comparison code_part1/OSTC_code_asm_part1/start.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 3cf8af30b36e
comparison
equal deleted inserted replaced
-1:000000000000 0:96a35aeda5f2
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