annotate src/calibrate.asm @ 190:a0f9ec25852e

limit sensor-read ppO2 to 2.55bar
author heinrichsweikamp
date Wed, 29 Oct 2014 15:33:36 +0100
parents e79bc535ef9e
children efe70488a04b
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
189
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
85 bra check_sensor2 ; No HUD/Digital data
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
86
147
fdd4e30846ae some cleanup
heinrichsweikamp
parents: 145
diff changeset
87 ; Copy disable flags from digital input
145
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
189
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
96 check_sensor2:
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
97 ; Copy disable flags from internal calibration routine
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
98 btfss sensor1_calibrated_ok
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
99 bcf use_02_sensor1
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
100 btfss sensor2_calibrated_ok
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
101 bcf use_02_sensor2
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
102 btfss sensor3_calibrated_ok
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
103 bcf use_02_sensor3
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
104 return
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
105
113
heinrichsweikamp
parents:
diff changeset
106 global calibrate_mix
heinrichsweikamp
parents:
diff changeset
107 calibrate_mix:
heinrichsweikamp
parents:
diff changeset
108 ; calibrate S8 HUD
heinrichsweikamp
parents:
diff changeset
109 btfss s8_digital ; S8 Digital?
heinrichsweikamp
parents:
diff changeset
110 bra calibrate_mix2 ; No
heinrichsweikamp
parents:
diff changeset
111
189
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
112 ; Yes, calibrate any S8-connected HUD
113
heinrichsweikamp
parents:
diff changeset
113 clrf temp1 ; Chksum
heinrichsweikamp
parents:
diff changeset
114 movlw 0xAA ; Start Byte
heinrichsweikamp
parents:
diff changeset
115 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
116 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
117 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
118
heinrichsweikamp
parents:
diff changeset
119 movlw 0x31 ; Calibrate
heinrichsweikamp
parents:
diff changeset
120 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
121 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
122 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
123
heinrichsweikamp
parents:
diff changeset
124 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
125 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
126 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
127 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
128
heinrichsweikamp
parents:
diff changeset
129 movff amb_pressure+0,WREG ; Ambient pressure
heinrichsweikamp
parents:
diff changeset
130 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
131 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
132 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
133 movff amb_pressure+1,WREG
heinrichsweikamp
parents:
diff changeset
134 addwf temp1,F
heinrichsweikamp
parents:
diff changeset
135 movff WREG,TXREG2
heinrichsweikamp
parents:
diff changeset
136 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
137
heinrichsweikamp
parents:
diff changeset
138 movff temp1,TXREG2 ; Chksum
heinrichsweikamp
parents:
diff changeset
139 call rs232_wait_tx2
heinrichsweikamp
parents:
diff changeset
140
heinrichsweikamp
parents:
diff changeset
141 calibrate_mix2:
heinrichsweikamp
parents:
diff changeset
142 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
143 mullw .100
heinrichsweikamp
parents:
diff changeset
144 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
145 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
146 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
147 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
148 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
149 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
150 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
151 movwf xB+0
heinrichsweikamp
parents:
diff changeset
152 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
153 movwf xB+1
heinrichsweikamp
parents:
diff changeset
154 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
155 movff o2_mv_sensor1+0,xB+0
heinrichsweikamp
parents:
diff changeset
156 movff o2_mv_sensor1+1,xB+1
heinrichsweikamp
parents:
diff changeset
157 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
158 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
159 movff xC+0,opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
160 movff xC+1,opt_x_s1+1 ; Factor for Sensor1
heinrichsweikamp
parents:
diff changeset
161
heinrichsweikamp
parents:
diff changeset
162 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
163 mullw .100
heinrichsweikamp
parents:
diff changeset
164 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
165 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
166 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
167 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
168 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
169 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
170 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
171 movwf xB+0
heinrichsweikamp
parents:
diff changeset
172 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
173 movwf xB+1
heinrichsweikamp
parents:
diff changeset
174 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
175 movff o2_mv_sensor2+0,xB+0
heinrichsweikamp
parents:
diff changeset
176 movff o2_mv_sensor2+1,xB+1
heinrichsweikamp
parents:
diff changeset
177 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
178 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
179 movff xC+0,opt_x_s2+0
heinrichsweikamp
parents:
diff changeset
180 movff xC+1,opt_x_s2+1 ; Factor for Sensor2
heinrichsweikamp
parents:
diff changeset
181
heinrichsweikamp
parents:
diff changeset
182 movff opt_calibration_O2_ratio,WREG ; Calibration gas %O2
heinrichsweikamp
parents:
diff changeset
183 mullw .100
heinrichsweikamp
parents:
diff changeset
184 movff PRODL,xA+0
heinrichsweikamp
parents:
diff changeset
185 movff PRODH,xA+1
heinrichsweikamp
parents:
diff changeset
186 ; (%O2*100)*[ambient,mbar]/100 -> xC
heinrichsweikamp
parents:
diff changeset
187 movff amb_pressure+0,xB+0
heinrichsweikamp
parents:
diff changeset
188 movff amb_pressure+1,xB+1
heinrichsweikamp
parents:
diff changeset
189 call mult16x16 ;xA*xB=xC
heinrichsweikamp
parents:
diff changeset
190 movlw LOW .100
heinrichsweikamp
parents:
diff changeset
191 movwf xB+0
heinrichsweikamp
parents:
diff changeset
192 movlw HIGH .100
heinrichsweikamp
parents:
diff changeset
193 movwf xB+1
heinrichsweikamp
parents:
diff changeset
194 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
195 movff o2_mv_sensor3+0,xB+0
heinrichsweikamp
parents:
diff changeset
196 movff o2_mv_sensor3+1,xB+1
heinrichsweikamp
parents:
diff changeset
197 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
198 ; xC= ppO2/mV
heinrichsweikamp
parents:
diff changeset
199 movff xC+0,opt_x_s3+0
heinrichsweikamp
parents:
diff changeset
200 movff xC+1,opt_x_s3+1 ; Factor for Sensor3
heinrichsweikamp
parents:
diff changeset
201
189
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
202 bsf sensor1_calibrated_ok
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
203 bsf sensor2_calibrated_ok
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
204 bsf sensor3_calibrated_ok ; Set flags prior check
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
205 rcall check_sensors ; Check O2 sensor thresholds min_mv and max_mv and set use_02_sensorX flags
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
206 ; initialise internal calibration flags
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
207 btfss use_02_sensor1 ; Sensor out of range?
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
208 bcf sensor1_calibrated_ok ; Yes, disable this sensor
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
209 btfss use_02_sensor2 ; Sensor out of range?
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
210 bcf sensor2_calibrated_ok ; Yes, disable this sensor
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
211 btfss use_02_sensor3 ; Sensor out of range?
e79bc535ef9e ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents: 187
diff changeset
212 bcf sensor3_calibrated_ok ; Yes, disable this sensor
113
heinrichsweikamp
parents:
diff changeset
213
heinrichsweikamp
parents:
diff changeset
214 ; 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
215 btfsc use_02_sensor1
113
heinrichsweikamp
parents:
diff changeset
216 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
217 btfsc use_02_sensor2
113
heinrichsweikamp
parents:
diff changeset
218 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
219 btfsc use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
220 return
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
221 bsf use_02_sensor1
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
222 bsf use_02_sensor2
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
223 bsf use_02_sensor3
113
heinrichsweikamp
parents:
diff changeset
224 ; Clear factors
heinrichsweikamp
parents:
diff changeset
225 banksel opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
226 clrf opt_x_s1+0
heinrichsweikamp
parents:
diff changeset
227 clrf opt_x_s1+1
heinrichsweikamp
parents:
diff changeset
228 clrf opt_x_s2+0
heinrichsweikamp
parents:
diff changeset
229 clrf opt_x_s2+1
heinrichsweikamp
parents:
diff changeset
230 clrf opt_x_s3+0
heinrichsweikamp
parents:
diff changeset
231 clrf opt_x_s3+1
heinrichsweikamp
parents:
diff changeset
232 banksel common
heinrichsweikamp
parents:
diff changeset
233 return
heinrichsweikamp
parents:
diff changeset
234
heinrichsweikamp
parents:
diff changeset
235 compute_ppo2_analog:
heinrichsweikamp
parents:
diff changeset
236 call get_analog_inputs
heinrichsweikamp
parents:
diff changeset
237 bra compute_ppo2_common
heinrichsweikamp
parents:
diff changeset
238
heinrichsweikamp
parents:
diff changeset
239 global compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays
heinrichsweikamp
parents:
diff changeset
240 compute_ppo2:
heinrichsweikamp
parents:
diff changeset
241 btfss c3_hardware ; C3 hardware?
heinrichsweikamp
parents:
diff changeset
242 return ; No
heinrichsweikamp
parents:
diff changeset
243
heinrichsweikamp
parents:
diff changeset
244 btfss s8_digital ; =1: Digital I/O
heinrichsweikamp
parents:
diff changeset
245 bra compute_ppo2_analog ; use analog
heinrichsweikamp
parents:
diff changeset
246
heinrichsweikamp
parents:
diff changeset
247 ; use digital
heinrichsweikamp
parents:
diff changeset
248 btfss new_s8_data_available ; =1: New data frame recieved
heinrichsweikamp
parents:
diff changeset
249 return
heinrichsweikamp
parents:
diff changeset
250 call compute_mvolts_for_all_sensors
heinrichsweikamp
parents:
diff changeset
251
heinrichsweikamp
parents:
diff changeset
252 compute_ppo2_common:
heinrichsweikamp
parents:
diff changeset
253 ; o2_mv_sensor1:2 * opt_x_s1:2 = o2_ppo2_sensor1/10000
heinrichsweikamp
parents:
diff changeset
254 movff o2_mv_sensor1+0,xA+0
heinrichsweikamp
parents:
diff changeset
255 movff o2_mv_sensor1+1,xA+1
heinrichsweikamp
parents:
diff changeset
256 movff opt_x_s1+0,xB+0
heinrichsweikamp
parents:
diff changeset
257 movff opt_x_s1+1,xB+1
heinrichsweikamp
parents:
diff changeset
258 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
259 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
260 movwf xB+0
heinrichsweikamp
parents:
diff changeset
261 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
262 movwf xB+1
heinrichsweikamp
parents:
diff changeset
263 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
264 movlw d'1'
heinrichsweikamp
parents:
diff changeset
265 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
266 movlw d'0'
heinrichsweikamp
parents:
diff changeset
267 addwfc xC+1,F
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
268 tstfsz xC+1 ; ppO2 is higher then 2.55bar?
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
269 setf xC+0 ; Yes.
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
270 movff xC+0,o2_ppo2_sensor1 ; result in 0.01bar
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
271 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
272 btfss use_02_sensor1
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
273 clrf o2_ppo2_sensor1
113
heinrichsweikamp
parents:
diff changeset
274
heinrichsweikamp
parents:
diff changeset
275 ; o2_mv_sensor2:2 * opt_x_s1:2 = o2_ppo2_sensor2/10000
heinrichsweikamp
parents:
diff changeset
276 movff o2_mv_sensor2+0,xA+0
heinrichsweikamp
parents:
diff changeset
277 movff o2_mv_sensor2+1,xA+1
heinrichsweikamp
parents:
diff changeset
278 movff opt_x_s2+0,xB+0
heinrichsweikamp
parents:
diff changeset
279 movff opt_x_s2+1,xB+1
heinrichsweikamp
parents:
diff changeset
280 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
281 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
282 movwf xB+0
heinrichsweikamp
parents:
diff changeset
283 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
284 movwf xB+1
heinrichsweikamp
parents:
diff changeset
285 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
286 movlw d'1'
heinrichsweikamp
parents:
diff changeset
287 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
288 movlw d'0'
heinrichsweikamp
parents:
diff changeset
289 addwfc xC+1,F
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
290 tstfsz xC+1 ; ppO2 is higher then 2.55bar?
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
291 setf xC+0 ; Yes.
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
292 movff xC+0,o2_ppo2_sensor2 ; result in 0.01bar
113
heinrichsweikamp
parents:
diff changeset
293 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
294 btfss use_02_sensor2
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
295 clrf o2_ppo2_sensor2
113
heinrichsweikamp
parents:
diff changeset
296
heinrichsweikamp
parents:
diff changeset
297 ; o2_mv_sensor3:2 * opt_x_s1:2 = o2_ppo2_sensor3/10000
heinrichsweikamp
parents:
diff changeset
298 movff o2_mv_sensor3+0,xA+0
heinrichsweikamp
parents:
diff changeset
299 movff o2_mv_sensor3+1,xA+1
heinrichsweikamp
parents:
diff changeset
300 movff opt_x_s3+0,xB+0
heinrichsweikamp
parents:
diff changeset
301 movff opt_x_s3+1,xB+1
heinrichsweikamp
parents:
diff changeset
302 call mult16x16 ;xA:2*xB:2=xC:4
heinrichsweikamp
parents:
diff changeset
303 movlw LOW .1000
heinrichsweikamp
parents:
diff changeset
304 movwf xB+0
heinrichsweikamp
parents:
diff changeset
305 movlw HIGH .1000
heinrichsweikamp
parents:
diff changeset
306 movwf xB+1
heinrichsweikamp
parents:
diff changeset
307 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
308 movlw d'1'
heinrichsweikamp
parents:
diff changeset
309 addwf xC+0,F
heinrichsweikamp
parents:
diff changeset
310 movlw d'0'
heinrichsweikamp
parents:
diff changeset
311 addwfc xC+1,F
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
312 tstfsz xC+1 ; ppO2 is higher then 2.55bar?
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
313 setf xC+0 ; Yes.
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
314 movff xC+0,o2_ppo2_sensor3 ; result in 0.01bar
113
heinrichsweikamp
parents:
diff changeset
315 ; Set to zero if sensor is not active!
145
e3ac5b2021bc NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents: 113
diff changeset
316 btfss use_02_sensor3
190
a0f9ec25852e limit sensor-read ppO2 to 2.55bar
heinrichsweikamp
parents: 189
diff changeset
317 clrf o2_ppo2_sensor3
113
heinrichsweikamp
parents:
diff changeset
318 return ; Done.
heinrichsweikamp
parents:
diff changeset
319
heinrichsweikamp
parents:
diff changeset
320
heinrichsweikamp
parents:
diff changeset
321 compute_mvolts_for_all_sensors: ; Compute mV or all sensors (S8 Mode)
heinrichsweikamp
parents:
diff changeset
322 ; compute AD results in 100µV steps (16bit/sensor)
heinrichsweikamp
parents:
diff changeset
323 ; 24bit AD result is in 244,1406541nV
heinrichsweikamp
parents:
diff changeset
324 ; Devide 24bit value through 409,5999512 -> 410 (0,01% error)
heinrichsweikamp
parents:
diff changeset
325 #DEFINE ad2mv_factor .410
heinrichsweikamp
parents:
diff changeset
326 ; Sensor 1
heinrichsweikamp
parents:
diff changeset
327 clrf xC+3
187
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
328 movff ir_s8_buffer+.6,xC+2
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
329 movff ir_s8_buffer+.5,xC+1
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
330 movff ir_s8_buffer+.4,xC+0
113
heinrichsweikamp
parents:
diff changeset
331 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
332 movwf xB+0
heinrichsweikamp
parents:
diff changeset
333 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
334 movwf xB+1
heinrichsweikamp
parents:
diff changeset
335 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
336 movff xC+1,o2_mv_sensor1+1
heinrichsweikamp
parents:
diff changeset
337 movff xC+0,o2_mv_sensor1+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
338 ; Sensor 2
heinrichsweikamp
parents:
diff changeset
339 clrf xC+3
187
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
340 movff ir_s8_buffer+.9,xC+2
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
341 movff ir_s8_buffer+.8,xC+1
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
342 movff ir_s8_buffer+.7,xC+0
113
heinrichsweikamp
parents:
diff changeset
343 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
344 movwf xB+0
heinrichsweikamp
parents:
diff changeset
345 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
346 movwf xB+1
heinrichsweikamp
parents:
diff changeset
347 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
348 movff xC+1,o2_mv_sensor2+1
heinrichsweikamp
parents:
diff changeset
349 movff xC+0,o2_mv_sensor2+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
350 ; Sensor 3
heinrichsweikamp
parents:
diff changeset
351 clrf xC+3
187
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
352 movff ir_s8_buffer+.12,xC+2
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
353 movff ir_s8_buffer+.11,xC+1
669b5d00706d CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents: 147
diff changeset
354 movff ir_s8_buffer+.10,xC+0
113
heinrichsweikamp
parents:
diff changeset
355 movlw LOW ad2mv_factor
heinrichsweikamp
parents:
diff changeset
356 movwf xB+0
heinrichsweikamp
parents:
diff changeset
357 movlw HIGH ad2mv_factor
heinrichsweikamp
parents:
diff changeset
358 movwf xB+1
heinrichsweikamp
parents:
diff changeset
359 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
heinrichsweikamp
parents:
diff changeset
360 movff xC+1,o2_mv_sensor3+1
heinrichsweikamp
parents:
diff changeset
361 movff xC+0,o2_mv_sensor3+0 ; in 100uV steps
heinrichsweikamp
parents:
diff changeset
362
heinrichsweikamp
parents:
diff changeset
363 bcf new_s8_data_available ; Clear flag
heinrichsweikamp
parents:
diff changeset
364 return ; Done.
heinrichsweikamp
parents:
diff changeset
365
heinrichsweikamp
parents:
diff changeset
366
heinrichsweikamp
parents:
diff changeset
367
heinrichsweikamp
parents:
diff changeset
368 END