Mercurial > public > mk2
comparison code_part1/OSTC_code_asm_part1/isr.asm @ 0:96a35aeda5f2
Initial setup
| author | heinrichsweikamp |
|---|---|
| date | Tue, 12 Jan 2010 15:05:59 +0100 |
| parents | |
| children | 3b30cd739782 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:96a35aeda5f2 |
|---|---|
| 1 | |
| 2 ; OSTC - diving computer code | |
| 3 ; Copyright (C) 2008 HeinrichsWeikamp GbR | |
| 4 | |
| 5 ; This program is free software: you can redistribute it and/or modify | |
| 6 ; it under the terms of the GNU General Public License as published by | |
| 7 ; the Free Software Foundation, either version 3 of the License, or | |
| 8 ; (at your option) any later version. | |
| 9 | |
| 10 ; This program is distributed in the hope that it will be useful, | |
| 11 ; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 13 ; GNU General Public License for more details. | |
| 14 | |
| 15 ; You should have received a copy of the GNU General Public License | |
| 16 ; along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 17 | |
| 18 | |
| 19 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com | |
| 20 ; written: 10/30/05 | |
| 21 ; last updated: 05/16/08 | |
| 22 ; known bugs: | |
| 23 ; ToDo: | |
| 24 | |
| 25 ; the timer1 module interrupts every 62.5ms (16x/second) | |
| 26 ; temperature and pressure is averaged over 4 measurements | |
| 27 ; flag pressure_refresh is set every 500ms | |
| 28 ; and provides accurate pressure (+/-1mBar stable) and temperature (0.1C stable) | |
| 29 | |
| 30 uartint: | |
| 31 btfsc simulatormode_active ; are we in simulatormode? | |
| 32 bra simulator_int ; Yes, reading is depth in m! | |
| 33 | |
| 34 movff RCREG,uart1_temp | |
| 35 movlw d'96' | |
| 36 subwf uart1_temp,F | |
| 37 dcfsnz uart1_temp,F ; "a" | |
| 38 bsf dump_external_eeprom ; set flag | |
| 39 dcfsnz uart1_temp,F ; "b" | |
| 40 bsf uart_settime ; set flag | |
| 41 dcfsnz uart1_temp,F ; "c" | |
| 42 bsf simulatormode_active ; set flag | |
| 43 dcfsnz uart1_temp,F ; "d" | |
| 44 bsf internal_eeprom_write ; set flag | |
| 45 dcfsnz uart1_temp,F ; "e" | |
| 46 bsf uart_send_hash ; set flag | |
| 47 dcfsnz uart1_temp,F ; "f" | |
| 48 bsf uart_compensate_temp ; set flag | |
| 49 dcfsnz uart1_temp,F ; "g" | |
| 50 bsf uart_send_int_eeprom ; set flag | |
| 51 dcfsnz uart1_temp,F ; "h" | |
| 52 bsf uart_reset_decodata ; set flag | |
| 53 dcfsnz uart1_temp,F ; "i" | |
| 54 bsf internal_eeprom_write2 ; set flag | |
| 55 dcfsnz uart1_temp,F ; "j" | |
| 56 bsf uart_send_int_eeprom2 ; set flag | |
| 57 dcfsnz uart1_temp,F ; "k" | |
| 58 bsf uart_store_tissue_data ; set flag | |
| 59 | |
| 60 | |
| 61 uartint1: | |
| 62 movf RCREG,w ; unload RCREG in stand-alone simulator mode | |
| 63 bcf PIR1,RCIF ; Clear flag | |
| 64 bcf RCSTA,CREN ; Clear receiver status | |
| 65 bsf RCSTA,CREN | |
| 66 return | |
| 67 | |
| 68 simulator_int: | |
| 69 btfsc standalone_simulator ; ignore in standalone simulator mode | |
| 70 bra uartint1 | |
| 71 | |
| 72 call set_LEDusb | |
| 73 tstfsz RCREG ; =0x00? | |
| 74 bra simulator_int1 ; No | |
| 75 incf RCREG,F ; Yes, so force RCREG=1 | |
| 76 | |
| 77 simulator_int1: | |
| 78 movf RCREG,w ; depth in m | |
| 79 mullw d'100' ; result will be mbar | |
| 80 movff PRODL,sim_pressure+0 ; stored for pressure overwrite | |
| 81 movff PRODH,sim_pressure+1 | |
| 82 bra uartint1 ; exit uart int | |
| 83 | |
| 84 schalter_links: ; | |
| 85 bcf INTCON,INT0IF ; Clear flag | |
| 86 | |
| 87 btfsc T0CON,TMR0ON ; Timer0 running? | |
| 88 bra timer0_restart ; Yes, restart | |
| 89 | |
| 90 bsf switch_left ; Set flag, button press is OK | |
| 91 | |
| 92 bsf T0CON,TMR0ON ; Start Timer 0 | |
| 93 return | |
| 94 | |
| 95 | |
| 96 schalter_rechts: ; | |
| 97 bcf INTCON3,INT1IF ; Clear flag | |
| 98 | |
| 99 btfsc T0CON,TMR0ON ; Timer0 running? | |
| 100 bra timer0_restart ; Yes, restart | |
| 101 | |
| 102 bsf switch_right ; Set flag, button press is OK | |
| 103 | |
| 104 bsf T0CON,TMR0ON ; Start Timer 0 | |
| 105 return | |
| 106 | |
| 107 timer0_restart: | |
| 108 bcf INTCON,TMR0IF ; Clear flag | |
| 109 | |
| 110 clrf T0CON ; Timer0 | |
| 111 clrf TMR0H | |
| 112 clrf TMR0L | |
| 113 bsf T0CON,TMR0ON ; Start Timer 0 | |
| 114 return | |
| 115 | |
| 116 timer0int: | |
| 117 bcf INTCON,TMR0IF ; Clear flag | |
| 118 bcf T0CON,TMR0ON ; Stop Timer 0 | |
| 119 clrf TMR0H | |
| 120 clrf TMR0L | |
| 121 return | |
| 122 | |
| 123 | |
| 124 timer0int_left_reset: | |
| 125 bcf INTCON2, INTEDG0 ; Interrupt on faling edge again | |
| 126 bcf switch_left_isr ; Clear flag, button press is done | |
| 127 | |
| 128 movlw T0CON_debounce ; Timer0 | |
| 129 movwf T0CON | |
| 130 | |
| 131 bsf T0CON,TMR0ON ; Start Timer 0 | |
| 132 return | |
| 133 | |
| 134 timer0int_left: | |
| 135 bsf INTCON2, INTEDG0 ; Interrupt on rising edge again | |
| 136 return | |
| 137 | |
| 138 timer0int_right_reset: | |
| 139 bcf INTCON2, INTEDG1 ; Interrupt on faling edge again | |
| 140 bcf switch_right_isr ; Clear flag, button press is done | |
| 141 | |
| 142 movlw T0CON_debounce ; Timer0 | |
| 143 movwf T0CON | |
| 144 | |
| 145 bsf T0CON,TMR0ON ; Start Timer 0 | |
| 146 return | |
| 147 | |
| 148 timer0int_right: | |
| 149 bsf INTCON2, INTEDG1 ; Interrupt on rising edge again | |
| 150 return | |
| 151 | |
| 152 timer3int: | |
| 153 bcf PIR2,TMR3IF ; Clear flag | |
| 154 bcf T3CON,TMR0ON ; Stop Timer 3 | |
| 155 bcf T2CON,2 ; stop Timer 2 | |
| 156 return | |
| 157 | |
| 158 timer1int: | |
| 159 bcf PIR1,TMR1IF ; Clear flag | |
| 160 | |
| 161 timer1int_debug: | |
| 162 | |
| 163 call clear_LEDr ; LEDr off (For charge indicator) | |
| 164 | |
| 165 movlw 0x08 ; Timer1 int after 62.5ms (=16/second) | |
| 166 cpfslt TMR1H ; Did we miss a 1/16 second? | |
| 167 incf timer1int_counter1,F ; Yes, add extra 1/16 second | |
| 168 | |
| 169 movlw 0x08 ; Timer1 int after 62.5ms (=16/second) | |
| 170 subwf TMR1H,F | |
| 171 | |
| 172 incf timer1int_counter1,F | |
| 173 movlw d'15' ; One second 16 | |
| 174 cpfsgt timer1int_counter1 | |
| 175 bra sensor_int_pre ; only pressure sensor | |
| 176 call RTCisr ; adjust time, then query pressure sensor | |
| 177 | |
| 178 sensor_int_pre: | |
| 179 btfss sleepmode ; In sleepmode? | |
| 180 bra sensor_int ; No | |
| 181 return | |
| 182 | |
| 183 sensor_int: | |
| 184 btfsc no_sensor_int ; No sensor interrupt (because it's addressed during sleep) | |
| 185 return | |
| 186 | |
| 187 incf timer1int_counter2,F ; counts to eight for state maschine | |
| 188 | |
| 189 movlw d'1' | |
| 190 cpfseq timer1int_counter2 ; State 1? | |
| 191 bra sensor_int1 ; No | |
| 192 | |
| 193 bcf pressure_refresh ; clear flags | |
| 194 clrf isr3_temp+0 ; pressure average registers | |
| 195 clrf isr3_temp+1 | |
| 196 clrf temperature_temp+0 | |
| 197 clrf temperature_temp+1 | |
| 198 sensor_int0: | |
| 199 call get_temperature_value ; State 1: Get temperature | |
| 200 call get_pressure_start ; and start pressure integration. | |
| 201 return ; Done. | |
| 202 sensor_int1: | |
| 203 movlw d'2' | |
| 204 cpfseq timer1int_counter2 ; State 2? | |
| 205 bra sensor_int2 ; No | |
| 206 | |
| 207 sensor_int1_1: | |
| 208 call get_pressure_value ; State2: Get pressure (51us) | |
| 209 call get_temperature_start ; and start temperature integration (73,5us) | |
| 210 call calculate_compensation ; calculate temperature compensated pressure (233us) | |
| 211 movf amb_pressure+0,W | |
| 212 addwf isr3_temp+0 ; average pressure | |
| 213 movf amb_pressure+1,W | |
| 214 addwfc isr3_temp+1 | |
| 215 movf temperature+0,W | |
| 216 addwf temperature_temp+0 ; average temperature | |
| 217 movf temperature+1,W | |
| 218 addwfc temperature_temp+1 | |
| 219 return | |
| 220 sensor_int2: | |
| 221 movlw d'3' | |
| 222 cpfseq timer1int_counter2 ; State 3? | |
| 223 bra sensor_int3 ; No | |
| 224 bra sensor_int0 ; Yes, but same as State 1! | |
| 225 sensor_int3: | |
| 226 movlw d'4' | |
| 227 cpfseq timer1int_counter2 ; State 4? | |
| 228 bra sensor_int4 ; No | |
| 229 bra sensor_int1_1 ; Yes, but same as State 2! | |
| 230 sensor_int4: | |
| 231 movlw d'5' | |
| 232 cpfseq timer1int_counter2 ; State 5? | |
| 233 bra sensor_int5 ; No | |
| 234 bra sensor_int0 ; Yes, but same as State 1! | |
| 235 sensor_int5: | |
| 236 movlw d'6' | |
| 237 cpfseq timer1int_counter2 ; State 6? | |
| 238 bra sensor_int6 ; No | |
| 239 bra sensor_int1_1 ; Yes, but same as State 2! | |
| 240 sensor_int6: | |
| 241 movlw d'7' | |
| 242 cpfseq timer1int_counter2 ; State 7? | |
| 243 bra sensor_int7 ; No | |
| 244 bra sensor_int0 ; Yes, but same as State 1! | |
| 245 sensor_int7: | |
| 246 rcall sensor_int1_1 ; Do State 2... | |
| 247 clrf timer1int_counter2 ; ..then reset State counter... | |
| 248 movlw d'2' ; and calculate average! | |
| 249 movwf isr2_temp | |
| 250 sensor_int8: | |
| 251 bcf STATUS,C | |
| 252 rrcf isr3_temp+1 ; isr3_temp / 2 | |
| 253 rrcf isr3_temp+0 | |
| 254 bcf STATUS,C | |
| 255 rrcf temperature_temp+1 ; temperature_temp /2 | |
| 256 rrcf temperature_temp+0 | |
| 257 decfsz isr2_temp,F | |
| 258 bra sensor_int8 ; once more | |
| 259 | |
| 260 movff isr3_temp+1,amb_pressure+1 ; copy into actual register | |
| 261 movff isr3_temp+0,amb_pressure+0 | |
| 262 | |
| 263 movff temperature_temp+1,temperature+1 | |
| 264 movff temperature_temp+0,temperature+0 | |
| 265 | |
| 266 bsf pressure_refresh ; Set flag! Temp and pressure were updated! | |
| 267 | |
| 268 btfss simulatormode_active ; are we in simulator mode? | |
| 269 bra comp_air_pressure ; no | |
| 270 | |
| 271 comp_air_pressure0: | |
| 272 movlw LOW d'1000' ; yes, so simulate 1Bar surface pressure | |
| 273 movwf last_surfpressure+0 | |
| 274 movlw HIGH d'1000' | |
| 275 movwf last_surfpressure+1 | |
| 276 | |
| 277 comp_air_pressure: | |
| 278 bcf neg_flag | |
| 279 movf last_surfpressure+0,W ; compensate airpressure | |
| 280 subwf amb_pressure+0,W | |
| 281 movwf rel_pressure+0 ; rel_pressure stores depth! | |
| 282 | |
| 283 movf last_surfpressure+1,W | |
| 284 subwfb amb_pressure+1,W | |
| 285 movwf rel_pressure+1 | |
| 286 btfss STATUS,N ; result is below zero? | |
| 287 return | |
| 288 clrf rel_pressure+0 ; Yes, do not display negative depths | |
| 289 clrf rel_pressure+1 ; e.g. when surface air pressure dropped during the dive | |
| 290 return | |
| 291 | |
| 292 RTCisr: | |
| 293 clrf timer1int_counter1 ; counts to 16 (one second / 62.5ms) | |
| 294 bsf onesecupdate ; we have a new second! | |
| 295 | |
| 296 bcf STATUS,Z ; are we in dive mode? | |
| 297 btfss divemode | |
| 298 bra RTCisr2 ; No, must be surface or sleepmode | |
| 299 | |
| 300 incf samplesecs,F ; CF20 diving seconds done | |
| 301 decf samplesecs_value,W ; holds CF20 value (minus 1 into WREG) | |
| 302 cpfsgt samplesecs | |
| 303 bra RTCisr1 ; no | |
| 304 | |
| 305 clrf samplesecs ; clear counter... | |
| 306 bsf store_sample ; ...and set bit for profile storage | |
| 307 RTCisr1: | |
| 308 ; Increase re-setable average depth divetime counter | |
| 309 incf average_divesecs+0,F ; increase divetime registers | |
| 310 btfsc STATUS,Z | |
| 311 incf average_divesecs+1,F ; increase divetime registers | |
| 312 | |
| 313 btfss divemode2 ; displayed divetime is running? | |
| 314 bra RTCisr2 ; No (e.g. too shallow) | |
| 315 | |
| 316 incf divesecs,F ; increase divetime registers | |
| 317 movlw d'59' | |
| 318 cpfsgt divesecs | |
| 319 bra RTCisr1a | |
| 320 clrf divesecs | |
| 321 bsf realdive ; this bit is always set (again) if the dive is longer then one minute | |
| 322 | |
| 323 incf divemins+0,F ; increase divemins | |
| 324 btfsc STATUS,Z | |
| 325 incf divemins+1,F ; and now do the realtime clock routine anyway | |
| 326 | |
| 327 RTCisr1a: | |
| 328 btfss FLAG_apnoe_mode ; Are we in Apnoe mode? | |
| 329 bra RTCisr2 ; No, skip the following | |
| 330 | |
| 331 incf apnoe_secs,F ; increase descent registers | |
| 332 movlw d'59' | |
| 333 cpfsgt apnoe_secs | |
| 334 bra RTCisr2 | |
| 335 clrf apnoe_secs | |
| 336 | |
| 337 incf apnoe_mins,F ; increase descent mins | |
| 338 ; Now, do the RTC routine.... | |
| 339 RTCisr2: | |
| 340 incf secs,F ; adjusts seconds, minutes, hours, day, month and year. Checks for a leap year and works until 2099! | |
| 341 movlw d'59' | |
| 342 cpfsgt secs | |
| 343 return | |
| 344 clrf secs | |
| 345 bsf oneminupdate | |
| 346 incf mins,F | |
| 347 movlw d'59' | |
| 348 cpfsgt mins | |
| 349 return | |
| 350 clrf mins | |
| 351 incf hours,F | |
| 352 movlw d'23' | |
| 353 cpfsgt hours | |
| 354 return | |
| 355 clrf hours | |
| 356 incf day,F | |
| 357 check_date: | |
| 358 movff month,isr_divB ; new month? | |
| 359 dcfsnz isr_divB,F | |
| 360 movlw .31 | |
| 361 dcfsnz isr_divB,F | |
| 362 movlw .28 | |
| 363 dcfsnz isr_divB,F | |
| 364 movlw .31 | |
| 365 dcfsnz isr_divB,F | |
| 366 movlw .30 | |
| 367 dcfsnz isr_divB,F | |
| 368 movlw .31 | |
| 369 dcfsnz isr_divB,F | |
| 370 movlw .30 | |
| 371 dcfsnz isr_divB,F | |
| 372 movlw .31 | |
| 373 dcfsnz isr_divB,F | |
| 374 movlw .31 | |
| 375 dcfsnz isr_divB,F | |
| 376 movlw .30 | |
| 377 dcfsnz isr_divB,F | |
| 378 movlw .31 | |
| 379 dcfsnz isr_divB,F | |
| 380 movlw .30 | |
| 381 dcfsnz isr_divB,F | |
| 382 movlw .31 | |
| 383 cpfsgt day,1 | |
| 384 return | |
| 385 movlw .1 | |
| 386 movwf day | |
| 387 incf month,F | |
| 388 movlw .12 | |
| 389 cpfsgt month,1 | |
| 390 return | |
| 391 movlw .1 | |
| 392 movwf month | |
| 393 incf year,F | |
| 394 return |
