0
|
1 ; OSTC - diving computer code
|
|
2 ; Copyright (C) 2008 HeinrichsWeikamp GbR
|
|
3
|
|
4 ; This program is free software: you can redistribute it and/or modify
|
|
5 ; it under the terms of the GNU General Public License as published by
|
|
6 ; the Free Software Foundation, either version 3 of the License, or
|
|
7 ; (at your option) any later version.
|
|
8
|
|
9 ; This program is distributed in the hope that it will be useful,
|
|
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12 ; GNU General Public License for more details.
|
|
13
|
|
14 ; You should have received a copy of the GNU General Public License
|
|
15 ; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
|
17
|
|
18 ; Start and init
|
|
19 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com
|
|
20 ; written: 10/13/04
|
|
21 ; last updated: 06/24/08
|
|
22 ; known bugs:
|
|
23 ; ToDo:
|
|
24
|
|
25 start:
|
|
26 movlb b'00000001' ; ram bank 1 selected
|
|
27 call init
|
|
28 btfsc divemode ; Reset from Divemode?
|
|
29 call PLED_resetdebugger ; Yes! Something went wrong, show reset informations
|
|
30
|
|
31 clrf STKPTR ; Clear Stackpointer
|
|
32 lfsr FSR0, 109h ; Clear rambank 1-9, do not delete RTC registers
|
|
33 clear_rambank:
|
|
34 clrf POSTINC0
|
|
35 movlw 0x0A
|
|
36 cpfseq FSR0H ; Bank 9 done?
|
|
37 bra clear_rambank ; clear...
|
|
38
|
|
39 ; Defaults for RTC
|
|
40 call disable_rs232 ; disable UART module
|
|
41 call RTCinit ; reset RTC
|
|
42
|
|
43 ; Air pressure compensation after reset
|
|
44 call get_calibration_data ; Get calibration data from pressure sensor
|
|
45
|
|
46 bcf pressure_refresh
|
|
47 wait_start_pressure:
|
|
48 btfss pressure_refresh ; Air pressure compensation
|
|
49 bra wait_start_pressure
|
|
50
|
|
51 clrf rel_pressure+0
|
|
52 clrf rel_pressure+1
|
|
53 clrf surface_interval+0
|
|
54 clrf surface_interval+1
|
|
55
|
|
56 bsf sleepmode ; Routine only works in sleepmode...
|
|
57 call pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
|
|
58 bcf sleepmode ; Normal mode again
|
|
59
|
|
60 movff amb_pressure+0,last_surfpressure+0
|
|
61 movff amb_pressure+1,last_surfpressure+1
|
|
62 movff amb_pressure+0,last_surfpressure_15min+0
|
|
63 movff amb_pressure+1,last_surfpressure_15min+1
|
|
64 movff amb_pressure+0,last_surfpressure_30min+0
|
|
65 movff amb_pressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers
|
|
66
|
|
67 ; reset deco data
|
|
68 incf nofly_time+0,F ; =1
|
|
69 clrf wait_temp ; Use as buffer
|
|
70 movff wait_temp,char_I_He_ratio ; No He at the Surface
|
|
71 movlw d'79' ; 79% N2
|
|
72 movwf wait_temp ; Use as buffer
|
|
73 movff wait_temp,char_I_N2_ratio ; No He at the Surface
|
|
74 movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
|
|
75 movff amb_pressure+1,int_I_pres_respiration+1
|
|
76
|
|
77 call deco_main_clear_tissue ;
|
|
78 movlb b'00000001' ; select ram bank 1
|
|
79 call deco_main_calc_desaturation_time; calculate desaturation time
|
|
80 movlb b'00000001' ; select ram bank 1
|
|
81 call main_clear_CNS_fraction ; clear CNS
|
|
82 movlb b'00000001' ; select ram bank 1
|
|
83 call calc_deko_surfmode ; calculate desaturation every minute
|
|
84 movlb b'00000001' ; select ram bank 1
|
|
85 call deco_main_calc_wo_deco_step_1_m ; calculate deco in surface mode
|
|
86 movlb b'00000001' ; select ram bank 1
|
|
87
|
|
88 ; check firmware and reset Custom Functions after an update
|
|
89 movlw LOW 0x101
|
|
90 movwf EEADR
|
|
91 movlw HIGH 0x101
|
|
92 movwf EEADRH
|
|
93 call read_eeprom ; read current version x
|
|
94 movff EEDATA,temp1
|
|
95 incf EEADR,F ; set to 0x102
|
|
96 call read_eeprom ; read current version y
|
|
97 movff EEDATA,temp2
|
|
98 clrf EEADRH ; Reset EEADRH
|
|
99
|
|
100 movlw softwareversion_x
|
|
101 cpfseq temp1 ; compare version x
|
|
102 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
|
|
103
|
|
104 movlw softwareversion_y
|
|
105 cpfseq temp2 ; compare version y
|
|
106 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
|
|
107 bra restart ; x and y are equal -> do not reset cf
|
|
108
|
|
109 check_firmware_new:
|
|
110 movlw LOW 0x101 ; store current version in EEPROM
|
|
111 movwf EEADR
|
|
112 movlw HIGH 0x101
|
|
113 movwf EEADRH
|
|
114 movlw softwareversion_x
|
|
115 movwf EEDATA
|
|
116 call write_eeprom ; write version x
|
|
117 incf EEADR,F ; set to 0x102
|
|
118 movlw softwareversion_y
|
|
119 movwf EEDATA
|
|
120 call write_eeprom ; write version y
|
|
121 clrf EEADRH ; Reset EEADRH
|
|
122 ; goto reset_all_cf ; resets all custom functions bank0 and bank1 and jumps to "restart"
|
|
123 ; goto reset_all_cf_bank1 ; resets all custom functions bank1 and jumps to "restart"
|
|
124
|
|
125 restart:
|
|
126 call clear_LEDr
|
|
127 call clear_LEDnofly ; all LEDs off
|
|
128 call PLED_boot ; PLED boot (Incl. Clear Screen!)
|
|
129 WIN_TOP .0
|
|
130 WIN_LEFT .0
|
|
131 WIN_FONT FT_SMALL
|
|
132 WIN_INVERT .0 ; Init new Wordprocessor
|
|
133 movlw 0xFF
|
|
134 movwf oled1_temp
|
|
135 movff oled1_temp,win_color1
|
|
136 movlw 0xFF
|
|
137 movwf oled1_temp
|
|
138 movff oled1_temp,win_color2
|
|
139 call I2CReset ; Just in Case any I2C device blocks the Bus
|
|
140 movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure
|
|
141 movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure
|
|
142
|
|
143 ; Check if new CF were added in the last firmware version
|
|
144 clrf EEADRH
|
|
145 read_int_eeprom d'92' ; Read number of CF used in this firmware
|
|
146 movlw max_custom_number ; Defined in definitions.asm
|
|
147 cpfseq EEDATA ; Compare with last version
|
|
148 bra restart_01 ; New CF, show warning and store new number
|
|
149 bra restart_1 ; No new CF, continue with boot
|
|
150 restart_01:
|
|
151 ; Save new number of current CF count
|
|
152 rcall display_new_cf_installed; Show warning
|
|
153 movlw max_custom_number ; Defined in definitions.asm
|
|
154 movwf EEDATA
|
|
155 write_int_eeprom d'92' ; Store number of CF used in this firmware
|
|
156
|
|
157 restart_1:
|
|
158 GETCUSTOM15 .31
|
|
159 movlw LOW .666
|
|
160 cpfseq lo
|
|
161 bra restart_2 ; Not equal!
|
|
162 movlw HIGH .666
|
|
163 cpfseq hi
|
|
164 bra restart_2 ; Not equal!
|
|
165 bra restart_3 ; Skip screen....
|
|
166
|
|
167 restart_2:
|
|
168 btfsc show_startup_screen ; Show start screen?
|
|
169 call startup_screen1 ;1/2
|
|
170 btfsc show_startup_screen ; Show start screen?
|
|
171 call startup_screen2 ;2/2
|
|
172
|
|
173 restart_3:
|
|
174 clrf flag1 ; clear all flags
|
|
175 clrf flag2
|
|
176 clrf flag3
|
|
177 clrf flag4
|
|
178 clrf flag5
|
|
179 clrf flag6
|
|
180 clrf flag7
|
|
181 clrf flag8
|
|
182 clrf flag9
|
|
183 clrf flag10
|
|
184 clrf flag11
|
|
185 clrf flag12
|
|
186 clrf flag13
|
|
187 clrf flag14
|
|
188 clrf flag15
|
|
189
|
|
190 ; Set Debug mode?
|
|
191 read_int_eeprom d'39'
|
|
192 bsf debug_mode
|
|
193 movlw d'1'
|
|
194 cpfseq EEDATA
|
|
195 bcf debug_mode ; clear flag if <> 1
|
|
196
|
|
197 goto surfloop ; Jump to Surfaceloop!
|
|
198
|
|
199
|
|
200 display_new_cf_installed:
|
|
201 call PLED_new_cf_warning ; Display new CF warning screen
|
|
202 movlw d'20' ; timeout for warning screen
|
|
203 bra startup_screen3a ; Will RETURN after timeout or button press
|
|
204
|
|
205 restart_set_modes_and_flags: ; "Call"ed from divemode, as well!
|
|
206 bcf gauge_mode
|
|
207 bcf FLAG_const_ppO2_mode
|
|
208 bcf FLAG_apnoe_mode
|
|
209 clrf EEADRH
|
|
210 read_int_eeprom d'34' ; Read deco data
|
|
211 movlw d'1' ; Gauge mode
|
|
212 cpfseq EEDATA
|
|
213 bra restart_3_test_ppO2_mode; check for ppO2 mode
|
|
214 bsf gauge_mode ; Set flag for gauge mode
|
|
215 movlw d'0'
|
|
216 movwf wait_temp
|
|
217 movff wait_temp,char_I_deco_model ; Clear Flagbyte
|
|
218 return ; start in Surfacemode
|
|
219 restart_3_test_ppO2_mode:
|
|
220 movlw d'2' ; const ppO2 mode
|
|
221 cpfseq EEDATA
|
|
222 bra restart_3_test_apnoe_mode; check for apnoe mode
|
|
223 bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode
|
|
224 movlw d'0'
|
|
225 movwf wait_temp
|
|
226 movff wait_temp,char_I_deco_model ; Clear Flagbyte
|
|
227 return ; start in Surfacemode
|
|
228 restart_3_test_apnoe_mode:
|
|
229 movlw d'3' ; Apnoe mode
|
|
230 cpfseq EEDATA
|
|
231 bra restart_4_test_gf_mode ; check for GF OC mode
|
|
232 bsf FLAG_apnoe_mode ; Set flag for Apnoe Mode
|
|
233 movlw d'0'
|
|
234 movwf wait_temp
|
|
235 movff wait_temp,char_I_deco_model ; Clear Flagbyte
|
|
236 return ; start in Surfacemode
|
|
237 restart_4_test_gf_mode:
|
|
238 movlw d'4' ; GF OC mode
|
|
239 cpfseq EEDATA
|
|
240 bra restart_5_test_gfO2_mode; check for GF CC mode
|
|
241 movlw d'1'
|
|
242 movwf wait_temp
|
|
243 movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method
|
|
244 return ; start in Surfacemode
|
|
245 restart_5_test_gfO2_mode:
|
|
246 movlw d'5' ; GF CC mode
|
|
247 cpfseq EEDATA
|
|
248 return ; Start in Surfacemode
|
|
249 bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode
|
|
250 movlw d'1'
|
|
251 movwf wait_temp
|
|
252 movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method
|
|
253 return ; start in Surfacemode
|
|
254
|
|
255 startup_screen1:
|
|
256 call PLED_ClearScreen
|
|
257 call PLED_startupscreen1 ; show startup sreen
|
|
258 startup_screen1_2:
|
|
259 movlw d'10' ; timeout for startup screen
|
|
260 movwf temp1
|
|
261 WAITMS d'200'
|
|
262 bcf switch_left
|
|
263 bcf switch_right
|
|
264 screen1_loop:
|
|
265 btfsc onesecupdate ; do every second tasks?
|
|
266 call set_dive_modes ; tests if depth>threshold
|
|
267 btfsc onesecupdate ; do every second tasks?
|
|
268 decf temp1,F
|
|
269 bcf onesecupdate ; every second tasks done
|
|
270
|
|
271 tstfsz temp1 ; timout occured?
|
|
272 bra screen1_loop2 ; no
|
|
273 return
|
|
274
|
|
275 screen1_loop2:
|
|
276 btfsc divemode ; Divemode active?
|
|
277 return
|
|
278 btfsc switch_left ; Ack?
|
|
279 return
|
|
280 btfsc switch_right ; Ack?
|
|
281 return
|
|
282 bra screen1_loop ; loop screen
|
|
283
|
|
284 startup_screen2:
|
|
285 call PLED_ClearScreen ; Page 1
|
|
286 call PLED_startupscreen2 ; show startup sreen
|
|
287 bra startup_screen1_2
|
|
288
|
|
289 startup_screen3a:; WARNING: Also used for decodescriptions and CF Warning screen!
|
|
290 movwf temp1
|
|
291 WAITMS d'200'
|
|
292 bcf switch_left
|
|
293 bcf switch_right
|
|
294 screen3_loop:
|
|
295 btfsc onesecupdate ; do every second tasks?
|
|
296 call set_dive_modes ; tests if depth>threshold
|
|
297
|
|
298 btfsc onesecupdate ; do every second tasks?
|
|
299 decf temp1,F
|
|
300 bcf onesecupdate ; every second tasks done
|
|
301
|
|
302 tstfsz temp1 ; timout occured?
|
|
303 bra screen3_loop2 ; no
|
|
304 return
|
|
305 screen3_loop2:
|
|
306 btfsc switch_left ; Ack?
|
|
307 return
|
|
308 btfsc switch_right ; Ack?
|
|
309 return
|
|
310 bra screen3_loop ; loop screen
|
|
311
|
|
312 init:
|
|
313 movlw b'01101100' ; 4MHz (x4 PLL)
|
|
314 movwf OSCCON
|
|
315
|
|
316 movlw b'00010001' ; I/O Ports
|
|
317 movwf TRISA
|
|
318 clrf PORTA
|
|
319 movlw b'00000011'
|
|
320 movwf TRISB
|
|
321 clrf PORTB
|
|
322 movlw b'11011101' ; UART
|
|
323 movwf TRISC
|
|
324 clrf PORTC
|
|
325 movlw b'00000000'
|
|
326 movwf TRISE
|
|
327 clrf PORTE
|
|
328 movlw b'00000000'
|
|
329 movwf TRISD
|
|
330 clrf PORTD
|
|
331
|
|
332 movlw b'01000000' ; Bit6: PPL enable
|
|
333 movwf OSCTUNE
|
|
334
|
|
335 movlw b'00011111' ; Timer0
|
|
336 movwf T0CON
|
|
337
|
|
338 movlw b'00000111' ; Timer1
|
|
339 movwf T1CON
|
|
340
|
|
341 movlw b'11010000' ; Interrups
|
|
342 movwf INTCON
|
|
343 movlw b'00000101'
|
|
344 movwf INTCON2
|
|
345 movlw b'00001000'
|
|
346 movwf INTCON3
|
|
347 movlw b'00100001'
|
|
348 movwf PIE1
|
|
349 movlw b'00000000'
|
|
350 movwf PIE2
|
|
351 clrf RCON
|
|
352
|
|
353 movlw b'00000000' ; A/D Converter
|
|
354 movwf ADCON0
|
|
355 movlw b'00001110'
|
|
356 movwf ADCON1
|
|
357 movlw b'10001010' ; Right justified
|
|
358 movwf ADCON2
|
|
359
|
|
360 clrf SSPCON1 ; Set I²C Mode
|
|
361 movlw b'00000000'
|
|
362 movwf SSPSTAT
|
|
363 movlw b'00101000'
|
|
364 movwf SSPCON1
|
|
365 movlw b'00000000'
|
|
366 movwf SSPCON2
|
|
367 movlw d'8' ; 400kHz I2C clock @ 16MHz Fcy
|
|
368 movwf SSPADD
|
|
369
|
|
370 clrf CCP1CON ; PWM Module off
|
|
371 clrf ECCP1CON ; PWM Module off
|
|
372
|
|
373 movlw b'00000111' ; Comperator Module off
|
|
374 movwf CMCON
|
|
375
|
|
376 movlw b'00100000'
|
|
377 movwf CANCON ; ECAN Module OFF
|
|
378
|
|
379 movlw b'00100100' ; UART
|
|
380 movwf TXSTA
|
|
381 movlw b'10010000'
|
|
382 movwf RCSTA
|
|
383 movlw b'00001000'
|
|
384 movwf BAUDCON
|
|
385 clrf SPBRGH
|
|
386 movlw d'34'
|
|
387 movwf SPBRG
|
|
388 clrf RCREG
|
|
389 clrf PIR1
|
|
390 return
|