comparison src/calibrate.asm @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents 185ba2f91f59
children 75e90cd0c2c3
comparison
equal deleted inserted replaced
633:690c48db7b5b 634:4050675965ea
1 ;============================================================================= 1 ;=============================================================================
2 ; 2 ;
3 ; File calibration.asm combined next generation V3.08.8 3 ; File calibration.asm * combined next generation V3.09.4n
4 ; 4 ;
5 ; o2 sensor calibration subroutines 5 ; o2 sensor calibration subroutines
6 ; 6 ;
7 ; Copyright (c) 2014, Heinrichs Weikamp, all right reserved. 7 ; Copyright (c) 2014, Heinrichs Weikamp, all right reserved.
8 ;============================================================================= 8 ;=============================================================================
12 #include "math.inc" 12 #include "math.inc"
13 #include "adc_lightsensor.inc" 13 #include "adc_lightsensor.inc"
14 #include "eeprom_rs232.inc" 14 #include "eeprom_rs232.inc"
15 15
16 16
17 calibrate CODE 17 ;=============================================================================
18 18 calibrate1 CODE
19 ;============================================================================= 19 ;=============================================================================
20
20 21
21 IFDEF _external_sensor 22 IFDEF _external_sensor
22 23
23 global transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics 24 ;-----------------------------------------------------------------------------
25 ; Transmit current Setpoint from WREG (in cbar) to external Electronics
26 ;
27 global transmit_setpoint
24 transmit_setpoint: 28 transmit_setpoint:
25 return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! 29 return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!!
26 btfss s8_digital_avail ; do we have a digital S8 interface? 30
27 return ; NO - ignore 31 ; btfsc ext_input_optical ; optical input in use?
28 ; YES - transmit setpoint from WREG 32 ; return ; YES - setpoint - TX not supported
29 clrf lo ; initialize checksum 33 ; TSTOSS opt_s8_mode ; NO - S8 mode selected?
30 movff char_I_const_ppO2,hi ; copy setpoint value to hi 34 ; return ; NO
31 movlw 0xAA ; start byte 35 ; clrf lo ; YES - initialize checksum
32 rcall tx_to_HUD ; transmit to HUD 36 ; movff char_I_const_ppO2,hi ; - copy setpoint value to hi
33 movlw 0x60 ; command new SP 37 ; movlw 0xAA ; - load start byte
34 rcall tx_to_HUD ; transmit to HUD 38 ; rcall tx_to_HUD_chksum ; - transmit to HUD
35 movff hi,WREG ; SP in cbar 39 ; movlw 0x60 ; - load command 'new SP'
36 rcall tx_to_HUD ; transmit to HUD 40 ; rcall tx_to_HUD_chksum ; - transmit to HUD
37 movff lo,WREG ; checksum 41 ; movf hi,W ; - load SP in cbar
38 rcall tx_to_HUD_cs ; transmit checksum 42 ; rcall tx_to_HUD_chksum ; - transmit to HUD
39 return 43 ; movf lo,W ; - load checksum
40 44 ; rcall tx_to_HUD ; - transmit checksum
41 tx_to_HUD: ; entry point to transmit a byte to the HUD 45 ; return ; - done
46
47
48 ;-----------------------------------------------------------------------------
49 ; Helper Function - Transmit Byte to external Electronics
50 ;
51 tx_to_HUD_chksum:
42 addwf lo,F ; add byte to checksum 52 addwf lo,F ; add byte to checksum
43 tx_to_HUD_cs: ; entry point to transmit the checksum 53 tx_to_HUD:
44 movff WREG,TXREG2 ; transmit byte 54 goto ir_s8_tx_single ; transmit byte and return
45 call ir_s8_wait_tx ; wait for UART 55
46 return 56
47 57 ;-----------------------------------------------------------------------------
48 58 ; Compute Calibration Factors
59 ;
49 global calibrate_mix 60 global calibrate_mix
50 calibrate_mix: 61 calibrate_mix:
51 ; set usage and calibration flags as per default 62 ; set usage and calibration flags to default values
52 bsf use_O2_sensor1 63 bsf use_O2_sensor1 ; sensor in use
53 bsf use_O2_sensor2 64 bsf use_O2_sensor2 ; ...
54 bsf use_O2_sensor3 65 bsf use_O2_sensor3 ; ...
55 bsf sensor1_calibrated_ok 66 bsf sensor1_calibrated_ok ; sensor calibration ok
56 bsf sensor2_calibrated_ok 67 bsf sensor2_calibrated_ok ; ...
57 bsf sensor3_calibrated_ok 68 bsf sensor3_calibrated_ok ; ...
58 69
59 ; ISR-safe 2 byte copy of the current pressure to xB for later use 70 ; ISR-safe 2 byte copy of the current pressure to xB for later use
60 SMOVII pressure_abs,xB 71 SMOVII pressure_abs,xB
61 72
62 ; check for HUD 73 ; check for HUD
63 btfss s8_digital_avail ; do we have a digital S8 interface? 74 btfsc ext_input_optical ; optical interface in use?
64 bra calibrate_mix1 ; NO - skip HUD part 75 bra calibrate_mix1 ; YES - skip
65 76 TSTOSS opt_s8_mode ; NO - S8 interface in use?
66 ; calibrate any S8-connected HUD 77 bra calibrate_mix1 ; NO - skip HUD part
78 ;bra calibrate_mix0 ; YES - calibrate S8 HUD
79
80 ; calibrate S8-connected external electronics
81 calibrate_mix0:
67 clrf lo ; initialize checksum 82 clrf lo ; initialize checksum
68 movlw 0xAA ; start byte 83 movlw 0xAA ; load start byte
84 rcall tx_to_HUD_chksum ; transmit to HUD
85 movlw 0x31 ; load calibration command
86 rcall tx_to_HUD_chksum ; transmit to HUD
87 movff opt_calibration_O2_ratio,WREG ; load calibration gas %O2
88 rcall tx_to_HUD_chksum ; transmit to HUD
89 movf xB+0,W ; load current absolute pressure low byte
90 rcall tx_to_HUD_chksum ; transmit to HUD
91 movf xB+1,W ; load current absolute pressure high byte
92 rcall tx_to_HUD_chksum ; transmit to HUD
93 movf lo,W ; load checksum
69 rcall tx_to_HUD ; transmit to HUD 94 rcall tx_to_HUD ; transmit to HUD
70 movlw 0x31 ; calibration command
71 rcall tx_to_HUD ; transmit to HUD
72 movff opt_calibration_O2_ratio,WREG ; calibration gas %O2
73 rcall tx_to_HUD ; transmit to HUD
74 movff xB+0,WREG ; current absolute pressure low byte
75 rcall tx_to_HUD ; transmit to HUD
76 movff xB+1,WREG ; current absolute pressure high byte
77 rcall tx_to_HUD ; transmit to HUD
78 movff lo,WREG ; checksum
79 rcall tx_to_HUD_cs ; transmit to HUD
80 ; bra calibrate_mix2
81 95
82 ; calibrate internal sensors 96 ; calibrate internal sensors
83 calibrate_mix1: ; compute %O2 * 100 * absolute pressure [mbar] / 100 97 calibrate_mix1: ; compute C = %O2 * 100 * absolute pressure [mbar] / 100
84 movff opt_calibration_O2_ratio,WREG 98 movff opt_calibration_O2_ratio,WREG ; load calibration gas %O2
85 mullw .100 99 mullw .100 ; multiply with 100
86 MOVII PROD,xA 100 MOVII PROD,xA ; copy result to xA
87 call mult16x16 ; xA*xB=xC 101 call mult16x16 ; xC = xA * xB
88 MOVLI .100,xB 102 MOVLI .100,xB ; prepare division by 100
89 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 103 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
90
91 ; keep a copy of the result
92 movff xC+0,mpr+0
93 movff xC+1,mpr+1
94 movff xC+2,mpr+2
95 movff xC+3,mpr+3
96 104
97 ; compute factor for sensor 1 105 ; compute factor for sensor 1
98 MOVII sensor1_mv,xB 106 MOVRR xC,mpr,.4 ; backup calibration value C
107 MOVII sensor1_mv,xB ; get mV from sensor 1
99 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 108 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
100 MOVII xC,opt_x_s1 ; xC = ppO2/mV as factor for sensor 1 109 MOVII xC,opt_x_s1 ; xC = ppO2/mV as factor for sensor 1
101 110
102 ; restore result
103 movff mpr+0,xC+0
104 movff mpr+1,xC+1
105 movff mpr+2,xC+2
106 movff mpr+3,xC+3
107
108 ; compute factor for sensor 2 111 ; compute factor for sensor 2
109 MOVII sensor2_mv,xB 112 MOVRR mpr,xC,.4 ; restore C
113 MOVII sensor2_mv,xB ; get mV from sensor 2
110 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 114 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
111 MOVII xC,opt_x_s2 ; xC = ppO2/mV as factor for sensor 2 115 MOVII xC,opt_x_s2 ; xC = ppO2/mV as factor for sensor 2
112 116
113 ; restore result
114 movff mpr+0,xC+0
115 movff mpr+1,xC+1
116 movff mpr+2,xC+2
117 movff mpr+3,xC+3
118
119 ; compute factor for sensor 3 117 ; compute factor for sensor 3
120 MOVII sensor3_mv,xB 118 MOVRR mpr,xC,.4 ; restore C
119 MOVII sensor3_mv,xB ; get mV from sensor 3
121 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 120 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
122 MOVII xC,opt_x_s3 ; xC = ppO2/mV as factor for sensor 3 121 MOVII xC,opt_x_s3 ; xC = ppO2/mV as factor for sensor 3
123 122
124 ; check sensor 1 for min/max mV 123 ; check sensor 1 for min/max mV
125 MOVII sensor1_mv,sub_a ; get mV from sensor 1 124 MOVII sensor1_mv,sub_a ; get mV from sensor 1
126 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 125 rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1
127 TSTFSZ WREG ; sensor mV within thresholds? 126 TSTFSZ WREG ; sensor mV within boundary?
128 bcf use_O2_sensor1 ; NO - clear usage flag 127 bcf use_O2_sensor1 ; NO - revoke sensor from usage
129 128
130 ; check sensor 2 for min/max mV 129 ; check sensor 2 for min/max mV
131 MOVII sensor2_mv,sub_a ; get mV from sensor 2 130 MOVII sensor2_mv,sub_a ; get mV from sensor 2
132 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 131 rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1
133 TSTFSZ WREG ; sensor mV within thresholds? 132 TSTFSZ WREG ; sensor mV within boundary?
134 bcf use_O2_sensor2 ; NO - clear usage flag 133 bcf use_O2_sensor2 ; NO - revoke sensor from usage
135 134
136 ; check sensor 3 for min/max mV 135 ; check sensor 3 for min/max mV
137 MOVII sensor3_mv,sub_a ; get mV from sensor 3 136 MOVII sensor3_mv,sub_a ; get mV from sensor 3
138 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 137 rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1
139 TSTFSZ WREG ; sensor mV within thresholds? 138 TSTFSZ WREG ; sensor mV within boundary?
140 bcf use_O2_sensor3 ; NO - clear usage flag 139 bcf use_O2_sensor3 ; NO - revoke sensor from usage
141 140
142 calibrate_mix2: 141 calibrate_mix2:
143 ; check for HUD 142 ; check for HUD
144 btfss hud_connection_ok ; HUD connection existing? 143 btfss hud_connection_ok ; HUD connection existing?
145 bra calibrate_mix3 ; NO - skip HUD part 144 bra calibrate_mix3 ; NO - skip HUD part
146 145
146 ; TODO: wait for HUD to complete calibration an send updated data
147
147 ; copy disable flags from HUD digital input 148 ; copy disable flags from HUD digital input
148 btfss sensor1_active 149 btfss sensor1_active ; sensor 1 usable?
149 bcf use_O2_sensor1 150 bcf use_O2_sensor1 ; NO - revoke sensor from usage
150 btfss sensor2_active 151 btfss sensor2_active ; sensor 2 usable?
151 bcf use_O2_sensor2 152 bcf use_O2_sensor2 ; NO - revoke sensor from usage
152 btfss sensor3_active 153 btfss sensor3_active ; sensor 3 usable?
153 bcf use_O2_sensor3 154 bcf use_O2_sensor3 ; NO - revoke sensor from usage
154 155
155 calibrate_mix3: 156 calibrate_mix3:
156 ; clear calibration flags if sensors are not found to be ok 157 ; clear calibration flags if sensors are not usable
157 btfss use_O2_sensor1 ; sensor 1 out of range? 158 btfss use_O2_sensor1 ; sensor 1 usable?
158 bcf sensor1_calibrated_ok ; YES - disable this sensor 159 bcf sensor1_calibrated_ok ; NO - revoke calibration
159 btfss use_O2_sensor2 ; sensor 2 out of range? 160 btfss use_O2_sensor2 ; sensor 2 usable?
160 bcf sensor2_calibrated_ok ; YES - disable this sensor 161 bcf sensor2_calibrated_ok ; NO - revoke calibration
161 btfss use_O2_sensor3 ; sensor 3 out of range? 162 btfss use_O2_sensor3 ; sensor 3 usable?
162 bcf sensor3_calibrated_ok ; YES - disable this sensor 163 bcf sensor3_calibrated_ok ; NO - revoke calibration
163 164
164 ; when no sensor is found, enable all three to show error state and clear calibration factors 165 ; if there is no usable sensor at all, then enable all three
165 btfsc use_O2_sensor1 166 ; sensors to show error state and clear calibration factors
166 return 167 btfsc use_O2_sensor1 ; sensor 1 usable?
167 btfsc use_O2_sensor2 168 return ; YES - done
168 return 169 btfsc use_O2_sensor2 ; NO - sensor 2 usable?
169 btfsc use_O2_sensor3 170 return ; YES - done
170 return 171 btfsc use_O2_sensor3 ; NO - sensor 3 usable?
171 172 return ; YES - done
172 ; enable all sensors 173 bsf use_O2_sensor1 ; NO - enable all sensors
173 bsf use_O2_sensor1 174 bsf use_O2_sensor2 ; - ...
174 bsf use_O2_sensor2 175 bsf use_O2_sensor3 ; - ...
175 bsf use_O2_sensor3 176 CLRR opt_x_s1,.6 ; - clear calibration factors (3x 16 bit)
176 ; clear calibration factors 177 return ; - done
177 banksel opt_x_s1 ; switch to bank options table 178
178 CLRI opt_x_s1 179
179 CLRI opt_x_s2 180 ;-----------------------------------------------------------------------------
180 CLRI opt_x_s3 181 ; Helper Function - Check if Sensor mV Value is within Min/Max Boundary
181 banksel common ; back to bank common 182 ;
182 return
183
184 calibrate_mix_helper: 183 calibrate_mix_helper:
185 MOVLI min_mv,sub_b ; load minimum threshold into sub_b 184 MOVLI min_mv,sub_b ; load minimum boundary into sub_b
186 call sub16 ; sub_c = sub_a - sub_b 185 call sub16 ; sub_c = sub_a - sub_b
187 btfsc neg_flag ; sensor mV lower than minimum threshold? 186 btfsc neg_flag ; sensor mV lower than minimum boundary?
188 retlw .1 ; YES - return signaling threshold violation 187 retlw .1 ; YES - return signaling boundary violation
189 MOVLI max_mv,sub_b ; load maximum threshold into sub_b 188
189 MOVLI max_mv,sub_b ; load maximum boundary into sub_b
190 call sub16 ; sub_c = sub_a - sub_b 190 call sub16 ; sub_c = sub_a - sub_b
191 btfss neg_flag ; sensor mV higher than maximum threshold? 191 btfss neg_flag ; sensor mV higher than maximum boundary?
192 retlw .1 ; YES - return signaling threshold violation 192 retlw .1 ; YES - return signaling boundary violation
193 retlw .0 ; NO - return signaling min/max ok 193
194 194 retlw .0 ; return signaling min/max ok
195 195
196 global compute_mvolts_for_all_sensors 196 ENDIF ; _external_sensor
197 compute_mvolts_for_all_sensors: ; compute mV or all sensors (S8 mode) 197
198 ;=============================================================================
199 calibrate2 CODE
200 ;=============================================================================
201
202 IFDEF _external_sensor
203
204 ;-----------------------------------------------------------------------------
205 ; Compute Sensor mV from Raw Values received via S8 digital Interface
206 ;
207 global compute_mvolts_from_rawdata
208 compute_mvolts_from_rawdata:
209
198 ; compute AD results in 100 µV steps (16 bit/sensor) 210 ; compute AD results in 100 µV steps (16 bit/sensor)
199 ; 24 bit AD result is in 244.1406541 nV 211 ; 24 bit AD result is in 244.1406541 nV
200 ; divide 24 bit value by 409.5999512 -> 410 with only 0.01% error 212 ; divide 24 bit value by 409.5999512 -> 410 with only 0.01% error
201 #DEFINE ad2mv_factor .410 213 #DEFINE ad2mv_factor .410
202 214
203 MOVLI ad2mv_factor,xB 215 MOVLI ad2mv_factor,xB ; load conversion factor into xB
204 216
205 ; Sensor 1 217 ; Sensor 1
206 SMOVTT s8_rawdata_sensor1,xC ; ISR-safe copy of 3 bytes to xC 218 SMOVTT s8_rawdata_sensor1,xC ; ISR-safe copy of 3 bytes to xC
207 clrf xC+3 ; clear MSB of xC 219 clrf xC+3 ; clear MSB of xC
208 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 220 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
209 MOVII xC,sensor1_mv ; in 100 µV steps 221 MOVII xC,sensor1_mv ; store result
210 222
211 ; Sensor 2 223 ; Sensor 2
212 SMOVTT s8_rawdata_sensor2,xC ; ISR-safe copy of 3 bytes to xC 224 SMOVTT s8_rawdata_sensor2,xC ; ISR-safe copy of 3 bytes to xC
213 clrf xC+3 ; clear MSB of xC 225 clrf xC+3 ; clear MSB of xC
214 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 226 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
215 MOVII xC,sensor2_mv ; in 100 µV steps 227 MOVII xC,sensor2_mv ; store result
216 228
217 ; Sensor 3 229 ; Sensor 3
218 SMOVTT s8_rawdata_sensor3,xC ; ISR-safe copy of 3 bytes to xC 230 SMOVTT s8_rawdata_sensor3,xC ; ISR-safe copy of 3 bytes to xC
219 clrf xC+3 ; clear MSB of xC 231 clrf xC+3 ; clear MSB of xC
220 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder 232 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
221 MOVII xC,sensor3_mv ; in 100 µV steps 233 MOVII xC,sensor3_mv ; store result
222 234
223 return ; done 235 return ; done
224 236
225 ENDIF ; _external_sensor 237 ENDIF ; _external_sensor
226 238
227 ;============================================================================= 239 ;-----------------------------------------------------------------------------
228 240
229 END 241 END