diff code_part1/OSTC_code_asm_part1/isr.asm @ 238:9581e48a914f

Some cleanup in the ISR
author heinrichsweikamp
date Sun, 20 Mar 2011 17:55:21 +0100
parents ed7826c740a0
children dee88c962653
line wrap: on
line diff
--- a/code_part1/OSTC_code_asm_part1/isr.asm	Sun Mar 20 10:19:19 2011 +0100
+++ b/code_part1/OSTC_code_asm_part1/isr.asm	Sun Mar 20 17:55:21 2011 +0100
@@ -81,7 +81,7 @@
 		movff	PRODH,sim_pressure+1
 		bra		uartint1					; exit uart int
 
-schalter_links:								; 
+switch_left_int:
 		bcf		INTCON,INT0IF				; Clear flag
 
 		btfsc	T0CON,TMR0ON				; Timer0 running?
@@ -93,7 +93,7 @@
 		return
 
 
-schalter_rechts:							; 
+switch_right_int:
 		bcf		INTCON3,INT1IF				; Clear flag
 
 		btfsc	T0CON,TMR0ON				; Timer0 running?
@@ -106,7 +106,6 @@
 
 timer0_restart:
 		bcf		INTCON,TMR0IF				; Clear flag
-
 		clrf	T0CON						; Timer0
 		clrf	TMR0H
 		clrf	TMR0L
@@ -120,7 +119,6 @@
 		clrf	TMR0L
 		return
 		
-
 timer0int_left_reset:
 		bcf		INTCON2, INTEDG0			; Interrupt on faling edge again
 		bcf		switch_left_isr				; Clear flag, button press is done
@@ -149,12 +147,6 @@
 		bsf		INTCON2, INTEDG1			; Interrupt on rising edge again
 		return
 
-timer3int:
-		bcf		PIR2,TMR3IF					; Clear flag
-		bcf		T3CON,TMR0ON				; Stop Timer 3
-		bcf		T2CON,2						; stop Timer 2
-		return
-
 timer1int:
 		bcf		PIR1,TMR1IF					; Clear flag
 
@@ -168,94 +160,66 @@
 		movlw	0x08						; Timer1 int after 62.5ms (=16/second)
 		subwf	TMR1H,F			
 	
-		incf	timer1int_counter1,F
+		incf	timer1int_counter1,F		; Increase timer1 counter
+
 		movlw	d'15'						; One second 16
 		cpfsgt	timer1int_counter1			 
 		bra		sensor_int_pre				; only pressure sensor
-		call	RTCisr						; adjust time, then query pressure sensor
+		rcall	RTCisr						; adjust time, then query pressure sensor
 
 sensor_int_pre:
-		btfss	sleepmode					; In sleepmode?
-		bra		sensor_int					; No
-		return
+		btfsc	sleepmode					; In sleepmode?
+		return								; Yes
 
 sensor_int:
 		btfsc		no_sensor_int			; No sensor interrupt (because it's addressed during sleep)
 		return						
 
-		incf		timer1int_counter2,F		; counts to eight for state maschine
-
-		movlw		d'1'
-		cpfseq		timer1int_counter2		; State 1?
-		bra			sensor_int1				; No
+		incf		timer1int_counter2,F	; counts to eight for state maschine
 
-		bcf			pressure_refresh			; clear flags
-		clrf		isr3_temp+0				; pressure average registers
-		clrf		isr3_temp+1
-		clrf		temperature_temp+0
-		clrf		temperature_temp+1
-sensor_int0:
-		call		get_temperature_value		; State 1: Get temperature
-		call		get_pressure_start	 	; and start pressure integration.
-		return						; Done.
-sensor_int1:
-		movlw		d'2'
-		cpfseq		timer1int_counter2		; State 2?
-		bra			sensor_int2				; No
-		
-sensor_int1_1:
-		call		get_pressure_value		; State2: Get pressure (51us)
-		call		get_temperature_start		; and start temperature integration (73,5us)
-		call		calculate_compensation		; calculate temperature compensated pressure (233us)
-		movf		amb_pressure+0,W
-		addwf		isr3_temp+0				; average pressure
-		movf		amb_pressure+1,W
-		addwfc		isr3_temp+1
-		movf		temperature+0,W
-		addwf		temperature_temp+0		; average temperature
-		movf		temperature+1,W
-		addwfc		temperature_temp+1
-		return		
-sensor_int2:
-		movlw		d'3'
-		cpfseq		timer1int_counter2		; State 3?
-		bra			sensor_int3				; No
-		bra			sensor_int0				; Yes, but same as State 1!
-sensor_int3:
-		movlw		d'4'
-		cpfseq		timer1int_counter2		; State 4?
-		bra			sensor_int4				; No
-		bra			sensor_int1_1			; Yes, but same as State 2!
-sensor_int4:
-		movlw		d'5'					
-		cpfseq		timer1int_counter2		; State 5?
-		bra			sensor_int5				; No
-		bra			sensor_int0				; Yes, but same as State 1!
-sensor_int5:
-		movlw		d'6'
-		cpfseq		timer1int_counter2		; State 6?
-		bra			sensor_int6				; No
-		bra			sensor_int1_1			; Yes, but same as State 2!
-sensor_int6:
-		movlw		d'7'
-		cpfseq		timer1int_counter2		; State 7?
-		bra			sensor_int7				; No
-		bra			sensor_int0				; Yes, but same as State 1!
-sensor_int7:
-		rcall		sensor_int1_1			; Do State 2...
-		clrf		timer1int_counter2		; ..then reset State counter...
-		movlw		d'2'					; and calculate average!
-		movwf		isr2_temp				
-sensor_int8:		
+; State 1: Clear flags and average registers, get temperature (51us) and start pressure integration (73,5us)
+; State 2: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
+; State 3: Get temperature (51us) and start pressure integration (73,5us)
+; State 4: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
+; State 5: Get temperature (51us) and start pressure integration (73,5us)
+; State 6: Get pressure (51us), start temperature integration (73,5us) and calculate temperature compensated pressure (233us)
+; State 7: Get temperature (51us) and start pressure integration (73,5us)
+; State 8: Get pressure (51us), start temperature integration (73,5us), calculate temperature compensated pressure (233us) and build average for half-second update of tempperature and pressure
+	
+		movff	timer1int_counter2,isr_divB		; isr_divB used as temp here...
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state1_plus_restart	; Do State 1
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state2				; Do State 2
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state1				; Do State 3
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state2				; Do State 4
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state1				; Do State 5
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state2				; Do State 6
+		dcfsnz	isr_divB,F
+		bra		sensor_int_state1				; Do State 7
+;		bra		sensor_int2_plus_average		; Do State 8
+
+;sensor_int2_plus_average:
+		rcall		sensor_int_state2
+sensor_int2_plus_average2:		
 		bcf			STATUS,C
 		rrcf		isr3_temp+1				; isr3_temp / 2
 		rrcf		isr3_temp+0
 		bcf			STATUS,C
 		rrcf		temperature_temp+1		; temperature_temp /2
 		rrcf		temperature_temp+0
-		decfsz		isr2_temp,F
-		bra			sensor_int8				; once more
-		
+
+		bcf			STATUS,C
+		rrcf		isr3_temp+1				; isr3_temp / 4
+		rrcf		isr3_temp+0
+		bcf			STATUS,C
+		rrcf		temperature_temp+1		; temperature_temp /4
+		rrcf		temperature_temp+0
+	
 		movff		isr3_temp+1,amb_pressure+1	; copy into actual register
 		movff		isr3_temp+0,amb_pressure+0
 
@@ -263,6 +227,7 @@
 		movff		temperature_temp+0,temperature+0
 
 		bsf			pressure_refresh 			; Set flag! Temp and pressure were updated!
+		clrf		timer1int_counter2			; Then reset State counter
 
 		btfss		simulatormode_active		; are we in simulator mode?
 		bra			comp_air_pressure			; no
@@ -277,16 +242,44 @@
 		bcf			neg_flag				
 		movf		last_surfpressure+0,W		; compensate airpressure
 		subwf   	amb_pressure+0,W             
-		movwf   	rel_pressure+0			; rel_pressure stores depth!
+		movwf   	rel_pressure+0				; rel_pressure stores depth!
 
 		movf		last_surfpressure+1,W
 		subwfb  	amb_pressure+1,W
 		movwf   	rel_pressure+1
-		btfss		STATUS,N				; result is below zero?
+		btfss		STATUS,N					; result is below zero?
+		return
+		clrf		rel_pressure+0				; Yes, do not display negative depths
+		clrf		rel_pressure+1				; e.g. when surface air pressure dropped during the dive
 		return
-		clrf		rel_pressure+0			; Yes, do not display negative depths
-		clrf		rel_pressure+1			; e.g. when surface air pressure dropped during the dive
-		return
+
+
+sensor_int_state1_plus_restart:
+		bcf			pressure_refresh		; clear flags
+		clrf		isr3_temp+0				; pressure average registers
+		clrf		isr3_temp+1
+		clrf		temperature_temp+0
+		clrf		temperature_temp+1
+
+sensor_int_state1:
+		call		get_temperature_value	; State 1: Get temperature
+		call		get_pressure_start	 	; and start pressure integration.
+		return								; Done.
+
+sensor_int_state2:
+		call		get_pressure_value		; State2: Get pressure (51us)
+		call		get_temperature_start	; and start temperature integration (73,5us)
+		call		calculate_compensation	; calculate temperature compensated pressure (233us)
+		movf		amb_pressure+0,W
+		addwf		isr3_temp+0				; average pressure
+		movf		amb_pressure+1,W
+		addwfc		isr3_temp+1
+		movf		temperature+0,W
+		addwf		temperature_temp+0		; average temperature
+		movf		temperature+1,W
+		addwfc		temperature_temp+1
+		return		
+
 
 RTCisr:			
 		clrf		timer1int_counter1		; counts to 16 (one second / 62.5ms)
@@ -294,15 +287,16 @@
 
 		bcf			STATUS,Z				; are we in dive mode?
 		btfss		divemode
-		bra			RTCisr2				; No, must be surface or sleepmode
+		bra			RTCisr2					; No, must be surface or sleepmode
 
 		incf		samplesecs,F			; CF20 diving seconds done 
 		decf		samplesecs_value,W		; holds CF20 value  (minus 1 into WREG)
 		cpfsgt		samplesecs
-		bra			RTCisr1				; no
+		bra			RTCisr1					; no
 
 		clrf		samplesecs				; clear counter...
 		bsf			store_sample			; ...and set bit for profile storage
+
 RTCisr1:		
 ; Increase re-setable average depth divetime counter
 		incf		average_divesecs+0,F	; increase stopwatch registers	
@@ -316,6 +310,7 @@
 		movlw		d'59'
 		cpfsgt		divesecs
 		bra			RTCisr1a
+
 		clrf		divesecs
 		bsf			realdive				; this bit is always set (again) if the dive is longer then one minute