0
|
1 ;=============================================================================
|
|
2 ;
|
|
3 ; File isr.asm
|
|
4 ;
|
|
5 ; INTERUPT subroutines
|
|
6 ;
|
|
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
|
|
8 ;=============================================================================
|
|
9 ; HISTORY
|
|
10 ; 2011-05-24 : [jDG] Cleanups from initial Matthias code.
|
|
11
|
|
12 #include "ostc3.inc"
|
|
13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c
|
|
14 #include "ms5541.inc"
|
|
15 #include "adc_lightsensor.inc"
|
|
16
|
|
17 ;=============================================================================
|
|
18
|
|
19 extern start
|
|
20
|
|
21 isr_high CODE 0x0008 ;High Priority Interrups
|
|
22 bra HighInt
|
|
23 nop
|
|
24 nop
|
|
25 nop
|
|
26 nop
|
|
27 nop
|
|
28 nop
|
|
29 bra HighInt
|
|
30
|
|
31 isr_low CODE 0x00018 ;Low Priority Interrups
|
|
32 ; *** low priority interrupts not used
|
|
33 retfie FAST ; Restores BSR, STATUS and WREG
|
|
34
|
|
35 HighInt:
|
|
36 movff PRODL,isr_prod+0
|
|
37 movff PRODH,isr_prod+1
|
|
38
|
|
39 ; Pressure sensor and others
|
|
40 btfsc PIR5,TMR7IF ; Timer 7
|
|
41 rcall isr_tmr7 ; Every 62,5ms
|
|
42
|
|
43 ; Timer0 for RX timing
|
|
44 ; btfsc INTCON,TMR0IF ; Timer0 INT (Button Debounce Timer)
|
|
45 ; rcall timer0int
|
|
46
|
|
47 ; Buttons
|
|
48 btfsc PIR1,TMR1IF ; Timer1 INT (Button hold-down Timer)
|
|
49 rcall timer1int
|
|
50 btfsc INTCON,INT0IF ; Buttons
|
|
51 rcall isr_switch_right
|
|
52 btfsc INTCON3,INT1IF ; Buttons
|
|
53 rcall isr_switch_left
|
|
54
|
|
55 ; IR-Link
|
|
56 btfsc PIR2,TMR3IF ; Timer 3
|
|
57 rcall isr_timer3 ; IR-Link Timeout
|
|
58 btfsc PIR3,RC2IF ; UART2
|
|
59 rcall isr_uart2 ; IR-Link
|
|
60
|
|
61 ; RTCC
|
|
62 btfsc PIR3,RTCCIF ; Real-time-clock interrupt
|
|
63 rcall isr_rtcc ; May return in bank common!
|
|
64
|
|
65 movff isr_prod+1,PRODH
|
|
66 movff isr_prod+0,PRODL
|
|
67 retfie FAST ; Restores BSR, STATUS and WREG
|
|
68
|
|
69 ;=============================================================================
|
|
70
|
|
71 ;timer0int:
|
|
72 ; bcf T0CON,TMR0ON ; Stop Timer 0
|
|
73 ; return
|
|
74 ;
|
|
75 ; movlw .240
|
|
76 ; movwf TMR0H
|
|
77 ; bcf INTCON,TMR0IF ; Clear flag
|
|
78 ; clrf TMR0L
|
|
79 ; return
|
|
80
|
|
81
|
|
82
|
|
83 isr_uart2: ; IR-Link
|
|
84 banksel RCREG2
|
|
85 movf RCREG2,W
|
|
86 bcf RCSTA2,CREN ; Clear receiver status
|
|
87 bsf RCSTA2,CREN
|
|
88 banksel isr_backup
|
|
89 bcf PIR3,RC2IF ; Clear flag
|
|
90 incf ir_counter,F ; Increase counter
|
|
91 movff ir_counter,isr1_temp ; Copy
|
|
92 dcfsnz isr1_temp,F
|
|
93 movwf ir_buffer+.0
|
|
94 dcfsnz isr1_temp,F
|
|
95 movwf ir_buffer+.1
|
|
96 dcfsnz isr1_temp,F
|
|
97 movwf ir_buffer+.2
|
|
98 dcfsnz isr1_temp,F
|
|
99 movwf ir_buffer+.3
|
|
100 dcfsnz isr1_temp,F
|
|
101 movwf ir_buffer+.4
|
|
102 dcfsnz isr1_temp,F
|
|
103 movwf ir_buffer+.5
|
|
104 dcfsnz isr1_temp,F
|
|
105 movwf ir_buffer+.6
|
|
106 dcfsnz isr1_temp,F
|
|
107 movwf ir_buffer+.7
|
|
108 dcfsnz isr1_temp,F
|
|
109 movwf ir_buffer+.8
|
|
110 dcfsnz isr1_temp,F
|
|
111 movwf ir_buffer+.9
|
|
112 dcfsnz isr1_temp,F
|
|
113 movwf ir_buffer+.10
|
|
114 dcfsnz isr1_temp,F
|
|
115 movwf ir_buffer+.11
|
|
116 dcfsnz isr1_temp,F
|
|
117 movwf ir_buffer+.12
|
|
118 dcfsnz isr1_temp,F
|
|
119 movwf ir_buffer+.13
|
|
120 dcfsnz isr1_temp,F
|
|
121 movwf ir_buffer+.14
|
|
122 dcfsnz isr1_temp,F
|
|
123 movwf ir_buffer+.15
|
|
124 clrf TMR3L ; Preload timer
|
|
125 movlw .253
|
|
126 movwf TMR3H
|
|
127 bsf T3CON,TMR3ON ; (Re)Start Timeout counter
|
|
128 return
|
|
129
|
|
130 isr_timer3: ; IR-Link Timeout
|
|
131 bcf T3CON,TMR3ON ; Stop Timer3
|
|
132 banksel isr_backup ; Select Bank0 for ISR data.
|
|
133 movlw .15
|
|
134 cpfseq ir_counter ; Got exact 15bytes?
|
|
135 bra isr_timer3_1 ; No, test for 16bytes
|
|
136 bra isr_timer3_2 ; Got 15 bytes, compute local checksum
|
|
137 isr_timer3_1:
|
|
138 movlw .16
|
|
139 cpfseq ir_counter ; Got exact 16bytes?
|
|
140 bra isr_timer3_exit ; No, exit
|
|
141 tstfsz ir_buffer+.15 ; Last byte=0x00
|
|
142 bra isr_timer3_exit ; No, exit
|
|
143
|
|
144 isr_timer3_2:
|
|
145 movff ir_buffer+.0,PRODL
|
|
146 clrf PRODH
|
|
147 movf ir_buffer+.1,W
|
|
148 rcall isr_timer3_checksum
|
|
149 movf ir_buffer+.2,W
|
|
150 rcall isr_timer3_checksum
|
|
151 movf ir_buffer+.3,W
|
|
152 rcall isr_timer3_checksum
|
|
153 movf ir_buffer+.4,W
|
|
154 rcall isr_timer3_checksum
|
|
155 movf ir_buffer+.5,W
|
|
156 rcall isr_timer3_checksum
|
|
157 movf ir_buffer+.6,W
|
|
158 rcall isr_timer3_checksum
|
|
159 movf ir_buffer+.7,W
|
|
160 rcall isr_timer3_checksum
|
|
161 movf ir_buffer+.8,W
|
|
162 rcall isr_timer3_checksum
|
|
163 movf ir_buffer+.9,W
|
|
164 rcall isr_timer3_checksum
|
|
165 movf ir_buffer+.10,W
|
|
166 rcall isr_timer3_checksum
|
|
167 movf ir_buffer+.11,W
|
|
168 rcall isr_timer3_checksum
|
|
169 movf ir_buffer+.12,W
|
|
170 rcall isr_timer3_checksum
|
|
171
|
|
172 ; Compare checksum
|
|
173 movf ir_buffer+.13,W
|
|
174 cpfseq PRODL ; Checksum ok?
|
|
175 bra isr_timer3_exit ; No, exit
|
|
176 movf ir_buffer+.14,W
|
|
177 cpfseq PRODH ; Checksum ok?
|
|
178 bra isr_timer3_exit ; No, exit
|
|
179
|
|
180 ; Checksum OK, copy results
|
|
181 movff ir_buffer+.1,hud_status_byte
|
|
182 movff ir_buffer+.2,o2_mv_sensor1+0
|
|
183 movff ir_buffer+.3,o2_mv_sensor1+1
|
|
184 movff ir_buffer+.4,o2_mv_sensor2+0
|
|
185 movff ir_buffer+.5,o2_mv_sensor2+1
|
|
186 movff ir_buffer+.6,o2_mv_sensor3+0
|
|
187 movff ir_buffer+.7,o2_mv_sensor3+1
|
|
188 movff ir_buffer+.8,o2_ppo2_sensor1
|
|
189 movff ir_buffer+.9,o2_ppo2_sensor2
|
|
190 movff ir_buffer+.10,o2_ppo2_sensor3
|
|
191 movff ir_buffer+.11,hud_battery_mv+0
|
|
192 movff ir_buffer+.12,hud_battery_mv+1
|
|
193
|
|
194 movlw ir_timeout_value ; multiples of 62,5ms
|
|
195 movwf ir_timeout ; Reload timeout
|
|
196
|
|
197 isr_timer3_exit:
|
|
198 clrf ir_counter ; Clear pointer
|
|
199 bcf PIR2,TMR3IF ; Clear flag
|
|
200 return
|
|
201
|
|
202 isr_timer3_checksum:
|
|
203 addwf PRODL,F
|
|
204 movlw .0
|
|
205 addwfc PRODH,F
|
|
206 return
|
|
207
|
|
208 ;=============================================================================
|
|
209
|
|
210 isr_tmr7: ; each 62,5ms
|
|
211 bcf PIR5,TMR7IF ; clear flag
|
|
212 banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
|
|
213 movlw .248
|
|
214 movwf TMR7H ; -> Rollover after 2048 cycles -> 62,5ms
|
|
215
|
|
216 banksel isr_backup
|
|
217 movf max_CCPR1L,W ; Dimm value
|
|
218 cpfseq CCPR1L ; = current PWM value?
|
|
219 rcall isr_dimm_tft ; No, adjust until max_CCPR1L=CCPR1L !
|
|
220
|
|
221 banksel isr_backup
|
|
222 decfsz ir_timeout,F ; IR Data still valid?
|
|
223 bra isr_tmr7_2 ; Yes, continue
|
|
224 ; timeout, clear IR-Data
|
|
225
|
|
226 movlw ir_timeout_value ; multiples of 62,5ms
|
|
227 movwf ir_timeout ; Reload timeout
|
|
228
|
|
229 banksel common
|
|
230 clrf o2_mv_sensor1+0
|
|
231 clrf o2_mv_sensor1+1
|
|
232 clrf o2_mv_sensor2+0
|
|
233 clrf o2_mv_sensor2+1
|
|
234 clrf o2_mv_sensor3+0
|
|
235 clrf o2_mv_sensor3+1
|
|
236 clrf hud_battery_mv+0
|
|
237 clrf hud_battery_mv+1
|
|
238 clrf hud_status_byte
|
|
239 clrf o2_ppo2_sensor1
|
|
240 clrf o2_ppo2_sensor2
|
|
241 clrf o2_ppo2_sensor3
|
|
242
|
|
243 isr_tmr7_2:
|
|
244 banksel common
|
|
245 btfss no_sensor_int ; No sensor interrupt (because it's addressed during sleep)
|
|
246 bra isr_sensor_state2 ; No, continue
|
|
247 banksel isr_backup ; Back to Bank0 ISR data
|
|
248 return
|
|
249
|
|
250 isr_set_speed_to_normal:
|
|
251 ; Set Speed to normal
|
|
252 movlw b'01110010'
|
|
253 movwf OSCCON ; 16MHz INTOSC
|
|
254 movlw b'00000000'
|
|
255 movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
|
|
256 movlw b'00001101' ; 1:2 Postscaler, 1:4 Prescaler, Timer 2 start -> 1960Hz (no-flicker)
|
|
257 movwf T2CON
|
|
258 btfss OSCCON,HFIOFS
|
|
259 bra $-2 ; Wait until clock is stable
|
|
260 return
|
|
261
|
|
262 isr_sensor_state2:
|
|
263 banksel common
|
|
264 movff sensor_state_counter,WREG
|
|
265 btfss WREG,0 ; every 1/4 second
|
|
266 bsf quarter_second_update ; Set flag
|
|
267 movlw d'2'
|
|
268 cpfseq speed_setting ; Set to normal in case it's not already in normal speed mode
|
|
269 rcall isr_set_speed_to_normal
|
|
270 banksel isr_backup ; Back to Bank0 ISR data
|
|
271
|
|
272 incf sensor_state_counter,F ; counts to eight for state maschine
|
|
273
|
|
274 ; State 1: Clear flags and average registers, get temperature (51us) and start pressure integration (73,5us)
|
|
275 ; State 2: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
|
|
276 ; State 3: Get temperature (51us) and start pressure integration (73,5us)
|
|
277 ; State 4: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
|
|
278 ; State 5: Get temperature (51us) and start pressure integration (73,5us)
|
|
279 ; State 6: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
|
|
280 ; State 7: Get temperature (51us) and start pressure integration (73,5us)
|
|
281 ; State 8: Get pressure (51us), start temperature integration (73,5us), calculate temperature compensated pressure (233us) and build average for half-second update of tempperature and pressure
|
|
282
|
|
283 movff sensor_state_counter,WREG ; WREG used as temp here...
|
|
284 dcfsnz WREG,F
|
|
285 bra sensor_int_state1_plus_restart ; Do State 1
|
|
286 dcfsnz WREG,F
|
|
287 bra sensor_int_state2 ; Do State 2
|
|
288 dcfsnz WREG,F
|
|
289 bra sensor_int_state1 ; Do State 3
|
|
290 dcfsnz WREG,F
|
|
291 bra sensor_int_state2 ; Do State 4
|
|
292 dcfsnz WREG,F
|
|
293 bra sensor_int_state1 ; Do State 5
|
|
294 dcfsnz WREG,F
|
|
295 bra sensor_int_state2 ; Do State 6
|
|
296 dcfsnz WREG,F
|
|
297 bra sensor_int_state1 ; Do State 7
|
|
298 ; bra sensor_int2_plus_average ; Do State 8
|
|
299 ;sensor_int2_plus_average:
|
|
300 ; First, do state2:
|
|
301 call get_pressure_value ; State2: Get pressure (51us)
|
|
302 call get_temperature_start ; and start temperature integration (73,5us)
|
|
303 call calculate_compensation ; calculate temperature compensated pressure (27us)
|
|
304 ; Build average
|
|
305 bcf STATUS,C ; clear carry bit.
|
|
306 rrcf amb_pressure_avg+1 ; amb_pressure sum / 2
|
|
307 rrcf amb_pressure_avg+0
|
|
308 bcf STATUS,C ; clear carry bit, twice.
|
|
309 rrcf amb_pressure_avg+1 ; amb_pressure sum / 4
|
|
310 rrcf amb_pressure_avg+0
|
|
311
|
|
312 ; ; Even more averaging
|
|
313 ; movf amb_pressure_avg+0,W
|
|
314 ; addwf amb_pressure+0
|
|
315 ; movf amb_pressure_avg+1,W
|
|
316 ; addwfc amb_pressure+1
|
|
317 ; bcf STATUS,C ; clear carry bit
|
|
318 ; rrcf amb_pressure+1 ; amb_pressure sum / 2
|
|
319 ; rrcf amb_pressure+0
|
|
320
|
|
321 movff amb_pressure_avg+1,amb_pressure+1 ; copy into actual register
|
|
322 movff amb_pressure_avg+0,amb_pressure+0
|
|
323
|
|
324 bcf STATUS,C
|
|
325 btfsc temperature_avg+1,7 ; Copy sign bit to carry
|
|
326 bsf STATUS,C
|
|
327 rrcf temperature_avg+1 ; Signed temperature /2
|
|
328 rrcf temperature_avg+0
|
|
329 bcf STATUS,C
|
|
330 btfsc temperature_avg+1,7 ; Copy sign bit to carry
|
|
331 bsf STATUS,C
|
|
332 rrcf temperature_avg+1 ; Signed temperature /4
|
|
333 rrcf temperature_avg+0
|
|
334
|
|
335 movff temperature_avg+1,temperature+1 ; copy into actual register
|
|
336 movff temperature_avg+0,temperature+0
|
|
337
|
|
338 banksel common ; flag1 is in Bank1
|
|
339 bsf pressure_refresh ; Set flag! Temp and pressure were updated!
|
|
340 bcf temp_changed ; Clear flag for temperature update
|
|
341 bcf pressure_refresh ; Clear flag for pressure update
|
|
342 banksel isr_backup ; Back to Bank0 ISR data
|
|
343
|
|
344 ; Temp changed?
|
|
345 movf temperature+0,W
|
|
346 cpfseq last_temperature+0
|
|
347 bra isr_sensor_state2_2 ; Yes
|
|
348 movf temperature+1,W
|
|
349 cpfseq last_temperature+1
|
|
350 bra isr_sensor_state2_2 ; Yes
|
|
351
|
|
352 bra isr_sensor_state2_3 ; no change
|
|
353
|
|
354 isr_sensor_state2_2:
|
|
355 banksel common ; flag1 is in Bank1
|
|
356 bsf temp_changed ; Yes
|
|
357 banksel isr_backup ; Back to Bank0 ISR data
|
|
358 isr_sensor_state2_3:
|
|
359 movff temperature+0,last_temperature+0 ; Copy for compare
|
|
360 movff temperature+1,last_temperature+1
|
|
361
|
|
362 movf amb_pressure+0,W
|
|
363 cpfseq last_pressure+0
|
|
364 bra isr_sensor_state2_4 ; Yes
|
|
365 movf amb_pressure+1,W
|
|
366 cpfseq last_pressure+1
|
|
367 bra isr_sensor_state2_4 ; Yes
|
|
368
|
|
369 bra isr_sensor_state2_5 ; No change
|
|
370 isr_sensor_state2_4:
|
|
371 banksel common ; flag1 is in Bank1
|
|
372 bsf pressure_refresh ; Yes
|
|
373 banksel isr_backup ; Back to Bank0 ISR data
|
|
374 isr_sensor_state2_5:
|
|
375 movff amb_pressure+0,last_pressure+0 ; Copy for compare
|
|
376 movff amb_pressure+1,last_pressure+1
|
|
377
|
|
378 clrf sensor_state_counter ; Then reset State counter
|
|
379 btfss simulatormode_active ; are we in simulator mode?
|
|
380 bra comp_air_pressure ; no
|
|
381 comp_air_pressure0:
|
|
382 movlw LOW d'1000' ; yes, so simulate 1000mbar surface pressure
|
|
383 movwf last_surfpressure+0
|
|
384 movlw HIGH d'1000'
|
|
385 movwf last_surfpressure+1
|
|
386 ; Always set pressure_refresh flag in simulator mode
|
|
387 banksel common ; flag1 is in Bank1
|
|
388 bsf pressure_refresh ; Yes
|
|
389 banksel isr_backup ; Back to Bank0 ISR data
|
|
390
|
|
391 comp_air_pressure:
|
|
392 movf last_surfpressure+0,W ; compensate airpressure
|
|
393 subwf amb_pressure+0,W
|
|
394 movwf rel_pressure+0 ; rel_pressure stores depth!
|
|
395
|
|
396 movf last_surfpressure+1,W
|
|
397 subwfb amb_pressure+1,W
|
|
398 movwf rel_pressure+1
|
|
399 btfss STATUS,N ; result is below zero?
|
|
400 bra sensor_int_state_exit
|
|
401 clrf rel_pressure+0 ; Yes, do not display negative depths
|
|
402 clrf rel_pressure+1 ; e.g. when surface air pressure dropped during the dive
|
|
403 bra sensor_int_state_exit
|
|
404
|
|
405 sensor_int_state1_plus_restart:
|
|
406 clrf amb_pressure_avg+0 ; pressure average registers
|
|
407 clrf amb_pressure_avg+1
|
|
408 clrf temperature_avg+0
|
|
409 clrf temperature_avg+1
|
|
410
|
|
411 sensor_int_state1:
|
|
412 call get_temperature_value ; State 1: Get temperature
|
|
413 call get_pressure_start ; and start pressure integration.
|
|
414 bra sensor_int_state_exit
|
|
415
|
|
416 sensor_int_state2:
|
|
417 call get_pressure_value ; State2: Get pressure (51us)
|
|
418 call get_temperature_start ; and start temperature integration (73,5us)
|
|
419 call calculate_compensation ; calculate temperature compensated pressure (233us)
|
|
420 ; bra sensor_int_state_exit
|
|
421 sensor_int_state_exit:
|
|
422 rcall isr_restore_clock ; Restore clock
|
|
423 return
|
|
424 ;=============================================================================
|
|
425
|
|
426 isr_dimm_tft: ; Adjust until max_CCPR1L=CCPR1L !
|
|
427 banksel common
|
|
428 btfsc tft_is_dimming ; Ignore while dimming
|
|
429 return
|
|
430 banksel isr_backup
|
|
431 movf max_CCPR1L,W
|
|
432 cpfsgt CCPR1L ; CCPR1L>max_CCPR1L?
|
|
433 bra isr_dimm_tft2 ; No, dimm up
|
|
434 ; dimm down
|
|
435 decf CCPR1L,F ; -1
|
|
436 return
|
|
437 isr_dimm_tft2:
|
|
438 movf max_CCPR1L,W
|
|
439 sublw .20
|
|
440 cpfsgt CCPR1L ; CCPR1L>max_CCPR1L-20?
|
|
441 bra isr_dimm_tft3 ; No, dimm up slow
|
|
442 ; dimm up faster
|
|
443 movlw .5
|
|
444 addwf CCPR1L,F
|
|
445 isr_dimm_tft3:
|
|
446 incf CCPR1L,F ; +1
|
|
447 return
|
|
448
|
|
449
|
|
450 isr_rtcc: ; each second
|
|
451 bcf PIR3,RTCCIF ; clear flag
|
|
452 banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
|
|
453 bsf RTCCFG,RTCPTR1
|
|
454 bsf RTCCFG,RTCPTR0 ; year
|
|
455 movff RTCVALL,year ; format is BCD!
|
|
456 movff RTCVALH,day ; dummy read
|
|
457 movff RTCVALL,day ; format is BCD!
|
|
458 movff RTCVALH,month ; format is BCD!
|
|
459 movff RTCVALL,hours ; format is BCD!
|
|
460 movff RTCVALH,secs ; format is BCD!
|
|
461 movff RTCVALL,secs ; format is BCD!
|
|
462 movff RTCVALH,mins ; format is BCD!
|
|
463 banksel isr_backup ; Back to Bank0 ISR data
|
|
464
|
|
465 ; Convert BCD to DEC and set registers
|
|
466 movff mins, isr1_temp
|
|
467 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
468 movff WREG,mins
|
|
469 movff secs, isr1_temp
|
|
470 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
471 movff WREG,secs
|
|
472 movff hours, isr1_temp
|
|
473 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
474 movff WREG,hours
|
|
475 movff month, isr1_temp
|
|
476 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
477 movff WREG,month
|
|
478 movff day, isr1_temp
|
|
479 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
480 movff WREG,day
|
|
481 movff year, isr1_temp
|
|
482 rcall isr_rtcc_convert ; Converts to dec with result in WREG
|
|
483 movff WREG,year
|
|
484
|
|
485 ; Place once/second tasks for ISR here (Be sure of the right bank!)
|
|
486 banksel common ; flag1 is in Bank1
|
|
487 btfss sleepmode ; in Sleepmode?
|
|
488 call get_ambient_level ; No, get ambient light level and set max_CCPR1L
|
|
489
|
|
490 rcall isr_battery_gauge ; Add amount of battery consumption to battery_gauge:6
|
|
491
|
|
492 banksel common ; flag1 is in Bank1
|
|
493 bsf onesecupdate ; A new second has begun
|
|
494 btfsc divemode ; in divemode?
|
|
495 rcall isr_divemode_1sec ; Yes, do some divemode stuff in bank common
|
|
496
|
|
497 tstfsz secs ; Secs == 0 ?
|
|
498 return ; No, Done.
|
|
499
|
|
500 ; banksel isr_backup ; Back to Bank0 ISR data
|
|
501 ; movff secs,isr1_temp ; Copy to Bank0
|
|
502 ; movlw d'0'
|
|
503 ; cpfseq isr1_temp ; Secs == 0 ?
|
|
504 ; return ; Done.
|
|
505
|
|
506 ; banksel common ; flag1 is in Bank1
|
|
507 bsf oneminupdate ; A new minute has begun
|
|
508
|
|
509 btfss divemode ; In Divemode?
|
|
510 rcall check_nofly_desat_time ; No, so reduce NoFly and Desat and increase interval
|
|
511
|
|
512 ; Check if a new hour has just begun
|
|
513 ; banksel common ; flag1 is in Bank1
|
|
514 tstfsz mins ; mins=0?
|
|
515 bra isr_rtcc2 ; No
|
|
516 bsf onehourupdate ; Yes, set flag
|
|
517
|
|
518 isr_rtcc2:
|
|
519 banksel isr_backup ; Back to Bank0 ISR data
|
|
520 return ; Done.
|
|
521
|
|
522 isr_battery_gauge:
|
|
523 banksel isr_backup ; Bank0 ISR data
|
|
524 movlw current_sleepmode ; 100µA/3600 -> nAs (Sleepmode current)
|
|
525 movwf isr1_temp ; Store value (low byte)
|
|
526 clrf isr2_temp ; High byte
|
|
527
|
|
528 banksel common ; flag1 is in Bank1
|
|
529 btfss sleepmode ; in Sleepmode?
|
|
530 rcall isr_battery_gauge2 ; No, compute current consumtion value into isr1_temp and isr2_temp
|
|
531
|
|
532 banksel isr_backup ; Bank0 ISR data
|
|
533 movf isr1_temp,W ; 48Bit add of isr1_temp and isr2_temp into battery_gauge:6
|
|
534 addwf battery_gauge+0,F
|
|
535 movf isr2_temp,W
|
|
536 addwfc battery_gauge+1,F
|
|
537 movlw .0
|
|
538 addwfc battery_gauge+2,F
|
|
539 movlw .0
|
|
540 addwfc battery_gauge+3,F
|
|
541 movlw .0
|
|
542 addwfc battery_gauge+4,F
|
|
543 movlw .0
|
|
544 addwfc battery_gauge+5,F
|
|
545 return
|
|
546
|
|
547 isr_battery_gauge2:
|
|
548 ; set consumtion rate in nAs for an one second interval
|
|
549 ; Example:
|
|
550 ; movlw LOW .55556 ; 0,2A/3600*1e9s = nAs
|
|
551 ; movwf isr1_temp ; Low byte
|
|
552 ; movlw HIGH .55556 ; 0,2A/3600*1e9s = nAs
|
|
553 ; movwf isr2_temp ; High byte
|
|
554
|
|
555 ; Current consumption for LED backlight is 47*CCPR1L+272
|
|
556 movf CCPR1L,W
|
|
557 mullw current_backlight_multi
|
|
558 movlw LOW current_backlight_offset
|
|
559 addwf PRODL,F
|
|
560 movlw HIGH current_backlight_offset
|
|
561 addwfc PRODH,F
|
|
562 movff PRODL,isr1_temp
|
|
563 movff PRODH,isr2_temp ; isr1_temp and isr2_temp hold value for backlight
|
|
564
|
|
565 ; Add current for CPU and GPU
|
|
566 ; speed_setting=1: ECO (3,1mA -> 861nAs), =2: NORMAL (5,50mA -> 1528nAs) or =3: FASTEST (8,04mA -> 2233nAs)
|
|
567 movlw .1
|
|
568 cpfseq speed_setting
|
|
569 bra isr_battery_gauge3
|
|
570 banksel isr_backup ; Bank0 ISR data
|
|
571 movlw LOW current_speed_eco
|
|
572 addwf isr1_temp,F
|
|
573 movlw HIGH current_speed_eco
|
|
574 addwfc isr2_temp,F
|
|
575 bra isr_battery_gauge5
|
|
576 isr_battery_gauge3:
|
|
577 movlw .2
|
|
578 cpfseq speed_setting
|
|
579 bra isr_battery_gauge4
|
|
580 banksel isr_backup ; Bank0 ISR data
|
|
581 movlw LOW current_speed_normal
|
|
582 addwf isr1_temp,F
|
|
583 movlw HIGH current_speed_normal
|
|
584 addwfc isr2_temp,F
|
|
585 bra isr_battery_gauge5
|
|
586 isr_battery_gauge4:
|
|
587 ; movlw .3
|
|
588 ; cpfseq speed_setting
|
|
589 ; bra isr_battery_gauge5
|
|
590 banksel isr_backup ; Bank0 ISR data
|
|
591 movlw LOW current_speed_fastest
|
|
592 addwf isr1_temp,F
|
|
593 movlw HIGH current_speed_fastest
|
|
594 addwfc isr2_temp,F
|
|
595 isr_battery_gauge5:
|
|
596 ; Add current if IR reciever is on
|
|
597 btfss ir_power ; IR enabled?
|
|
598 bra isr_battery_gauge6 ; no
|
|
599 movlw LOW current_ir_reciever
|
|
600 addwf isr1_temp,F
|
|
601 movlw HIGH current_ir_reciever
|
|
602 addwfc isr2_temp,F
|
|
603 isr_battery_gauge6:
|
|
604 ; Add current for compass/accelerometer
|
|
605 btfss compass_enabled ; compass active?
|
|
606 bra isr_battery_gauge7 ; no
|
|
607 movlw LOW current_compass
|
|
608 addwf isr1_temp,F
|
|
609 movlw HIGH current_compass
|
|
610 addwfc isr2_temp,F
|
|
611 isr_battery_gauge7:
|
|
612 return
|
|
613
|
|
614 isr_divemode_1sec:
|
|
615 incf samplesecs,F ; "samplingrate" diving seconds done
|
|
616 decf samplesecs_value,W ; holds "samplingrate" value (minus 1 into WREG)
|
|
617 cpfsgt samplesecs ; Done?
|
|
618 bra isr_divemode_1sec2 ; no
|
|
619
|
|
620 clrf samplesecs ; clear counter...
|
|
621 bsf store_sample ; ...and set bit for profile storage
|
|
622 isr_divemode_1sec2:
|
|
623 ; Increase re-setable average depth divetime counter
|
|
624 incf average_divesecs+0,F ; increase stopwatch registers
|
|
625 btfsc STATUS,Z
|
|
626 incf average_divesecs+1,F ; increase stopwatch registers
|
|
627 ; Increase total divetime (Regardless of start_dive_threshold)
|
|
628 incf total_divetime_seconds+0,F
|
|
629 movlw .0
|
|
630 addwfc total_divetime_seconds+1,F ; Total dive time (Regardless of start_dive_threshold)
|
|
631
|
|
632 btfss divemode2 ; displayed divetime is running?
|
|
633 return ; No (e.g. too shallow)
|
|
634
|
|
635 ; increase divetime registers (Displayed dive time)
|
|
636 incf divesecs,F
|
|
637 movlw d'59'
|
|
638 cpfsgt divesecs
|
|
639 bra isr_divemode_1sec2a
|
|
640
|
|
641 clrf divesecs
|
|
642 bsf realdive ; this bit is always set (again) if the dive is longer then one minute
|
|
643 incf divemins+0,F
|
|
644 movlw .0
|
|
645 addwfc divemins+1,F ; increase divemins
|
|
646
|
|
647 isr_divemode_1sec2a:
|
|
648 btfss FLAG_apnoe_mode ; Are we in Apnoe mode?
|
|
649 return ; No
|
|
650
|
|
651 incf apnoe_secs,F ; increase descent registers
|
|
652 movlw d'59'
|
|
653 cpfsgt apnoe_secs ; full minute?
|
|
654 return ; No
|
|
655 clrf apnoe_secs
|
|
656 incf apnoe_mins,F ; increase descent mins
|
|
657 return
|
|
658
|
|
659 ;=============================================================================
|
|
660 ; BCD to Binary convertion.
|
|
661 ; Input: isr1_temp = Value in BCD
|
|
662 ; Output WREG = value in binary.
|
|
663 isr_rtcc_convert:
|
|
664 swapf isr1_temp, W
|
|
665 andlw 0x0F ; W= tens
|
|
666 rlncf WREG, W ; W= 2*tens
|
|
667 subwf isr1_temp, F ; 16*tens + ones - 2*tens
|
|
668 subwf isr1_temp, F ; 14*tens + ones - 2*tens
|
|
669 subwf isr1_temp, W ; 12*tens + ones - 2*tens
|
|
670 return
|
|
671
|
|
672 ;=============================================================================
|
|
673
|
|
674 isr_switch_right: ;
|
|
675 bcf INTCON,INT0IE ; Disable INT0
|
|
676 ; bcf power_sw2 ; Power-down switch circuity
|
|
677 banksel common ; flag1 is in Bank1
|
|
678 bsf switch_right ; Set flag, button press is OK
|
|
679 bra isr_switch_common ; Continue...
|
|
680
|
|
681 isr_switch_left: ;
|
|
682 bcf INTCON3,INT1IE ; Disable INT1
|
|
683 ; bcf power_sw1 ; Power-down switch circuity
|
|
684 banksel common ; flag1 is in Bank1
|
|
685 bsf switch_left ; Set flag, button press is OK
|
|
686
|
|
687 isr_switch_common:
|
|
688 ; load timer1 for first press
|
|
689 clrf TMR1L
|
|
690 movlw TMR1H_VALUE_FIRST ; in steps of 7,8125ms
|
|
691 movwf TMR1H
|
|
692 bsf T1CON,TMR1ON ; Start Timer 1
|
|
693 ; nop
|
|
694 ; nop
|
|
695 ; nop
|
|
696 ; nop
|
|
697 ; nop
|
|
698 ; nop
|
|
699 ; nop
|
|
700 ; nop
|
|
701 ; nop
|
|
702 ; nop
|
|
703 ; nop
|
|
704 ; nop
|
|
705 ; nop
|
|
706 ; nop
|
|
707 ; nop
|
|
708 ; nop
|
|
709 ; nop
|
|
710 ; nop
|
|
711 ; nop
|
|
712 ; nop
|
|
713 ; nop
|
|
714 ; nop
|
|
715 ; nop
|
|
716 ; nop
|
|
717
|
|
718 banksel isr_backup ; Select Bank0 for ISR data.
|
|
719 ; bsf power_sw1
|
|
720 bcf INTCON3,INT1IF ; Clear flag
|
|
721 ; bsf power_sw2 ; Power-up switch circuity
|
|
722 bcf INTCON,INT0IF ; Clear flag
|
|
723 return
|
|
724
|
|
725 timer1int:
|
|
726 bcf PIR1,TMR1IF ; Clear flag
|
|
727 banksel common ; flag1 is in Bank1
|
|
728 btfss switch_left1 ; Left button hold-down?
|
|
729 bra timer1int_left ; Yes
|
|
730 btfss switch_right2 ; Right button hold-down?
|
|
731 bra timer1int_right ; Yes
|
|
732
|
|
733 ; No button hold-down, stop Timer 1
|
|
734 bcf T1CON,TMR1ON ; Stop Timer 1
|
|
735 bsf INTCON,INT0IE ; Enable INT0
|
|
736 bsf INTCON3,INT1IE ; Enable INT1
|
|
737 bcf INTCON,INT0IF ; Clear flag
|
|
738 bcf INTCON3,INT1IF ; Clear flag
|
|
739 ; bcf switch_left
|
|
740 ; bcf switch_right
|
|
741 return
|
|
742
|
|
743 timer1int_left:
|
|
744 ; bcf power_sw1 ; Power-down switch circuity
|
|
745 bsf switch_left ; (Re-)Set flag
|
|
746 bra timer1int_common ; Continue
|
|
747 timer1int_right:
|
|
748 ; bcf power_sw2 ; Power-down switch circuity
|
|
749 bsf switch_right ; (Re-)Set flag
|
|
750 timer1int_common:
|
|
751 ; load timer1 for next press
|
|
752 clrf TMR1L
|
|
753 movlw TMR1H_VALUE_CONT ; Surface mode
|
|
754 btfsc divemode
|
|
755 movlw TMR1H_VALUE_CONT_DIVE ; Dive mode
|
|
756 movwf TMR1H
|
|
757 ; nop
|
|
758 ; nop
|
|
759 ; nop
|
|
760 ; nop
|
|
761 ; nop
|
|
762 ; nop
|
|
763 ; nop
|
|
764 ; nop
|
|
765 ; nop
|
|
766 ; nop
|
|
767 ; nop
|
|
768 ; nop
|
|
769 ; nop
|
|
770 ; nop
|
|
771 ; nop
|
|
772 ; nop
|
|
773 ;
|
|
774 ; nop
|
|
775 ; nop
|
|
776 ; nop
|
|
777 ; nop
|
|
778 ; nop
|
|
779 ; nop
|
|
780 ; nop
|
|
781 ; nop
|
|
782 ; bsf power_sw1
|
|
783 bcf INTCON3,INT1IF ; Clear flag
|
|
784 ; bsf power_sw2 ; Power-up switch circuity
|
|
785 bcf INTCON,INT0IF ; Clear flag
|
|
786 return ; Return from timer1int with timer1 kept running
|
|
787
|
|
788 ;=============================================================================
|
|
789
|
|
790 check_nofly_desat_time:
|
|
791 movf nofly_time+0,W ; Is nofly null ?
|
|
792 iorwf nofly_time+1,W
|
|
793 bz check_nofly_desat_time2 ; yes...
|
|
794
|
|
795 movlw d'1'
|
|
796 subwf nofly_time+0,F
|
|
797 movlw d'0'
|
|
798 subwfb nofly_time+1,F ; reduce by one
|
|
799
|
|
800 check_nofly_desat_time2:
|
|
801 movf desaturation_time+0,W ; Is Desat null ?
|
|
802 iorwf desaturation_time+1,W
|
|
803 bz check_nofly_desat_time3 ; yes...
|
|
804
|
|
805 movlw d'1'
|
|
806 subwf desaturation_time+0,F
|
|
807 movlw d'0'
|
|
808 subwfb desaturation_time+1,F ; reduce by one...
|
|
809
|
|
810 ; Increase surface interval timer
|
|
811 movlw d'1'
|
|
812 addwf surface_interval+0,F
|
|
813 movlw d'0'
|
|
814 addwfc surface_interval+1,F
|
|
815 return ; Done
|
|
816
|
|
817 check_nofly_desat_time3:
|
|
818 clrf surface_interval+0
|
|
819 clrf surface_interval+1 ; Clear surface interval timer
|
|
820 return ; Done.
|
|
821
|
|
822 ;=============================================================================
|
|
823
|
|
824 isr_restore_clock:
|
|
825 banksel isr_backup
|
|
826 movff speed_setting,isr1_temp ; Copy to Bank0
|
|
827 movlw d'1'
|
|
828 cpfseq isr1_temp
|
|
829 bra isr_restore_speed2
|
|
830 ; Reset to eco
|
|
831 movlw b'00000000'
|
|
832 movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
|
|
833 movlw b'00110010'
|
|
834 movwf OSCCON ; 1MHz INTOSC
|
|
835 movlw T2CON_ECO
|
|
836 movwf T2CON
|
|
837 bra isr_restore_exit
|
|
838 isr_restore_speed2:
|
|
839 movlw d'2'
|
|
840 cpfseq isr1_temp
|
|
841 bra isr_restore_speed3
|
|
842 ; Reset to normal
|
|
843 movlw b'01110010'
|
|
844 movwf OSCCON ; 16MHz INTOSC
|
|
845 movlw b'00000000'
|
|
846 movwf OSCTUNE ; 4x PLL Disable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
|
|
847 movlw T2CON_NORMAL
|
|
848 movwf T2CON
|
|
849 bra isr_restore_exit
|
|
850
|
|
851 isr_restore_speed3:
|
|
852 ; Reset to fastest
|
|
853 movlw b'01110010' ; 16MHz INTOSC
|
|
854 movwf OSCCON
|
|
855 movlw b'01000000'
|
|
856 movwf OSCTUNE ; 4x PLL Enable (Bit6) - only works with 8 or 16MHz (=32 or 64MHz)
|
|
857 movlw T2CON_FASTEST
|
|
858 movwf T2CON
|
|
859 ; bra isr_restore_exit
|
|
860 isr_restore_exit:
|
|
861 btfss OSCCON,HFIOFS
|
|
862 bra isr_restore_exit ; loop until PLL is stable
|
|
863 return
|
|
864
|
|
865 END |