Download DISTRIBUTED DISPATCHING FOR EMBEDDED GENERATION

Transcript
btfss
goto
goto
finc
STATUS,C
finc
fok
incfsz fvi,W
incf
fvi,F
goto
ftest
; skip if it is not
; test if this will roll over
; if it won't then increment
; skip decrement
; else, if frequency was OK, decrement fvi. Unless it's zero!
fok
movf
fvi,F
; move fvi to itself
btfss STATUS,Z
; in order to test for zero
decf
fvi,F
; if the counter hits 'CTS'- Bring the show down!
ftest movf
fvi,W
bcf
STATUS,C
sublw CTS
btfsc STATUS,C
; skip if fvi greater than CTS
goto
fnotrip
; branch to 'no trip' if fvi within limit
bsf
movf
occurred...
sublw
btfsc
goto
movlw
movwf
movlw
movwf
PORTA,4
pstat,W
; otherwise immediately cut out power stage
; test if status != tripped ie trip
TRIPPED
STATUS,Z
fnotrip
TRIPPED
pstat
CTR
fvi
; because we only want to reset fvi once...
; and not every time we do this test...
; which would lock us up for good
has
; status = tripped
; reset fvi.
; if the counter hits 0- Start up again!
fnotrip movf
fvi,W
; next instruction skipped if fvi=0
btfss STATUS,Z
goto
ttest
movlw RUNNING
; set status to running
movwf pstat
; now get the new throttle setting for this cycle
; a 8 bit setting multiplexed in as two lots of 4 bits due to shortage of
; IO pins
ttest movf
pstat,W
; don't execute this if we are tripped
sublw TRIPPED
btfsc STATUS,Z
goto
nothrot
throt bsf
PORTA,4
; set multiplexing bit
nop
; wait
nop
movf
PORTA,W
; read 4 most significant bits into W
andlw B'00001111'
; mask
movwf power
; put into power register
swapf power,F
; swap nibbles
bcf
PORTA,4
; clear multiplexing output
nop
; wait
nop
movf
PORTA,W
; read 4 least significant bits into W
andlw B'00001111'
; mask
iorwf power,F
; OR with existing contents of power reg
; simple sleep mode
btfsc STATUS,Z
bsf
PORTA,4
; is throttle setting zero?
; then cut out power stage
; finally saturate errc
; this is needed so the timer can't be set to pump out interrupts faster than the
; program can handle them
nothrot movf
errc,W
bcf
STATUS,C
sublw TMAX
btfsc STATUS,C
; is errc greater than TMAX
goto
skpsat
; if not skip the next bit
movlw TMAX
movwf errc
; if so let errc=TMAX
201
just