stop_wait res 1 ; or otherwise count down
retry_wait res 1
+fault_spurious_count res 1
+
code
;======================================================================
;
; Off shutdown off none off On
; On power-up on none off Stopping,FAULT Off
-; Stopping shutdown on 500ms 50% 1/100ms Retry
+; Stopping shutdown on 500ms 50% 1/100ms Retry
; Retry power-up off 50ms off Persists Off,FIXED Off
-; Persists shutdown off 90ms on Retry Off
+; Persists shutdown off 90ms on Retry Off
;
; (no notation: event ignored)
- make code correspond to new
- get rid of Clearing state.
;
; shutdown LAT stop_wait retry_wait
;
bs_f INTCON3, INT1IE
clr_f stop_wait
clr_f retry_wait
+ clr_f fault_spurious_count
pin_h p0_booster_shutdown
pin_h p0_booster_userfault
; now we are Off
;----------
command_power_off @
-; On -> Off; noop in other states
- pinlat_ifh p0_booster_shutdown
- return ; Off, Stopping or Persists
- ; might be On or Retry:
-
- tst_f_ifnz retry_wait
- return ; that deals with Retry
- ; must be On:
+; On, Retry, Persists -> Off; noop in Off or Stopping
+ tst_f_ifnz stop_wait
+ return ; that deals with Stopping
+ ; must be On, Off, Retry or Persists:
+ ; (it's harmless to do this if we were already Off)
power_off_now
+ clr_f retry_wait
+ pin_vh p0_booster_userfault
pin_vh p0_booster_shutdown
goto cdu_off
power_fault_intrl @
bt_f_if0 INTCON3, INT1IF
return
- ; we have a fault:
+ ; we may have a fault:
bc_f INTCON3, INT1IF
- call power_off_now
- mov_fw retry_wait
- bra_z power_fault_newshort ; we were Off or On
- ; must be Stopping, Retry or Persists:
+ call portb_read
+ pin_inw_ifh p0_booster_overload
+ bra fault_isactual
+ ; spurious:
- tst_f_ifnz stop_wait
- bra power_fault_stopmore ; we were already Stopping; restart timer
- ; might be Retry or Persists, goto Persists (restarting any timer):
+ inc_f_ifz fault_spurious_count ; ++f.s._count == 0x00 ?
+ bs_f fault_spurious_count, 7 ; f.s._count = 0x80
- mov_lw persist_timeout / tick_us
- mov_wf retry_wait
- pin_vl p0_booster_userfault
-faultintrl_noop
intrl_handled_nostack
;-----
-power_fault_newshort
+fault_isactual
+ pinlat_ifh p0_booster_shutdown
+ bra faultintrl_noop
+ ; Off, Stopping or Persists - must have lost the race
+ ; or flapped while we faffed. Well, never mind, it's
+ ; off now and we're taking care of it. (If the host
+ ; caused Off by OFF they can at worst send an OFF and
+ ; immediate ON in about 2ms, so worst-case duty cycle
+ ; for a short (if the host is perversely timed) is
+ ; (our interrupt latency) / 2ms
+ ; and if they ever don't manage to get the OFF through
+ ; in time then we go into Stopping.)
+ ; must be On or Retry:
+
+ pin_vh p0_booster_shutdown
+ tst_f_ifnz retry_wait
+ bra fault_persists ; that deals with Retry
+ ; must be On:
+
mov_lw b'00000111'
call serial_addbyte
-power_fault_stopmore
+
mov_lw stop_timeout / tickdiv_us
mov_wf stop_wait
pin_vl p0_booster_userfault
rcall power_stop_doflash
intrl_handled_nostack
+;-----
+fault_persists ; Retry -> Persists (booster was shut down just a moment ago)
+ mov_lw persist_timeout / tick_us
+ mov_wf retry_wait
+ pin_vl p0_booster_userfault
+faultintrl_noop
+ intrl_handled_nostack
+
;--------------------
power_fault_tick @
tst_f_ifnz retry_wait
; we were in Stopping, Retry or Persists:
tst_f_ifnz stop_wait
- bra power_stop_doflash ; that was Stopping, just flash the LED
+ bra power_stop_doflash ; that deals with Stopping (just flash)
; must be Retry or Persists:
pinlat_ifh p0_booster_shutdown
;--------------------
power_fault_tickdiv @
+ tst_f_ifnz fault_spurious_count
+ bra fault_spurious_tickdiv
+ ; in any case:
+fault_tickdiv_rest
tst_f_ifnz stop_wait
dec_f_ifnz stop_wait
return
; stop_wait was running but has just reached zero;
; we were in Stopping, now we can Retry:
+ call cdu_off
power_retry
mov_lw retry_timeout / tickdiv_us
mov_wf retry_wait
pin_vh p0_booster_userfault
return
+;----------
+fault_spurious_tickdiv
+; does not return, instead continues with fault_tickdiv_rest
+ mov_lw 0xc1 ; SPURIOUS
+ call serial_addbyte
+
+ mov_fw fault_spurious_count
+ bra_n fault_spurious_tickdiv_isoverflow
+fault_spurious_tickdiv_writeamt
+ call serial_addbyte_another
+ clr_f fault_spurious_count
+ bra fault_tickdiv_rest
+
+;-----
+fault_spurious_tickdiv_isoverflow
+ mov_lw 0x7f
+ bra fault_spurious_tickdiv_writeamt
+
;--------------------
power_panichook @
pin_vh p0_booster_shutdown