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