Mercurial > public > hwos_code
view src/eeprom_rs232.asm @ 588:bf0c76e9b01b
Sync safety stop countdown output
author | heinrichsweikamp |
---|---|
date | Sat, 10 Mar 2018 15:39:33 +0100 |
parents | b455b31ce022 |
children | ca4556fb60b9 |
line wrap: on
line source
;============================================================================= ; ; File eeprom_rs232.asm V2.98 ; ; Internal EEPROM, RS232 ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY ; 2011-08-06 : [mH] moving from OSTC code #include "hwos.inc" #include "wait.inc" #include "shared_definitions.h" #include "rtc.inc" write_int_eeprom macro eeprom_address movlw eeprom_address call write_int_eeprom_1 endm read_int_eeprom macro eeprom_address movlw eeprom_address call read_int_eeprom_1 endm ;============================================================================= eeprom code 0xF00000+0x10 ; Skip SERIAL number. Should not be overwritten. global eeprom_serial_save global eeprom_opt_backup eeprom_serial_save res 2 eeprom_opt_backup res 0x3E ;============================================================================= basic CODE global write_int_eeprom_1 write_int_eeprom_1: movwf EEADR ; bra write_eeprom ; writes and "returns" after write ;============================================================================= ; writes into internal eeprom ; Input: EEADRH:EEADR = EEPROM address. ; EEDATA = byte to write. ; Trashed: WREG. global write_eeprom write_eeprom: bcf EECON1,EEPGD bcf EECON1,CFGS bsf EECON1,WREN bcf INTCON,GIE ; Disable interrupts for the next 5 instructions movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE ; ...but the flag for the ISR routines were still set, so they will interrupt now! write_eep2: btfsc EECON1,WR bra write_eep2 ; wait about 4ms... bcf EECON1,WREN return global read_int_eeprom_1 read_int_eeprom_1: movwf EEADR ; bra read_eeprom ; reads and "returns" after write ;============================================================================= ; reads from internal eeprom ; Input: EEADRH:EEADR = EEPROM address. ; Output: EEDATA. ; Trashed: NONE. global read_eeprom read_eeprom: bcf EECON1,EEPGD bcf EECON1,CFGS bsf EECON1,RD return global disable_ir_s8 disable_ir_s8: banksel TXSTA2 clrf TXSTA2 clrf RCSTA2 banksel common bcf ir_power ; IR off bcf mcp_power ; Power-down instrumentation amp bsf s8_npower ; Power-down S8 HUD return global enable_ir_s8 enable_ir_s8: ;init serial port2 (TRISG2) btfsc analog_o2_input bra enable_s8 ; Start S8 banksel BAUDCON2 movlw b'00100000' ; BRG16=0 ; inverted for IR movwf BAUDCON2 movlw b'00100000' ; BRGH=0, SYNC=0 movwf TXSTA2 movlw .102 ; SPBRGH:SPBRG = .102 : 2403 BAUD @ 16MHz movwf SPBRG2 movlw b'10010000' movwf RCSTA2 banksel common bsf ir_power ; Power-up IR btfss ir_power bra $-6 return enable_s8: ; Check for Digital/Analog bsf s8_npower ; Power-down S8 HUD WAITMS d'1' ; Very short delay bsf mcp_power ; Power-up instrumentation amp btfss mcp_power bra $-6 banksel TXSTA2 clrf TXSTA2 clrf RCSTA2 banksel common ; It may be digital, check for voltage when isolator is powered bcf s8_npower ; Power S8 HUD WAITMS d'1' ; Very short delay btfsc PORTG,2 ; RX2=1? bra enable_s8_2 ; Yes, digital WAITMS d'30' btfsc PORTG,2 ; RX2=1? bra enable_s8_2 ; Yes, digital ; Not found, set to analog (fail-safe) enable_s8_analog: ; S8 Analog bsf s8_npower ; Power-down S8 HUD bcf s8_digital ; Clear flag return enable_s8_2: ; S8 Digital banksel BAUDCON2 movlw b'00000000' ; BRG16=0 ; normal for S8 movwf BAUDCON2 movlw b'00100000' ; BRGH=0, SYNC=0 movwf TXSTA2 movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16MHz movwf SPBRG2 movlw b'10010000' movwf RCSTA2 banksel common bsf s8_digital ; Set flag return ;============================================================================= global enable_rs232 enable_rs232: call speed_normal ; 16MHz enable_rs232_2: movlw T2CON_NORMAL cpfseq T2CON bra enable_rs232_2 ; Wait until speed is normal bcf PORTE,0 ; Start comms ;init serial port1 (TRISC6/7) movlw b'00100100' ; BRGH=1, SYNC=0 movwf TXSTA1 movlw b'10010000' movwf RCSTA1 return global disable_rs232 disable_rs232: clrf RCSTA1 clrf TXSTA1 ; UART disable bcf PORTC,6 ; TX hard to GND bsf PORTE,0 ; Stop comms return global rs232_wait_tx rs232_wait_tx: btfss TXSTA1,TRMT ; RS232 Busy? bra rs232_wait_tx ; yes, wait... btfss ble_available ; ble available? return ; No, done. btfsc NRTS ; Wait for Bluetooth module bra rs232_wait_tx ; yes, wait... return ; Done. global rs232_wait_tx2 rs232_wait_tx2: banksel TXSTA2 rs232_wait_tx2_1: btfss TXSTA2,TRMT ; RS232 Busy? bra rs232_wait_tx2_1 ; yes, wait... banksel common return ; Done. global rs232_get_byte rs232_get_byte: bcf rs232_receive_overflow ; clear flag movlw .10 movwf uart1_temp clrf uart2_temp clrf uart3_temp rs232_get_byte2: btfsc PIR1,RCIF ; data arrived? return ; Yes decfsz uart3_temp,F bra rs232_get_byte2 decfsz uart2_temp,F bra rs232_get_byte2 decfsz uart1_temp,F bra rs232_get_byte2 ; timeout occurred (about 400ms) bsf rs232_receive_overflow ; set flag rs232_get_byte3: bcf RCSTA1,CREN ; Clear receiver status bsf RCSTA1,CREN return ; and return anyway ;============================================================================= global do_logoffset_common_write do_logoffset_common_write: ; TODO: limit [lo:hi] to 9999 ? may arrive here as >= 10000 because of +10 increment option ; SIMPLER WAY: return without writing to eeprom if hi == 0x27 -> 0x2700 = 9984, this is within ; the save range for a +10 increment, shall do it... ; mH movff lo,EEDATA write_int_eeprom 0x0D movff hi,EEDATA write_int_eeprom 0x0E return global do_logoffset_common_read do_logoffset_common_read: clrf EEADRH read_int_eeprom 0x0D movff EEDATA,lo read_int_eeprom 0x0E movff EEDATA,hi ; Existing logbook offset into lo:hi return global update_battery_registers update_battery_registers: ; save battery_gauge:6 into EEPROM 0x07-0x0C clrf EEADRH movff battery_gauge+0,EEDATA write_int_eeprom 0x07 movff battery_gauge+1,EEDATA write_int_eeprom 0x08 movff battery_gauge+2,EEDATA write_int_eeprom 0x09 movff battery_gauge+3,EEDATA write_int_eeprom 0x0A movff battery_gauge+4,EEDATA write_int_eeprom 0x0B movff battery_gauge+5,EEDATA write_int_eeprom 0x0C movff battery_type,EEDATA ; =0:1.5V, =1:3,6V Saft, =2:LiIon 3,7V/0.8Ah, =3:LiIon 3,7V/3.1Ah, =4: LiIon 3,7V/2.3Ah write_int_eeprom 0x0F return global vault_decodata_into_eeprom vault_decodata_into_eeprom: ; Vault in EEPROM 512...1023 ; Write 0xAA at 512 to indicate valid data in vault ; Store last time/date ; Store 0x700 to 0x780 (pres_tissue_N2 and pres_tissue_He) movlw HIGH .512 ; =2 movwf EEADRH movlw 0xAA movwf EEDATA write_int_eeprom .0 ; Store date/time movff year,EEDATA write_int_eeprom .1 movff month,EEDATA write_int_eeprom .2 movff day,EEDATA write_int_eeprom .3 movff hours,EEDATA write_int_eeprom .4 movff mins,EEDATA write_int_eeprom .5 movff secs,EEDATA write_int_eeprom .6 movff int_O_CNS_fraction+0,EEDATA write_int_eeprom .7 movff int_O_CNS_fraction+1,EEDATA write_int_eeprom .8 movff int_O_desaturation_time+0,EEDATA write_int_eeprom .9 movff int_O_desaturation_time+1,EEDATA write_int_eeprom .10 movff surface_interval+0,EEDATA write_int_eeprom .11 movff surface_interval+1,EEDATA write_int_eeprom .12 movff int_O_gradient_factor+0,EEDATA ; value limited to 255, only lower byte in use for value write_int_eeprom .13 movff int_O_nofly_time+0,EEDATA write_int_eeprom .14 movff int_O_nofly_time+1,EEDATA write_int_eeprom .15 ; Tissue data from 16 to 144 movlw .16 movwf EEADR movlw .128 movwf lo lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128Bytes vault_decodata_into_eeprom2: movff POSTINC1,EEDATA call write_eeprom ; EEDATA into EEPROM@EEADR incf EEADR,F decfsz lo,F ; All done? bra vault_decodata_into_eeprom2 ; No clrf EEADRH return global restore_decodata_from_eeprom restore_decodata_from_eeprom: movlw LOW .512 ; =0 movwf EEADR movlw HIGH .512 ; =2 movwf EEADRH ; Restore date/time read_int_eeprom .1 movff EEDATA,year read_int_eeprom .2 movff EEDATA,month read_int_eeprom .3 movff EEDATA,day read_int_eeprom .4 movff EEDATA,hours read_int_eeprom .5 movff EEDATA,mins read_int_eeprom .6 movff EEDATA,secs call rtc_set_rtc read_int_eeprom .7 movff EEDATA,int_O_CNS_fraction+0 read_int_eeprom .8 movff EEDATA,int_O_CNS_fraction+1 read_int_eeprom .9 movff EEDATA,int_O_desaturation_time+0 read_int_eeprom .10 movff EEDATA,int_O_desaturation_time+1 read_int_eeprom .11 movff EEDATA,surface_interval+0 read_int_eeprom .12 movff EEDATA,surface_interval+1 read_int_eeprom .13 movff EEDATA,int_O_gradient_factor+0 read_int_eeprom .14 movff EEDATA,int_O_nofly_time+0 read_int_eeprom .15 movff EEDATA,int_O_nofly_time+1 ; Tissue data from 16 to 144 movlw .16 movwf EEADR movlw .128 movwf lo lfsr FSR1,0x700 ; pres_tissue_N2+0, 32*4Byte Float = 128Bytes restore_decodata_from_eeprom2: call read_eeprom ; EEPROM@EEADR into EEDATA movff EEDATA,POSTINC1 incf EEADR,F decfsz lo,F ; All done? bra restore_decodata_from_eeprom2 ; No clrf EEADRH return global reset_battery_internal_only reset_battery_internal_only: clrf EEADRH clrf EEDATA ; Delete to zero write_int_eeprom 0x07 write_int_eeprom 0x08 write_int_eeprom 0x09 write_int_eeprom 0x0A write_int_eeprom 0x0B write_int_eeprom 0x0C banksel battery_gauge+0 clrf battery_gauge+0 clrf battery_gauge+1 clrf battery_gauge+2 clrf battery_gauge+3 clrf battery_gauge+4 clrf battery_gauge+5 banksel common movlw .100 movwf batt_percent return global eeprom_reset_logbook_pointers eeprom_reset_logbook_pointers: clrf EEADRH ; Make sure to select EEPROM bank 0 clrf EEDATA write_int_eeprom .4 write_int_eeprom .5 write_int_eeprom .6 write_int_eeprom .2 ; Also, delete total dive counter write_int_eeprom .3 write_int_eeprom .16 write_int_eeprom .17 ; And the backup counter, too return END