view src/eeprom_rs232.asm @ 604:ca4556fb60b9

bump to 2.99beta, work on 3.00 stable
author heinrichsweikamp
date Thu, 22 Nov 2018 19:47:26 +0100
parents b455b31ce022
children c40025d8e750
line wrap: on
line source

;=============================================================================
;
;   File eeprom_rs232.asm												V2.99a
;
;   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 - it should not be overwritten

	global	eeprom_serial_save
	global	eeprom_opt_backup

eeprom_serial_save	res 2
eeprom_opt_backup	res 0x3E

;=============================================================================
ee_rs232		CODE

	global	write_int_eeprom_1
write_int_eeprom_1:
	movwf	EEADR
	bra		write_eeprom				; writes and "returns" after write


	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

;=============================================================================
; 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	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 @ 16 MHz
	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 @ 16 MHz
	movwf	SPBRG2
	movlw	b'10010000'
	movwf	RCSTA2
	banksel	common
	bsf		s8_digital					; set flag
	return

;=============================================================================

	global	enable_rs232
enable_rs232:
	call	speed_normal				; 16 MHz
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
	clrf	uart1_temp					; set uart1_temp to .10 without using WREG: first clear to 0, then...
	bsf		uart1_temp,1				; set bit 1 (value 2),
	bsf		uart1_temp,3				; and bit 3 (value 8).
	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:
	movlw	0x26
	cpfslt	hi								; is offset < 0x26?? (decimal 9983 at max, hence save for another +10) ?
	return									; NO  - abort
	movff	lo,EEDATA						; YES - proceed writing offset to EEPROM
	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 = 128 Bytes
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