Mercurial > public > hwos_code
annotate src/calibrate.asm @ 629:237931377539
3.07 stable release
author | heinrichsweikamp |
---|---|
date | Fri, 29 Nov 2019 18:48:11 +0100 |
parents | c40025d8e750 |
children | 185ba2f91f59 |
rev | line source |
---|---|
113 | 1 ;============================================================================= |
2 ; | |
623 | 3 ; File calibration.asm combined next generation V3.03.1 |
113 | 4 ; |
5 ; o2 sensor calibration subroutines | |
6 ; | |
7 ; Copyright (c) 2014, Heinrichs Weikamp, all right reserved. | |
8 ;============================================================================= | |
9 | |
582 | 10 #include "hwos.inc" |
604 | 11 #include "shared_definitions.h" ; mailbox between c and asm |
582 | 12 #include "math.inc" |
13 #include "adc_lightsensor.inc" | |
14 #include "eeprom_rs232.inc" | |
113 | 15 |
16 | |
582 | 17 calibrate CODE |
18 | |
623 | 19 ;============================================================================= |
20 | |
21 IFDEF _external_sensor | |
604 | 22 |
23 global transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics | |
24 transmit_setpoint: | |
623 | 25 return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! |
26 btfss s8_digital_avail ; do we have a digital S8 interface? | |
604 | 27 return ; NO - ignore |
28 ; YES - transmit setpoint from WREG | |
29 clrf lo ; initialize checksum | |
623 | 30 movff char_I_const_ppO2,hi ; copy setpoint value to hi |
604 | 31 movlw 0xAA ; start byte |
32 rcall tx_to_HUD ; transmit to HUD | |
33 movlw 0x60 ; command new SP | |
34 rcall tx_to_HUD ; transmit to HUD | |
35 movff hi,WREG ; SP in cbar | |
36 rcall tx_to_HUD ; transmit to HUD | |
37 movff lo,WREG ; checksum | |
38 rcall tx_to_HUD_cs ; transmit checksum | |
39 return | |
40 | |
41 tx_to_HUD: ; entry point to transmit a byte to the HUD | |
42 addwf lo,F ; add byte to checksum | |
43 tx_to_HUD_cs: ; entry point to transmit the checksum | |
44 movff WREG,TXREG2 ; transmit byte | |
45 call rs232_wait_tx2 ; wait for UART | |
46 return | |
47 | |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
48 |
604 | 49 global calibrate_mix |
50 calibrate_mix: | |
51 ; set usage and calibration flags as per default | |
52 bsf use_O2_sensor1 | |
53 bsf use_O2_sensor2 | |
54 bsf use_O2_sensor3 | |
55 bsf sensor1_calibrated_ok | |
56 bsf sensor2_calibrated_ok | |
57 bsf sensor3_calibrated_ok | |
58 | |
623 | 59 ; ISR-safe 2 byte copy of the current pressure to xB for later use |
60 SMOVII pressure_abs,xB | |
61 | |
604 | 62 ; check for HUD |
623 | 63 btfss s8_digital_avail ; do we have a digital S8 interface? |
604 | 64 bra calibrate_mix1 ; NO - skip HUD part |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
65 |
604 | 66 ; calibrate any S8-connected HUD |
67 clrf lo ; initialize checksum | |
68 movlw 0xAA ; start byte | |
69 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 | |
623 | 74 movff xB+0,WREG ; current absolute pressure low byte |
604 | 75 rcall tx_to_HUD ; transmit to HUD |
623 | 76 movff xB+1,WREG ; current absolute pressure high byte |
604 | 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 | |
582 | 81 |
604 | 82 ; calibrate internal sensors |
623 | 83 calibrate_mix1: ; compute %O2 * 100 * absolute pressure [mbar] / 100 |
604 | 84 movff opt_calibration_O2_ratio,WREG |
85 mullw .100 | |
623 | 86 MOVII PROD,xA |
604 | 87 call mult16x16 ; xA*xB=xC |
623 | 88 MOVLI .100,xB |
89 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
604 | 90 |
91 ; keep a copy of the result | |
623 | 92 movff xC+0,mpr+0 |
93 movff xC+1,mpr+1 | |
94 movff xC+2,mpr+2 | |
95 movff xC+3,mpr+3 | |
604 | 96 |
97 ; compute factor for sensor 1 | |
623 | 98 MOVII sensor1_mv,xB |
99 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 | |
604 | 101 |
102 ; restore result | |
623 | 103 movff mpr+0,xC+0 |
104 movff mpr+1,xC+1 | |
105 movff mpr+2,xC+2 | |
106 movff mpr+3,xC+3 | |
604 | 107 |
108 ; compute factor for sensor 2 | |
623 | 109 MOVII sensor2_mv,xB |
110 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 | |
604 | 112 |
113 ; restore result | |
623 | 114 movff mpr+0,xC+0 |
115 movff mpr+1,xC+1 | |
116 movff mpr+2,xC+2 | |
117 movff mpr+3,xC+3 | |
604 | 118 |
119 ; compute factor for sensor 3 | |
623 | 120 MOVII sensor3_mv,xB |
121 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 | |
604 | 123 |
124 ; check sensor 1 for min/max mV | |
623 | 125 MOVII sensor1_mv,sub_a ; get mV from sensor 1 |
604 | 126 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 |
127 TSTFSZ WREG ; sensor mV within thresholds? | |
128 bcf use_O2_sensor1 ; NO - clear usage flag | |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
129 |
604 | 130 ; check sensor 2 for min/max mV |
623 | 131 MOVII sensor2_mv,sub_a ; get mV from sensor 2 |
604 | 132 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 |
133 TSTFSZ WREG ; sensor mV within thresholds? | |
134 bcf use_O2_sensor2 ; NO - clear usage flag | |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
135 |
604 | 136 ; check sensor 3 for min/max mV |
623 | 137 MOVII sensor3_mv,sub_a ; get mV from sensor 3 |
604 | 138 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 |
139 TSTFSZ WREG ; sensor mV within thresholds? | |
140 bcf use_O2_sensor3 ; NO - clear usage flag | |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
141 |
604 | 142 calibrate_mix2: |
143 ; check for HUD | |
144 btfss hud_connection_ok ; HUD connection existing? | |
145 bra calibrate_mix3 ; NO - skip HUD part | |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
113
diff
changeset
|
146 |
623 | 147 ; copy disable flags from HUD digital input |
582 | 148 btfss sensor1_active |
149 bcf use_O2_sensor1 | |
150 btfss sensor2_active | |
151 bcf use_O2_sensor2 | |
152 btfss sensor3_active | |
153 bcf use_O2_sensor3 | |
113 | 154 |
604 | 155 calibrate_mix3: |
156 ; clear calibration flags if sensors are not found to be ok | |
157 btfss use_O2_sensor1 ; sensor 1 out of range? | |
158 bcf sensor1_calibrated_ok ; YES - disable this sensor | |
159 btfss use_O2_sensor2 ; sensor 2 out of range? | |
160 bcf sensor2_calibrated_ok ; YES - disable this sensor | |
161 btfss use_O2_sensor3 ; sensor 3 out of range? | |
162 bcf sensor3_calibrated_ok ; YES - disable this sensor | |
113 | 163 |
623 | 164 ; when no sensor is found, enable all three to show error state and clear calibration factors |
192 | 165 btfsc use_O2_sensor1 |
113 | 166 return |
192 | 167 btfsc use_O2_sensor2 |
113 | 168 return |
192 | 169 btfsc use_O2_sensor3 |
113 | 170 return |
623 | 171 |
172 ; enable all sensors | |
192 | 173 bsf use_O2_sensor1 |
174 bsf use_O2_sensor2 | |
175 bsf use_O2_sensor3 | |
623 | 176 ; clear calibration factors |
177 banksel opt_x_s1 ; switch to bank options table | |
178 CLRI opt_x_s1 | |
179 CLRI opt_x_s2 | |
180 CLRI opt_x_s3 | |
181 banksel common ; back to bank common | |
113 | 182 return |
183 | |
604 | 184 calibrate_mix_helper: |
623 | 185 MOVLI min_mv,sub_b ; load minimum threshold into sub_b |
604 | 186 call sub16 ; sub_c = sub_a - sub_b |
187 btfsc neg_flag ; sensor mV lower than minimum threshold? | |
188 retlw .1 ; YES - return signaling threshold violation | |
623 | 189 MOVLI max_mv,sub_b ; load maximum threshold into sub_b |
604 | 190 call sub16 ; sub_c = sub_a - sub_b |
191 btfss neg_flag ; sensor mV higher than maximum threshold? | |
192 retlw .1 ; YES - return signaling threshold violation | |
193 retlw .0 ; NO - return signaling min/max ok | |
560 | 194 |
448 | 195 |
560 | 196 global compute_mvolts_for_all_sensors |
604 | 197 compute_mvolts_for_all_sensors: ; compute mV or all sensors (S8 mode) |
623 | 198 ; compute AD results in 100 µV steps (16 bit/sensor) |
199 ; 24 bit AD result is in 244.1406541 nV | |
200 ; divide 24 bit value by 409.5999512 -> 410 with only 0.01% error | |
582 | 201 #DEFINE ad2mv_factor .410 |
623 | 202 |
203 MOVLI ad2mv_factor,xB | |
204 | |
560 | 205 ; Sensor 1 |
623 | 206 SMOVTT s8_rawdata_sensor1,xC ; ISR-safe copy of 3 bytes to xC |
207 clrf xC+3 ; clear MSB of xC | |
208 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
209 MOVII xC,sensor1_mv ; in 100 µV steps | |
210 | |
560 | 211 ; Sensor 2 |
623 | 212 SMOVTT s8_rawdata_sensor2,xC ; ISR-safe copy of 3 bytes to xC |
213 clrf xC+3 ; clear MSB of xC | |
214 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
215 MOVII xC,sensor2_mv ; in 100 µV steps | |
216 | |
560 | 217 ; Sensor 3 |
623 | 218 SMOVTT s8_rawdata_sensor3,xC ; ISR-safe copy of 3 bytes to xC |
219 clrf xC+3 ; clear MSB of xC | |
220 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
221 MOVII xC,sensor3_mv ; in 100 µV steps | |
352
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
275
diff
changeset
|
222 |
604 | 223 return ; done |
113 | 224 |
623 | 225 |
226 ENDIF ; _external_sensor | |
227 | |
228 ;============================================================================= | |
229 | |
230 END |