chiark / gitweb /
fix totally bogus single-byte serial command handling; consequently rearrange section...
[trains.git] / detpic / energy.asm
1 ;======================================================================
2 ; TRACK POWER AND SHORT CIRCUIT
3
4   include common.inc
5
6 settling_timeout        equ      10000 ; us
7
8 stop_timeout            equ     500000 ; us
9 stopflash_timeout       equ      50000 ; us
10 retry_timeout           equ      50000 ; us
11 persist_timeout         equ      90000 ; us
12
13   udata_acs
14 settling        res     1 ; all counters are 0 if stopped
15 stop_wait       res     1 ;  or otherwise count down
16 retry_wait      res     1
17
18   code
19
20 ;======================================================================
21 ;
22 ; POLARISING/SETTLING:
23 ;
24 ;               NMRA            flag_p. settling        Booster PWM
25 ;
26 ; Normal        running         0       stopped         mark
27 ; Polarising    paused          1       stopped         space
28 ; Settling      paused          1       running         space
29 ;
30 ; NMRA is paused by disabling timer 0 intr; when we restart,
31 ; we restart the current message.
32 ;
33 ;----------------------------------------------------------------------
34
35 ;--------------------
36 power_polarising_init @
37         clr_f   settling
38         pin_h   p0_booster_pwm
39         return
40
41 ;--------------------
42 power_polarising_begin @
43         pin_vl  p0_booster_pwm
44         bc_f    INTCON, TMR0IE ; disables NMRA interrupt
45         bs_f    flags, flags_polarising
46         clr_f   settling
47         return
48
49 ;--------------------
50 power_polarising_settling @
51 ; idempotent
52         tst_f_ifnz settling
53         return
54         mov_lw  settling_timeout / tick_us
55         mov_wf  settling
56         return
57
58 ;--------------------
59 power_polarising_tick @
60         tst_f_ifnz settling
61         dec_f_ifnz settling ; decrement if not zero
62         return ; return if not dec'd, or if decrement didn't make zero
63         ; settle timeout complete:
64
65         bc_f    flags, flags_polarising
66         call    nmra_restartmessage
67         bs_f    INTCON, TMR0IE ; reenables NMRA interrupt
68         goto    i2c_consider_restartread
69
70 ;======================================================================
71 ;
72 ; FAULTS AND POWER:
73 ;
74 ;               Shutdown  CDU   Timeout User Fault      Next states
75 ;
76 ; Off           shutdown  off   none    off             *On (or +Fault)
77 ; On            power-up  on    none    off             Fault, or *Off
78 ; Stopping      shutdown  off   500ms   50% 1/100ms     ->Retry
79 ; Retry         power-up  off   50ms    off             ->Off, or Persists
80 ; Persists      shutdown  off   90ms    on              ->Retry
81 ;                                                       * = when host instructs
82 ;                                                       + = lost race, only
83 ;                                                       -> = after timeout
84 ;
85 ;               shutdown LAT    stop_wait       retry_wait
86 ;
87 ; Off           H (shutdown)    stopped         stopped
88 ; On            L (power-up)    stopped         stopped
89 ; Stopping      H (shutdown)    before Retry    for LED flash
90 ; Retry         L (power-up)    stopped         before Off
91 ; Persists      H (shutdown)    stopped         before retry
92 ;
93 ;                               (uses tickdiv)  (uses tick)
94
95 ;--------------------
96 power_fault_init @
97         bs_f    INTCON2, INTEDG1 ; rising edge
98         bc_f    INTCON3, INT1IP
99         bc_f    INTCON3, INT1IF
100         bs_f    INTCON3, INT1IE
101         clr_f   stop_wait
102         clr_f   retry_wait
103         pin_h   p0_booster_shutdown
104         pin_h   p0_booster_userfault
105         ; now we are Off
106         return
107
108 command_power_section code 0x2080
109 ;--------------------
110 command_power_on @
111 ; Off -> On; noop in other states
112         pinlat_ifl p0_booster_shutdown
113         return  ; On or Retry
114         ; might be Off, Stopping or Persists:
115
116         tst_f_ifnz retry_wait
117         return  ; that deals with Stopping or Persists
118         ; must be Off:
119
120         pin_vl  p0_booster_shutdown
121         goto    cdu_on
122
123 ;----------
124 command_power_off @
125 ; On -> Off; noop in other states
126         pinlat_ifh p0_booster_shutdown
127         return  ; Off, Stopping or Persists
128         ; might be On or Retry:
129
130         tst_f_ifnz retry_wait
131         return  ; that deals with Retry
132         ; must be On:
133 power_off_now
134         pin_vh  p0_booster_shutdown
135         goto    cdu_off
136
137 code2 code
138 ;--------------------
139 power_fault_intrl @
140         bt_f_if0 INTCON3, INT1IF
141         return
142         ; we have a fault:
143
144         bc_f    INTCON3, INT1IF
145         call    power_off_now
146
147         mov_fw  retry_wait
148         bra_z   power_fault_stop ; we were Off or On, goto Stopping
149         ; must be Stopping, Retry or Persists:
150
151         tst_f_ifnz stop_wait
152         bra     power_fault_stop ; we were already Stopping; restart timer
153         ; might be Retry or Persists, goto Persists (restarting any timer):
154
155         mov_lw  persist_timeout / tick_us
156         mov_wf  retry_wait
157         pin_vl  p0_booster_userfault
158         return
159
160 ;-----
161 power_fault_stop
162         mov_lw  stop_timeout / tickdiv_us
163         mov_wf  stop_wait
164         pin_vl  p0_booster_userfault
165         mov_lw  b'00000111'
166         call    serial_addbyte
167         rcall   power_stop_doflash
168         intrl_handled_nostack
169
170 ;--------------------
171 power_fault_tick @
172         tst_f_ifnz retry_wait
173         dec_f_ifnz retry_wait
174         return
175         ; retry_wait was running but has just reached zero;
176         ; we were in Stopping, Retry or Persists:
177
178         tst_f_ifnz stop_wait
179         bra     power_stop_doflash ; that was Stopping, just flash the LED
180         ; must be Retry or Persists:
181
182         pinlat_ifh p0_booster_shutdown
183         bra     power_retry ; we were in Persists, now we can try again
184         ; we were in Retry and it worked.
185 ; go to Off:
186         pin_vh  p0_booster_shutdown
187         pin_vh  p0_booster_userfault
188         mov_lw  b'00000110'
189         goto    serial_addbyte
190
191 ;----------
192 power_stop_doflash
193         pin_vhl p0_booster_userfault
194         mov_lw  stopflash_timeout / tick_us
195         mov_wf  retry_wait
196         return
197
198 ;--------------------
199 power_fault_tickdiv @
200         tst_f_ifnz stop_wait
201         dec_f_ifnz stop_wait
202         return
203         ; stop_wait was running but has just reached zero;
204         ; we were in Stopping, now we can Retry:
205 power_retry
206         mov_lw  retry_timeout / tickdiv_us
207         mov_wf  retry_wait
208         pin_vl  p0_booster_shutdown
209         pin_vh  p0_booster_userfault
210         return
211
212 ;--------------------
213 power_panichook @
214         pin_vh  p0_booster_shutdown
215         pin_vl  p0_booster_pwm
216         pin_vh  p0_booster_userfault
217         return
218
219 ;======================================================================
220   include final.inc