Mercurial > public > hwos_code
diff src/calibrate.asm @ 623:c40025d8e750
3.03 beta released
author | heinrichsweikamp |
---|---|
date | Mon, 03 Jun 2019 14:01:48 +0200 |
parents | ca4556fb60b9 |
children | 185ba2f91f59 |
line wrap: on
line diff
--- a/src/calibrate.asm Wed Apr 10 10:51:07 2019 +0200 +++ b/src/calibrate.asm Mon Jun 03 14:01:48 2019 +0200 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File calibration.asm REFACTORED VERSION V2.98b +; File calibration.asm combined next generation V3.03.1 ; ; o2 sensor calibration subroutines ; @@ -12,20 +12,22 @@ #include "math.inc" #include "adc_lightsensor.inc" #include "eeprom_rs232.inc" -#include "isr.inc" calibrate CODE +;============================================================================= + + IFDEF _external_sensor global transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics transmit_setpoint: - return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! - btfss s8_digital ; S8 Digital connection existing? + return ; !!!! FUNCTION IS CURRENTLY DISABLED !!!! + btfss s8_digital_avail ; do we have a digital S8 interface? return ; NO - ignore ; YES - transmit setpoint from WREG clrf lo ; initialize checksum - movwf hi ; store setpoint + movff char_I_const_ppO2,hi ; copy setpoint value to hi movlw 0xAA ; start byte rcall tx_to_HUD ; transmit to HUD movlw 0x60 ; command new SP @@ -54,8 +56,11 @@ bsf sensor2_calibrated_ok bsf sensor3_calibrated_ok + ; ISR-safe 2 byte copy of the current pressure to xB for later use + SMOVII pressure_abs,xB + ; check for HUD - btfss s8_digital ; S8 Digital connection existing? + btfss s8_digital_avail ; do we have a digital S8 interface? bra calibrate_mix1 ; NO - skip HUD part ; calibrate any S8-connected HUD @@ -66,84 +71,70 @@ rcall tx_to_HUD ; transmit to HUD movff opt_calibration_O2_ratio,WREG ; calibration gas %O2 rcall tx_to_HUD ; transmit to HUD - movff amb_pressure+0,WREG ; ambient pressure low byte + movff xB+0,WREG ; current absolute pressure low byte rcall tx_to_HUD ; transmit to HUD - movff amb_pressure+1,WREG ; ambient pressure high byte + movff xB+1,WREG ; current absolute pressure high byte rcall tx_to_HUD ; transmit to HUD movff lo,WREG ; checksum rcall tx_to_HUD_cs ; transmit to HUD ; bra calibrate_mix2 ; calibrate internal sensors -calibrate_mix1: ; compute %O2 * 100 * ambient_pressure[mbar] / 100 +calibrate_mix1: ; compute %O2 * 100 * absolute pressure [mbar] / 100 movff opt_calibration_O2_ratio,WREG mullw .100 - movff PRODL,xA+0 - movff PRODH,xA+1 - SAFE_2BYTE_COPY amb_pressure,xB + MOVII PROD,xA call mult16x16 ; xA*xB=xC - movlw LOW .100 - movwf xB+0 - movlw HIGH .100 - movwf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + MOVLI .100,xB + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder ; keep a copy of the result - movff xC+0,lo - movff xC+1,hi - movff xC+2,up - movff xC+3,ex + movff xC+0,mpr+0 + movff xC+1,mpr+1 + movff xC+2,mpr+2 + movff xC+3,mpr+3 ; compute factor for sensor 1 - movff o2_mv_sensor1+0,xB+0 - movff o2_mv_sensor1+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,opt_x_s1+0 ; xC= ppO2/mV as factor for sensor 1 - movff xC+1,opt_x_s1+1 + MOVII sensor1_mv,xB + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,opt_x_s1 ; xC = ppO2/mV as factor for sensor 1 ; restore result - movff lo,xC+0 - movff hi,xC+1 - movff up,xC+2 - movff ex,xC+3 + movff mpr+0,xC+0 + movff mpr+1,xC+1 + movff mpr+2,xC+2 + movff mpr+3,xC+3 ; compute factor for sensor 2 - movff o2_mv_sensor2+0,xB+0 - movff o2_mv_sensor2+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,opt_x_s2+0 ; xC= ppO2/mV as factor for sensor 2 - movff xC+1,opt_x_s2+1 + MOVII sensor2_mv,xB + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,opt_x_s2 ; xC = ppO2/mV as factor for sensor 2 ; restore result - movff lo,xC+0 - movff hi,xC+1 - movff up,xC+2 - movff ex,xC+3 + movff mpr+0,xC+0 + movff mpr+1,xC+1 + movff mpr+2,xC+2 + movff mpr+3,xC+3 ; compute factor for sensor 3 - movff o2_mv_sensor3+0,xB+0 - movff o2_mv_sensor3+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,opt_x_s3+0 ; xC= ppO2/mV as factor for sensor 3 - movff xC+1,opt_x_s3+1 + MOVII sensor3_mv,xB + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,opt_x_s3 ; xC = ppO2/mV as factor for sensor 3 ; check sensor 1 for min/max mV - movff o2_mv_sensor1+0, sub_a+0 ; get mV from sensor 1 - movff o2_mv_sensor1+1, sub_a+1 + MOVII sensor1_mv,sub_a ; get mV from sensor 1 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 TSTFSZ WREG ; sensor mV within thresholds? bcf use_O2_sensor1 ; NO - clear usage flag ; check sensor 2 for min/max mV - movff o2_mv_sensor2+0, sub_a+0 ; get mV from sensor 2 - movff o2_mv_sensor2+1, sub_a+1 + MOVII sensor2_mv,sub_a ; get mV from sensor 2 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 TSTFSZ WREG ; sensor mV within thresholds? bcf use_O2_sensor2 ; NO - clear usage flag ; check sensor 3 for min/max mV - movff o2_mv_sensor3+0, sub_a+0 ; get mV from sensor 3 - movff o2_mv_sensor3+1, sub_a+1 + MOVII sensor3_mv,sub_a ; get mV from sensor 3 rcall calibrate_mix_helper ; check mV for min/max thresholds, returns with WREG = 0 if ok, else WREG = 1 TSTFSZ WREG ; sensor mV within thresholds? bcf use_O2_sensor3 ; NO - clear usage flag @@ -153,7 +144,7 @@ btfss hud_connection_ok ; HUD connection existing? bra calibrate_mix3 ; NO - skip HUD part - ; Copy disable flags from HUD digital input + ; copy disable flags from HUD digital input btfss sensor1_active bcf use_O2_sensor1 btfss sensor2_active @@ -170,40 +161,32 @@ btfss use_O2_sensor3 ; sensor 3 out of range? bcf sensor3_calibrated_ok ; YES - disable this sensor - ; When no sensor is found, enable all three to show error state and clear calibration factors + ; when no sensor is found, enable all three to show error state and clear calibration factors btfsc use_O2_sensor1 return btfsc use_O2_sensor2 return btfsc use_O2_sensor3 return - ; Enable all sensors + + ; enable all sensors bsf use_O2_sensor1 bsf use_O2_sensor2 bsf use_O2_sensor3 - ; Clear calibration factors - banksel opt_x_s1+0 - clrf opt_x_s1+0 - clrf opt_x_s1+1 - clrf opt_x_s2+0 - clrf opt_x_s2+1 - clrf opt_x_s3+0 - clrf opt_x_s3+1 - banksel common + ; clear calibration factors + banksel opt_x_s1 ; switch to bank options table + CLRI opt_x_s1 + CLRI opt_x_s2 + CLRI opt_x_s3 + banksel common ; back to bank common return calibrate_mix_helper: - movlw LOW min_mv ; load minimum threshold... - movwf sub_b+0 ; ...into sub_b - movlw HIGH min_mv - movwf sub_b+1 + MOVLI min_mv,sub_b ; load minimum threshold into sub_b call sub16 ; sub_c = sub_a - sub_b btfsc neg_flag ; sensor mV lower than minimum threshold? retlw .1 ; YES - return signaling threshold violation - movlw LOW max_mv ; load maximum threshold... - movwf sub_b+0 ; ...into sub_b - movlw HIGH max_mv - movwf sub_b+1 + MOVLI max_mv,sub_b ; load maximum threshold into sub_b call sub16 ; sub_c = sub_a - sub_b btfss neg_flag ; sensor mV higher than maximum threshold? retlw .1 ; YES - return signaling threshold violation @@ -212,40 +195,36 @@ global compute_mvolts_for_all_sensors compute_mvolts_for_all_sensors: ; compute mV or all sensors (S8 mode) -; compute AD results in 100µV steps (16bit/sensor) -; 24bit AD result is in 244,1406541nV -; Divide 24bit value through 409,5999512 -> 410 (0,01% error) + ; compute AD results in 100 µV steps (16 bit/sensor) + ; 24 bit AD result is in 244.1406541 nV + ; divide 24 bit value by 409.5999512 -> 410 with only 0.01% error #DEFINE ad2mv_factor .410 - movlw LOW ad2mv_factor - movwf xB+0 - movlw HIGH ad2mv_factor - movwf xB+1 + + MOVLI ad2mv_factor,xB + ; Sensor 1 - clrf xC+3 - movff s8_rawdata_sensor1+2,xC+2 - movff s8_rawdata_sensor1+1,xC+1 - movff s8_rawdata_sensor1+0,xC+0 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor1+1 - movff xC+0,o2_mv_sensor1+0 ; in 100 uV steps + SMOVTT s8_rawdata_sensor1,xC ; ISR-safe copy of 3 bytes to xC + clrf xC+3 ; clear MSB of xC + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,sensor1_mv ; in 100 µV steps + ; Sensor 2 - clrf xC+3 - movff s8_rawdata_sensor2+2,xC+2 - movff s8_rawdata_sensor2+1,xC+1 - movff s8_rawdata_sensor2+0,xC+0 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor2+1 - movff xC+0,o2_mv_sensor2+0 ; in 100 uV steps + SMOVTT s8_rawdata_sensor2,xC ; ISR-safe copy of 3 bytes to xC + clrf xC+3 ; clear MSB of xC + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,sensor2_mv ; in 100 µV steps + ; Sensor 3 - clrf xC+3 - movff s8_rawdata_sensor3+2,xC+2 - movff s8_rawdata_sensor3+1,xC+1 - movff s8_rawdata_sensor3+0,xC+0 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+1,o2_mv_sensor3+1 - movff xC+0,o2_mv_sensor3+0 ; in 100 uV steps + SMOVTT s8_rawdata_sensor3,xC ; ISR-safe copy of 3 bytes to xC + clrf xC+3 ; clear MSB of xC + call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder + MOVII xC,sensor3_mv ; in 100 µV steps - bcf new_s8_data_available ; clear flag return ; done - END \ No newline at end of file + + ENDIF ; _external_sensor + +;============================================================================= + + END