Mercurial > public > hwos_code
diff src/start.asm @ 0:11d4fc797f74
init
author | heinrichsweikamp |
---|---|
date | Wed, 24 Apr 2013 19:22:45 +0200 |
parents | |
children | 55dfc8f6093f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/start.asm Wed Apr 24 19:22:45 2013 +0200 @@ -0,0 +1,283 @@ +;============================================================================= +; +; File start.asm +; +; Startup subroutines +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= +; HISTORY +; 2011-08-06 : [mH] moving from OSTC code + +#include "ostc3.inc" ; Mandatory header +#include "ms5541.inc" +#include "isr.inc" +#include "shared_definitions.h" ; Mailbox from/to p2_deco.c +#include "eeprom_rs232.inc" +#include "math.inc" +#include "tft.inc" +#include "surfmode.inc" +#include "wait.inc" +#include "rtc.inc" +#include "external_flash.inc" +#include "convert.inc" +#include "strings.inc" +#include "tft_outputs.inc" + + extern init_ostc3 + extern option_restore_all + +;============================================================================= +; Reset vector: What to do on device wake-up and hard reset. +; +reset_v code 0x00000 +; goto start + goto 0x1FF00 ; Bootloader + + ORG 0x00004 ; Needed for second-level bootloader + goto start +;============================================================================= +boot CODE + global start + +start: + lfsr FSR0,0x000 ; Clear rambank 0-14 +clear_rambank: + clrf POSTINC0 + movlw 0x0F + cpfseq FSR0H ; Bank 14 done? + bra clear_rambank ; clear... + + call init_ostc3 + call speed_normal + + bsf no_sensor_int ; disable sensor interrupt + + call disable_rs232 ; disable UART module +; Air pressure compensation after reset + call get_calibration_data ; Get calibration data from pressure sensor + banksel common ; get_calibration_data uses isr_backup + bcf no_sensor_int ; normal sensor interrupt mode + + bcf pressure_refresh +; First pass will not have valid temperature! + btfss pressure_refresh ; Air pressure compensation + bra $-2 +; Second pass + bcf pressure_refresh + btfss pressure_refresh ; Air pressure compensation + bra $-2 + + clrf rel_pressure+0 + clrf rel_pressure+1 + clrf surface_interval+0 + clrf surface_interval+1 + + SAFE_2BYTE_COPY amb_pressure, last_surfpressure + + movlw LOW max_surfpressure + movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar + movlw HIGH max_surfpressure + movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar + movff last_surfpressure+0,sub_b+0 + movff last_surfpressure+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Is 1080mbar < amb_pressure ? + bra start_copy_pressure ; NO: current airpressure is lower then "allowed" airpressure, ok! + + ; not ok! Overwrite with max. "allowed" airpressure + movlw LOW max_surfpressure + movff WREG,last_surfpressure+0 ; max. "allowed" airpressure in mbar + movlw HIGH max_surfpressure + movff WREG,last_surfpressure+1 ; max. "allowed" airpressure in mbar + +start_copy_pressure: + movff last_surfpressure+0,last_surfpressure_15min+0 + movff last_surfpressure+1,last_surfpressure_15min+1 + movff last_surfpressure+0,last_surfpressure_30min+0 + movff last_surfpressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers + +; reset deco data for surface mode + movlw d'79' + movff WREG,char_I_N2_ratio ; 79% N2 + SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine + movff int_I_pres_respiration+0,int_I_pres_surface+0 ; copy for desat routine + movff int_I_pres_respiration+1,int_I_pres_surface+1 + + extern deco_reset + call deco_reset + call deco_calc_desaturation_time ; calculate desaturation time + banksel common + call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode + banksel common + clrf nofly_time+0 ; Reset NoFly + clrf nofly_time+1 + clrf desaturation_time+0 ; Reset Desat + clrf desaturation_time+1 + bcf menubit ; clear menu flag +; Check for Power-on reset here + extern new_battery_menu + extern use_old_batteries + + btfsc RCON,POR ; Was this a power-on reset? + goto use_old_batteries ; No, load last stored battery values + ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" + + ; Yes + call rtc_init ; init clock + goto new_battery_menu ; show "New battery dialog" + ; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return" + + global power_on_return +power_on_return: + bsf RCON,POR ; Set bit for next detection + +; check firmware and reset Custom Functions after an update + movlw d'1' + movwf EEADR + movlw d'1' + movwf EEADRH + call read_eeprom ; read current version x + movff EEDATA,temp1 + incf EEADR,F ; set to 0x102 + call read_eeprom ; read current version y + movff EEDATA,temp2 + clrf EEADRH ; Reset EEADRH + + movlw softwareversion_x + cpfseq temp1 ; compare version x + bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM + + movlw softwareversion_y + cpfseq temp2 ; compare version y + bra check_firmware_new ; is not equal -> reset CF and store new version in EEPROM + bra restart ; x and y are equal -> do not reset cf + +check_firmware_new: + call speed_normal + call TFT_boot ; Initialize TFT (includes clear screen) + clrf CCPR1L ; Backlight off + WIN_TOP .50 + WIN_LEFT .10 + movlw LOW 0x1E000 + movwf TBLPTRL + movlw HIGH 0x1E000 + movwf TBLPTRH + movlw UPPER 0x1E000 + movwf TBLPTRU + extern color_image + call color_image ; Show logo + call TFT_standard_color + WIN_SMALL .10,.100 + STRCPY_TEXT_PRINT tNewFirmware1 ; "Update sucessfull!" + WIN_SMALL .10,.140 + STRCPY_TEXT tNewFirmware2 ; "New Firmware: " + movlw softwareversion_x + movwf lo + bsf leftbind + output_8 + PUTC "." + movlw softwareversion_y + movwf lo + output_8 + bcf leftbind + STRCAT_PRINT "" ; Print second row + call TFT_Display_FadeIn ; Display resulting surface screen. + +; place "after-update reset" here... + movlw d'1' ; store current version in EEPROM + movwf EEADR + movlw d'1' + movwf EEADRH + movlw softwareversion_x + movwf EEDATA + call write_eeprom ; write version x + incf EEADR,F ; set to 0x102 + movlw softwareversion_y + movwf EEDATA + call write_eeprom ; write version y + clrf EEADRH ; Reset EEADRH + + movlw .7 + movwf lo +check_firmware_new2: + ; Wait 1 second + bcf onesecupdate + btfss onesecupdate + bra $-2 + decfsz lo,F ; Wait 10 seconds... + bra check_firmware_new2 + + global restart +restart: + clrf STKPTR ; Never return from here + extern option_save_all + btfsc menubit ; Return from Menu/COMM mode or timeout? + call option_save_all ; Yes, save all settings into EEPROM + + clrf flag1 ; clear all flags + clrf flag2 + clrf flag3 + clrf flag4 + clrf flag5 + clrf flag6 + clrf flag7 + clrf flag8 + bsf tft_is_dimming ; TFT is dimming up (soon), ignore ambient sensor! + ; Select high altitude (Fly) mode? + movff last_surfpressure_30min+0,sub_b+0 + movff last_surfpressure_30min+1,sub_b+1 + movlw HIGH high_altitude_threshold + movwf sub_a+1 + movlw LOW high_altitude_threshold ; Hard-wired 880mbar + movwf sub_a+0 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; Result negative (Ambient>880mbar)? + bsf high_altitude_mode ; No, Set Flag! + + call ext_flash_disable_protection ; Disable write protection for external flash + + extern testloop +; goto testloop + + goto surfloop ; Jump to Surfaceloop! + +;============================================================================= +; Setup all flags and parameters for divemode and simulator computations. +; + global restart_set_modes_and_flags +restart_set_modes_and_flags: ; "Call"ed from divemode, as well! + call option_restore_all ; Restore everything from EEPROM + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea + + bcf FLAG_apnoe_mode + bcf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + bcf FLAG_gauge_mode ; =1: In Gauge mode + call disable_ir ; IR off + + tstfsz lo + bra restart_set_modes_and_flags2 + ; OC Mode + return + +restart_set_modes_and_flags2: + decfsz lo,F + bra restart_set_modes_and_flags3 + ; CC Mode + bsf FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active + call enable_ir ; Enable IR-Port + return + +restart_set_modes_and_flags3: + decfsz lo,F + bra restart_set_modes_and_flags4 + ; Gauge Mode + bsf FLAG_gauge_mode ; =1: In Gauge mode + return + +restart_set_modes_and_flags4: + ; Apnea Mode + bsf FLAG_apnoe_mode + return ; start in Surfacemode + + END \ No newline at end of file