Mercurial > public > mk2
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/start.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,390 @@ +; OSTC - diving computer code +; Copyright (C) 2008 HeinrichsWeikamp GbR + +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. + +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this program. If not, see <http://www.gnu.org/licenses/>. + + +; Start and init +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 10/13/04 +; last updated: 06/24/08 +; known bugs: +; ToDo: + +start: + movlb b'00000001' ; ram bank 1 selected + call init + btfsc divemode ; Reset from Divemode? + call PLED_resetdebugger ; Yes! Something went wrong, show reset informations + + clrf STKPTR ; Clear Stackpointer + lfsr FSR0, 109h ; Clear rambank 1-9, do not delete RTC registers +clear_rambank: + clrf POSTINC0 + movlw 0x0A + cpfseq FSR0H ; Bank 9 done? + bra clear_rambank ; clear... + +; Defaults for RTC + call disable_rs232 ; disable UART module + call RTCinit ; reset RTC + +; Air pressure compensation after reset + call get_calibration_data ; Get calibration data from pressure sensor + + bcf pressure_refresh +wait_start_pressure: + btfss pressure_refresh ; Air pressure compensation + bra wait_start_pressure + + clrf rel_pressure+0 + clrf rel_pressure+1 + clrf surface_interval+0 + clrf surface_interval+1 + + bsf sleepmode ; Routine only works in sleepmode... + call pressuretest_sleep_fast ; Gets pressure without averaging (faster!) + bcf sleepmode ; Normal mode again + + movff amb_pressure+0,last_surfpressure+0 + movff amb_pressure+1,last_surfpressure+1 + movff amb_pressure+0,last_surfpressure_15min+0 + movff amb_pressure+1,last_surfpressure_15min+1 + movff amb_pressure+0,last_surfpressure_30min+0 + movff amb_pressure+1,last_surfpressure_30min+1 ; Rests all airpressure registers + +; reset deco data + incf nofly_time+0,F ; =1 + clrf wait_temp ; Use as buffer + movff wait_temp,char_I_He_ratio ; No He at the Surface + movlw d'79' ; 79% N2 + movwf wait_temp ; Use as buffer + movff wait_temp,char_I_N2_ratio ; No He at the Surface + movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine + movff amb_pressure+1,int_I_pres_respiration+1 + + call deco_main_clear_tissue ; + movlb b'00000001' ; select ram bank 1 + call deco_main_calc_desaturation_time; calculate desaturation time + movlb b'00000001' ; select ram bank 1 + call main_clear_CNS_fraction ; clear CNS + movlb b'00000001' ; select ram bank 1 + call calc_deko_surfmode ; calculate desaturation every minute + movlb b'00000001' ; select ram bank 1 + call deco_main_calc_wo_deco_step_1_m ; calculate deco in surface mode + movlb b'00000001' ; select ram bank 1 + +; check firmware and reset Custom Functions after an update + movlw LOW 0x101 + movwf EEADR + movlw HIGH 0x101 + 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: + movlw LOW 0x101 ; store current version in EEPROM + movwf EEADR + movlw HIGH 0x101 + 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 +; goto reset_all_cf ; resets all custom functions bank0 and bank1 and jumps to "restart" +; goto reset_all_cf_bank1 ; resets all custom functions bank1 and jumps to "restart" + +restart: + call clear_LEDr + call clear_LEDnofly ; all LEDs off + call PLED_boot ; PLED boot (Incl. Clear Screen!) + WIN_TOP .0 + WIN_LEFT .0 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + movlw 0xFF + movwf oled1_temp + movff oled1_temp,win_color1 + movlw 0xFF + movwf oled1_temp + movff oled1_temp,win_color2 + call I2CReset ; Just in Case any I2C device blocks the Bus + movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure + movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure + +; Check if new CF were added in the last firmware version + clrf EEADRH + read_int_eeprom d'92' ; Read number of CF used in this firmware + movlw max_custom_number ; Defined in definitions.asm + cpfseq EEDATA ; Compare with last version + bra restart_01 ; New CF, show warning and store new number + bra restart_1 ; No new CF, continue with boot +restart_01: +; Save new number of current CF count + rcall display_new_cf_installed; Show warning + movlw max_custom_number ; Defined in definitions.asm + movwf EEDATA + write_int_eeprom d'92' ; Store number of CF used in this firmware + +restart_1: + GETCUSTOM15 .31 + movlw LOW .666 + cpfseq lo + bra restart_2 ; Not equal! + movlw HIGH .666 + cpfseq hi + bra restart_2 ; Not equal! + bra restart_3 ; Skip screen.... + +restart_2: + btfsc show_startup_screen ; Show start screen? + call startup_screen1 ;1/2 + btfsc show_startup_screen ; Show start screen? + call startup_screen2 ;2/2 + +restart_3: + clrf flag1 ; clear all flags + clrf flag2 + clrf flag3 + clrf flag4 + clrf flag5 + clrf flag6 + clrf flag7 + clrf flag8 + clrf flag9 + clrf flag10 + clrf flag11 + clrf flag12 + clrf flag13 + clrf flag14 + clrf flag15 + +; Set Debug mode? + read_int_eeprom d'39' + bsf debug_mode + movlw d'1' + cpfseq EEDATA + bcf debug_mode ; clear flag if <> 1 + + goto surfloop ; Jump to Surfaceloop! + + +display_new_cf_installed: + call PLED_new_cf_warning ; Display new CF warning screen + movlw d'20' ; timeout for warning screen + bra startup_screen3a ; Will RETURN after timeout or button press + +restart_set_modes_and_flags: ; "Call"ed from divemode, as well! + bcf gauge_mode + bcf FLAG_const_ppO2_mode + bcf FLAG_apnoe_mode + clrf EEADRH + read_int_eeprom d'34' ; Read deco data + movlw d'1' ; Gauge mode + cpfseq EEDATA + bra restart_3_test_ppO2_mode; check for ppO2 mode + bsf gauge_mode ; Set flag for gauge mode + movlw d'0' + movwf wait_temp + movff wait_temp,char_I_deco_model ; Clear Flagbyte + return ; start in Surfacemode +restart_3_test_ppO2_mode: + movlw d'2' ; const ppO2 mode + cpfseq EEDATA + bra restart_3_test_apnoe_mode; check for apnoe mode + bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode + movlw d'0' + movwf wait_temp + movff wait_temp,char_I_deco_model ; Clear Flagbyte + return ; start in Surfacemode +restart_3_test_apnoe_mode: + movlw d'3' ; Apnoe mode + cpfseq EEDATA + bra restart_4_test_gf_mode ; check for GF OC mode + bsf FLAG_apnoe_mode ; Set flag for Apnoe Mode + movlw d'0' + movwf wait_temp + movff wait_temp,char_I_deco_model ; Clear Flagbyte + return ; start in Surfacemode +restart_4_test_gf_mode: + movlw d'4' ; GF OC mode + cpfseq EEDATA + bra restart_5_test_gfO2_mode; check for GF CC mode + movlw d'1' + movwf wait_temp + movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method + return ; start in Surfacemode +restart_5_test_gfO2_mode: + movlw d'5' ; GF CC mode + cpfseq EEDATA + return ; Start in Surfacemode + bsf FLAG_const_ppO2_mode ; Set flag for ppO2 mode + movlw d'1' + movwf wait_temp + movff wait_temp,char_I_deco_model ; Set Flagbyte for GF method + return ; start in Surfacemode + +startup_screen1: + call PLED_ClearScreen + call PLED_startupscreen1 ; show startup sreen +startup_screen1_2: + movlw d'10' ; timeout for startup screen + movwf temp1 + WAITMS d'200' + bcf switch_left + bcf switch_right +screen1_loop: + btfsc onesecupdate ; do every second tasks? + call set_dive_modes ; tests if depth>threshold + btfsc onesecupdate ; do every second tasks? + decf temp1,F + bcf onesecupdate ; every second tasks done + + tstfsz temp1 ; timout occured? + bra screen1_loop2 ; no + return + +screen1_loop2: + btfsc divemode ; Divemode active? + return + btfsc switch_left ; Ack? + return + btfsc switch_right ; Ack? + return + bra screen1_loop ; loop screen + +startup_screen2: + call PLED_ClearScreen ; Page 1 + call PLED_startupscreen2 ; show startup sreen + bra startup_screen1_2 + +startup_screen3a:; WARNING: Also used for decodescriptions and CF Warning screen! + movwf temp1 + WAITMS d'200' + bcf switch_left + bcf switch_right +screen3_loop: + btfsc onesecupdate ; do every second tasks? + call set_dive_modes ; tests if depth>threshold + + btfsc onesecupdate ; do every second tasks? + decf temp1,F + bcf onesecupdate ; every second tasks done + + tstfsz temp1 ; timout occured? + bra screen3_loop2 ; no + return +screen3_loop2: + btfsc switch_left ; Ack? + return + btfsc switch_right ; Ack? + return + bra screen3_loop ; loop screen + +init: + movlw b'01101100' ; 4MHz (x4 PLL) + movwf OSCCON + + movlw b'00010001' ; I/O Ports + movwf TRISA + clrf PORTA + movlw b'00000011' + movwf TRISB + clrf PORTB + movlw b'11011101' ; UART + movwf TRISC + clrf PORTC + movlw b'00000000' + movwf TRISE + clrf PORTE + movlw b'00000000' + movwf TRISD + clrf PORTD + + movlw b'01000000' ; Bit6: PPL enable + movwf OSCTUNE + + movlw b'00011111' ; Timer0 + movwf T0CON + + movlw b'00000111' ; Timer1 + movwf T1CON + + movlw b'11010000' ; Interrups + movwf INTCON + movlw b'00000101' + movwf INTCON2 + movlw b'00001000' + movwf INTCON3 + movlw b'00100001' + movwf PIE1 + movlw b'00000000' + movwf PIE2 + clrf RCON + + movlw b'00000000' ; A/D Converter + movwf ADCON0 + movlw b'00001110' + movwf ADCON1 + movlw b'10001010' ; Right justified + movwf ADCON2 + + clrf SSPCON1 ; Set I²C Mode + movlw b'00000000' + movwf SSPSTAT + movlw b'00101000' + movwf SSPCON1 + movlw b'00000000' + movwf SSPCON2 + movlw d'8' ; 400kHz I2C clock @ 16MHz Fcy + movwf SSPADD + + clrf CCP1CON ; PWM Module off + clrf ECCP1CON ; PWM Module off + + movlw b'00000111' ; Comperator Module off + movwf CMCON + + movlw b'00100000' + movwf CANCON ; ECAN Module OFF + + movlw b'00100100' ; UART + movwf TXSTA + movlw b'10010000' + movwf RCSTA + movlw b'00001000' + movwf BAUDCON + clrf SPBRGH + movlw d'34' + movwf SPBRG + clrf RCREG + clrf PIR1 + return