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