annotate src/calibrate.asm @ 145:e3ac5b2021bc

NEW: Setpoint-Fallback option for external O2 sensor failure
author heinrichsweikamp
date Tue, 05 Aug 2014 16:55:09 +0200
parents f3062a611eef
children fdd4e30846ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
113
heinrichsweikamp
parents:
diff changeset
1 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
2 ;
heinrichsweikamp
parents:
diff changeset
3 ; File calibration.asm
heinrichsweikamp
parents:
diff changeset
4 ;
heinrichsweikamp
parents:
diff changeset
5 ; o2 sensor calibration subroutines
heinrichsweikamp
parents:
diff changeset
6 ;
heinrichsweikamp
parents:
diff changeset
7 ; Copyright (c) 2014, Heinrichs Weikamp, all right reserved.
heinrichsweikamp
parents:
diff changeset
8 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
9
heinrichsweikamp
parents:
diff changeset
10 #include "ostc3.inc"
heinrichsweikamp
parents:
diff changeset
11 #include "shared_definitions.h" ; Mailbox between c and asm
heinrichsweikamp
parents:
diff changeset
12 #include "math.inc"
heinrichsweikamp
parents:
diff changeset
13 #include "adc_lightsensor.inc"
heinrichsweikamp
parents:
diff changeset
14 #include "eeprom_rs232.inc"
heinrichsweikamp
parents:
diff changeset
15
heinrichsweikamp
parents:
diff changeset
16 calibrate CODE
heinrichsweikamp
parents:
diff changeset
17
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
18 global check_sensors ; Check O2 sensor thresholds for fallback
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
19 check_sensors:
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
20 ; Check min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
21 movff o2_mv_sensor1+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
22 movff o2_mv_sensor1+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
23 movlw LOW min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
24 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
25 movlw HIGH min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
26 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
27 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
28 bsf use_02_sensor1 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
29 btfsc neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
30 bcf use_02_sensor1 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
31
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
32 movff o2_mv_sensor2+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
33 movff o2_mv_sensor2+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
34 movlw LOW min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
35 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
36 movlw HIGH min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
37 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
38 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
39 bsf use_02_sensor2 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
40 btfsc neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
41 bcf use_02_sensor2 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
42
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
43 movff o2_mv_sensor3+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
44 movff o2_mv_sensor3+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
45 movlw LOW min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
46 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
47 movlw HIGH min_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
48 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
49 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
50 bsf use_02_sensor3 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
51 btfsc neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
52 bcf use_02_sensor3 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
53 ; Check max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
54 movff o2_mv_sensor1+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
55 movff o2_mv_sensor1+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
56 movlw LOW max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
57 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
58 movlw HIGH max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
59 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
60 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
61 btfss neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
62 bcf use_02_sensor1 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
63
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
64 movff o2_mv_sensor2+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
65 movff o2_mv_sensor2+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
66 movlw LOW max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
67 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
68 movlw HIGH max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
69 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
70 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
71 btfss neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
72 bcf use_02_sensor2 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
73
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
74 movff o2_mv_sensor3+0, sub_a+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
75 movff o2_mv_sensor3+1, sub_a+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
76 movlw LOW max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
77 movwf sub_b+0
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
78 movlw HIGH max_mv
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
79 movwf sub_b+1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
80 call sub16 ; sub_c = sub_a - sub_b
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
81 btfss neg_flag
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
82 bcf use_02_sensor3 ;=1: Use this sensor for deco
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
83
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
84 btfss hud_connection_ok ;=1: HUD connection ok
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
85 return ; No HUD/Digital data
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
86
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
87 ; Copy disbale flags from digital input
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
88 btfss sensor1_active
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
89 bcf use_02_sensor1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
90 btfss sensor2_active
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
91 bcf use_02_sensor2
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
92 btfss sensor3_active
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
93 bcf use_02_sensor3
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
94 return
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
95
113
heinrichsweikamp
parents:
diff changeset
96 global calibrate_mix
heinrichsweikamp
parents:
diff changeset
97 calibrate_mix:
heinrichsweikamp
parents:
diff changeset
98 ; calibrate S8 HUD
heinrichsweikamp
parents:
diff changeset
99 btfss s8_digital ; S8 Digital?
heinrichsweikamp
parents:
diff changeset
100 bra calibrate_mix2 ; No
heinrichsweikamp
parents:
diff changeset
101
heinrichsweikamp
parents:
diff changeset
102 clrf temp1 ; Chksum
heinrichsweikamp
parents:
diff changeset
103 movlw 0xAA ; Start Byte
heinrichsweikamp
parents:
diff changeset
104 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
105 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
106 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
107
heinrichsweikamp
parents:
diff changeset
108 movlw 0x31 ; Calibrate
heinrichsweikamp
parents:
diff changeset
109 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
110 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
111 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
112
heinrichsweikamp
parents:
diff changeset
113 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
114 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
115 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
116 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
117
heinrichsweikamp
parents:
diff changeset
118 movff amb_pressure+0,WREG ; Ambient pressure
heinrichsweikamp
parents:
diff changeset
119 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
120 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
121 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
122 movff amb_pressure+1,WREG
heinrichsweikamp
parents:
diff changeset
123 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
124 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
125 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
126
heinrichsweikamp
parents:
diff changeset
127 movff temp1,TXREG2 ; Chksum
heinrichsweikamp
parents:
diff changeset
128 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
129
heinrichsweikamp
parents:
diff changeset
130 calibrate_mix2:
heinrichsweikamp
parents:
diff changeset
131 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
132 mullw .100
heinrichsweikamp
parents:
diff changeset
133 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
134 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
135 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
136 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
137 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
138 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
139 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
140 movwf xB+0
heinrichsweikamp
parents:
diff changeset
141 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
142 movwf xB+1
heinrichsweikamp
parents:
diff changeset
143 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
144 movff o2_mv_sensor1+0,xB+0
heinrichsweikamp
parents:
diff changeset
145 movff o2_mv_sensor1+1,xB+1
heinrichsweikamp
parents:
diff changeset
146 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
147 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
148 movff xC+0,opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
149 movff xC+1,opt_x_s1+1 ; Factor for Sensor1
heinrichsweikamp
parents:
diff changeset
150
heinrichsweikamp
parents:
diff changeset
151 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
152 mullw .100
heinrichsweikamp
parents:
diff changeset
153 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
154 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
155 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
156 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
157 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
158 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
159 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
160 movwf xB+0
heinrichsweikamp
parents:
diff changeset
161 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
162 movwf xB+1
heinrichsweikamp
parents:
diff changeset
163 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
164 movff o2_mv_sensor2+0,xB+0
heinrichsweikamp
parents:
diff changeset
165 movff o2_mv_sensor2+1,xB+1
heinrichsweikamp
parents:
diff changeset
166 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
167 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
168 movff xC+0,opt_x_s2+0
heinrichsweikamp
parents:
diff changeset
169 movff xC+1,opt_x_s2+1 ; Factor for Sensor2
heinrichsweikamp
parents:
diff changeset
170
heinrichsweikamp
parents:
diff changeset
171 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
172 mullw .100
heinrichsweikamp
parents:
diff changeset
173 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
174 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
175 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
176 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
177 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
178 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
179 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
180 movwf xB+0
heinrichsweikamp
parents:
diff changeset
181 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
182 movwf xB+1
heinrichsweikamp
parents:
diff changeset
183 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
184 movff o2_mv_sensor3+0,xB+0
heinrichsweikamp
parents:
diff changeset
185 movff o2_mv_sensor3+1,xB+1
heinrichsweikamp
parents:
diff changeset
186 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
187 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
188 movff xC+0,opt_x_s3+0
heinrichsweikamp
parents:
diff changeset
189 movff xC+1,opt_x_s3+1 ; Factor for Sensor3
heinrichsweikamp
parents:
diff changeset
190
heinrichsweikamp
parents:
diff changeset
191 ; Result is in 100µV
heinrichsweikamp
parents:
diff changeset
192 movff o2_mv_sensor1+0, sub_a+0
heinrichsweikamp
parents:
diff changeset
193 movff o2_mv_sensor1+1, sub_a+1
heinrichsweikamp
parents:
diff changeset
194 movlw LOW min_mv
heinrichsweikamp
parents:
diff changeset
195 movwf sub_b+0
heinrichsweikamp
parents:
diff changeset
196 movlw HIGH min_mv
heinrichsweikamp
parents:
diff changeset
197 movwf sub_b+1
heinrichsweikamp
parents:
diff changeset
198 call sub16 ; sub_c = sub_a - sub_b
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
199 bsf use_02_sensor1 ; Sensor active!
113
heinrichsweikamp
parents:
diff changeset
200 btfsc neg_flag
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
201 bcf use_02_sensor1
113
heinrichsweikamp
parents:
diff changeset
202
heinrichsweikamp
parents:
diff changeset
203 ; Result is in 100µV
heinrichsweikamp
parents:
diff changeset
204 movff o2_mv_sensor2+0, sub_a+0
heinrichsweikamp
parents:
diff changeset
205 movff o2_mv_sensor2+1, sub_a+1
heinrichsweikamp
parents:
diff changeset
206 movlw LOW min_mv
heinrichsweikamp
parents:
diff changeset
207 movwf sub_b+0
heinrichsweikamp
parents:
diff changeset
208 movlw HIGH min_mv
heinrichsweikamp
parents:
diff changeset
209 movwf sub_b+1
heinrichsweikamp
parents:
diff changeset
210 call sub16 ; sub_c = sub_a - sub_b
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
211 bsf use_02_sensor2 ; Sensor active!
113
heinrichsweikamp
parents:
diff changeset
212 btfsc neg_flag
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
213 bcf use_02_sensor2
113
heinrichsweikamp
parents:
diff changeset
214
heinrichsweikamp
parents:
diff changeset
215 ; Result is in 100µV
heinrichsweikamp
parents:
diff changeset
216 movff o2_mv_sensor3+0, sub_a+0
heinrichsweikamp
parents:
diff changeset
217 movff o2_mv_sensor3+1, sub_a+1
heinrichsweikamp
parents:
diff changeset
218 movlw LOW min_mv
heinrichsweikamp
parents:
diff changeset
219 movwf sub_b+0
heinrichsweikamp
parents:
diff changeset
220 movlw HIGH min_mv
heinrichsweikamp
parents:
diff changeset
221 movwf sub_b+1
heinrichsweikamp
parents:
diff changeset
222 call sub16 ; sub_c = sub_a - sub_b
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
223 bsf use_02_sensor3 ; Sensor active!
113
heinrichsweikamp
parents:
diff changeset
224 btfsc neg_flag
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
225 bcf use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
226
heinrichsweikamp
parents:
diff changeset
227 ; When no sensor is found, enable all three to show error state
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
228 btfsc use_02_sensor1
113
heinrichsweikamp
parents:
diff changeset
229 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
230 btfsc use_02_sensor2
113
heinrichsweikamp
parents:
diff changeset
231 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
232 btfsc use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
233 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
234 bsf use_02_sensor1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
235 bsf use_02_sensor2
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
236 bsf use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
237 ; Clear factors
heinrichsweikamp
parents:
diff changeset
238 banksel opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
239 clrf opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
240 clrf opt_x_s1+1
heinrichsweikamp
parents:
diff changeset
241 clrf opt_x_s2+0
heinrichsweikamp
parents:
diff changeset
242 clrf opt_x_s2+1
heinrichsweikamp
parents:
diff changeset
243 clrf opt_x_s3+0
heinrichsweikamp
parents:
diff changeset
244 clrf opt_x_s3+1
heinrichsweikamp
parents:
diff changeset
245 banksel common
heinrichsweikamp
parents:
diff changeset
246 return
heinrichsweikamp
parents:
diff changeset
247
heinrichsweikamp
parents:
diff changeset
248 compute_ppo2_analog:
heinrichsweikamp
parents:
diff changeset
249 call get_analog_inputs
heinrichsweikamp
parents:
diff changeset
250 bra compute_ppo2_common
heinrichsweikamp
parents:
diff changeset
251
heinrichsweikamp
parents:
diff changeset
252 global compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays
heinrichsweikamp
parents:
diff changeset
253 compute_ppo2:
heinrichsweikamp
parents:
diff changeset
254 btfss c3_hardware ; C3 hardware?
heinrichsweikamp
parents:
diff changeset
255 return ; No
heinrichsweikamp
parents:
diff changeset
256
heinrichsweikamp
parents:
diff changeset
257 btfss s8_digital ; =1: Digital I/O
heinrichsweikamp
parents:
diff changeset
258 bra compute_ppo2_analog ; use analog
heinrichsweikamp
parents:
diff changeset
259
heinrichsweikamp
parents:
diff changeset
260 ; use digital
heinrichsweikamp
parents:
diff changeset
261 btfss new_s8_data_available ; =1: New data frame recieved
heinrichsweikamp
parents:
diff changeset
262 return
heinrichsweikamp
parents:
diff changeset
263 call compute_mvolts_for_all_sensors
heinrichsweikamp
parents:
diff changeset
264
heinrichsweikamp
parents:
diff changeset
265 compute_ppo2_common:
heinrichsweikamp
parents:
diff changeset
266 ; o2_mv_sensor1:2 * opt_x_s1:2 = o2_ppo2_sensor1/10000
heinrichsweikamp
parents:
diff changeset
267 movff o2_mv_sensor1+0,xA+0
heinrichsweikamp
parents:
diff changeset
268 movff o2_mv_sensor1+1,xA+1
heinrichsweikamp
parents:
diff changeset
269 movff opt_x_s1+0,xB+0
heinrichsweikamp
parents:
diff changeset
270 movff opt_x_s1+1,xB+1
heinrichsweikamp
parents:
diff changeset
271 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
272 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
273 movwf xB+0
heinrichsweikamp
parents:
diff changeset
274 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
275 movwf xB+1
heinrichsweikamp
parents:
diff changeset
276 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
277 movlw d'1'
heinrichsweikamp
parents:
diff changeset
278 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
279 movlw d'0'
heinrichsweikamp
parents:
diff changeset
280 addwfc xC+1,F
heinrichsweikamp
parents:
diff changeset
281 movff xC+0,o2_ppo2_sensor1+0
heinrichsweikamp
parents:
diff changeset
282 movff xC+1,o2_ppo2_sensor1+1 ; result in 0.01bar
heinrichsweikamp
parents:
diff changeset
283 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
284 btfss use_02_sensor1
113
heinrichsweikamp
parents:
diff changeset
285 clrf o2_ppo2_sensor1+0
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
286 btfss use_02_sensor1
113
heinrichsweikamp
parents:
diff changeset
287 clrf o2_ppo2_sensor1+1
heinrichsweikamp
parents:
diff changeset
288
heinrichsweikamp
parents:
diff changeset
289 ; o2_mv_sensor2:2 * opt_x_s1:2 = o2_ppo2_sensor2/10000
heinrichsweikamp
parents:
diff changeset
290 movff o2_mv_sensor2+0,xA+0
heinrichsweikamp
parents:
diff changeset
291 movff o2_mv_sensor2+1,xA+1
heinrichsweikamp
parents:
diff changeset
292 movff opt_x_s2+0,xB+0
heinrichsweikamp
parents:
diff changeset
293 movff opt_x_s2+1,xB+1
heinrichsweikamp
parents:
diff changeset
294 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
295 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
296 movwf xB+0
heinrichsweikamp
parents:
diff changeset
297 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
298 movwf xB+1
heinrichsweikamp
parents:
diff changeset
299 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
300 movlw d'1'
heinrichsweikamp
parents:
diff changeset
301 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
302 movlw d'0'
heinrichsweikamp
parents:
diff changeset
303 addwfc xC+1,F
heinrichsweikamp
parents:
diff changeset
304 movff xC+0,o2_ppo2_sensor2+0
heinrichsweikamp
parents:
diff changeset
305 movff xC+1,o2_ppo2_sensor2+1 ; result in 0.01bar
heinrichsweikamp
parents:
diff changeset
306 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
307 btfss use_02_sensor2
113
heinrichsweikamp
parents:
diff changeset
308 clrf o2_ppo2_sensor2+0
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
309 btfss use_02_sensor2
113
heinrichsweikamp
parents:
diff changeset
310 clrf o2_ppo2_sensor2+1
heinrichsweikamp
parents:
diff changeset
311
heinrichsweikamp
parents:
diff changeset
312 ; o2_mv_sensor3:2 * opt_x_s1:2 = o2_ppo2_sensor3/10000
heinrichsweikamp
parents:
diff changeset
313 movff o2_mv_sensor3+0,xA+0
heinrichsweikamp
parents:
diff changeset
314 movff o2_mv_sensor3+1,xA+1
heinrichsweikamp
parents:
diff changeset
315 movff opt_x_s3+0,xB+0
heinrichsweikamp
parents:
diff changeset
316 movff opt_x_s3+1,xB+1
heinrichsweikamp
parents:
diff changeset
317 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
318 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
319 movwf xB+0
heinrichsweikamp
parents:
diff changeset
320 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
321 movwf xB+1
heinrichsweikamp
parents:
diff changeset
322 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
323 movlw d'1'
heinrichsweikamp
parents:
diff changeset
324 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
325 movlw d'0'
heinrichsweikamp
parents:
diff changeset
326 addwfc xC+1,F
heinrichsweikamp
parents:
diff changeset
327 movff xC+0,o2_ppo2_sensor3+0
heinrichsweikamp
parents:
diff changeset
328 movff xC+1,o2_ppo2_sensor3+1 ; result in 0.01bar
heinrichsweikamp
parents:
diff changeset
329 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
330 btfss use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
331 clrf o2_ppo2_sensor3+0
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
332 btfss use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
333 clrf o2_ppo2_sensor3+1
heinrichsweikamp
parents:
diff changeset
334
heinrichsweikamp
parents:
diff changeset
335 return ; Done.
heinrichsweikamp
parents:
diff changeset
336
heinrichsweikamp
parents:
diff changeset
337
heinrichsweikamp
parents:
diff changeset
338 compute_mvolts_for_all_sensors: ; Compute mV or all sensors (S8 Mode)
heinrichsweikamp
parents:
diff changeset
339 ; compute AD results in 100µV steps (16bit/sensor)
heinrichsweikamp
parents:
diff changeset
340 ; 24bit AD result is in 244,1406541nV
heinrichsweikamp
parents:
diff changeset
341 ; Devide 24bit value through 409,5999512 -> 410 (0,01% error)
heinrichsweikamp
parents:
diff changeset
342 #DEFINE ad2mv_factor .410
heinrichsweikamp
parents:
diff changeset
343 ; Sensor 1
heinrichsweikamp
parents:
diff changeset
344 clrf xC+3
heinrichsweikamp
parents:
diff changeset
345 movff ir_buffer+.6,xC+2
heinrichsweikamp
parents:
diff changeset
346 movff ir_buffer+.5,xC+1
heinrichsweikamp
parents:
diff changeset
347 movff ir_buffer+.4,xC+0
heinrichsweikamp
parents:
diff changeset
348 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
349 movwf xB+0
heinrichsweikamp
parents:
diff changeset
350 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
351 movwf xB+1
heinrichsweikamp
parents:
diff changeset
352 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
353 movff xC+1,o2_mv_sensor1+1
heinrichsweikamp
parents:
diff changeset
354 movff xC+0,o2_mv_sensor1+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
355 ; Sensor 2
heinrichsweikamp
parents:
diff changeset
356 clrf xC+3
heinrichsweikamp
parents:
diff changeset
357 movff ir_buffer+.9,xC+2
heinrichsweikamp
parents:
diff changeset
358 movff ir_buffer+.8,xC+1
heinrichsweikamp
parents:
diff changeset
359 movff ir_buffer+.7,xC+0
heinrichsweikamp
parents:
diff changeset
360 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
361 movwf xB+0
heinrichsweikamp
parents:
diff changeset
362 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
363 movwf xB+1
heinrichsweikamp
parents:
diff changeset
364 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
365 movff xC+1,o2_mv_sensor2+1
heinrichsweikamp
parents:
diff changeset
366 movff xC+0,o2_mv_sensor2+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
367 ; Sensor 3
heinrichsweikamp
parents:
diff changeset
368 clrf xC+3
heinrichsweikamp
parents:
diff changeset
369 movff ir_buffer+.12,xC+2
heinrichsweikamp
parents:
diff changeset
370 movff ir_buffer+.11,xC+1
heinrichsweikamp
parents:
diff changeset
371 movff ir_buffer+.10,xC+0
heinrichsweikamp
parents:
diff changeset
372 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
373 movwf xB+0
heinrichsweikamp
parents:
diff changeset
374 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
375 movwf xB+1
heinrichsweikamp
parents:
diff changeset
376 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
377 movff xC+1,o2_mv_sensor3+1
heinrichsweikamp
parents:
diff changeset
378 movff xC+0,o2_mv_sensor3+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
379
heinrichsweikamp
parents:
diff changeset
380 bcf new_s8_data_available ; Clear flag
heinrichsweikamp
parents:
diff changeset
381 return ; Done.
heinrichsweikamp
parents:
diff changeset
382
heinrichsweikamp
parents:
diff changeset
383
heinrichsweikamp
parents:
diff changeset
384
heinrichsweikamp
parents:
diff changeset
385 END