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
275
+ − 12 #include "hwos.inc" ; Mandatory header
0
+ − 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"
113
+ − 26 #include "adc_lightsensor.inc"
+ − 27 #include "i2c.inc"
0
+ − 28
275
+ − 29 extern init_ostc
0
+ − 30 extern option_restore_all
+ − 31
+ − 32 ;=============================================================================
+ − 33 ; Reset vector: What to do on device wake-up and hard reset.
+ − 34 ;
+ − 35 reset_v code 0x00000
+ − 36 ; goto start
+ − 37 goto 0x1FF00 ; Bootloader
+ − 38
+ − 39 ORG 0x00004 ; Needed for second-level bootloader
+ − 40 goto start
+ − 41 ;=============================================================================
+ − 42 boot CODE
+ − 43 global start
+ − 44
+ − 45 start:
+ − 46 lfsr FSR0,0x000 ; Clear rambank 0-14
+ − 47 clear_rambank:
+ − 48 clrf POSTINC0
+ − 49 movlw 0x0F
+ − 50 cpfseq FSR0H ; Bank 14 done?
+ − 51 bra clear_rambank ; clear...
+ − 52
275
+ − 53 call init_ostc
0
+ − 54 bsf no_sensor_int ; disable sensor interrupt
+ − 55
+ − 56 ; Air pressure compensation after reset
+ − 57 call get_calibration_data ; Get calibration data from pressure sensor
+ − 58 banksel common ; get_calibration_data uses isr_backup
+ − 59 bcf no_sensor_int ; normal sensor interrupt mode
+ − 60
10
+ − 61 call TFT_DisplayOff ; display off
+ − 62 bsf LEDr ; Status LED
0
+ − 63 bcf pressure_refresh
+ − 64 ; First pass will not have valid temperature!
+ − 65 btfss pressure_refresh ; Air pressure compensation
+ − 66 bra $-2
50
+ − 67 bcf LEDr
0
+ − 68 ; Second pass
+ − 69 bcf pressure_refresh
+ − 70 btfss pressure_refresh ; Air pressure compensation
+ − 71 bra $-2
+ − 72
+ − 73 clrf rel_pressure+0
+ − 74 clrf rel_pressure+1
+ − 75 clrf surface_interval+0
+ − 76 clrf surface_interval+1
+ − 77
+ − 78 SAFE_2BYTE_COPY amb_pressure, last_surfpressure
+ − 79
+ − 80 movlw LOW max_surfpressure
+ − 81 movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar
+ − 82 movlw HIGH max_surfpressure
+ − 83 movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar
+ − 84 movff last_surfpressure+0,sub_b+0
+ − 85 movff last_surfpressure+1,sub_b+1
+ − 86 call subU16 ; sub_c = sub_a - sub_b
+ − 87 btfss neg_flag ; Is 1080mbar < amb_pressure ?
+ − 88 bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok!
+ − 89
+ − 90 ; not ok! Overwrite with max. "allowed" airpressure
+ − 91 movlw LOW max_surfpressure
+ − 92 movff WREG,last_surfpressure+0 ; max. "allowed" airpressure in mbar
+ − 93 movlw HIGH max_surfpressure
+ − 94 movff WREG,last_surfpressure+1 ; max. "allowed" airpressure in mbar
+ − 95
+ − 96 start_copy_pressure:
+ − 97 movff last_surfpressure+0,last_surfpressure_15min+0
+ − 98 movff last_surfpressure+1,last_surfpressure_15min+1
+ − 99 movff last_surfpressure+0,last_surfpressure_30min+0
+ − 100 movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers
+ − 101
+ − 102 ; reset deco data for surface mode
+ − 103 movlw d'79'
+ − 104 movff WREG,char_I_N2_ratio ; 79% N2
+ − 105 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine
+ − 106 movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine
+ − 107 movff int_I_pres_respiration+1,int_I_pres_surface+1
+ − 108
+ − 109 extern deco_reset
+ − 110 call deco_reset
133
+ − 111
+ − 112 call rtc_init ; init clock
+ − 113
+ − 114 movlw HIGH .512 ; =2
+ − 115 movwf EEADRH
+ − 116 read_int_eeprom .0
+ − 117 clrf EEADRH
+ − 118 movlw 0xAA
+ − 119 cpfseq EEDATA ; =0xAA
+ − 120 bra no_deco_restore ; No
+ − 121
+ − 122 extern restore_decodata_from_eeprom
+ − 123 call restore_decodata_from_eeprom ; Reload deco data and date/time from eeprom
+ − 124
+ − 125 no_deco_restore:
+ − 126 call deco_calc_desaturation_time ; calculate desaturation time
+ − 127 banksel common
+ − 128 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode
+ − 129 banksel common
0
+ − 130 bcf menubit ; clear menu flag
215
+ − 131
0
+ − 132 ; Check for Power-on reset here
215
+ − 133 extern new_battery_menu,use_old_batteries
+ − 134 ; *****************************************************************************
+ − 135 ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return"
+ − 136 ; *****************************************************************************
0
+ − 137
+ − 138 btfsc RCON,POR ; Was this a power-on reset?
+ − 139 goto use_old_batteries ; No, load last stored battery values
+ − 140
215
+ − 141 call lt2942_get_status ; Check for gauge IC
375
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 142
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 143 btfss rechargeable ; cR or 2 hardware?
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 144 goto new_battery_menu ; No, show "New battery dialog"
215
+ − 145
375
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 146 movlw .30
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 147 movff WREG,opt_cR_button_right
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 148 movff WREG,opt_cR_button_left ; Reset on power-on reset
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 149 call piezo_config ; Yes, configure buttons
a9e35c1327aa
1.88 release, BUGFIX: Start with Sensor use from sleep (cR only), CHANGE: Apply button settings when button menu is closed, NEW: Reset button settings on a magnet reset (cR and OSTC 2)
heinrichsweikamp
diff
changeset
+ − 150 goto use_old_batteries ; Yes, load last stored battery values
0
+ − 151
+ − 152 global power_on_return
+ − 153 power_on_return:
+ − 154 bsf RCON,POR ; Set bit for next detection
+ − 155
+ − 156 ; check firmware and reset Custom Functions after an update
+ − 157 movlw d'1'
281
+ − 158 movwf EEADR ; =1
+ − 159 movwf EEADRH ; =1
0
+ − 160 call read_eeprom ; read current version x
+ − 161 movff EEDATA,temp1
+ − 162 incf EEADR,F ; set to 0x102
+ − 163 call read_eeprom ; read current version y
+ − 164 movff EEDATA,temp2
+ − 165 clrf EEADRH ; Reset EEADRH
+ − 166
+ − 167 movlw softwareversion_x
+ − 168 cpfseq temp1 ; compare version x
+ − 169 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
+ − 170
+ − 171 movlw softwareversion_y
+ − 172 cpfseq temp2 ; compare version y
+ − 173 bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM
+ − 174 bra restart ; x and y are equal -> do not reset cf
+ − 175
+ − 176 check_firmware_new:
+ − 177 call TFT_boot ; Initialize TFT (includes clear screen)
+ − 178 clrf CCPR1L ; Backlight off
+ − 179 WIN_TOP .50
+ − 180 WIN_LEFT .10
+ − 181 movlw LOW 0x1E000
+ − 182 movwf TBLPTRL
+ − 183 movlw HIGH 0x1E000
+ − 184 movwf TBLPTRH
+ − 185 movlw UPPER 0x1E000
+ − 186 movwf TBLPTRU
+ − 187 extern color_image
+ − 188 call color_image ; Show logo
+ − 189 call TFT_standard_color
+ − 190 WIN_SMALL .10,.100
52
+ − 191 STRCPY_TEXT_PRINT tNewFirmware1 ; "Update successfull!"
0
+ − 192 WIN_SMALL .10,.140
+ − 193 STRCPY_TEXT tNewFirmware2 ; "New Firmware: "
+ − 194 movlw softwareversion_x
+ − 195 movwf lo
+ − 196 bsf leftbind
+ − 197 output_8
+ − 198 PUTC "."
+ − 199 movlw softwareversion_y
+ − 200 movwf lo
45
+ − 201 output_99x
0
+ − 202 bcf leftbind
+ − 203 STRCAT_PRINT "" ; Print second row
+ − 204 call TFT_Display_FadeIn ; Display resulting surface screen.
+ − 205
+ − 206 ; place "after-update reset" here...
93
+ − 207
+ − 208 extern oPressureAdjust, option_reset, option_save
+ − 209 lfsr FSR0,oPressureAdjust
+ − 210 call option_reset ; Reset FSR0 option to factory default.
+ − 211 lfsr FSR0,oPressureAdjust
+ − 212 call option_save ; Save in EEPROM
+ − 213
281
+ − 214 call fix_180_dives ; fix dives made with the 1.80
+ − 215
0
+ − 216 movlw d'1' ; store current version in EEPROM
281
+ − 217 movwf EEADR ; =1
+ − 218 movwf EEADRH ; =1
0
+ − 219 movlw softwareversion_x
+ − 220 movwf EEDATA
+ − 221 call write_eeprom ; write version x
+ − 222 incf EEADR,F ; set to 0x102
+ − 223 movlw softwareversion_y
+ − 224 movwf EEDATA
+ − 225 call write_eeprom ; write version y
+ − 226 clrf EEADRH ; Reset EEADRH
+ − 227
+ − 228 movlw .7
+ − 229 movwf lo
+ − 230 check_firmware_new2:
+ − 231 ; Wait 1 second
+ − 232 bcf onesecupdate
+ − 233 btfss onesecupdate
+ − 234 bra $-2
+ − 235 decfsz lo,F ; Wait 10 seconds...
+ − 236 bra check_firmware_new2
+ − 237
+ − 238 global restart
+ − 239 restart:
+ − 240 clrf STKPTR ; Never return from here
276
e4cb495aed3d
Increase byte timeout in PC download mode, faster response to "Exit" in main menu
heinrichsweikamp
diff
changeset
+ − 241 clrf CCP1CON ; stop PWM
e4cb495aed3d
Increase byte timeout in PC download mode, faster response to "Exit" in main menu
heinrichsweikamp
diff
changeset
+ − 242 bcf PORTC,2 ; Pull PWM out to GND
e4cb495aed3d
Increase byte timeout in PC download mode, faster response to "Exit" in main menu
heinrichsweikamp
diff
changeset
+ − 243
21
+ − 244 extern option_save_all, option_check_all
+ − 245
0
+ − 246 btfsc menubit ; Return from Menu/COMM mode or timeout?
+ − 247 call option_save_all ; Yes, save all settings into EEPROM
+ − 248
220
+ − 249 call option_restore_all ; Restore everything from EEPROM
23
+ − 250 call option_check_all ; Check all options (and reset if not within their min/max boundaries)
220
+ − 251 call option_save_all ; Save all settings into EEPROM after they have been checked
23
+ − 252
0
+ − 253 clrf flag1 ; clear all flags
+ − 254 clrf flag2
+ − 255 clrf flag3
+ − 256 clrf flag4
+ − 257 clrf flag5
+ − 258 clrf flag6
+ − 259 clrf flag7
+ − 260 clrf flag8
16
+ − 261 clrf flag9
113
+ − 262 clrf flag10
267
+ − 263 ; Do not clear flag11 (Sensor calibration and charger status)
255
+ − 264 clrf flag12
319
+ − 265 clrf flag13
235
+ − 266 clrf hardware_flag ; hardware descriptor flag
+ − 267 bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor!
23
+ − 268
236
+ − 269 ; configure hardware_flag byte
+ − 270
+ − 271 bsf ambient_sensor ; Clear flag
+ − 272 bsf optical_input ; Clear flag
+ − 273
113
+ − 274 call lt2942_get_status ; Check for gauge IC
236
+ − 275 btfss rechargeable ; cR hardware?
+ − 276 bra restart2 ; No
+ − 277
113
+ − 278 call lt2942_init ; Yes, init battery gauge IC
236
+ − 279 bcf ambient_sensor ; Clear flag
+ − 280 bcf optical_input ; Clear flag
248
+ − 281
243
+ − 282 restart2:
+ − 283 btfsc vusb_in
+ − 284 bra restart3 ; USB (and powered on)
+ − 285 bcf PORTE,0 ; Start comms
+ − 286 WAITMS d'1'
+ − 287 btfss vusb_in
+ − 288 bra restart3 ; USB (and powered off)
+ − 289 bsf ble_available ; ble available
+ − 290 restart3:
+ − 291 bsf PORTE,0 ; Stop comms
248
+ − 292 btfsc ble_available ; ble available?
+ − 293 bra restart4 ; Yes, can't be a cR
+ − 294 btfss rechargeable ; Rechargeable
+ − 295 bra restart4 ; No, can't be a cR
+ − 296 bsf analog_o2_input ; Set flag for analog
249
+ − 297 restart4:
+ − 298 ; The hardware_flag is now:
+ − 299 ; 3: 0x0A
+ − 300 ; cR: 0x05
+ − 301 ; 2 with BLE: 0x11
+ − 302 ; 3 with BLE: 0x1A
113
+ − 303
0
+ − 304 ; Select high altitude (Fly) mode?
+ − 305 movff last_surfpressure_30min+0,sub_b+0
+ − 306 movff last_surfpressure_30min+1,sub_b+1
+ − 307 movlw HIGH high_altitude_threshold
+ − 308 movwf sub_a+1
+ − 309 movlw LOW high_altitude_threshold ; Hard-wired 880mbar
+ − 310 movwf sub_a+0
+ − 311 call subU16 ; sub_c = sub_a - sub_b
+ − 312 btfss neg_flag ; Result negative (Ambient>880mbar)?
+ − 313 bsf high_altitude_mode ; No, Set Flag!
+ − 314
236
+ − 315 btfss analog_o2_input
165
+ − 316 bsf TRISB,3
235
+ − 317 btfss rechargeable
165
+ − 318 bsf TRISG,0
0
+ − 319 call ext_flash_disable_protection ; Disable write protection for external flash
+ − 320
155
+ − 321 bsf flip_screen ; Flip 180°
+ − 322 TSTOSS opt_flip_screen ; =1: Flip the screen
+ − 323 bcf flip_screen ; Normal orientation
151
+ − 324
0
+ − 325 goto surfloop ; Jump to Surfaceloop!
+ − 326
+ − 327 ;=============================================================================
+ − 328 ; Setup all flags and parameters for divemode and simulator computations.
+ − 329 ;
+ − 330 global restart_set_modes_and_flags
+ − 331 restart_set_modes_and_flags: ; "Call"ed from divemode, as well!
+ − 332 call option_restore_all ; Restore everything from EEPROM
24
+ − 333
+ − 334 ; Setup sampling rate
+ − 335 movlw .2
+ − 336 movwf samplingrate
+ − 337 TSTOSS opt_sampling_rate ; =1: 10s, =0: 2s
+ − 338 bra restart_set_modes_and_flags1
+ − 339 movlw .10
+ − 340 movwf samplingrate
+ − 341 restart_set_modes_and_flags1:
0
+ − 342 movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea
+ − 343
+ − 344 bcf FLAG_apnoe_mode
+ − 345 bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active
+ − 346 bcf FLAG_gauge_mode ; =1: In Gauge mode
224
+ − 347 call disable_ir_s8 ; IR off
0
+ − 348
+ − 349 tstfsz lo
+ − 350 bra restart_set_modes_and_flags2
+ − 351 ; OC Mode
+ − 352 return
+ − 353
+ − 354 restart_set_modes_and_flags2:
+ − 355 decfsz lo,F
+ − 356 bra restart_set_modes_and_flags3
+ − 357 ; CC Mode
359
+ − 358 btfsc analog_o2_input ; cR?
+ − 359 bra restart_set_modes_and_flags2b ; Yes, skip mode check
+ − 360 btfsc optical_input ; 3
+ − 361 bra restart_set_modes_and_flags2b ; Yes, skip mode check
+ − 362 ; Make sure Sensor is not selected
+ − 363 ; opt_ccr_mode must be <> 1 (=0: Fixed SP, =1: Sensor, =2: Auto SP)
+ − 364 banksel opt_ccr_mode
+ − 365 movlw .1
+ − 366 cpfseq opt_ccr_mode ; = Sensor?
+ − 367 bra restart_set_modes_and_flags2b ; No
+ − 368 clrf opt_ccr_mode ; Yes, reset to Fixed SP
+ − 369 restart_set_modes_and_flags2b:
+ − 370 banksel common
338
+ − 371 bsf FLAG_ccr_mode ; =1: CCR mode (Fixed SP, Auto SP or Sensor) active
187
+ − 372 call enable_ir_s8 ; Enable IR/S8-Port
0
+ − 373 return
+ − 374
+ − 375 restart_set_modes_and_flags3:
+ − 376 decfsz lo,F
+ − 377 bra restart_set_modes_and_flags4
+ − 378 ; Gauge Mode
+ − 379 bsf FLAG_gauge_mode ; =1: In Gauge mode
+ − 380 return
+ − 381
+ − 382 restart_set_modes_and_flags4:
+ − 383 ; Apnea Mode
+ − 384 bsf FLAG_apnoe_mode
+ − 385 return ; start in Surfacemode
+ − 386
+ − 387 END