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
|
31
|
77 movlw d'0'
|
|
78 movff WREG,char_I_step_is_1min ; 2 second deco mode
|
32
|
79 call deco_main_clear_tissue ;
|
|
80 movlb b'00000001' ; select ram bank 1
|
0
|
81 call deco_main_calc_desaturation_time; calculate desaturation time
|
|
82 movlb b'00000001' ; select ram bank 1
|
|
83 call main_clear_CNS_fraction ; clear CNS
|
|
84 movlb b'00000001' ; select ram bank 1
|
|
85 call calc_deko_surfmode ; calculate desaturation every minute
|
|
86 movlb b'00000001' ; select ram bank 1
|
|
87 call deco_main_calc_wo_deco_step_1_m ; calculate deco in surface mode
|
|
88 movlb b'00000001' ; select ram bank 1
|
|
89
|
|
90 ; check firmware and reset Custom Functions after an update
|
|
91 movlw LOW 0x101
|
|
92 movwf EEADR
|
|
93 movlw HIGH 0x101
|
|
94 movwf EEADRH
|
|
95 call read_eeprom ; read current version x
|
|
96 movff EEDATA,temp1
|
|
97 incf EEADR,F ; set to 0x102
|
|
98 call read_eeprom ; read current version y
|
|
99 movff EEDATA,temp2
|
|
100 clrf EEADRH ; Reset EEADRH
|
|
101
|
|
102 movlw softwareversion_x
|
|
103 cpfseq temp1 ; compare version x
|
|
104 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
|
|
105
|
|
106 movlw softwareversion_y
|
|
107 cpfseq temp2 ; compare version y
|
|
108 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
|
|
109 bra restart ; x and y are equal -> do not reset cf
|
|
110
|
|
111 check_firmware_new:
|
|
112 movlw LOW 0x101 ; store current version in EEPROM
|
|
113 movwf EEADR
|
|
114 movlw HIGH 0x101
|
|
115 movwf EEADRH
|
|
116 movlw softwareversion_x
|
|
117 movwf EEDATA
|
|
118 call write_eeprom ; write version x
|
|
119 incf EEADR,F ; set to 0x102
|
|
120 movlw softwareversion_y
|
|
121 movwf EEDATA
|
|
122 call write_eeprom ; write version y
|
|
123 clrf EEADRH ; Reset EEADRH
|
|
124 ; goto reset_all_cf ; resets all custom functions bank0 and bank1 and jumps to "restart"
|
3
|
125 goto reset_all_cf_bank1 ; resets all custom functions bank1 and jumps to "restart"
|
0
|
126
|
|
127 restart:
|
21
|
128 bcf LED_red
|
|
129 bcf LED_blue ; all LEDs off
|
15
|
130
|
|
131 clrf flag1 ; clear all flags
|
|
132 clrf flag2
|
|
133 clrf flag3
|
|
134 clrf flag4
|
|
135 clrf flag5
|
|
136 clrf flag6
|
|
137 clrf flag7
|
|
138 clrf flag8
|
|
139 clrf flag9
|
|
140 clrf flag10
|
|
141 clrf flag11
|
|
142 clrf flag12
|
|
143 clrf flag13
|
|
144 clrf flag14
|
|
145 clrf flag15
|
|
146
|
0
|
147 call PLED_boot ; PLED boot (Incl. Clear Screen!)
|
|
148 WIN_TOP .0
|
|
149 WIN_LEFT .0
|
|
150 WIN_FONT FT_SMALL
|
|
151 WIN_INVERT .0 ; Init new Wordprocessor
|
|
152 movlw 0xFF
|
|
153 movwf oled1_temp
|
|
154 movff oled1_temp,win_color1
|
|
155 movlw 0xFF
|
|
156 movwf oled1_temp
|
|
157 movff oled1_temp,win_color2
|
|
158 call I2CReset ; Just in Case any I2C device blocks the Bus
|
|
159 movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure
|
|
160 movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure
|
|
161
|
|
162 ; Check if new CF were added in the last firmware version
|
|
163 clrf EEADRH
|
|
164 read_int_eeprom d'92' ; Read number of CF used in this firmware
|
|
165 movlw max_custom_number ; Defined in definitions.asm
|
|
166 cpfseq EEDATA ; Compare with last version
|
|
167 bra restart_01 ; New CF, show warning and store new number
|
|
168 bra restart_1 ; No new CF, continue with boot
|
|
169 restart_01:
|
|
170 ; Save new number of current CF count
|
|
171 rcall display_new_cf_installed; Show warning
|
|
172 movlw max_custom_number ; Defined in definitions.asm
|
|
173 movwf EEDATA
|
|
174 write_int_eeprom d'92' ; Store number of CF used in this firmware
|
|
175
|
|
176 restart_1:
|
15
|
177 ; btfss pressure_refresh ; Wait for pressure sensor...
|
|
178 ; bra restart_1 ; loop until pressure and temp stable
|
12
|
179 ;
|
0
|
180
|
|
181 ; Set Debug mode?
|
|
182 read_int_eeprom d'39'
|
|
183 bsf debug_mode
|
|
184 movlw d'1'
|
|
185 cpfseq EEDATA
|
|
186 bcf debug_mode ; clear flag if <> 1
|
|
187
|
|
188 goto surfloop ; Jump to Surfaceloop!
|
|
189
|
|
190
|
|
191 display_new_cf_installed:
|
|
192 call PLED_new_cf_warning ; Display new CF warning screen
|
|
193 movlw d'20' ; timeout for warning screen
|
|
194 bra startup_screen3a ; Will RETURN after timeout or button press
|
|
195
|
|
196 restart_set_modes_and_flags: ; "Call"ed from divemode, as well!
|
|
197 bcf gauge_mode
|
|
198 bcf FLAG_const_ppO2_mode
|
|
199 bcf FLAG_apnoe_mode
|
|
200 clrf EEADRH
|
|
201 read_int_eeprom d'34' ; Read deco data
|
|
202 movlw d'1' ; Gauge mode
|
|
203 cpfseq EEDATA
|
|
204 bra restart_3_test_ppO2_mode; check for ppO2 mode
|
|
205 bsf gauge_mode ; Set flag for gauge mode
|
|
206 movlw d'0'
|
|
207 movwf wait_temp
|
|
208 movff wait_temp,char_I_deco_model ; Clear Flagbyte
|
|
209 return ; start in Surfacemode
|
|
210 restart_3_test_ppO2_mode:
|
|
211 movlw d'2' ; const ppO2 mode
|
|
212 cpfseq EEDATA
|
|
213 bra restart_3_test_apnoe_mode; check for apnoe mode
|
|
214 bsf FLAG_const_ppO2_mode ; Set flag for ppO2 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_apnoe_mode:
|
|
220 movlw d'3' ; Apnoe mode
|
|
221 cpfseq EEDATA
|
|
222 bra restart_4_test_gf_mode ; check for GF OC mode
|
|
223 bsf FLAG_apnoe_mode ; Set flag for Apnoe 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_4_test_gf_mode:
|
|
229 movlw d'4' ; GF OC mode
|
|
230 cpfseq EEDATA
|
|
231 bra restart_5_test_gfO2_mode; check for GF CC mode
|
|
232 movlw d'1'
|
|
233 movwf wait_temp
|
|
234 movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method
|
|
235 return ; start in Surfacemode
|
|
236 restart_5_test_gfO2_mode:
|
|
237 movlw d'5' ; GF CC mode
|
|
238 cpfseq EEDATA
|
|
239 return ; Start in Surfacemode
|
|
240 bsf FLAG_const_ppO2_mode ; Set flag for ppO2 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
|
|
246 startup_screen1:
|
|
247 call PLED_ClearScreen
|
|
248 call PLED_startupscreen1 ; show startup sreen
|
|
249 startup_screen1_2:
|
|
250 movlw d'10' ; timeout for startup screen
|
|
251 movwf temp1
|
|
252 WAITMS d'200'
|
|
253 bcf switch_left
|
|
254 bcf switch_right
|
|
255 screen1_loop:
|
|
256 btfsc onesecupdate ; do every second tasks?
|
|
257 call set_dive_modes ; tests if depth>threshold
|
|
258 btfsc onesecupdate ; do every second tasks?
|
|
259 decf temp1,F
|
|
260 bcf onesecupdate ; every second tasks done
|
|
261
|
|
262 tstfsz temp1 ; timout occured?
|
|
263 bra screen1_loop2 ; no
|
|
264 return
|
|
265
|
|
266 screen1_loop2:
|
|
267 btfsc divemode ; Divemode active?
|
|
268 return
|
|
269 btfsc switch_left ; Ack?
|
|
270 return
|
|
271 btfsc switch_right ; Ack?
|
|
272 return
|
|
273 bra screen1_loop ; loop screen
|
|
274
|
|
275 startup_screen2:
|
|
276 call PLED_ClearScreen ; Page 1
|
|
277 call PLED_startupscreen2 ; show startup sreen
|
|
278 bra startup_screen1_2
|
|
279
|
|
280 startup_screen3a:; WARNING: Also used for decodescriptions and CF Warning screen!
|
|
281 movwf temp1
|
|
282 WAITMS d'200'
|
|
283 bcf switch_left
|
|
284 bcf switch_right
|
|
285 screen3_loop:
|
|
286 btfsc onesecupdate ; do every second tasks?
|
|
287 call set_dive_modes ; tests if depth>threshold
|
|
288
|
|
289 btfsc onesecupdate ; do every second tasks?
|
|
290 decf temp1,F
|
|
291 bcf onesecupdate ; every second tasks done
|
|
292
|
|
293 tstfsz temp1 ; timout occured?
|
|
294 bra screen3_loop2 ; no
|
|
295 return
|
|
296 screen3_loop2:
|
|
297 btfsc switch_left ; Ack?
|
|
298 return
|
|
299 btfsc switch_right ; Ack?
|
|
300 return
|
|
301 bra screen3_loop ; loop screen
|
|
302
|
|
303 init:
|
|
304 movlw b'01101100' ; 4MHz (x4 PLL)
|
|
305 movwf OSCCON
|
|
306
|
|
307 movlw b'00010001' ; I/O Ports
|
|
308 movwf TRISA
|
|
309 clrf PORTA
|
|
310 movlw b'00000011'
|
|
311 movwf TRISB
|
|
312 clrf PORTB
|
|
313 movlw b'11011101' ; UART
|
|
314 movwf TRISC
|
|
315 clrf PORTC
|
|
316 movlw b'00000000'
|
|
317 movwf TRISE
|
|
318 clrf PORTE
|
|
319 movlw b'00000000'
|
|
320 movwf TRISD
|
|
321 clrf PORTD
|
|
322
|
|
323 movlw b'01000000' ; Bit6: PPL enable
|
|
324 movwf OSCTUNE
|
|
325
|
|
326 movlw b'00011111' ; Timer0
|
|
327 movwf T0CON
|
|
328
|
|
329 movlw b'00000111' ; Timer1
|
|
330 movwf T1CON
|
|
331
|
|
332 movlw b'11010000' ; Interrups
|
|
333 movwf INTCON
|
|
334 movlw b'00000101'
|
|
335 movwf INTCON2
|
|
336 movlw b'00001000'
|
|
337 movwf INTCON3
|
|
338 movlw b'00100001'
|
|
339 movwf PIE1
|
|
340 movlw b'00000000'
|
|
341 movwf PIE2
|
|
342 clrf RCON
|
|
343
|
|
344 movlw b'00000000' ; A/D Converter
|
|
345 movwf ADCON0
|
|
346 movlw b'00001110'
|
|
347 movwf ADCON1
|
|
348 movlw b'10001010' ; Right justified
|
|
349 movwf ADCON2
|
|
350
|
|
351 clrf SSPCON1 ; Set I²C Mode
|
|
352 movlw b'00000000'
|
|
353 movwf SSPSTAT
|
|
354 movlw b'00101000'
|
|
355 movwf SSPCON1
|
|
356 movlw b'00000000'
|
|
357 movwf SSPCON2
|
|
358 movlw d'8' ; 400kHz I2C clock @ 16MHz Fcy
|
|
359 movwf SSPADD
|
|
360
|
|
361 clrf CCP1CON ; PWM Module off
|
|
362 clrf ECCP1CON ; PWM Module off
|
|
363
|
|
364 movlw b'00000111' ; Comperator Module off
|
|
365 movwf CMCON
|
|
366
|
|
367 movlw b'00100000'
|
|
368 movwf CANCON ; ECAN Module OFF
|
|
369
|
|
370 movlw b'00100100' ; UART
|
|
371 movwf TXSTA
|
|
372 movlw b'10010000'
|
|
373 movwf RCSTA
|
|
374 movlw b'00001000'
|
|
375 movwf BAUDCON
|
|
376 clrf SPBRGH
|
|
377 movlw d'34'
|
|
378 movwf SPBRG
|
|
379 clrf RCREG
|
|
380 clrf PIR1
|
|
381 return
|