Mercurial > public > hwos_code
annotate src/start.asm @ 19:06e19a880df6
changelog
author | heinrichsweikamp |
---|---|
date | Wed, 03 Jul 2013 11:51:46 +0200 |
parents | 7b06f20881be |
children | 79b2084fd75a |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
3 ; File start.asm | |
4 ; | |
5 ; Startup subroutines | |
6 ; | |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 ; HISTORY | |
10 ; 2011-08-06 : [mH] moving from OSTC code | |
11 | |
12 #include "ostc3.inc" ; Mandatory header | |
13 #include "ms5541.inc" | |
14 #include "isr.inc" | |
15 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c | |
16 #include "eeprom_rs232.inc" | |
17 #include "math.inc" | |
18 #include "tft.inc" | |
19 #include "surfmode.inc" | |
20 #include "wait.inc" | |
21 #include "rtc.inc" | |
22 #include "external_flash.inc" | |
23 #include "convert.inc" | |
24 #include "strings.inc" | |
25 #include "tft_outputs.inc" | |
26 | |
27 extern init_ostc3 | |
28 extern option_restore_all | |
29 | |
30 ;============================================================================= | |
31 ; Reset vector: What to do on device wake-up and hard reset. | |
32 ; | |
33 reset_v code 0x00000 | |
34 ; goto start | |
35 goto 0x1FF00 ; Bootloader | |
36 | |
37 ORG 0x00004 ; Needed for second-level bootloader | |
38 goto start | |
39 ;============================================================================= | |
40 boot CODE | |
41 global start | |
42 | |
43 start: | |
44 lfsr FSR0,0x000 ; Clear rambank 0-14 | |
45 clear_rambank: | |
46 clrf POSTINC0 | |
47 movlw 0x0F | |
48 cpfseq FSR0H ; Bank 14 done? | |
49 bra clear_rambank ; clear... | |
50 | |
51 call init_ostc3 | |
52 call speed_normal | |
53 | |
54 bsf no_sensor_int ; disable sensor interrupt | |
55 | |
56 call disable_rs232 ; disable UART module | |
57 ; Air pressure compensation after reset | |
58 call get_calibration_data ; Get calibration data from pressure sensor | |
59 banksel common ; get_calibration_data uses isr_backup | |
60 bcf no_sensor_int ; normal sensor interrupt mode | |
61 | |
10 | 62 call TFT_DisplayOff ; display off |
63 bsf LEDr ; Status LED | |
0 | 64 bcf pressure_refresh |
65 ; First pass will not have valid temperature! | |
66 btfss pressure_refresh ; Air pressure compensation | |
67 bra $-2 | |
68 ; Second pass | |
69 bcf pressure_refresh | |
70 btfss pressure_refresh ; Air pressure compensation | |
71 bra $-2 | |
10 | 72 bcf LEDr |
0 | 73 |
74 clrf rel_pressure+0 | |
75 clrf rel_pressure+1 | |
76 clrf surface_interval+0 | |
77 clrf surface_interval+1 | |
78 | |
79 SAFE_2BYTE_COPY amb_pressure, last_surfpressure | |
80 | |
81 movlw LOW max_surfpressure | |
82 movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar | |
83 movlw HIGH max_surfpressure | |
84 movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar | |
85 movff last_surfpressure+0,sub_b+0 | |
86 movff last_surfpressure+1,sub_b+1 | |
87 call subU16 ; sub_c = sub_a - sub_b | |
88 btfss neg_flag ; Is 1080mbar < amb_pressure ? | |
89 bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! | |
90 | |
91 ; not ok! Overwrite with max. "allowed" airpressure | |
92 movlw LOW max_surfpressure | |
93 movff WREG,last_surfpressure+0 ; max. "allowed" airpressure in mbar | |
94 movlw HIGH max_surfpressure | |
95 movff WREG,last_surfpressure+1 ; max. "allowed" airpressure in mbar | |
96 | |
97 start_copy_pressure: | |
98 movff last_surfpressure+0,last_surfpressure_15min+0 | |
99 movff last_surfpressure+1,last_surfpressure_15min+1 | |
100 movff last_surfpressure+0,last_surfpressure_30min+0 | |
101 movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers | |
102 | |
103 ; reset deco data for surface mode | |
104 movlw d'79' | |
105 movff WREG,char_I_N2_ratio ; 79% N2 | |
106 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine | |
107 movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine | |
108 movff int_I_pres_respiration+1,int_I_pres_surface+1 | |
109 | |
110 extern deco_reset | |
111 call deco_reset | |
112 call deco_calc_desaturation_time ; calculate desaturation time | |
113 banksel common | |
114 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode | |
115 banksel common | |
116 clrf nofly_time+0 ; Reset NoFly | |
117 clrf nofly_time+1 | |
118 clrf desaturation_time+0 ; Reset Desat | |
119 clrf desaturation_time+1 | |
120 bcf menubit ; clear menu flag | |
121 ; Check for Power-on reset here | |
122 extern new_battery_menu | |
123 extern use_old_batteries | |
124 | |
125 btfsc RCON,POR ; Was this a power-on reset? | |
126 goto use_old_batteries ; No, load last stored battery values | |
127 ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" | |
128 | |
129 ; Yes | |
130 call rtc_init ; init clock | |
131 goto new_battery_menu ; show "New battery dialog" | |
132 ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" | |
133 | |
134 global power_on_return | |
135 power_on_return: | |
136 bsf RCON,POR ; Set bit for next detection | |
137 | |
138 ; check firmware and reset Custom Functions after an update | |
139 movlw d'1' | |
140 movwf EEADR | |
141 movlw d'1' | |
142 movwf EEADRH | |
143 call read_eeprom ; read current version x | |
144 movff EEDATA,temp1 | |
145 incf EEADR,F ; set to 0x102 | |
146 call read_eeprom ; read current version y | |
147 movff EEDATA,temp2 | |
148 clrf EEADRH ; Reset EEADRH | |
149 | |
150 movlw softwareversion_x | |
151 cpfseq temp1 ; compare version x | |
152 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM | |
153 | |
154 movlw softwareversion_y | |
155 cpfseq temp2 ; compare version y | |
156 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM | |
157 bra restart ; x and y are equal -> do not reset cf | |
158 | |
159 check_firmware_new: | |
160 call speed_normal | |
161 call TFT_boot ; Initialize TFT (includes clear screen) | |
162 clrf CCPR1L ; Backlight off | |
163 WIN_TOP .50 | |
164 WIN_LEFT .10 | |
165 movlw LOW 0x1E000 | |
166 movwf TBLPTRL | |
167 movlw HIGH 0x1E000 | |
168 movwf TBLPTRH | |
169 movlw UPPER 0x1E000 | |
170 movwf TBLPTRU | |
171 extern color_image | |
172 call color_image ; Show logo | |
173 call TFT_standard_color | |
174 WIN_SMALL .10,.100 | |
175 STRCPY_TEXT_PRINT tNewFirmware1 ; "Update sucessfull!" | |
176 WIN_SMALL .10,.140 | |
177 STRCPY_TEXT tNewFirmware2 ; "New Firmware: " | |
178 movlw softwareversion_x | |
179 movwf lo | |
180 bsf leftbind | |
181 output_8 | |
182 PUTC "." | |
183 movlw softwareversion_y | |
184 movwf lo | |
185 output_8 | |
186 bcf leftbind | |
187 STRCAT_PRINT "" ; Print second row | |
188 call TFT_Display_FadeIn ; Display resulting surface screen. | |
189 | |
190 ; place "after-update reset" here... | |
191 movlw d'1' ; store current version in EEPROM | |
192 movwf EEADR | |
193 movlw d'1' | |
194 movwf EEADRH | |
195 movlw softwareversion_x | |
196 movwf EEDATA | |
197 call write_eeprom ; write version x | |
198 incf EEADR,F ; set to 0x102 | |
199 movlw softwareversion_y | |
200 movwf EEDATA | |
201 call write_eeprom ; write version y | |
202 clrf EEADRH ; Reset EEADRH | |
203 | |
204 movlw .7 | |
205 movwf lo | |
206 check_firmware_new2: | |
207 ; Wait 1 second | |
208 bcf onesecupdate | |
209 btfss onesecupdate | |
210 bra $-2 | |
211 decfsz lo,F ; Wait 10 seconds... | |
212 bra check_firmware_new2 | |
213 | |
214 global restart | |
215 restart: | |
216 clrf STKPTR ; Never return from here | |
217 extern option_save_all | |
218 btfsc menubit ; Return from Menu/COMM mode or timeout? | |
219 call option_save_all ; Yes, save all settings into EEPROM | |
220 | |
221 clrf flag1 ; clear all flags | |
222 clrf flag2 | |
223 clrf flag3 | |
224 clrf flag4 | |
225 clrf flag5 | |
226 clrf flag6 | |
227 clrf flag7 | |
228 clrf flag8 | |
16
7b06f20881be
calm compass reading for minor heading changes
heinrichsweikamp
parents:
10
diff
changeset
|
229 clrf flag9 |
0 | 230 bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! |
231 ; Select high altitude (Fly) mode? | |
232 movff last_surfpressure_30min+0,sub_b+0 | |
233 movff last_surfpressure_30min+1,sub_b+1 | |
234 movlw HIGH high_altitude_threshold | |
235 movwf sub_a+1 | |
236 movlw LOW high_altitude_threshold ; Hard-wired 880mbar | |
237 movwf sub_a+0 | |
238 call subU16 ; sub_c = sub_a - sub_b | |
239 btfss neg_flag ; Result negative (Ambient>880mbar)? | |
240 bsf high_altitude_mode ; No, Set Flag! | |
241 | |
242 call ext_flash_disable_protection ; Disable write protection for external flash | |
243 | |
244 extern testloop | |
245 ; goto testloop | |
246 | |
247 goto surfloop ; Jump to Surfaceloop! | |
248 | |
249 ;============================================================================= | |
250 ; Setup all flags and parameters for divemode and simulator computations. | |
251 ; | |
252 global restart_set_modes_and_flags | |
253 restart_set_modes_and_flags: ; "Call"ed from divemode, as well! | |
254 call option_restore_all ; Restore everything from EEPROM | |
255 movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea | |
256 | |
257 bcf FLAG_apnoe_mode | |
258 bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active | |
259 bcf FLAG_gauge_mode ; =1: In Gauge mode | |
260 call disable_ir ; IR off | |
261 | |
262 tstfsz lo | |
263 bra restart_set_modes_and_flags2 | |
264 ; OC Mode | |
265 return | |
266 | |
267 restart_set_modes_and_flags2: | |
268 decfsz lo,F | |
269 bra restart_set_modes_and_flags3 | |
270 ; CC Mode | |
271 bsf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active | |
272 call enable_ir ; Enable IR-Port | |
273 return | |
274 | |
275 restart_set_modes_and_flags3: | |
276 decfsz lo,F | |
277 bra restart_set_modes_and_flags4 | |
278 ; Gauge Mode | |
279 bsf FLAG_gauge_mode ; =1: In Gauge mode | |
280 return | |
281 | |
282 restart_set_modes_and_flags4: | |
283 ; Apnea Mode | |
284 bsf FLAG_apnoe_mode | |
285 return ; start in Surfacemode | |
286 | |
287 END |