chiark / gitweb /
59aa76bbc9455ebebd0f5d71902b7f928cfdea14
[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      25000 ; 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         return
39
40 ;--------------------
41 power_polarising_begin
42         pin_l   p0_booster_pwm
43         bc_f    INTCON, TMR0IE ; disables NMRA interrupt
44         bs_f    flags, flags_polarising
45         clr_f   settling
46         return
47
48 ;--------------------
49 power_polarising_settling
50 ; idempotent
51         tst_f_ifnz settling
52         return
53         mov_lw  settling_timeout / tick_us
54         mov_wf  settling
55         return
56
57 ;--------------------
58 power_polarising_tick
59         tst_f_ifnz settling
60         dec_f_ifnz settling ; decrement if not zero
61         return ; return if not dec'd, or if decrement didn't make zero
62         ; settle timeout complete:
63
64         bc_f    flags, flags_polarising
65         call    nmra_restartmessage
66         bs_f    INTCON, TMR0IE ; reenables NMRA interrupt
67         goto    i2c_consider_restartread
68
69 ;======================================================================
70 ;
71 ; FAULTS AND POWER:
72 ;
73 ;               Shutdown  CDU   Timeout User Fault      Next states
74 ;
75 ; Off           shutdown  off   none    off             *On (or +Fault)
76 ; On            power-up  on    none    off             Fault, or *Off
77 ; Stopping      shutdown  off   500ms   50% 1/50ms      ->Retry
78 ; Retry         power-up  off   50ms    off             ->Off, or Persists
79 ; Persists      shutdown  off   90ms    on              ->Retry
80 ;                                                       * = when host instructs
81 ;                                                       + = lost race, only
82 ;                                                       -> = after timeout
83 ;
84 ;               shutdown LAT    stop_wait       retry_wait
85 ;
86 ; Off           H (shutdown)    stopped         stopped
87 ; On            L (power-up)    stopped         stopped
88 ; Stopping      H (shutdown)    before Retry    for LED flash
89 ; Retry         L (power-up)    stopped         before Off
90 ; Persists      H (shutdown)    stopped         before retry
91 ;
92 ;                               (uses tickdiv)  (uses tick)
93
94 ;--------------------
95 power_fault_init
96         bs_f    INTCON2, INTEDG1 ; rising edge
97         bc_f    INTCON3, INT1IP
98         bc_f    INTCON3, INT1IF
99         bs_f    INTCON3, INT1IE
100         clr_f   stop_wait
101         clr_f   retry_wait
102         pin_h   p0_booster_shutdown
103         pin_vl  p0_booster_userfault
104         pin_z   p0_booster_userfault
105         ; now we are Off
106         return
107
108 ;--------------------
109 command_power
110         bra_nc  command_power_off
111         ; command is ON:
112
113 ; Off -> On; noop in other states
114         pinlat_ifh p0_booster_shutdown
115         return  ; On or Retry
116         ; might be Off, Stopping or Persists:
117
118         tst_f_ifnz retry_wait
119         return  ; that deals with Stopping or Persists
120         ; must be Off:
121
122         pin_l   p0_booster_shutdown
123         goto    cdu_on
124
125 ;----------
126 command_power_off
127 ; On -> Off; noop in other states
128         pinlat_ifl p0_booster_shutdown
129         return  ; Off, Stopping or Persists
130         ; might be On or Retry:
131
132         tst_f_ifnz retry_wait
133         return  ; that deals with Retry
134         ; must be On:
135 power_off_now
136         pin_h   p0_booster_shutdown
137         goto    cdu_off
138
139 ;--------------------
140 power_fault_intrl
141         bt_f_if1 INTCON3, INT1IF
142         return
143         ; we have a fault:
144
145         mov_fw  retry_wait
146         bra_z   power_stop ; we were Off or On, goto Stopping
147         ; must be Stopping, Retry or Persists:
148
149         tst_f_ifnz stop_wait
150         bra     power_stop ; we were already Stopping; restart timer
151         ; might be Retry or Persists, goto Persists (restarting any timer):
152
153         rcall   power_off_now
154         mov_lw  persist_timeout / tick_us
155         mov_wf  retry_wait
156         return
157
158 ;--------------------
159 power_fault_tick
160         tst_f_ifnz retry_wait
161         dec_f_ifnz retry_wait
162         return
163         ; retry_wait was running but has just reached zero;
164         ; we were in Stopping, Retry or Persists:
165
166         tst_f_ifnz stop_wait
167         bra     power_stop_doflash ; that was Stopping, just flash the LED
168         ; must be Retry or Persists:
169
170         pinlat_ifl p0_booster_shutdown
171         bra     power_retry ; we were in Persists, now we can try again
172         ; we were in Retry but it didn't work:
173 ; go to Persists:
174         pin_h   p0_booster_shutdown
175         mov_lw  persist_timeout / tickdiv_us
176         mov_wf  retry_wait
177         pin_nz  p0_booster_userfault
178         return
179
180 ;----------
181 power_stop
182         rcall   power_off_now
183         mov_lw  stop_timeout / tickdiv_us
184         mov_wf  stop_wait
185         pin_z   p0_booster_userfault
186         mov_lw  b'00000111'
187         call    serial_addbyte
188 power_stop_doflash
189         pin_znz p0_booster_userfault
190         mov_lw  stopflash_timeout / tickdiv_us
191         mov_wf  retry_wait
192         return
193
194 ;--------------------
195 power_fault_tickdiv
196         tst_f_ifnz stop_wait
197         dec_f_ifnz stop_wait
198         return
199         ; stop_wait was running but has just reached zero;
200         ; we were in Stopping, now we can Retry:
201 power_retry
202         mov_lw  retry_timeout / tickdiv_us
203         mov_wf  retry_wait
204         pin_l   p0_booster_shutdown
205         pin_z   p0_booster_userfault
206         return
207
208 ;--------------------
209 power_panichook
210         pin_h   p0_booster_shutdown
211         pin_l   p0_booster_pwm
212         pin_z   p0_booster_userfault
213         return
214
215 ;======================================================================
216  include final.inc