TACHYON
[~
FORGET EPC.fth
3 STOP
pub EPC.fth ." Ecohousing Process Controller V4.2 140620-0000 " ;
{ updated version using SPI etc
}
( EPC SYSTEM BLOCK DIAGRAM )
( CE0810 I/O Connections )
( ***** HARDWARE DEPENDANT DEFINITIONS ***** )
#P23 |< == @rst1 \ Reset lines to C8051 micros - removed for EPC work
#P25 |< == @rst0
#P11 |< == @valve \ drives MOSFET
#P12 |< == @top \
#P13 |< == @bottom
#P14 |< == @pressure
@top @bottom + @pressure + == inputpins
\ #P6 |< == RXDKEY \ Serial receive data from keypad ( connected to PIXIE instead )
\ RS485 COMS - not used - I/O used on module
#P14 == TXD422
#P12 == TE422
( RS485 coms to VGA PIXIE monitors - rx and tx separated )
#P22 == RXD422
#P21 == TXD485
#P20 == TE485
\ The CE0810 is equipped with an I/O module that drives the pump solenoid and monitors inputs
( PIO4307 Schematic )
\ ***** APPLICATION CONSTANTS *****
#20 == #maxframes \ frames used per system
\ *** TIMERS ***
TIMER =VALVE \ valve timer
TIMER =DISPLAY
TIMER =SCREEN
TIMER =RS485
LONG encoder
BUFFERS ORG
04 DS epccold
04 DS entry \ numeric entry
04 DS entry2
04 DS digits
04 DS polls \ counting polling
01 DS autoent
03 DS+
04 DS autofnc
04 DS step
04 DS count \ number of strokes required to pour
04 DS restart
04 DS stroke
04 DS valve
04 DS dpymode
04 DS strokes
04 DS encoder
04 DS holdtime
04 DS precharge
04 DS epcflg
04 DS xnum \ x position of number entry
04 DS ynum
04 DS ewidth
\ pour#,time,date,start,<program>
04 DS pour \ pour number or order#
04 DS start \ start time of pour
04 DS pourtime
04 DS pourdate
#maxframes DS steps \ steps for XX machines
400d == memsz
20d == rcdsz
memsz DS memory
pub ESAVE ; \ epccold DUP $200 ESAVE ;
pub busy? 1 epcflg ;
pub .TIME TIME@ L>W .BYTE ." :" W>B .BYTE DROP ;
\ Console messages - time stamped
pub MSG CON CR runtime @ #100000 MOD DECIMAL <# # # # "." HOLD # # "@" HOLD #> PRINT$ ." : " ;
pub VALVE ( on/off -- ) @valve OUT ;
pub VALVE? ( -- flg ) @valve IN ;
pub PRESSURE? ( -- flg ) @pressure INPUTS @pressure IN 0= @pressure OUTSET ;
pub TOP? ( -- flg ) @top IN 0= ;
pub BOTTOM? ( -- flg ) @bottom IN 0= ;
pub MONOUT ( ch -- )
DUP TXD485 SEROUT
BL < IF 2 1 LED OUTLEDS 1 ms OFF 1 LED OUTLEDS THEN
;
\ 32 ch x 12 lines of 16x32 font = 384 chars
\ Divert output to serial port of remote PIXIEs
pub MON ' MONOUT uemit W! ;
\ Set the BAUD rate for the RS485 network to the PIXIEs
CLKFREQ #115200 / == BAUD485
\ Pulse the RS485 receiver input to release any WAITPNE instruction
pub RELEASE
RXD422 MASK DUP OUTCLR INPUTS
;
pub SERIN485
2 =RS485 TIMEOUT
' RELEASE =RS485 ALARM
RXD422 MASK
0 8 BAUD485 4TH WAITPNE
DELTA FOR SHRINP WAITCNT NEXT
WAITCNT
#24 SHR NIP DUP $FF = IF DROP 0 THEN
;
pub MON@ ( -- ch ) \ Enquire if any screens have a keypad character to send
5 TXD485 SEROUT \ Send ENQ command to PIXIE
TE485 PINCLR \ then listen for a response (task)
SERIN485
TE485 PINSET \ back to transmit mode
;
\ Setup serial port of monitors and clear their screens
pub !MON
#115200 SERBAUD TE485 PINSET TXD485 PINCLR #200 ms TXD485 PINSET ( 4 seconds )
;
\ Color constants
$00 == BLACK
$14 == TEAL
$44 == PINK
\ $D4 == CREAM PINK
$88 == MAGENTA
$50 == DRAB
$54 == KAHKI
$58 == LILAC
$60 == LIME
\ $64 == GREEN CREAM
$70 == CALYPSO
$D0 == ORANGE
$0C == BLUE
$30 == GREEN
$C0 == RED
$54 == GREY
$FC == WHITE
RED GREEN + == YELLOW
GREEN BLUE + == CYAN
\ Turn a bold color into a shade
pub SHADE ( col -- shade ) DUP %01010100 AND SWAP %10101000 AND 2/ OR ;
LONG colors
pub PEN ( color -- ) MON $1D EMIT DUP EMIT CON 8 SHL colors @ $FF AND OR colors ! ;
pub PAPER ( color -- ) colors @ $FF ANDN OR colors ! ;
pub PLOT ( x y -- ) $1E EMIT SWAP EMIT EMIT ;
pub XSIZE ( xsize -- ) MON $18 EMIT EMIT CON ;
pub YSIZE ( ysize -- ) MON $19 EMIT EMIT CON ;
pub NORMAL 1 1
pub SIZE ( x y -- ) YSIZE XSIZE ;
pub .DIGITS ( num -- ) MON 0 MAX #99 MIN $20A .NUM CON ;
pub @X ( x -- ) MON $10 EMIT EMIT ;
pub @Y ( y -- ) MON $11 EMIT EMIT ;
pub @XY ( x y -- ) @Y @X ;
\ Position cursor at character X Y
pub CXY ( x y -- ) 4 SHL SWAP 3 SHL SWAP
pub COLORS ( fg bg -- col ) SWAP B>W ;
\ cval = rrggbbxxrrggbbxx - tile cnt cval
pub TILES ( tile# cnt cval -- ) MON $1C EMIT ROT EMIT SWAP EMIT W>B EMIT EMIT CON ;
pub @TILE ( x y -- tile# ) 4 SHL + ;
pub PAINT ( xtile ytile width height -- )
3RD OVER ADO 4TH I @TILE 3RD colors @ TILES LOOP
2DROP 2DROP
;
\ pub *SET #80 #36 5
pub @ENTRY #208 #176 5
\ position number entry on screen with autoenter enabled for digits (or 0 for manual)
pub SETNUM ( x y width -- ) DUP autoent C! ewidth C! ynum ! xnum ! ;
\ Characters used to represent "LED" indicators at bottom left of screen
" -*-T-BLH-V-5-6-7" 0 STRING mleds
pub MLED ( val index -- )
NORMAL DUP 4 SHL #176 @XY
2* SWAP 0<> 1 AND + mleds + C@ EMIT
CON
;
pub MLEDS
BLACK PEN ORANGE PAPER 0 #11 5 1 PAINT
VALVE? 4 MLED
PRESSURE? 3 MLED
TOP? 1 MLED
BOTTOM? 2 MLED
;
pub STEP@ step @ steps + C@ ;
pub STEP! step @ steps + C! ESAVE ;
pub RUNNING? count @ 0<> ;
\ Display the current MACHINE number as very big digits
pub .MACHINE ( n -- )
MSG ." MACHINE " DUP .DEC \ Echo diagnostics to console
YELLOW PEN BLACK PAPER 0 1 9 #10 PAINT \ paint tiles in machine number area x y xwidth ywidth
9 #11 SIZE 0 0 @XY 1+ .DIGITS \ Large digits
NORMAL PRESSURE? IF GREEN ELSE RED THEN \ Reflect pressure status in machine title
PEN BLACK PAPER
0 #10 8 1 PAINT \ paint tiles for title
#50 #158 @XY ." MACHINE " \ display title
CON \ return I/O to console in case we run interactively
;
BYTE lastcount
pub .COUNT ( n -- )
DUP lastcount C@ = IF DROP EXIT THEN \ don't bother updating if there is no change
DUP lastcount C! \ update change variable
MSG ." COUNT " DUP .DEC \ diagnostic
GREEN PEN BLACK PAPER
9 6 7 4 PAINT
6 5 SIZE \ Set medium sized digits
#142 #88 @XY .DIGITS
NORMAL WHITE PEN BLUE PAPER 9 #10 7 1 PAINT \ setup title block
#162 #160 @XY ." COUNT" \ set title
CON
;
BYTE dpymode
pub .HOLD
=VALVE @ 1000d / 1+ .COUNT
dpymode C@ "H" = IF EXIT THEN \ don't redraw if it's already drawn
MSG ." HOLD "
WHITE PEN RED PAPER 9 1 7 5 PAINT
6 5 SIZE #142 8 @XY 2 SPACES CON \ erase digits
"H" dpymode C!
2 4 SIZE
#146 #24 @XY ." HOLD"
CON
;
pub .STROKE ( n -- )
MSG ." STROKE " DUP .DEC
dpymode C@ "D" <>
IF "D" dpymode C! 3 5 SIZE #146 #16 @XY 4 SPACES THEN
DUP IF CYAN ELSE GREY THEN PEN
BLACK PAPER 9 1 7 4 PAINT
6 5 SIZE
#142 8 @XY .DIGITS
NORMAL WHITE PEN BLUE PAPER 9 5 7 1 PAINT
#162 #80 @XY ." STROKE" CON
;
\ Position display at step entry
pub @STEP ( step -- )
NORMAL #128 ( step 128 ) \ xpos of 1st column program list
OVER #maxframes 2/ =>
IF SWAP #maxframes 2/ - SWAP #56 + ( step ypos ) THEN \ use right column
SWAP 4 SHL ( y spacing ) 16 + @XY \ top offset
;
\ Display step entry along with highlighting if selected
pub DisplayStep ( step -- )
DUP @STEP \ position display at step area
MON ." #" DUP 1+ $20A .NUM \ display machine number
." =" DUP steps + C@ $20A .NUM \ display contents of current step
WHITE PEN DUP step C@ = IF RED SHADE ELSE BLUE SHADE THEN PAPER \ HIGHLIGHT if selected
8 OVER #maxframes 2/ =>
IF 4 + SWAP #maxframes 2/ - SWAP THEN
SWAP 1+ 4 1 PAINT
;
pub .STEP
RUNNING?
IF STEP@ .COUNT step @ .MACHINE
ELSE step @ DisplayStep
THEN
CON
;
pub DATA.DISPLAY
dpymode C@ "D" <> IF .STEP 0 "D" dpymode C! THEN
RUNNING?
IF encoder @ stroke @ <> \ update only on change
IF encoder @ DUP stroke ! .STROKE THEN \ display the current stroke
\ .MACHINE.TITLE
THEN
;
TABLE encstk #64 ALLOT
BYTE inputs
\ for non-latching unipolar hall effect devices A1126
pub ENCODER.TASK
encoder ~ 3
BEGIN
DUP inputs C! \ update global variable for application to sense inputs
@top IN NOT IF 4 OR DUP 1 AND @bottom IN AND IF encoder ++ 1 ANDN 2 OR THEN ELSE 4 ANDN THEN
@bottom IN NOT IF 8 OR DUP 2 AND @top IN AND IF encoder ++ 2 ANDN 1 OR THEN ELSE 8 ANDN THEN
\ @pressure IN NOT IF $10 OR ELSE $10 ANDN THEN
AGAIN
;
}
{ OPERATION
*********** SEQUENCE DESCRIPTION ************
ENTER STEP AND PRESS START
WHEN PRESSURE DROPS WAIT A BIT AND THEN
1. ENGAGE VALVE
WHEN STROKE COUNTER REACHES CURRENT STEP COUNT THEN:
1. RELEASE VALVE
2. ADVANCE STEP
3. IF STEP = 0 THEN SKIP STEPS UNTIL <>0 or END
4. STOP & ENTER PROGRAM MODE
5. RESET STROKE COUNTER
6. HOLD TIMEOUT
}
( ********************* KEYPAD ****************** )
pub !LCD ;
\ Use 16 characters at the bottom of the screen for messages
pub @LCD ( x y -- ) #80 #176 @XY ;
pub SETENT STEP@ entry ! ;
pub STEP+ step @ 1+
pub STEPCNT! DUP 0< IF #maxframes + THEN #maxframes MOD step ! ;
pub STEP- ( -- ) step @ 1- STEPCNT! ;
pub .STEP+ step @ 1- #maxframes MOD DisplayStep step @ DisplayStep ;
pub .STEP- ( -- ) step @ 1+ #maxframes MOD DisplayStep step @ DisplayStep ;
pub .ERROR @LCD ." *ERROR!* " ;
pub FUNC
pub PUSH entry @ entry2 ! ;
pub CLRENT entry ~ digits ~ ;
pub CLEAR CLRENT @ENTRY autofnc ~ !LCD encoder ~
pub .ENTRY RED PEN WHITE PAPER #13 #11 3 1 PAINT xnum @ ynum @ @XY 1 YSIZE
pub ENTRY MON entry @ ewidth C@ 8 SHL #10 + .NUM CON ;
pub [CLEAR] CLRENT .ENTRY entry @ STEP! .STEP @LCD 16 SPACES ;
pub [CE] digits C@ IF entry @ #10 / entry ! digits C-- .ENTRY THEN ;
pub [ENTER]
digits C@
IF
entry @ #120 <
IF entry @ STEP! .STEP CLRENT
ELSE .ERROR CLRENT EXIT
THEN
THEN
CLRENT .ENTRY STEP+ .STEP+ SETENT
;
pub STROKES.SET
SETENT
2 autoent C!
;
\ ********************* DISPLAY *****************
pub LIST_STATS ;
pub EPC.BUSY 60000d =SCREEN TIMEOUT busy? CLR ;
pub EPC.IDLE busy? SET ( CLRSCR LOGO LIST_STATS ) ;
pub LIST.CLR
BLACK PEN \ erase the list area
;
pub .ASTIME
DECIMAL <# # # ":" HOLD # # #> PRINT$
;
pub .POUR
NORMAL 0 0 @XY
." #" pour @ $30A .NUM
SPACE ." @" pourtime @ .ASTIME
CON
;
pub [INC] ( inc step ) STEP@ 1+ STEP! .STEP ;
pub [DEC] ( dec step ) STEP@ 1- STEP! .STEP ;
pub LIST_PROGRAM
.POUR
WHITE PEN BLUE SHADE PAPER
8 1 8 #10 PAINT
#128 0 @XY ." MACHINES"
#maxframes 0 DO I DisplayStep LOOP CON
;
pub CLRSCR MON CLS CON ;
pub LOGO
YELLOW PEN GREEN SHADE PAPER
0 1 8 2 PAINT
WHITE SHADE PEN BLACK PAPER
0 3 8 2 PAINT
\ 1234567890123456
NORMAL 2 YSIZE 0 #14 @XY
." Ecohousing "
1 YSIZE 0 #48 @XY
." Proportioner"
CR ." Controller "
CON
;
\ Fill the main display block
pub MAIN.FILL ( col -- )
WHITE SWAP COLORS
5 6 ADO 0 I @TILE 8 3RD TILES LOOP DROP
;
pub ALERT ( col -- )
MAIN.FILL
3 6 SIZE
16 #80 @XY
;
pub *STOP*
CLRSCR
RED ALERT
WHITE PEN RED PAPER
MON ." STOP"
LOGO
;
\ Change display to EDIT mode
pub EDIT
*STOP*
stroke @ restart !
count ~
OFF VALVE
LIST_PROGRAM
STROKES.SET
LIST_STATS
;
pub [STOP]
MSG ." Stopped "
EDIT
@LCD ." Stopped at " .TIME
CON
;
\ pour#,time,date,start,<program>
pub NEXT-POUR
memory DUP rcdsz + memsz rcdsz - CMOVE \ make room for new entry by pushing in
pour memory rcdsz CMOVE \ save current pour
pour ++ \ increment pour count
start ~
ESAVE
;
pub +MACHINE ( Step to next machine in run sequence and holdoff valve)
BEGIN
STEP+ step @ 0= \ stop if there are no more machines (back to 0)
IF NEXT-POUR [STOP] EXIT THEN
STEP@ 0<>
UNTIL
STEP@ count !
.STEP
holdtime @ =VALVE TIMEOUT \ 8 second valve timeout
;
pub ?STROKE ( Process the stroke counter)
RUNNING?
IF
EPC.BUSY \ Hold off screensaver
encoder @ 1+ count @ > \ terminate?
IF OFF VALVE +MACHINE \ turn off the high pressure valve etc
THEN
THEN
;
\ Turn on full pressure valve if required
pub ?VALVE
=VALVE TIMEOUT? \ ignore while timing out
IF
RUNNING?
PRESSURE? NOT AND \ and no pressure ?
IF ON VALVE THEN
ELSE \ on HOLD - timing out for next machine
encoder ~ \ Don't allow encoder pulses while timing out
-1 stroke !
holdtime @ 2/ precharge @ 0 MAX MIN precharge ! \ is precharge is short enough
=VALVE @ precharge @ U< \ precharge line just before it times out
IF
PRESSURE? NOT AND \ and no pressure ?
IF ON VALVE THEN
THEN
THEN
;
\ This is just a little demo and not used in this application
pub BIGCLOCK
MON CLS
YELLOW PEN BLACK PAPER 0 0 #16 #12 PAINT
6 XSIZE #12 YSIZE 0 0 @XY .TIME
CON
;
pub BIGNUM ( num -- )
MON CLS
YELLOW PEN BLACK PAPER 0 0 #16 #12 PAINT
6 XSIZE #12 YSIZE 0 0 @XY .DEC
CON
;
pub SHOW.TIME #216 0 @XY .TIME ;
\ Poll the display for updates etc
pub ?DISPLAY
=DISPLAY TIMEOUT?
IF
#250 =DISPLAY TIMEOUT
SHOW.TIME
epcflg 1+ C++
epcflg 1+ C@ 3 AND
" |/-\" + C@
mleds 1+ C! ON 0 MLED
CON
=VALVE TIMEOUT?
IF DATA.DISPLAY ELSE .HOLD THEN
THEN
MLEDS
epcflg 1+ C@ 3 AND 2 LED
VALVE? 1 AND 1+ 4 LED
PRESSURE? 1 AND 1+ 5 LED
@top IN 0= 2 AND 7 LED
@bottom IN 0= 2 AND 6 LED
OUTLEDS
;
pub START
MSG ." Process started "
MON CLS
-1 stroke ! \ enable screen refresh for stroke
.STEP
time @ pourtime ! date @ pourdate !
time @ start !
LIST_STATS
.POUR
@LCD ." Started at " .TIME
;
pub [START]
MSG ." Start requested"
encoder ~
0 #maxframes 0 DO I steps + C@ IF DROP I LEAVE THEN LOOP \ find next active entry
step !
STEP@ ?DUP
IF count !
START
ELSE
[STOP]
@LCD ." Empty program "
THEN
CON
;
pub [HOLD] \ *** START/HOLD ***
RUNNING? IF [STOP] ELSE -1 lastcount C! [START] THEN
;
\ pour#,time,date,<program>
pub RECALL
entry @ CLRENT
memsz rcdsz / 0
DO I rcdsz * memory + @ OVER =
IF DROP I rcdsz * memory + pour rcdsz CMOVE THEN
LOOP
LIST.CLR
LIST_PROGRAM
;
( ***** KEYPAD TASK ***** )
{ The keypad used is a modified USB keypad which was supposed to be PS/2 compatible but this was not the case and since PS/2 keypads are hard to come by it was decided to modify these ones instead. Since we now have full control over the keys, codes, and interface it was changed to a simple 9600 baud serial send only. All keys including the NUM LOCK output a single ASCII code corresponding to their key label. In this implementation the keypads plug into the PIXIE which runs the monitor and so any keys that pressed are sent back over the RS485 bus in a simple multi-station mode.
}
LONG key
pub KEY@ ( -- byte )
MON@ DUP IF key @ 8 SHL OVER + key ! THEN
;
pub [DIGIT] ( n -- )
@ENTRY NORMAL
$0F AND
digits C@ 0= IF CLRENT @LCD 16 SPACES THEN
digits C@ 5 <
IF entry @ 0A * + entry ! digits C++ .ENTRY
digits C@ autoent C@ => IF [ENTER] THEN
ELSE DROP
THEN
;
pub [RECALL]
digits C@
IF
@LCD ." Recall pour #" entry @ $30A .NUM
RECALL
ELSE
key 1+ C@ "*" =
IF
steps #maxframes ERASE LIST_PROGRAM
@LCD ." Program cleared "
ELSE
\ 1234567890123456
@LCD ." Next press wipes"
THEN
THEN
;
pub [STEP+] step @ STEP+ DisplayStep .STEP+ STROKES.SET ;
pub [STEP-] step @ STEP- DisplayStep .STEP- STROKES.SET ;
pub [STEP0] step @ step ~ DisplayStep step @ DisplayStep STROKES.SET ;
pub SETTIME
digits C@ 4 = entry @ #0500 #2400 WITHIN AND
IF entry @ #100 * TIME! THEN
@LCD ." Set time " .TIME 2 SPACES
CLRENT .ENTRY
CON
;
pub SETPRECH
entry @ #1000 * 0 holdtime @ 2/ WITHIN IF entry @ #1000 * precharge ! ESAVE THEN
@LCD ." Precharge = " precharge @ #1000 U/ .DEC CLRENT
;
pub SETHOLD
entry @ 1 #60 WITHIN IF entry @ #1000 * holdtime ! ESAVE THEN
@LCD ." Hold time = " entry @ .DEC CLRENT
;
pub [SET]
digits C@ SWITCH
1 CASE SETHOLD BREAK
2 CASE SETHOLD BREAK
3 CASE SETPRECH BREAK
4 CASE SETTIME BREAK
;
pub RUNKEYS:
[STOP]
{
SWITCH
BL CASE encoder C++ BREAK
"[" CASE OFF VALVE BREAK
"]" CASE ON VALVE BREAK
[STOP]
}
;
pub [KEYPAD]
>B SWITCH
^[ CASE step ~ [HOLD] BREAK \ HOLD START/STOP
"/" CASE [SET] BREAK
"*" CASE [RECALL] BREAK
"-" CASE [STEP-] BREAK \ step down
"+" CASE [STEP+] BREAK \ step up
^H CASE [CE] BREAK \ clear entry
^M CASE [ENTER] LIST_STATS BREAK
"." CASE [CLEAR] BREAK
BL CASE [STEP0] BREAK
SWITCH@ "0" "9" WITHIN IF SWITCH@ [DIGIT] BREAK \ 0..9 numeric key
;
pub ?KEYPAD
KEY@ ?DUP
IF
MSG ." KEY=" DUP .BYTE SPACE DUP BL > IF DUP EMIT THEN
RUNNING? \ Special keys during RUN (normally stops)
IF
RUNKEYS:
ELSE
=SCREEN TIMEOUT? IF EDIT THEN
EPC.BUSY
[KEYPAD]
THEN
THEN
;
pub ?EPC
polls ++
polls @ 3 AND 0= IF 1 ms ?KEYPAD THEN
?STROKE
?VALVE
?DISPLAY
CON
;
pub DEFAULTS
pour memsz rcdsz + ERASE
pour ~
#8000 holdtime ! \ 8 second timeout
#2000 precharge !
$A55A5AA5 epccold !
ESAVE
;
pub ?DEFAULTS
epccold @ $A55A5AA5 <>
IF DEFAULTS THEN
step ~
;
pub !HW
epcflg ~
polls ~
-1 lastcount C!
?DEFAULTS
@rst0 OUTCLR @rst1 OUTCLR
!LCD SETENT
CLRSCR
CLEAR
#50 ms
;
BYTE escs
pub ESCS?
KEY ?DUP IF $1B = IF escs C++ ELSE escs C~ THEN ELSE DROP THEN escs C@ 2 >
;
LONG epc
pub EPCTASK ( Ecohousing Pour Controller Task - monitors strokes,valve,keypad,timers,etc)
0 LED! escs C~ EPC.BUSY
BEGIN
!SP
?EPC
epc ++
ESCS?
UNTIL
CON
;
pub !EPC
!MON ( need to eait 4 seconds for full boot )
\ LED test - take a few seconds here as we have to wait for the monitors to reboot
4 FOR $666666 LED! #250 ms $999999 LED! #250 ms NEXT \ alternate red and green LEDs
#24 0 DO I MASK LED! #100 ms LOOP \ Light LEDs as green and red individually
0 #48 @XY EPC.fth #1000 ms
WHITE PEN BLUE PAPER 0 1 16 #10 PAINT
BLUE PEN WHITE PAPER 0 0 16 1 PAINT
GREEN PEN BLACK PAPER 0 #11 16 1 PAINT
MSG ." Initialising EPC"
#50 ms
!HW
MSG ." [STOP] executed"
[STOP]
' ENCODER.TASK 3 RUN
;
pub EPC ( Ecohousing Pour Controller & Operator Display - www.ecohousing.com.au )
!SP !PCB !EPC
EPCTASK
CON
;
pub GO EPC ;
pub RESUME EDIT EPCTASK ;
{ PRODUCTION NOTES: First version used latching hall effect devices Remove all components from bottom side of CE0810 Change IO15..12 resnet to 100K (20V inputs) Use 220R for IO11..8 NAMES: $56A6...74DB for 7733 (1900 bytes added) CODE: $0000...4047 for 8722 (3767 bytes added) CALLS: 0295 vectors free RAM: 5727 bytes free } |
]~
END
AUTORUN EPC
?BACKUP