diff code_part1/OSTC_code_asm_part1/ms5535.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 2b5c52ae3923
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/ms5535.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,603 @@
+; 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/>.
+
+
+; routines for Intersema MS5535A, MS5541B and MS5541C
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 9/26/05
+; last updated: 08/08/31
+; known bugs:
+; ToDo: 
+
+; with second order temperature compensation
+
+calculate_compensation:
+; calculate xdT
+	clrf	isr_xA+1
+	movlw	d'8'
+	movwf	isr_xA+0
+	movff	C5+0,isr_xB+0
+	movff	C5+1,isr_xB+1
+	call	isr_mult16x16		;isr_xA*isr_xB=isr_xC
+	movlw   LOW		d'10000'
+	addwf   isr_xC+0, f
+	movlw   HIGH 	d'10000'
+	addwfc  isr_xC+1, f			;isr_xC= 8*C5 + 10000
+	movff	D2+0,isr_sub_a+0
+	movff	D2+1,isr_sub_a+1
+	movff	isr_xC+0,isr_sub_b+0
+	movff	isr_xC+1,isr_sub_b+1
+	call	isr_sub16	;  isr_sub_c = isr_sub_a - isr_sub_b
+	movff	isr_sub_c+0,xdT+0
+	movff	isr_sub_c+1,xdT+1
+
+; Second order temperature calculation
+	btfsc	neg_flag_isr		
+	bra		dTzero_yes
+;	dT>0
+	bcf		neg_flag_xdT
+	movff	xdT+0,isr_xA+0
+	movff	xdT+1,isr_xA+1
+	movff	xdT+0,isr_xB+0
+	movff	xdT+1,isr_xB+1
+	call	isr_mult16x16		;isr_xA*isr_xB=isr_xC
+	movlw	d'17'			; 2^17=(128*128)*8
+	movwf	isr_divB
+	call	isr_div32			; isr_xC=isr_xC(32Bit)/2^isr_divB (isr_divB: 8Bit only!)
+	movff	xdT+0,isr_sub_a+0
+	movff	xdT+1,isr_sub_a+1
+	movff	isr_xC+0,isr_sub_b+0
+	movff	isr_xC+1,isr_sub_b+1
+	call	isr_sub16	;  isr_sub_c = isr_sub_a - isr_sub_b
+	movff	isr_sub_c+0,xdT2+0
+	movff	isr_sub_c+1,xdT2+1
+	bra		OFF_calc			; Done
+		
+dTzero_yes:
+;	dT<0
+	bsf		neg_flag_xdT
+	movff	xdT+0,isr_xA+0
+	movff	xdT+1,isr_xA+1
+	movff	xdT+0,isr_xB+0
+	movff	xdT+1,isr_xB+1
+	call	isr_mult16x16		;isr_xA*isr_xB=isr_xC
+	movlw	d'15'			; 2^15=(128*128)*2
+	movwf	isr_divB
+	call	isr_div32			; isr_xC=isr_xC(32Bit)/2^isr_divB (isr_divB: 8Bit only!)
+
+	movf	xdT+0,W
+	addwf	isr_xC+0,F
+	movf	xdT+1,W
+	addwfc	isr_xC+1,F	
+	movff	isr_xC+0,xdT2+0
+	movff	isr_xC+1,xdT2+1
+
+OFF_calc:
+; calculate OFF
+	movff	C4+0,isr_sub_a
+	movff	C4+1,isr_sub_a+1
+	movlw	d'250'
+	movwf	isr_sub_b
+	clrf	isr_sub_b+1
+	call	isr_sub16				; (C4-250) - Sets neg_flag_isr!
+	movff	isr_sub_c,isr_xA
+	movff	isr_sub_c+1,isr_xA+1
+	movff	xdT+0,isr_xB
+	movff	xdT+0+1,isr_xB+1
+	call	isr_mult16x16			; (C4-250)*dT
+	movff	isr_xC+0,isr_divA
+	movff	isr_xC+1,isr_divA+1
+	movlw	d'12'
+	movwf	isr_divB
+	call	isr_div16				; [(C4-250)*dT]/2^12
+	movff	isr_divA+0,isr_xC+0	
+	movff	isr_divA+1,isr_xC+1			; isr_xC= {[(C4-250)*dT]/2^12}
+	btfss	neg_flag_isr			; neg_flag_isr=1?
+	bra		OFF_calc2			; Yes, do C2 - isr_xC
+								; no, so do C2 + isr_xC
+	movf	C2+0,W
+	addwf   isr_xC+0, f				
+	movf	C2+1,W
+	addwfc  isr_xC+1, f				; isr_xC= C2 + {[(C4-250)*dT/2^12]}
+OFF_calc3:	
+	movlw   LOW	d'10000'
+	addwf   isr_xC+0, f
+	movlw   HIGH d'10000'
+	addwfc  isr_xC+1, f				; isr_xC=[(C4-250)*dT/2^12] + 10000
+	movff	isr_xC+0,OFF+0
+	movff	isr_xC+1,OFF+1
+	bra		calculate_SENS		; Done with OFF
+
+OFF_calc2:	
+	movff	C2+0,isr_sub_a+0
+	movff	C2+1,isr_sub_a+1
+	movff	isr_xC+0,isr_sub_b+0
+	movff	isr_xC+1,isr_sub_b+1
+	call	isr_sub16	;  isr_sub_c = isr_sub_a - isr_sub_b
+						; isr_xC= C2 - {[(C4-250)*dT/2^12]}
+	movff	isr_sub_c+0,isr_xC+0
+	movff	isr_sub_c+1,isr_xC+1			; Done with OFF
+	bra		OFF_calc3
+	
+calculate_SENS:
+	movff	C3+0, C3_temp+0
+	movff	C3+1, C3_temp+1
+	movlw   d'200'
+	addwf   C3_temp+0, f
+	movlw   d'0'
+	addwfc  C3_temp+1, f		; C3 no longer valid!
+	movff	C3_temp+0, isr_xA
+	movff	C3_temp+1, isr_xA+1
+	movff	xdT+0, isr_xB
+	movff	xdT+1, isr_xB+1
+	call	isr_mult16x16
+	movff	isr_xC+0,isr_divA
+	movff	isr_xC+1,isr_divA+1
+	movlw	d'13'
+	movwf	isr_divB
+	call	isr_div16
+	movff	isr_divA,SENS+0
+	movff	isr_divA+1,SENS+1
+	movff	C1+0,isr_divA
+	movff	C1+1,isr_divA+1
+	movlw	d'1'
+	movwf	isr_divB
+	call	isr_div16
+	movf	isr_divA,W
+	addwf   SENS+0, f
+	movf	isr_divA+1,W
+	addwfc  SENS+1, f
+	movlw   d'184'
+	addwf   SENS+0, f
+	movlw   d'11'
+	addwfc  SENS+1, f
+
+; calculate amb_pressure
+	movff	D1+0,isr_sub_a
+	movff	D1+1,isr_sub_a+1
+	movff	OFF+0,isr_sub_b
+	movff	OFF+1,isr_sub_b+1
+	call	isr_sub16
+	movff	isr_sub_c,isr_xA
+	movff	isr_sub_c+1,isr_xA+1
+	movff	SENS+0,isr_xB
+	movff	SENS+1,isr_xB+1
+	call	isr_mult16x16
+	movlw	d'12'
+	movwf	isr_divB
+	call	isr_div32
+	btfsc	neg_flag_isr		; invert isr_xC+0 and isr_xC+1
+	call	isr_invert_xC
+	movlw   LOW 	d'1000'
+	addwf   isr_xC+0, f
+	movlw   HIGH 	d'1000'
+	addwfc  isr_xC+1, f
+	movff	isr_xC+0,amb_pressure+0
+	movff	isr_xC+1,amb_pressure+1
+
+	btfss	simulatormode_active		; are we in simulator mode?
+	bra		calc_pressure_done			; no
+
+	movff	sim_pressure+0,amb_pressure+0	; override readings with simulator values
+	movff	sim_pressure+1,amb_pressure+1
+	
+calc_pressure_done:
+
+; calculate temp	
+	movff	C6+0, C3_temp+0
+	movff	C6+1, C3_temp+1
+	movlw   d'100'
+	addwf   C3_temp+0, f
+	movlw   d'0'
+	addwfc  C3_temp+1, f
+	movff	C3_temp+0,isr_xA+0
+	movff	C3_temp+1,isr_xA+1
+	movff	xdT2+0,isr_xB+0	
+	movff	xdT2+1,isr_xB+1
+	call	isr_mult16x16
+	movlw	d'11'
+	movwf	isr_divB
+	call	isr_div32
+	bcf		neg_temp				; Temperatur positive 
+	
+	btfsc	neg_flag_xdT			; was xdT negative?
+	bra		neg_sub_temp			; yes,  200 - dT*(....
+									; No, 200 + dT*(....
+;	movf	temperature_correction,W
+;	addlw   d'200'
+;	btfsc	STATUS,C
+;	incf	isr_xC+1,F
+
+	movlw	d'200'
+	addwf   isr_xC+0, f
+	movlw   d'0'
+	addwfc  isr_xC+1, f
+	movff	isr_xC+0,temperature+0
+	movff	isr_xC+1,temperature+1
+	return			; done
+
+neg_sub_temp:					; 200 - dT*(....
+;	movf	temperature_correction,W
+;	addlw   d'200'
+;	btfsc	STATUS,C
+;	decf	isr_xC+1,F
+
+	movlw	d'200'
+neg_sub_temp3:
+	movwf	isr_sub_a+0
+	clrf	isr_sub_a+1
+	movff	isr_xC+0, isr_sub_b+0
+	movff	isr_xC+1, isr_sub_b+1
+	call	isr_sub16				; isr_sub_c = isr_sub_a - isr_sub_b
+	btfsc	neg_flag_isr			; below zero?
+	bsf		neg_temp			; temperature negative!
+
+	movff	isr_sub_c+0,temperature+0
+	movff	isr_sub_c+1,temperature+1
+	return			; Fertig mit allem
+
+
+get_pressure_start:
+	rcall	reset_MS5535A
+	movlw	b'10100000'	;+3*high as start and 1+low as stop!
+get_pressure_start2:
+	movwf	isr1_temp
+	movlw	d'12'
+	movwf	clock_count
+	rcall	send_data_MS55535A
+	return
+
+get_pressure_value:
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,D1+1	
+	movff	dLSB,D1+0
+	return
+
+get_temperature_start:
+	rcall	reset_MS5535A
+	movlw	b'10010000'	;+3*high as start and 1+low as stop!
+	bra		get_pressure_start2	; continue in "get_pressure"
+
+get_temperature_value:
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,D2+1
+	movff	dLSB,D2+0
+	return
+
+get_calibration_data:
+	; read addional temperature correction from internal EEPROM 0x100
+	bsf		no_sensor_int				; No sensor interupt!
+	clrf	temperature_correction		; clear compensation value
+	movlw	LOW		0x100
+	movwf	EEADR
+	movlw	HIGH	0x100
+	movwf	EEADRH
+	call	read_eeprom
+	clrf	EEADRH						; Only 256Bytes used in normal program
+	movlw	d'200'						; limit value
+	cpfsgt	EEDATA						; EEDATA>200?
+	movff	EEDATA, temperature_correction	; No, Store for compensation
+	
+	rcall	reset_MS5535A
+	movlw	d'13'
+	movwf	clock_count
+	movlw	b'01010100'	;+3*high as start and 1+low as stop!
+	movwf	isr1_temp
+	rcall	send_data_MS55535A
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,W1+1	
+	movff	dLSB,W1+0
+
+	movlw	d'13'
+	movwf	clock_count
+	movlw	b'01011000'	;+3*high as start and 1+low as stop!
+	movwf	isr1_temp
+	rcall	send_data_MS55535A
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,W2+1	
+	movff	dLSB,W2+0
+
+	movlw	d'13'
+	movwf	clock_count
+	movlw	b'01100100'	;+3*high as start and 1+low as stop!
+	movwf	isr1_temp
+	rcall	send_data_MS55535A
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,W3+1	
+	movff	dLSB,W3+0
+
+	movlw	d'13'
+	movwf	clock_count
+	movlw	b'01101000'	;+3*high as start and 1+low as stop!
+	movwf	isr1_temp
+	rcall	send_data_MS55535A
+	rcall	get_2bytes_MS5535A
+	movff	dMSB,W4+1	
+	movff	dLSB,W4+0
+
+; calculate C1 (16Bit)
+	movff	W1+1, C1+1
+	bcf		STATUS,C
+	rrcf	C1+1
+	bcf		STATUS,C
+	rrcf	C1+1
+	bcf		STATUS,C
+	rrcf	C1+1
+	movff	W1+0, C1+0
+	bsf		STATUS,C
+	btfss	W1+1,0
+	bcf		STATUS,C
+	rrcf	C1+0
+	bsf		STATUS,C
+	btfss	W1+1,1
+	bcf		STATUS,C
+	rrcf	C1+0
+	bsf		STATUS,C
+	btfss	W1+1,2
+	bcf		STATUS,C
+	rrcf	C1+0
+
+; calculate C2 (16Bit)
+	movff	W2+0, C2+0
+	bsf		STATUS,C
+	btfss	W2+1,0
+	bcf		STATUS,C
+	rrcf	C2+0
+	bsf		STATUS,C
+	btfss	W2+1,1
+	bcf		STATUS,C
+	rrcf	C2+0
+	bsf		STATUS,C
+	btfss	W2+1,2
+	bcf		STATUS,C
+	rrcf	C2+0
+	bsf		STATUS,C
+	btfss	W2+1,3
+	bcf		STATUS,C
+	rrcf	C2+0
+	bsf		STATUS,C
+	btfss	W2+1,4
+	bcf		STATUS,C
+	rrcf	C2+0
+	bsf		STATUS,C
+	btfss	W2+1,5
+	bcf		STATUS,C
+	rrcf	C2+0
+
+	movff	W2+1, C2+1
+	bsf		STATUS,C
+	btfss	W1+0,0
+	bcf		STATUS,C
+	rrcf	C2+1
+	bsf		STATUS,C
+	btfss	W1+0,1
+	bcf		STATUS,C
+	rrcf	C2+1
+	bsf		STATUS,C
+	btfss	W1+0,2
+	bcf		STATUS,C
+	rrcf	C2+1
+	bcf		STATUS,C
+	rrcf	C2+1
+	bcf		STATUS,C
+	rrcf	C2+1
+	bcf		STATUS,C
+	rrcf	C2+1
+
+; calculate C3 (16Bit)
+	movff	W3+1,C3+0
+	bsf		STATUS,C
+	btfss	W3+0,7
+	bcf		STATUS,C
+	rlcf	C3+0
+	bsf		STATUS,C
+	btfss	W3+0,6
+	bcf		STATUS,C
+	rlcf	C3+0
+	clrf	C3+1
+	btfsc	W3+1,7
+	bsf		C3+1,1
+	btfsc	W3+1,6
+	bsf		C3+1,0
+	
+; calculate C4 (16Bit)	
+	movff	W4+1,C4+0
+	bsf		STATUS,C
+	btfss	W4+0,7
+	bcf		STATUS,C
+	rlcf	C4+0
+	clrf	C4+1
+	btfsc	W4+1,7
+	bsf		C4+1,0
+	
+; calculate C5 (16Bit)		
+	movff	W3+0,C5+0
+	bcf		C5+0,6
+	btfsc	W2+0,0
+	bsf		C5+0,6
+	bcf		C5+0,7
+	btfsc	W2+0,1
+	bsf		C5+0,7
+	clrf	C5+1
+	btfsc	W2+0,2
+	bsf		C5+1,0
+	btfsc	W2+0,3
+	bsf		C5+1,1
+	btfsc	W2+0,4
+	bsf		C5+1,2
+	btfsc	W2+0,5
+	bsf		C5+1,3
+
+; calculate C6 (16Bit)		
+	clrf	C6+1
+	movff	W4+0,C6+0
+	bcf		C6+0,7
+
+	bcf		no_sensor_int		; enable sensor interrupts
+	return
+
+reset_MS5535A_one:
+	bsf		sensor_SDO
+	nop
+	bsf		sensor_CLK
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	return	
+
+reset_MS5535A_zero:
+	bcf		sensor_SDO
+	nop
+	bsf		sensor_CLK
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	return	
+
+reset_MS5535A:
+	rcall	reset_MS5535A_one			;0
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero
+	rcall	reset_MS5535A_one
+	rcall	reset_MS5535A_zero			;15
+	rcall	reset_MS5535A_zero	
+	rcall	reset_MS5535A_zero	
+	rcall	reset_MS5535A_zero	
+	rcall	reset_MS5535A_zero	
+	rcall	reset_MS5535A_zero			;20
+	return
+
+get_2bytes_MS5535A:
+	movlw	d'8'
+	movwf	clock_count
+	rcall	recieve_loop
+	movff	isr1_temp,dMSB
+
+	movlw	d'8'
+	movwf	clock_count
+	rcall	recieve_loop
+	movff	isr1_temp,dLSB
+	bsf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	return
+
+recieve_loop:
+	bsf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	btfss	sensor_SDI	;MSB first
+	bcf		STATUS,C
+	btfsc	sensor_SDI	;MSB first
+	bsf		STATUS,C
+	rlcf	isr1_temp,F
+	decfsz	clock_count,F
+	bra		recieve_loop
+	return
+	
+
+send_data_MS55535A:
+	; send three startbits first
+	bcf		sensor_CLK
+	bsf		sensor_SDO
+	movlw	d'3'
+	subwf	clock_count,F	; total bit counter
+	bsf		sensor_CLK		
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bsf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bsf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+	; now send 8 bytes from isr_temp1 and fill-up with zeros
+datenbits:
+	btfss	isr1_temp,7	;MSB first
+	bcf		sensor_SDO
+	btfsc	isr1_temp,7	;MSB first
+	bsf		sensor_SDO
+	bcf		STATUS,C
+	rlcf	isr1_temp
+
+	bsf		sensor_CLK	
+	nop
+	nop
+	nop
+	nop
+	nop
+	nop
+	bcf		sensor_CLK	
+
+	decfsz	clock_count,F
+	bra		datenbits
+	return