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