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