Mercurial > public > hwos_code
comparison src/start.asm @ 0:11d4fc797f74
init
| author | heinrichsweikamp |
|---|---|
| date | Wed, 24 Apr 2013 19:22:45 +0200 |
| parents | |
| children | 55dfc8f6093f |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:11d4fc797f74 |
|---|---|
| 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 | |
| 62 bcf pressure_refresh | |
| 63 ; First pass will not have valid temperature! | |
| 64 btfss pressure_refresh ; Air pressure compensation | |
| 65 bra $-2 | |
| 66 ; Second pass | |
| 67 bcf pressure_refresh | |
| 68 btfss pressure_refresh ; Air pressure compensation | |
| 69 bra $-2 | |
| 70 | |
| 71 clrf rel_pressure+0 | |
| 72 clrf rel_pressure+1 | |
| 73 clrf surface_interval+0 | |
| 74 clrf surface_interval+1 | |
| 75 | |
| 76 SAFE_2BYTE_COPY amb_pressure, last_surfpressure | |
| 77 | |
| 78 movlw LOW max_surfpressure | |
| 79 movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar | |
| 80 movlw HIGH max_surfpressure | |
| 81 movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar | |
| 82 movff last_surfpressure+0,sub_b+0 | |
| 83 movff last_surfpressure+1,sub_b+1 | |
| 84 call subU16 ; sub_c = sub_a - sub_b | |
| 85 btfss neg_flag ; Is 1080mbar < amb_pressure ? | |
| 86 bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! | |
| 87 | |
| 88 ; not ok! Overwrite with max. "allowed" airpressure | |
| 89 movlw LOW max_surfpressure | |
| 90 movff WREG,last_surfpressure+0 ; max. "allowed" airpressure in mbar | |
| 91 movlw HIGH max_surfpressure | |
| 92 movff WREG,last_surfpressure+1 ; max. "allowed" airpressure in mbar | |
| 93 | |
| 94 start_copy_pressure: | |
| 95 movff last_surfpressure+0,last_surfpressure_15min+0 | |
| 96 movff last_surfpressure+1,last_surfpressure_15min+1 | |
| 97 movff last_surfpressure+0,last_surfpressure_30min+0 | |
| 98 movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers | |
| 99 | |
| 100 ; reset deco data for surface mode | |
| 101 movlw d'79' | |
| 102 movff WREG,char_I_N2_ratio ; 79% N2 | |
| 103 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine | |
| 104 movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine | |
| 105 movff int_I_pres_respiration+1,int_I_pres_surface+1 | |
| 106 | |
| 107 extern deco_reset | |
| 108 call deco_reset | |
| 109 call deco_calc_desaturation_time ; calculate desaturation time | |
| 110 banksel common | |
| 111 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode | |
| 112 banksel common | |
| 113 clrf nofly_time+0 ; Reset NoFly | |
| 114 clrf nofly_time+1 | |
| 115 clrf desaturation_time+0 ; Reset Desat | |
| 116 clrf desaturation_time+1 | |
| 117 bcf menubit ; clear menu flag | |
| 118 ; Check for Power-on reset here | |
| 119 extern new_battery_menu | |
| 120 extern use_old_batteries | |
| 121 | |
| 122 btfsc RCON,POR ; Was this a power-on reset? | |
| 123 goto use_old_batteries ; No, load last stored battery values | |
| 124 ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" | |
| 125 | |
| 126 ; Yes | |
| 127 call rtc_init ; init clock | |
| 128 goto new_battery_menu ; show "New battery dialog" | |
| 129 ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" | |
| 130 | |
| 131 global power_on_return | |
| 132 power_on_return: | |
| 133 bsf RCON,POR ; Set bit for next detection | |
| 134 | |
| 135 ; check firmware and reset Custom Functions after an update | |
| 136 movlw d'1' | |
| 137 movwf EEADR | |
| 138 movlw d'1' | |
| 139 movwf EEADRH | |
| 140 call read_eeprom ; read current version x | |
| 141 movff EEDATA,temp1 | |
| 142 incf EEADR,F ; set to 0x102 | |
| 143 call read_eeprom ; read current version y | |
| 144 movff EEDATA,temp2 | |
| 145 clrf EEADRH ; Reset EEADRH | |
| 146 | |
| 147 movlw softwareversion_x | |
| 148 cpfseq temp1 ; compare version x | |
| 149 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM | |
| 150 | |
| 151 movlw softwareversion_y | |
| 152 cpfseq temp2 ; compare version y | |
| 153 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM | |
| 154 bra restart ; x and y are equal -> do not reset cf | |
| 155 | |
| 156 check_firmware_new: | |
| 157 call speed_normal | |
| 158 call TFT_boot ; Initialize TFT (includes clear screen) | |
| 159 clrf CCPR1L ; Backlight off | |
| 160 WIN_TOP .50 | |
| 161 WIN_LEFT .10 | |
| 162 movlw LOW 0x1E000 | |
| 163 movwf TBLPTRL | |
| 164 movlw HIGH 0x1E000 | |
| 165 movwf TBLPTRH | |
| 166 movlw UPPER 0x1E000 | |
| 167 movwf TBLPTRU | |
| 168 extern color_image | |
| 169 call color_image ; Show logo | |
| 170 call TFT_standard_color | |
| 171 WIN_SMALL .10,.100 | |
| 172 STRCPY_TEXT_PRINT tNewFirmware1 ; "Update sucessfull!" | |
| 173 WIN_SMALL .10,.140 | |
| 174 STRCPY_TEXT tNewFirmware2 ; "New Firmware: " | |
| 175 movlw softwareversion_x | |
| 176 movwf lo | |
| 177 bsf leftbind | |
| 178 output_8 | |
| 179 PUTC "." | |
| 180 movlw softwareversion_y | |
| 181 movwf lo | |
| 182 output_8 | |
| 183 bcf leftbind | |
| 184 STRCAT_PRINT "" ; Print second row | |
| 185 call TFT_Display_FadeIn ; Display resulting surface screen. | |
| 186 | |
| 187 ; place "after-update reset" here... | |
| 188 movlw d'1' ; store current version in EEPROM | |
| 189 movwf EEADR | |
| 190 movlw d'1' | |
| 191 movwf EEADRH | |
| 192 movlw softwareversion_x | |
| 193 movwf EEDATA | |
| 194 call write_eeprom ; write version x | |
| 195 incf EEADR,F ; set to 0x102 | |
| 196 movlw softwareversion_y | |
| 197 movwf EEDATA | |
| 198 call write_eeprom ; write version y | |
| 199 clrf EEADRH ; Reset EEADRH | |
| 200 | |
| 201 movlw .7 | |
| 202 movwf lo | |
| 203 check_firmware_new2: | |
| 204 ; Wait 1 second | |
| 205 bcf onesecupdate | |
| 206 btfss onesecupdate | |
| 207 bra $-2 | |
| 208 decfsz lo,F ; Wait 10 seconds... | |
| 209 bra check_firmware_new2 | |
| 210 | |
| 211 global restart | |
| 212 restart: | |
| 213 clrf STKPTR ; Never return from here | |
| 214 extern option_save_all | |
| 215 btfsc menubit ; Return from Menu/COMM mode or timeout? | |
| 216 call option_save_all ; Yes, save all settings into EEPROM | |
| 217 | |
| 218 clrf flag1 ; clear all flags | |
| 219 clrf flag2 | |
| 220 clrf flag3 | |
| 221 clrf flag4 | |
| 222 clrf flag5 | |
| 223 clrf flag6 | |
| 224 clrf flag7 | |
| 225 clrf flag8 | |
| 226 bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! | |
| 227 ; Select high altitude (Fly) mode? | |
| 228 movff last_surfpressure_30min+0,sub_b+0 | |
| 229 movff last_surfpressure_30min+1,sub_b+1 | |
| 230 movlw HIGH high_altitude_threshold | |
| 231 movwf sub_a+1 | |
| 232 movlw LOW high_altitude_threshold ; Hard-wired 880mbar | |
| 233 movwf sub_a+0 | |
| 234 call subU16 ; sub_c = sub_a - sub_b | |
| 235 btfss neg_flag ; Result negative (Ambient>880mbar)? | |
| 236 bsf high_altitude_mode ; No, Set Flag! | |
| 237 | |
| 238 call ext_flash_disable_protection ; Disable write protection for external flash | |
| 239 | |
| 240 extern testloop | |
| 241 ; goto testloop | |
| 242 | |
| 243 goto surfloop ; Jump to Surfaceloop! | |
| 244 | |
| 245 ;============================================================================= | |
| 246 ; Setup all flags and parameters for divemode and simulator computations. | |
| 247 ; | |
| 248 global restart_set_modes_and_flags | |
| 249 restart_set_modes_and_flags: ; "Call"ed from divemode, as well! | |
| 250 call option_restore_all ; Restore everything from EEPROM | |
| 251 movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea | |
| 252 | |
| 253 bcf FLAG_apnoe_mode | |
| 254 bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active | |
| 255 bcf FLAG_gauge_mode ; =1: In Gauge mode | |
| 256 call disable_ir ; IR off | |
| 257 | |
| 258 tstfsz lo | |
| 259 bra restart_set_modes_and_flags2 | |
| 260 ; OC Mode | |
| 261 return | |
| 262 | |
| 263 restart_set_modes_and_flags2: | |
| 264 decfsz lo,F | |
| 265 bra restart_set_modes_and_flags3 | |
| 266 ; CC Mode | |
| 267 bsf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active | |
| 268 call enable_ir ; Enable IR-Port | |
| 269 return | |
| 270 | |
| 271 restart_set_modes_and_flags3: | |
| 272 decfsz lo,F | |
| 273 bra restart_set_modes_and_flags4 | |
| 274 ; Gauge Mode | |
| 275 bsf FLAG_gauge_mode ; =1: In Gauge mode | |
| 276 return | |
| 277 | |
| 278 restart_set_modes_and_flags4: | |
| 279 ; Apnea Mode | |
| 280 bsf FLAG_apnoe_mode | |
| 281 return ; start in Surfacemode | |
| 282 | |
| 283 END |
