diff src/ms5541.asm @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents 185ba2f91f59
children 7d8a4c60ec1a 5b7fe7777425
line wrap: on
line diff
--- a/src/ms5541.asm	Thu Mar 05 15:06:14 2020 +0100
+++ b/src/ms5541.asm	Tue Apr 28 17:34:31 2020 +0200
@@ -1,8 +1,8 @@
 ;=============================================================================
 ;
-;   File ms5541.asm                           combined next generation V3.8.6
+;   File ms5541.asm                          * combined next generation V3.9.4f
 ;
-;   Sensor subroutines
+;   Sensor Subroutines
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
 ;=============================================================================
@@ -15,15 +15,19 @@
 
 ms5541	CODE
 
-;=============================================================================
+
 ; Expose internal variables to ease debug
 	global	D1, D2
 	global	C1, C2, C3, C4, C5, C6
 	global	xdT, xdT2, OFF, SENS, pressure_abs_avg, temperature_avg
 
-;=============================================================================
 
-	global calculate_compensation		; called from ISR and from sleep mode, returns in bank isr_data
+;-----------------------------------------------------------------------------
+; Convert Temperature & Pressure raw Values to compensated Values
+;
+; called from ISR and from sleep mode, returns in bank isr_data
+;
+	global calculate_compensation
 calculate_compensation:
 	banksel	isr_backup					; select bank ISR data
 
@@ -51,125 +55,112 @@
 
 	; dT >= 0: divide by 8, i.e. 3 shifts rights
 	; dT <  0: divide by 2, i.e. 1 shifts rights
-	movlw	.3
-	btfss	xdT+1,7						 ; was dT negative ?
-	movlw	.1
+	movlw	.3							; 3 shifts by default
+	btfss	xdT+1,7						; was dT negative ?
+	movlw	.1							; YES - replace by 1 shift
 calc_loop_1:
-	bcf		STATUS,C					; dT^2 is positive, so injected zeros
-	rrcf	isr_xC+1,F
-	rrcf	isr_xC+0,F
-	decfsz	WREG
-	bra		calc_loop_1
+	bcf		STATUS,C					; dT^2 is positive, so injecte zeros
+	rrcf	isr_xC+1,F					; shift right high byte
+	rrcf	isr_xC+0,F					; shift right low  byte
+	decfsz	WREG						; decrement loop counter, all shifts done?
+	bra		calc_loop_1					; NO  - loop
 
 	movf	isr_xC+0,W					; dT2 = dT - (dT/128)*(dT/128)/(2 ...or... 8)
-	subwf	xdT+0,W
-	movwf	xdT2+0
-	movf	isr_xC+1,W
-	subwfb	xdT+1,W
-	movwf	xdT2+1
+	subwf	xdT+0,W						; ...
+	movwf	xdT2+0						; ...
+	movf	isr_xC+1,W					; ...
+	subwfb	xdT+1,W						; ...
+	movwf	xdT2+1						; ...
 
 	; calculate OFF = C2 + ((C4-250)*dT2)/2^12 + 10000 (range +9.246 .. +18.887)
 	MOVII	C4,  isr_xA					; C4 - 250 --> A
 	MOVII	xdT2,isr_xB					; dT2      --> B
-	call	isr_signed_mult16x16
+	call	isr_signed_mult16x16		; C = A*B
 
 	movlw	.12-.8						; a 12 bit shift = 1 byte + 4 bits
-	call	isr_shift_C31
+	call	isr_shift_C31				; special shift
 
 	movlw	LOW(.10000)					; add 10000
-	addwf	isr_xC+1,F
-	movlw	HIGH(.10000)
-	addwfc	isr_xC+2,F
+	addwf	isr_xC+1,F					; ...
+	movlw	HIGH(.10000)				; ...
+	addwfc	isr_xC+2,F					; ...
 
 	movf	C2+0,W						; add C2 and store result in OFF
-	addwf	isr_xC+1,W
-	movwf	OFF+0
-	movf	C2+1,W
-	addwfc	isr_xC+2,W
-	movwf	OFF+1
+	addwf	isr_xC+1,W					; ...
+	movwf	OFF+0						; ...
+	movf	C2+1,W						; ...
+	addwfc	isr_xC+2,W					; ...
+	movwf	OFF+1						; ...
 
 	; calculate SENS = C1/2 + ((C3+200)*dT)/2^13 + 3000
 	movlw	LOW(.200)					; C3+200 --> A
-	addwf	C3+0,W
-	movwf	isr_xA+0
-	movlw	HIGH(.200)
-	addwfc	C3+1,W
-	movwf	isr_xA+1
+	addwf	C3+0,W						; ...
+	movwf	isr_xA+0					; ...
+	movlw	HIGH(.200)					; ...
+	addwfc	C3+1,W						; ...
+	movwf	isr_xA+1					; ...
 										; B still contains dT2
-	call	isr_signed_mult16x16		; A*B --> C
+	call	isr_signed_mult16x16		; C = A*B
 	movlw	.13-.8						; A 13 bit shift = 1 byte + 5 bits
-	call	isr_shift_C31
+	call	isr_shift_C31				; special shift
 
 	bcf		STATUS,C					; SENS = C1 / 2
-	rrcf	C1+1,W
-	movwf	SENS+1
-	rrcf	C1+0,W
-	movwf	SENS+0
+	rrcf	C1+1,W						; ...
+	movwf	SENS+1						; ...
+	rrcf	C1+0,W						; ...
+	movwf	SENS+0						; ...
 
 	movlw	LOW(.3000)					; add 3000
-	addwf	isr_xC+1,F
-	movlw	HIGH(.3000)
-	addwfc	isr_xC+2,F
+	addwf	isr_xC+1,F					; ...
+	movlw	HIGH(.3000)					; ...
+	addwfc	isr_xC+2,F					; ...
 
 	movf	isr_xC+1,W					; and sum into SENS
-	addwf	SENS+0,F
-	movf	isr_xC+2,W
-	addwfc	SENS+1,F
+	addwf	SENS+0,F					; ...
+	movf	isr_xC+2,W					; ...
+	addwfc	SENS+1,F					; ...
 
 	; calculate absolute pressure = (sens * (d1-off))/2^12 + 1000 (for MS5541C)
 	; calculate absolute pressure = (sens * (d1-off))/2^11 + 1000 (for MS5541C-30)
 	movf	OFF+0,W						; d1-off --> a
-	subwf	D1+0,W
-	movwf	isr_xA+0
-	movf	OFF+1,W
-	subwfb	D1+1,W
-	movwf	isr_xA+1
+	subwf	D1+0,W						; ...
+	movwf	isr_xA+0					; ...
+	movf	OFF+1,W						; ...
+	subwfb	D1+1,W						; ...
+	movwf	isr_xA+1					; ...
 
-	MOVII	SENS,isr_xB					; sens --> b
-	call	isr_signed_mult16x16
-	movlw	.13
+	MOVII	SENS,isr_xB					; sens --> B
+	call	isr_signed_mult16x16		; C = A*B
+	movlw	.13							; 12 * 256 = 3328
 	cpfslt	C1+1						; C1 > 3328 ?
 	bra		isr_shift_ms5541_30			; YES - MS5541-30
 	movlw	.12-.8						; NO  - MS5541: 12 bit shift = 1 byte + 4 bits
-	bra		isr_shift_ms5541_common
+	bra		isr_shift_ms5541_common		;     - continue
 isr_shift_ms5541_30:
 	movlw	.11-.8						; MS5541-30:    11 bit shift = 1 byte + 3 bits
 isr_shift_ms5541_common:
-	call	isr_shift_C31
+	call	isr_shift_C31				; special shift
 	movlw	LOW  .1000					; add 1000
-	addwf	isr_xC+1,F
-	movlw	HIGH .1000
-	addwfc	isr_xC+2,F
+	addwf	isr_xC+1,F					; ...
+	movlw	HIGH .1000					; ...
+	addwfc	isr_xC+2,F					; ...
 
 	; add opt_pressure_adjust to result (SIGNED!)
-	movff	opt_pressure_adjust,isr_xC+0; get adjustment value (signed)
-	movf	isr_xC+0,F					; excite flags, opt_pressure_adjust = 0 ?
-	bz		calc_compensation_1			; YES - skip pressure adjustment
-	btfss	isr_xC+0,7					; NO  - opt_pressure_adjust < 0 ?
-	bra		pressure_extra_add			;       NO  - add offset
-	;bra	pressure_extra_sub			;       YES - subtract offset
-
-pressure_extra_sub:
-	comf	isr_xC+0,F					; complement opt_pressure_adjust
-	incf	isr_xC+0,F					; ...
-	movlw	.22							; check for max. of 20 mbar
-	cpfslt	isr_xC+0					; opt_pressure_adjust < 21 mbar ?
-	clrf	isr_xC+0					; NO - reset opt_pressure_adjust to zero
-	movf	isr_xC+0,W					; get opt_pressure_adjust to WREG
-	subwf	isr_xC+1,F					; pressure value -= opt_pressure_adjust, low  byte
-	movlw	.0							; pressure value -= opt_pressure_adjust, high byte
-	subwfb	isr_xC+2,F					; ...
-	bra		calc_compensation_1			; continue with checking for simulator mode
-
-pressure_extra_add:
-	movlw	.21							; check for max. of 20 mbar
-	cpfslt	isr_xC+0					; opt_pressure_adjust < 21 mbar ?
-	clrf	isr_xC+0					; NO - reset opt_pressure_adjust to zero
-	movf	isr_xC+0,W					; get opt_pressure_adjust to WREG
+	clrf	isr_xC+0					; prepare high byte for adjustment
+	movff	opt_pressure_adjust,WREG	; get     low  byte for adjustment (signed)
+	movf	WREG,W						; excite flags
+	bz		calc_compensation_1			; opt_pressure_adjust = 0 -> skip adjustment
+	btfss	STATUS,N					; opt_pressure_adjust < 0 ?
+	bra		calc_compensation_adjust	; NO  - positive
+	negf	WREG						; YES - negate opt_pressure_adjust for limit check
+	setf	isr_xC+0					;     - adopt high byte for adjustment
+calc_compensation_adjust:
+	addlw	-.21						; limit is 20 mbar, subtract 21
+	bnn		calc_compensation_1			; result not negative -> skip adjustment
+	movff	opt_pressure_adjust,WREG	; get opt_pressure_adjust,               low  byte
 	addwf	isr_xC+1,F					; pressure value += opt_pressure_adjust, low  byte
-	movlw	.0							; pressure value += opt_pressure_adjust, high byte
-	addwfc	isr_xC+2,F					; ...
-	;bra	calc_compensation_1			; continue with checking for simulator mode
+	movf	isr_xC+0,W					; get adjustment,                        high byte
+	addwfc	isr_xC+2,F					; pressure value += opt_pressure_adjust, high byte
 
 calc_compensation_1:
 	bcf		sensor_override_active		; clear sensor override active flag by default
@@ -270,145 +261,160 @@
 
 	; calculate temp = 200 + dT*(C6+100)/2^11
 	movlw	LOW(.100)					; C6 + 100 --> A
-	addwf	C6+0,W
-	movwf	isr_xA+0
-	movlw	HIGH(.100)
-	addwfc	C6+1,W
-	movwf	isr_xA+1
+	addwf	C6+0,W						; ...
+	movwf	isr_xA+0					; ...
+	movlw	HIGH(.100)					; ...
+	addwfc	C6+1,W						; ...
+	movwf	isr_xA+1					; ...
 
 	MOVII	xdT2,isr_xB					; dT2 --> B
 	call	isr_signed_mult16x16		; A*B
 	movlw	.11-.8						; a 12 bit shift = 1 byte + 3 bits
-	call	isr_shift_C31
+	call	isr_shift_C31				; special shift
 
 	movlw	LOW(.200)					; add 200
-	addwf	isr_xC+1,F
-	movlw	HIGH(.200)
-	addwfc	isr_xC+2,F
+	addwf	isr_xC+1,F					; ...
+	movlw	HIGH(.200)					; ...
+	addwfc	isr_xC+2,F					; ...
 
 	; add opt_temperature_adjust to result (SIGNED!)
-	movff	opt_temperature_adjust,isr_xC+0
-
-	btfss	isr_xC+0,7					; < 0 ?
-	bra		temperature_extra_add		; NO
-	comf	isr_xC+0,F					; YES
-	incf	isr_xC+0,F
-	movlw	.22							; check for max. of 2.0°C
-	cpfslt	isr_xC+0
-	clrf	isr_xC+0
-	movf	isr_xC+0,W					; subtract
-	subwf	isr_xC+1,F
-	movlw	.0
-	subwfb	isr_xC+2,F
-	bra		temperature_extra_common
+	clrf	isr_xC+0					; prepare high byte for adjustment
+	movff	opt_temperature_adjust,WREG	; get     low  byte for adjustment (signed)
+	movf	WREG,W						; excite flags
+	bz		calc_temperature_add_avg	; opt_temperature_adjust = 0 -> skip adjustment
+	btfss	STATUS,N					; opt_temperature_adjust < 0 ?
+	bra		calc_temperature_adjust		; NO  - positive
+	negf	WREG						; YES - negate opt_temperature_adjust for limit check
+	setf	isr_xC+0					;     - adopt high byte for adjustment
+calc_temperature_adjust:
+	addlw	-.21						; limit is 2.0°C, subtract 21 (scaling is 0.1°C)
+	bnn		calc_temperature_add_avg	; result not negative -> skip adjustment
+	movff	opt_temperature_adjust,WREG	; get opt_temperature_adjust,                  low  byte
+	addwf	isr_xC+1,F					; temperature value += opt_temperature_adjust, low  byte
+	movf	isr_xC+0,W					; get adjustment                               high byte
+	addwfc	isr_xC+2,F					; temperature value += opt_temperature_adjust, high byte
 
-temperature_extra_add:
-	movlw	.21							; check for max. of 2.0°C
-	cpfslt	isr_xC+0
-	clrf	isr_xC+0
-	movf	isr_xC+0,W					; add
-	addwf	isr_xC+1,F
-	movlw	.0
-	addwfc	isr_xC+2,F
+calc_temperature_add_avg:
+	movf	isr_xC+1,W					; copy current temperature to WREG,       low  byte
+	addwf	temperature_avg+0,F			; temperature_avg += current temperature, low  byte
+	movf	isr_xC+2,W					; copy current temperature to WREG,       high byte
+	addwfc	temperature_avg+1,F			; temperature_avg += current temperature, high byte
+	return								; done
+
 
-temperature_extra_common:
-	movf	isr_xC+1,W
-	addwf	temperature_avg+0,F
-	movf	isr_xC+2,W
-	addwfc	temperature_avg+1,F
-
+;-----------------------------------------------------------------------------
+; Start Pressure Measurement
+;
+; called from ISR and sleep mode, needs to be called in bank isr_backup
+;
+	global	get_pressure_start
+get_pressure_start:
+	rcall	reset_MS5541				; reset the chip
+	movlw	b'10100000'					; +3*high as start and 1+low as stop
+	movwf	dbuffer						; ....
+	movlw	d'12'						; send start command
+	rcall	send_data_MS5541			; ...
 	return								; done
 
-;=============================================================================
 
-	global	get_pressure_start			; called from ISR and sleep mode, needs to be called bank isr_backup
-get_pressure_start:
-	rcall	reset_MS5541
-	movlw	b'10100000'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'12'
-	rcall	send_data_MS5541
-	return
-
-	global get_pressure_value			; called from ISR and sleep mode, needs to be called bank isr_backup
+;-----------------------------------------------------------------------------
+; Read Pressure Measurement Result
+;
+; called from ISR and sleep mode, needs to be called in bank isr_backup
+;
+	global get_pressure_value
 get_pressure_value:
 	btfsc	MS5541_miso					; conversion done?
-	return								; NO - done
-	rcall	get_2bytes_MS5541
-	movff	dMSB,D1+1
-	movff	dLSB,D1+0
-	return
-
-;=============================================================================
-
-	global	get_temperature_start		; called from ISR and sleep mode, needs to be called in bank isr_backup
-get_temperature_start:
-	rcall	reset_MS5541
-	movlw	b'10010000'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'12'
-	rcall	send_data_MS5541
-	return
+	return								; NO  - abort
+	rcall	get_2bytes_MS5541			; YES - read result
+	movff	dMSB,D1+1					; copy result to D1, high byte first
+	movff	dLSB,D1+0					; ...                low  byte second
+	return								; done
 
 
-	global	get_temperature_value		; called from ISR and sleep mode, needs to be called in bank isr_backup
+;-----------------------------------------------------------------------------
+; Start Temperature Measurement
+;
+; called from ISR and sleep mode, needs to be called in bank isr_backup
+;
+	global	get_temperature_start
+get_temperature_start:
+	rcall	reset_MS5541				; reset chip
+	movlw	b'10010000'					; +3*high as start and 1+low as stop
+	movwf	dbuffer						; ...
+	movlw	d'12'						; send start command
+	rcall	send_data_MS5541			; ...
+	return								; done
+
+
+;-----------------------------------------------------------------------------
+; Read Pressure Measurement Result
+;
+; called from ISR and sleep mode, needs to be called in bank isr_backup
+;
+	global	get_temperature_value
 get_temperature_value:
 	btfsc	MS5541_miso					; conversion done?
 	return								; NO - done
-	rcall	get_2bytes_MS5541
-	movff	dMSB,D2+1
-	movff	dLSB,D2+0
-	return
+	rcall	get_2bytes_MS5541			; YES - read result
+	movff	dMSB,D2+1					; copy result to D2, high byte first
+	movff	dLSB,D2+0					; ...                low  byte second
+	return								; done
+
 
-;=============================================================================
-
-	global	get_calibration_data		; called by start, returns in bank common
+;-----------------------------------------------------------------------------
+; Retrieve Calibration Data
+;
+; called by start, returns in bank common
+;
+	global	get_calibration_data
 get_calibration_data:
 	banksel	isr_backup					; select bank ISR data
 	bsf		block_sensor_interrupt		; disable sensor interrupts
 
-	rcall	reset_MS5541
+	rcall	reset_MS5541				; reset chip
+
 	movlw	b'01010100'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'13'
-	rcall	send_data_MS5541
-	rcall	get_2bytes_MS5541
-	movff	dMSB,ir_s8_buffer+1
-	movff	dLSB,ir_s8_buffer+0
+	movwf	dbuffer						; ...
+	movlw	d'13'						; send command
+	rcall	send_data_MS5541			; ...
+	rcall	get_2bytes_MS5541			; read result
+	movff	dMSB,ir_s8_buffer+1			; copy result, high byte first
+	movff	dLSB,ir_s8_buffer+0			; copy result, low  byte second
 
 	movlw	b'01011000'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'13'
-	rcall	send_data_MS5541
-	rcall	get_2bytes_MS5541
-	movff	dMSB,ir_s8_buffer+3
-	movff	dLSB,ir_s8_buffer+2
+	movwf	dbuffer						; ...
+	movlw	d'13'						; send command
+	rcall	send_data_MS5541			; ...
+	rcall	get_2bytes_MS5541			; read result
+	movff	dMSB,ir_s8_buffer+3			; copy result, high byte first
+	movff	dLSB,ir_s8_buffer+2			; copy result, low  byte second
 
 	movlw	b'01100100'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'13'
-	rcall	send_data_MS5541
-	rcall	get_2bytes_MS5541
-	movff	dMSB,ir_s8_buffer+5
-	movff	dLSB,ir_s8_buffer+4
+	movwf	dbuffer						; ...
+	movlw	d'13'						; send command
+	rcall	send_data_MS5541			; ...
+	rcall	get_2bytes_MS5541			; read result
+	movff	dMSB,ir_s8_buffer+5			; copy result, high byte first
+	movff	dLSB,ir_s8_buffer+4			; copy result, low  byte second
 
 	movlw	b'01101000'					; +3*high as start and 1+low as stop
-	movwf	dbuffer
-	movlw	d'13'
-	rcall	send_data_MS5541
-	rcall	get_2bytes_MS5541
-	movff	dMSB,ir_s8_buffer+7
-	movff	dLSB,ir_s8_buffer+6
+	movwf	dbuffer						; ...
+	movlw	d'13'						; send command
+	rcall	send_data_MS5541			; ...
+	rcall	get_2bytes_MS5541			; read result
+	movff	dMSB,ir_s8_buffer+7			; copy result, high byte first
+	movff	dLSB,ir_s8_buffer+6			; copy result, low  byte second
 
-	; calculate C1 (16Bit)
-	movff	ir_s8_buffer+1, C1+1
+	; calculate C1 (16 Bit)
+	movff	ir_s8_buffer+1,C1+1
 	bcf		STATUS,C
 	rrcf	C1+1
 	bcf		STATUS,C
 	rrcf	C1+1
 	bcf		STATUS,C
 	rrcf	C1+1
-	movff	ir_s8_buffer+0, C1+0
+	movff	ir_s8_buffer+0,C1+0
 	bsf		STATUS,C
 	btfss	ir_s8_buffer+1,0
 	bcf		STATUS,C
@@ -422,7 +428,7 @@
 	bcf		STATUS,C
 	rrcf	C1+0
 
-	; calculate C2 (16Bit)
+	; calculate C2 (16 Bit)
 	movff	ir_s8_buffer+2, C2+0
 	bsf		STATUS,C
 	btfss	ir_s8_buffer+3,0
@@ -469,7 +475,7 @@
 	bcf		STATUS,C
 	rrcf	C2+1
 
-	; calculate C3 (16Bit)
+	; calculate C3 (16 Bit)
 	movff	ir_s8_buffer+5,C3+0
 	bsf		STATUS,C
 	btfss	ir_s8_buffer+4,7
@@ -485,7 +491,7 @@
 	btfsc	ir_s8_buffer+5,6
 	bsf		C3+1,0
 
-	; calculate C4 (16Bit)
+	; calculate C4 (16 Bit)
 	movff	ir_s8_buffer+7,C4+0
 	bsf		STATUS,C
 	btfss	ir_s8_buffer+6,7
@@ -503,7 +509,7 @@
 	addwfc	C4+1,W
 	movwf	C4+1
 
-	; calculate C5 (16Bit)
+	; calculate C5 (16 Bit)
 	movff	ir_s8_buffer+4,C5+0
 	bcf		C5+0,6
 	btfsc	ir_s8_buffer+2,0
@@ -544,13 +550,16 @@
 	banksel	common						; back to bank common
 	return								; done
 
-;=============================================================================
+
+;-----------------------------------------------------------------------------
+; Helper Function - Reset Chip
+;
 reset_MS5541_one:
-	bsf		MS5541_mosi
+	bsf		MS5541_mosi					; set MOSI
 	bra		send_clk_pulse				; send one high-low sequence on MS5541_clk and return
 
 reset_MS5541_zero:
-	bcf		MS5541_mosi
+	bcf		MS5541_mosi					; clear MOSI
 	bra		send_clk_pulse				; send one high-low sequence on MS5541_clk and return
 
 reset_MS5541:
@@ -578,77 +587,95 @@
 	return
 
 
+;-----------------------------------------------------------------------------
+; Helper Function - read 2 Byte from Chip
+;
 get_2bytes_MS5541:
-	movlw	d'8'
-	movwf	clock_count
-	rcall	recieve_loop
-	movff	dbuffer,dMSB
-	movlw	d'8'
-	movwf	clock_count
-	rcall	recieve_loop
-	movff	dbuffer,dLSB
+	movlw	d'8'						; load counter for 8 bit
+	movwf	clock_count					; ...
+	rcall	recieve_loop				; receive 8 bits
+	movff	dbuffer,dMSB				; store result
+	movlw	d'8'						; load counter for 8 bit
+	movwf	clock_count					; ...
+	rcall	recieve_loop				; receive 8 bits
+	movff	dbuffer,dLSB				; store result
 	bra		send_clk_pulse				; send one high-low sequence on MS5541_clk and return
 
+
+;-----------------------------------------------------------------------------
+; Helper Function - read 1 Bit from Chip
+;
 recieve_loop:
 	rcall	send_clk_pulse				; send one high-low sequence on MS5541_clk
-	btfss	MS5541_miso					; MSB first
-	bcf		STATUS,C
-	btfsc	MS5541_miso					; MSB first
-	bsf		STATUS,C
-	rlcf	dbuffer,F
-	decfsz	clock_count,F
-	bra		recieve_loop
-	return
+	btfss	MS5541_miso					; read bit = 1 ? (MSB first)
+	bcf		STATUS,C					; NO - clear carry bit
+	btfsc	MS5541_miso					; read bit = 0 ? (MSB first)
+	bsf		STATUS,C					; NO - set   carry bit
+	rlcf	dbuffer,F					; shift buffer
+	decfsz	clock_count,F				; decrement counter, became zero?
+	bra		recieve_loop				; NO  - loop
+	return								; YES - done
 
+
+;-----------------------------------------------------------------------------
+; Helper Function - send a Clock Pulse
+;
 send_clk_pulse:
-	bsf		MS5541_clk
+	bsf		MS5541_clk					; set clock
 	nop
 	nop
 	nop
 	nop
 	nop
 	nop
-	bcf		MS5541_clk
+	bcf		MS5541_clk					; release clock
 	nop
 	nop
 	nop
 	nop
-	return
+	return								; done
 
 
+;-----------------------------------------------------------------------------
+; Helper Function - send a Command
+;
 send_data_MS5541:
 	movwf	clock_count					; from WREG
 	; send three start bits first
-	bcf		MS5541_clk
-	nop
-	nop
-	bsf		MS5541_mosi
-	movlw	d'3'
-	subwf	clock_count,F				; total bit counter
+	bcf		MS5541_clk					; revoke clock
+	nop									; wait
+	nop									; wait
+	bsf		MS5541_mosi					; set MOSI
+	movlw	d'3'						; compute total bit counter
+	subwf	clock_count,F				; ...
 	rcall	send_clk_pulse				; send one high-low sequence on MS5541_clk
 	rcall	send_clk_pulse				; send one high-low sequence on MS5541_clk
 	rcall	send_clk_pulse				; send one high-low sequence on MS5541_clk
-send_data_MS5541_loop:					; now send 8 bits from dbuffer and fill-up with zeros
-	bcf		MS5541_clk
-	nop
-	nop
-	btfss	dbuffer,7					; MSB first
-	bcf		MS5541_mosi
-	btfsc	dbuffer,7					; MSB first
-	bsf		MS5541_mosi
-	bsf		MS5541_clk
-	bcf		STATUS,C
-	rlcf	dbuffer,F
-	nop
-	nop
+
+send_data_MS5541_loop:
+	; now send 8 bits from dbuffer and fill-up with zeros
+	bcf		MS5541_clk					; revoke clock
+	nop									; wait
+	nop									; wait
+	btfss	dbuffer,7					; bit = 1 ? (MSB first)
+	bcf		MS5541_mosi					; NO  - clear MOSI
+	btfsc	dbuffer,7					; bit = 0 ? (MSB first)
+	bsf		MS5541_mosi					; NO  - set   MOSI
+	bsf		MS5541_clk					; set clock
+	bcf		STATUS,C					; clear carry bit
+	rlcf	dbuffer,F					; shift data byte
+	nop									; wait
+	nop									; wait
 ;	nop
 ;	nop
 ;	nop
 ;	nop
 ;	bcf		MS5541_clk
-	decfsz	clock_count,F
-	bra		send_data_MS5541_loop
-	bcf		MS5541_clk
-	return
+	decfsz	clock_count,F				; decrement bit counter, became zero?
+	bra		send_data_MS5541_loop		; NO  - loop
+	bcf		MS5541_clk					; YES - revoke clock
+	return								;     - done
 
-	END
\ No newline at end of file
+;-----------------------------------------------------------------------------
+
+	END