Mercurial > public > hwos_code
diff src/eeprom_rs232.asm @ 582:b455b31ce022
work on 2.97 stable
author | heinrichsweikamp |
---|---|
date | Mon, 26 Feb 2018 16:40:28 +0100 |
parents | 3c55627d5f8f |
children | ca4556fb60b9 |
line wrap: on
line diff
--- a/src/eeprom_rs232.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/eeprom_rs232.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File eeprom_rs232.asm +; File eeprom_rs232.asm V2.98 ; ; Internal EEPROM, RS232 ; @@ -11,26 +11,68 @@ #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 ;============================================================================= -eeprom code 0xF00000+0x10 -; Skip SERIAL number. Should not be overwritten. - global eeprom_serial_save, eeprom_opt_backup -eeprom_serial_save res 2 -eeprom_opt_backup res 0x3E +basic CODE -;============================================================================= -basic CODE - - global write_int_eeprom_1 + global write_int_eeprom_1 write_int_eeprom_1: movwf EEADR - bra write_eeprom ; writes and "returns" after write +; 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 +; bra read_eeprom ; reads and "returns" after write ;============================================================================= ; reads from internal eeprom @@ -38,180 +80,357 @@ ; Output: EEDATA. ; Trashed: NONE. global read_eeprom -read_eeprom: +read_eeprom: bcf EECON1,EEPGD bcf EECON1,CFGS bsf EECON1,RD return -;============================================================================= -; 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 interrups 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 + 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 disable_ir_s8 -disable_ir_s8: - banksel TXSTA2 - clrf TXSTA2 - clrf RCSTA2 - banksel common - bcf ir_power ; IR off - bcf mcp_power ; Power-down intrumentation amp - bsf s8_npower ; Power-down S8 HUD - return - global enable_ir_s8 + global enable_ir_s8 enable_ir_s8: ;init serial port2 (TRISG2) - btfsc analog_o2_input - bra enable_s8 ; Start S8 + btfsc analog_o2_input + bra enable_s8 ; Start S8 - banksel BAUDCON2 - movlw b'00100000' ; BRG16=0 ; inverted for IR + 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 + 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 intrumentation amp - btfss mcp_power - bra $-6 - banksel TXSTA2 - clrf TXSTA2 - clrf RCSTA2 - banksel common + ; 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 + ; 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) + 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 + ; 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 +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 + 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 + 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 + 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 + 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 + 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 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. - 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 + global rs232_wait_tx2 rs232_wait_tx2: - banksel TXSTA2 + banksel TXSTA2 rs232_wait_tx2_1: - btfss TXSTA2,TRMT ; RS232 Busy? - bra rs232_wait_tx2_1 ; yes, wait... - banksel common - return ; Done. + 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_recieve_overflow ; clear flag - movlw .10 - movwf uart1_temp - clrf uart2_temp - clrf uart3_temp + 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 + btfsc PIR1,RCIF ; data arrived? + return ; Yes + decfsz uart3_temp,F bra rs232_get_byte2 - decfsz uart1_temp,F + decfsz uart2_temp,F + bra rs232_get_byte2 + decfsz uart1_temp,F bra rs232_get_byte2 - ; timeout occoured (about 400ms) - bsf rs232_recieve_overflow ; set flag + ; timeout occurred (about 400ms) + bsf rs232_receive_overflow ; set flag rs232_get_byte3: - bcf RCSTA1,CREN ; Clear receiver status + bcf RCSTA1,CREN ; Clear receiver status bsf RCSTA1,CREN - return ; and return anyway + 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 - END \ No newline at end of file + ; 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