Mercurial > public > hwos_code
diff src/calibrate.asm @ 634:4050675965ea
3.10 stable release
| author | heinrichsweikamp |
|---|---|
| date | Tue, 28 Apr 2020 17:34:31 +0200 |
| parents | 185ba2f91f59 |
| children | 75e90cd0c2c3 |
line wrap: on
line diff
--- a/src/calibrate.asm Thu Mar 05 15:06:14 2020 +0100 +++ b/src/calibrate.asm Tue Apr 28 17:34:31 2020 +0200 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File calibration.asm combined next generation V3.08.8 +; File calibration.asm * combined next generation V3.09.4n ; ; o2 sensor calibration subroutines ; @@ -14,216 +14,228 @@ #include "eeprom_rs232.inc" -calibrate CODE +;============================================================================= +calibrate1 CODE +;============================================================================= -;============================================================================= IFDEF _external_sensor - global transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics +;----------------------------------------------------------------------------- +; Transmit current Setpoint from WREG (in cbar) to external Electronics +; + global transmit_setpoint transmit_setpoint: 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 - 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 - rcall tx_to_HUD ; transmit to HUD - movff hi,WREG ; SP in cbar - rcall tx_to_HUD ; transmit to HUD - movff lo,WREG ; checksum - rcall tx_to_HUD_cs ; transmit checksum - return -tx_to_HUD: ; entry point to transmit a byte to the HUD - addwf lo,F ; add byte to checksum -tx_to_HUD_cs: ; entry point to transmit the checksum - movff WREG,TXREG2 ; transmit byte - call ir_s8_wait_tx ; wait for UART - return +; btfsc ext_input_optical ; optical input in use? +; return ; YES - setpoint - TX not supported +; TSTOSS opt_s8_mode ; NO - S8 mode selected? +; return ; NO +; clrf lo ; YES - initialize checksum +; movff char_I_const_ppO2,hi ; - copy setpoint value to hi +; movlw 0xAA ; - load start byte +; rcall tx_to_HUD_chksum ; - transmit to HUD +; movlw 0x60 ; - load command 'new SP' +; rcall tx_to_HUD_chksum ; - transmit to HUD +; movf hi,W ; - load SP in cbar +; rcall tx_to_HUD_chksum ; - transmit to HUD +; movf lo,W ; - load checksum +; rcall tx_to_HUD ; - transmit checksum +; return ; - done +;----------------------------------------------------------------------------- +; Helper Function - Transmit Byte to external Electronics +; +tx_to_HUD_chksum: + addwf lo,F ; add byte to checksum +tx_to_HUD: + goto ir_s8_tx_single ; transmit byte and return + + +;----------------------------------------------------------------------------- +; Compute Calibration Factors +; global calibrate_mix calibrate_mix: - ; set usage and calibration flags as per default - bsf use_O2_sensor1 - bsf use_O2_sensor2 - bsf use_O2_sensor3 - bsf sensor1_calibrated_ok - bsf sensor2_calibrated_ok - bsf sensor3_calibrated_ok + ; set usage and calibration flags to default values + bsf use_O2_sensor1 ; sensor in use + bsf use_O2_sensor2 ; ... + bsf use_O2_sensor3 ; ... + bsf sensor1_calibrated_ok ; sensor calibration ok + 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_avail ; do we have a digital S8 interface? - bra calibrate_mix1 ; NO - skip HUD part + btfsc ext_input_optical ; optical interface in use? + bra calibrate_mix1 ; YES - skip + TSTOSS opt_s8_mode ; NO - S8 interface in use? + bra calibrate_mix1 ; NO - skip HUD part + ;bra calibrate_mix0 ; YES - calibrate S8 HUD - ; calibrate any S8-connected HUD + ; calibrate S8-connected external electronics +calibrate_mix0: clrf lo ; initialize checksum - movlw 0xAA ; start byte - rcall tx_to_HUD ; transmit to HUD - movlw 0x31 ; calibration command + movlw 0xAA ; load start byte + rcall tx_to_HUD_chksum ; transmit to HUD + movlw 0x31 ; load calibration command + rcall tx_to_HUD_chksum ; transmit to HUD + movff opt_calibration_O2_ratio,WREG ; load calibration gas %O2 + rcall tx_to_HUD_chksum ; transmit to HUD + movf xB+0,W ; load current absolute pressure low byte + rcall tx_to_HUD_chksum ; transmit to HUD + movf xB+1,W ; load current absolute pressure high byte + rcall tx_to_HUD_chksum ; transmit to HUD + movf lo,W ; load checksum rcall tx_to_HUD ; transmit to HUD - movff opt_calibration_O2_ratio,WREG ; calibration gas %O2 - rcall tx_to_HUD ; transmit to HUD - movff xB+0,WREG ; current absolute pressure low byte - rcall tx_to_HUD ; transmit to HUD - 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 * absolute pressure [mbar] / 100 - movff opt_calibration_O2_ratio,WREG - mullw .100 - MOVII PROD,xA - call mult16x16 ; xA*xB=xC - MOVLI .100,xB +calibrate_mix1: ; compute C = %O2 * 100 * absolute pressure [mbar] / 100 + movff opt_calibration_O2_ratio,WREG ; load calibration gas %O2 + mullw .100 ; multiply with 100 + MOVII PROD,xA ; copy result to xA + call mult16x16 ; xC = xA * xB + MOVLI .100,xB ; prepare division by 100 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder - ; keep a copy of the result - 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 - MOVII sensor1_mv,xB + MOVRR xC,mpr,.4 ; backup calibration value C + MOVII sensor1_mv,xB ; get mV from sensor 1 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 mpr+0,xC+0 - movff mpr+1,xC+1 - movff mpr+2,xC+2 - movff mpr+3,xC+3 - ; compute factor for sensor 2 - MOVII sensor2_mv,xB + MOVRR mpr,xC,.4 ; restore C + MOVII sensor2_mv,xB ; get mV from sensor 2 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 mpr+0,xC+0 - movff mpr+1,xC+1 - movff mpr+2,xC+2 - movff mpr+3,xC+3 - ; compute factor for sensor 3 - MOVII sensor3_mv,xB + MOVRR mpr,xC,.4 ; restore C + MOVII sensor3_mv,xB ; get mV from sensor 3 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 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 + rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within boundary? + bcf use_O2_sensor1 ; NO - revoke sensor from usage ; check sensor 2 for min/max mV 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 + rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within boundary? + bcf use_O2_sensor2 ; NO - revoke sensor from usage ; check sensor 3 for min/max mV 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 + rcall calibrate_mix_helper ; check mV for min/max boundary, returns with WREG = 0 if ok, else WREG = 1 + TSTFSZ WREG ; sensor mV within boundary? + bcf use_O2_sensor3 ; NO - revoke sensor from usage calibrate_mix2: ; check for HUD btfss hud_connection_ok ; HUD connection existing? bra calibrate_mix3 ; NO - skip HUD part + ; TODO: wait for HUD to complete calibration an send updated data + ; copy disable flags from HUD digital input - btfss sensor1_active - bcf use_O2_sensor1 - btfss sensor2_active - bcf use_O2_sensor2 - btfss sensor3_active - bcf use_O2_sensor3 + btfss sensor1_active ; sensor 1 usable? + bcf use_O2_sensor1 ; NO - revoke sensor from usage + btfss sensor2_active ; sensor 2 usable? + bcf use_O2_sensor2 ; NO - revoke sensor from usage + btfss sensor3_active ; sensor 3 usable? + bcf use_O2_sensor3 ; NO - revoke sensor from usage calibrate_mix3: - ; clear calibration flags if sensors are not found to be ok - btfss use_O2_sensor1 ; sensor 1 out of range? - bcf sensor1_calibrated_ok ; YES - disable this sensor - btfss use_O2_sensor2 ; sensor 2 out of range? - bcf sensor2_calibrated_ok ; YES - disable this sensor - 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 - btfsc use_O2_sensor1 - return - btfsc use_O2_sensor2 - return - btfsc use_O2_sensor3 - return + ; clear calibration flags if sensors are not usable + btfss use_O2_sensor1 ; sensor 1 usable? + bcf sensor1_calibrated_ok ; NO - revoke calibration + btfss use_O2_sensor2 ; sensor 2 usable? + bcf sensor2_calibrated_ok ; NO - revoke calibration + btfss use_O2_sensor3 ; sensor 3 usable? + bcf sensor3_calibrated_ok ; NO - revoke calibration - ; enable all sensors - bsf use_O2_sensor1 - bsf use_O2_sensor2 - bsf use_O2_sensor3 - ; 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: - 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 - 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 - retlw .0 ; NO - return signaling min/max ok + ; if there is no usable sensor at all, then enable all three + ; sensors to show error state and clear calibration factors + btfsc use_O2_sensor1 ; sensor 1 usable? + return ; YES - done + btfsc use_O2_sensor2 ; NO - sensor 2 usable? + return ; YES - done + btfsc use_O2_sensor3 ; NO - sensor 3 usable? + return ; YES - done + bsf use_O2_sensor1 ; NO - enable all sensors + bsf use_O2_sensor2 ; - ... + bsf use_O2_sensor3 ; - ... + CLRR opt_x_s1,.6 ; - clear calibration factors (3x 16 bit) + return ; - done - global compute_mvolts_for_all_sensors -compute_mvolts_for_all_sensors: ; compute mV or all sensors (S8 mode) +;----------------------------------------------------------------------------- +; Helper Function - Check if Sensor mV Value is within Min/Max Boundary +; +calibrate_mix_helper: + MOVLI min_mv,sub_b ; load minimum boundary into sub_b + call sub16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; sensor mV lower than minimum boundary? + retlw .1 ; YES - return signaling boundary violation + + MOVLI max_mv,sub_b ; load maximum boundary into sub_b + call sub16 ; sub_c = sub_a - sub_b + btfss neg_flag ; sensor mV higher than maximum boundary? + retlw .1 ; YES - return signaling boundary violation + + retlw .0 ; return signaling min/max ok + + ENDIF ; _external_sensor + +;============================================================================= +calibrate2 CODE +;============================================================================= + + IFDEF _external_sensor + +;----------------------------------------------------------------------------- +; Compute Sensor mV from Raw Values received via S8 digital Interface +; + global compute_mvolts_from_rawdata +compute_mvolts_from_rawdata: + ; 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 - MOVLI ad2mv_factor,xB + MOVLI ad2mv_factor,xB ; load conversion factor into xB ; Sensor 1 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 + MOVII xC,sensor1_mv ; store result ; Sensor 2 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 + MOVII xC,sensor2_mv ; store result ; Sensor 3 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 + MOVII xC,sensor3_mv ; store result return ; done ENDIF ; _external_sensor -;============================================================================= +;----------------------------------------------------------------------------- END
