Mercurial > public > hwos_code
diff src/adc_lightsensor.asm @ 582:b455b31ce022
work on 2.97 stable
author | heinrichsweikamp |
---|---|
date | Mon, 26 Feb 2018 16:40:28 +0100 |
parents | 237afdfb4918 |
children | 00b24fb4324d |
line wrap: on
line diff
--- a/src/adc_lightsensor.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/adc_lightsensor.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,6 +1,6 @@ ;============================================================================= ; -; File adc.asm +; File adc.asm V2.98 ; ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. @@ -14,126 +14,130 @@ #include "eeprom_rs232.inc" #include "i2c.inc" -sensors CODE + extern reset_battery_internal_only + +sensors CODE + +;============================================================================= wait_adc: movwf ADCON0 - nop - bsf ADCON0,1 ; start ADC + nop + bsf ADCON0,1 ; start ADC wait_adc2: - btfsc ADCON0,1 ; Wait... + btfsc ADCON0,1 ; Wait... bra wait_adc2 - return + return global get_battery_voltage -get_battery_voltage: ; starts ADC and waits until fnished - btfss battery_gauge_available - bra get_battery_voltage1 ; Normal ostc3 hardware +get_battery_voltage: ; starts ADC and waits until finished + btfss battery_gauge_available + bra get_battery_voltage1 ; Normal ostc3 hardware - call lt2942_get_accumulated_charge - call lt2942_get_voltage - - tstfsz batt_voltage+1 ; <256mV? - bra get_battery_voltage_noretry ; No + call lt2942_get_accumulated_charge + call lt2942_get_voltage + + tstfsz batt_voltage+1 ; <256mV? + bra get_battery_voltage_noretry ; No - ; Retry - call lt2942_get_accumulated_charge - call lt2942_get_voltage - + ; Retry + call lt2942_get_accumulated_charge + call lt2942_get_voltage + get_battery_voltage_noretry: - btfsc divemode - return ; Not in divemode + btfsc divemode + return ; Not in divemode - bcf cv_active - bcf cc_active - bcf LEDr - bcf TRISJ,2 ; Chrg-Out output - bsf CHRG_OUT + bcf cv_active + bcf cc_active + bcf LEDr + bcf TRISJ,2 ; Chrg-Out output + bsf CHRG_OUT - btfss CHRG_IN - bra charge_cc_active + btfss CHRG_IN + bra charge_cc_active - bcf CHRG_OUT - bsf TRISJ,2 ; Chrg-Out high impedance + bcf CHRG_OUT + bsf TRISJ,2 ; Chrg-Out high impedance - WAITMS d'1' + WAITMS d'1' - btfsc CHRG_IN - return -;cv_active: - decfsz safety_stop_countdown,F - return - movlw .15 - cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? - bra charge_cc_active ; No - bsf cc_active - bsf cv_active - bsf LEDr ; Indicate charging - call lt2942_charge_done ; Reset accumulating registers to 0xFFFF - WAITMS d'10' - bcf LEDr ; Indicate charging - bsf safety_stop_countdown,0 ; =1 - return + btfsc CHRG_IN + return + ;cv_active: + decfsz get_bat_volt_counter,F + return + movlw .15 + cpfsgt batt_voltage+1 ; Batt Voltage >= 16*256mV (4,096V)? + bra charge_cc_active ; No + bsf cc_active + bsf cv_active + bsf LEDr ; Indicate charging + call lt2942_charge_done ; Reset accumulating registers to 0xFFFF + WAITMS d'10' + bcf LEDr ; Indicate charging + bsf get_bat_volt_counter,0 ; =1 + return charge_cc_active: - bsf cc_active - bsf LEDr ; Indicate charging - bcf CHRG_OUT - bsf TRISJ,2 ; Chrg-Out high impedance - movlw .10 - movwf safety_stop_countdown - return + bsf cc_active + bsf LEDr ; Indicate charging + bcf CHRG_OUT + bsf TRISJ,2 ; Chrg-Out high impedance + movlw .10 + movwf get_bat_volt_counter + return get_battery_voltage1: - bsf adc_running ; =1: The ADC is in use - movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV + bsf adc_running ; =1: The ADC is in use + movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV movwf ADCON1 - movlw b'00011001' ; power on ADC, select AN6 - rcall wait_adc + movlw b'00011001' ; power on ADC, select AN6 + rcall wait_adc - movff ADRESH,batt_voltage+1 ; store value - movff ADRESL,batt_voltage+0 ; store value - bcf ADCON0,0 ; power off ADC + movff ADRESH,batt_voltage+1 ; store value + movff ADRESL,batt_voltage+0 ; store value + bcf ADCON0,0 ; power off ADC -; Multiply with 2,006 to be excact here... +; Multiply with 2,006 to be exact here... ; bcf STATUS,C ; rlcf xA+0,F ; -; rlcf xA+1,F ; x2 +; rlcf xA+1,F ; x2 -; movff xA+0,batt_voltage+0 ; store value +; movff xA+0,batt_voltage+0 ; store value ; movff xA+1,batt_voltage+1 - movlw LOW lithium_36v_low + movlw LOW lithium_36v_low movwf sub_a+0 - movlw HIGH lithium_36v_low + movlw HIGH lithium_36v_low movwf sub_a+1 movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b -; Battery is 3,6V (>lithium_36v_low?) + call subU16 ; sub_c = sub_a - sub_b + ; Battery is 3,6V (>lithium_36v_low?) btfss neg_flag - bra get_battery_voltage4 ; No, use 1,5V + bra get_battery_voltage4 ; No, use 1,5V - bsf battery_is_36v ; Yes, set flag (Cleared in power-on reset only!) + bsf battery_is_36v ; Yes, set flag (Cleared in power-on reset only!) -; Check if the battery is near-dead already - movlw LOW lithium_36v_empty + ; Check if the battery is near-dead already + movlw LOW lithium_36v_empty movwf sub_a+0 - movlw HIGH lithium_36v_empty + movlw HIGH lithium_36v_empty movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b -; Battery is not dead yet (>lithium_36v_empty?) + call subU16 ; sub_c = sub_a - sub_b + ; Battery is not dead yet (>lithium_36v_empty?) btfsc neg_flag - bra get_battery_voltage2 ; Yes, battery is still ok + bra get_battery_voltage2 ; Yes, battery is still ok - ; Battery is probably dead very soon - ; Set ">=24Ah used" into battery gauge registers - movlw .128 - movff WREG,battery_gauge+5 + ; Battery is probably dead very soon + ; Set ">=24Ah used" into battery gauge registers + movlw .128 + movff WREG,battery_gauge+5 get_battery_voltage2: - ; Use 3,6V battery gauging mode + ; Use 3,6V battery gauging mode movff battery_gauge+5,xC+3 movff battery_gauge+4,xC+2 movff battery_gauge+3,xC+1 @@ -144,12 +148,12 @@ ; Result is in percent movff internal_battery_capacity+0,xB+0 movff internal_battery_capacity+1,xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder movff xC+0,lo - ; Limit to 100 - movlw .100 - cpfslt lo - movwf lo + ; Limit to 100 + movlw .100 + cpfslt lo + movwf lo ; lo will be between 0 (Full) and 100 (empty) movf lo,W sublw .100 @@ -160,117 +164,118 @@ movwf lo ; lo will be between 100 (Full) and 0 (empty) -; use 3,6V battery sensing based on 50mA load -; 75% + ; use 3,6V battery sensing based on 50mA load + ; 75% movff batt_voltage+0,sub_b+0 movff batt_voltage+1,sub_b+1 - movlw LOW lithium_36v_75 + movlw LOW lithium_36v_75 movwf sub_a+0 - movlw HIGH lithium_36v_75 + movlw HIGH lithium_36v_75 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3a - movlw .75 - movwf lo + bra get_battery_voltage3a + movlw .75 + movwf lo get_battery_voltage3a: ; 50% - movlw LOW lithium_36v_50 + movlw LOW lithium_36v_50 movwf sub_a+0 - movlw HIGH lithium_36v_50 + movlw HIGH lithium_36v_50 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3b - movlw .50 - movwf lo + bra get_battery_voltage3b + movlw .50 + movwf lo get_battery_voltage3b: - ; 25% - movlw LOW lithium_36v_25 + ; 25% + movlw LOW lithium_36v_25 movwf sub_a+0 - movlw HIGH lithium_36v_25 + movlw HIGH lithium_36v_25 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3c - movlw .25 - movwf lo + bra get_battery_voltage3c + movlw .25 + movwf lo get_battery_voltage3c: - ; 10% - movlw LOW lithium_36v_10 + ; 10% + movlw LOW lithium_36v_10 movwf sub_a+0 - movlw HIGH lithium_36v_10 + movlw HIGH lithium_36v_10 movwf sub_a+1 - call subU16 ; sub_c = sub_a - sub_b + call subU16 ; sub_c = sub_a - sub_b btfsc neg_flag - bra get_battery_voltage3d - movlw .10 - movwf lo + bra get_battery_voltage3d + movlw .10 + movwf lo get_battery_voltage3d: movlw .100 cpfslt lo movwf lo ; lo will be between 100 (Full) and 0 (empty) - movf batt_percent,W - cpfsgt lo ; keep batt_percent on the lowest value found - movff lo,batt_percent ; store value - btfsc battery_is_36v ; but always use computed value for 3,6V battery - movff lo,batt_percent ; store value - bcf adc_running ; =1: The ADC is in use + movf batt_percent,W + cpfsgt lo ; keep batt_percent on the lowest value found + movff lo,batt_percent ; store value + btfsc battery_is_36v ; but always use computed value for 3,6V battery + movff lo,batt_percent ; store value + bcf adc_running ; =1: The ADC is in use return get_battery_voltage4: - ; Use 1,5V battery voltage mode - ; Use approximation (batt_voltage:2-aa_15v_low)/4 = lo + ; Use 1,5V battery voltage mode + ; Use approximation (batt_voltage:2-aa_15v_low)/4 = lo movff batt_voltage+0,sub_a+0 movff batt_voltage+1,sub_a+1 - movlw LOW aa_15v_low - movwf sub_b+0 - movlw HIGH aa_15v_low + movlw LOW aa_15v_low + movwf sub_b+0 + movlw HIGH aa_15v_low movwf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - bcf STATUS,C - rrcf sub_c+1 - rrcf sub_c+0 ; /2 - bcf STATUS,C - rrcf sub_c+1 - rrcf sub_c+0 ; /4 - movff sub_c+0,lo - bra get_battery_voltage3d ; Check limits and return + call subU16 ; sub_c = sub_a - sub_b + bcf STATUS,C + rrcf sub_c+1 + rrcf sub_c+0 ; /2 + bcf STATUS,C + rrcf sub_c+1 + rrcf sub_c+0 ; /4 + movff sub_c+0,lo + bra get_battery_voltage3d ; Check limits and return global get_ambient_level -get_ambient_level: ; starts ADC and waits until finished - btfsc adc_running ; ADC in use? - return ; Yes, return +get_ambient_level: ; starts ADC and waits until finished + btfsc adc_running ; ADC in use? + return ; Yes, return - btfsc ambient_sensor - bra get_ambient_level1 ; Normal ostc3 hardware + btfsc ambient_sensor + bra get_ambient_level1 ; Normal ostc3 hardware - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - incf isr1_temp,F ; adjust 0-2 to 1-3 - movlw ambient_light_max_high_cr; cR and 2 hardware brightest setting + incf isr1_temp,F ; adjust 0-2 to 1-3 + movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_eco ; brightest setting + movlw ambient_light_max_eco ; brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_medium; brightest setting + movlw ambient_light_max_medium ; brightest setting - movff WREG,ambient_light+0 ; Set to max. - movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt + movff WREG,ambient_light+0 ; Set to max. + movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt return get_ambient_level1: - movlw b'00000000' ; Vref+ = Vdd + movlw b'00000000' ; Vref+ = Vdd movwf ADCON1 - movlw b'00011101' ; power on ADC, select AN7 - rcall wait_adc + movlw b'00011101' ; power on ADC, select AN7 + rcall wait_adc movff ADRESH,ambient_light+1 movff ADRESL,ambient_light+0 - bcf ADCON0,0 ; power off ADC + bcf ADCON0,0 ; power off ADC ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) - ; First: Devide through 16 + ; First: Divide by 16 + banksel ambient_light bcf STATUS,C rrcf ambient_light+1 rrcf ambient_light+0 @@ -286,384 +291,367 @@ ; Result: ambient_light:2/16 ; Now, make sure to have value between ambient_light_low and ambient_light_max - movlw .254 - tstfsz ambient_light+1 ; >255? - movwf ambient_light+0 ; avoid ADC clipping + movlw .254 + tstfsz ambient_light+1 ; >255? + movwf ambient_light+0 ; avoid ADC clipping - incfsz ambient_light+0,W ; =255? - bra get_ambient_level2 ; No, continue + incfsz ambient_light+0,W ; =255? + bra get_ambient_level2 ; No, continue - movlw .254 - movwf ambient_light+0 ; avoid ADC clipping + movlw .254 + movwf ambient_light+0 ; avoid ADC clipping get_ambient_level2: -; movlw .10 -; subwf ambient_light+0,F ; Subtract 10 (ADC Offset) -; btfsc STATUS,N -; movwf ambient_light+0 ; avoid clipping +; movlw .10 +; subwf ambient_light+0,F ; Subtract 10 (ADC Offset) +; btfsc STATUS,N +; movwf ambient_light+0 ; avoid clipping - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - btfsc RCSTA1,7 ; UART module on? - clrf isr1_temp ; Yes, set temporally to eco mode + btfsc RCSTA1,7 ; UART module on? + clrf isr1_temp ; Yes, set temporally to eco mode - incf isr1_temp,F ; adjust 0-2 to 1-3 + incf isr1_temp,F ; adjust 0-2 to 1-3 - banksel common ; flag is in bank1 - movlw ambient_light_max_high_cr; cR and 2 hardware brightest setting - btfss battery_gauge_available - movlw ambient_light_max_high_15V; 1,5V battery brightest setting - btfsc battery_is_36v ; 3,6V battery in use? - movlw ambient_light_max_high_36V ; 3,6V battery brightest setting - banksel isr_backup ; Back to Bank0 ISR data + banksel common ; flag is in bank1 + movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting + btfss battery_gauge_available + movlw ambient_light_max_high_15V ; 1,5V battery brightest setting + btfsc battery_is_36v ; 3,6V battery in use? + movlw ambient_light_max_high_36V ; 3,6V battery brightest setting + banksel isr_backup ; Back to Bank0 ISR data dcfsnz isr1_temp,F - movlw ambient_light_max_eco ; brightest setting + movlw ambient_light_max_eco ; brightest setting dcfsnz isr1_temp,F - movlw ambient_light_max_medium; brightest setting + movlw ambient_light_max_medium ; brightest setting - banksel common ; ambient_light is in Bank1 - incf ambient_light+0,F ; +1 - cpfslt ambient_light+0 ; smaller then WREG? - movwf ambient_light+0 ; No, set to max. + banksel ambient_light + incf ambient_light+0,F ; +1 + cpfslt ambient_light+0 ; smaller then WREG? + movwf ambient_light+0 ; No, set to max. - banksel isr_backup ; Back to Bank0 ISR data + banksel isr_backup ; Back to Bank0 ISR data movff opt_brightness,isr1_temp - incf isr1_temp,F ; adjust 0-2 to 1-3 - movlw ambient_light_min_high ; darkest setting + incf isr1_temp,F ; adjust 0-2 to 1-3 + movlw ambient_light_min_high ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_eco ; darkest setting + movlw ambient_light_min_eco ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_medium; darkest setting + movlw ambient_light_min_medium ; darkest setting dcfsnz isr1_temp,F - movlw ambient_light_min_high ; darkest setting - - banksel common ; ambient_light is in Bank1 - cpfsgt ambient_light+0 ; bigger then WREG? - movwf ambient_light+0 ; No, set to min - - movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt + movlw ambient_light_min_high ; darkest setting + + banksel ambient_light + cpfsgt ambient_light+0 ; bigger then WREG? + movwf ambient_light+0 ; No, set to min + banksel common + + movff ambient_light+0,max_CCPR1L ; Store value for dimming in TMR7 interrupt return global get_analog_inputs -get_analog_inputs: ; starts ADC and waits until finished - bsf adc_running ; =1: The ADC is in use - btfsc TFT_PWM - bra get_analog_inputs ; Wait for PWM low - movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV +get_analog_inputs: ; starts ADC and waits until finished + bsf adc_running ; =1: The ADC is in use + btfsc TFT_PWM + bra get_analog_inputs ; Wait for PWM low + movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV movwf ADCON1 - movlw b'00100001' ; power on ADC, select AN8 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor1:2 - addwf o2_mv_sensor1+0,F - movf ADRESH,W - addwfc o2_mv_sensor1+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor1+1,F ; /2 - rrcf o2_mv_sensor1+0,F + movlw b'00100001' ; power on ADC, select AN8 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor1:2 + addwf o2_mv_sensor1+0,F + movf ADRESH,W + addwfc o2_mv_sensor1+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor1+1,F ; /2 + rrcf o2_mv_sensor1+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor1+1 ; >ignore_mv? - bra get_analog_inputs2a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor1+1 - clrf o2_mv_sensor1+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor1+1 ; >ignore_mv? + bra get_analog_inputs2a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor1+1 + clrf o2_mv_sensor1+0 get_analog_inputs2a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor1+1 ; >25,5mV? - bra get_analog_inputs2 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor1+0 ; >1,9mV? - clrf o2_mv_sensor1+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor1+1 ; >25,5mV? + bra get_analog_inputs2 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor1+0 ; >1,9mV? + clrf o2_mv_sensor1+0 ; no, clear result get_analog_inputs2: - movlw b'00100101' ; power on ADC, select AN9 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor2:2 - addwf o2_mv_sensor2+0,F - movf ADRESH,W - addwfc o2_mv_sensor2+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor2+1,F ; /2 - rrcf o2_mv_sensor2+0,F + movlw b'00100101' ; power on ADC, select AN9 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor2:2 + addwf o2_mv_sensor2+0,F + movf ADRESH,W + addwfc o2_mv_sensor2+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor2+1,F ; /2 + rrcf o2_mv_sensor2+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor2+1 ; >ignore_mv? - bra get_analog_inputs3a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor2+1 - clrf o2_mv_sensor2+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor2+1 ; >ignore_mv? + bra get_analog_inputs3a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor2+1 + clrf o2_mv_sensor2+0 get_analog_inputs3a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor2+1 ; >25,5mV? - bra get_analog_inputs3 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor2+0 ; >1,9mV? - clrf o2_mv_sensor2+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor2+1 ; >25,5mV? + bra get_analog_inputs3 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor2+0 ; >1,9mV? + clrf o2_mv_sensor2+0 ; no, clear result get_analog_inputs3: - movlw b'00101001' ; power on ADC, select AN10 - rcall wait_adc - bcf STATUS,C - rrcf ADRESH,F ; /2 - rrcf ADRESL,W - ; add to o2_mv_sensor3:2 - addwf o2_mv_sensor3+0,F - movf ADRESH,W - addwfc o2_mv_sensor3+1,F - ; Devide by 2 - bcf STATUS,C - rrcf o2_mv_sensor3+1,F ; /2 - rrcf o2_mv_sensor3+0,F + movlw b'00101001' ; power on ADC, select AN10 + rcall wait_adc + bcf STATUS,C + rrcf ADRESH,F ; /2 + rrcf ADRESL,W + ; add to o2_mv_sensor3:2 + addwf o2_mv_sensor3+0,F + movf ADRESH,W + addwfc o2_mv_sensor3+1,F + ; Devide by 2 + bcf STATUS,C + rrcf o2_mv_sensor3+1,F ; /2 + rrcf o2_mv_sensor3+0,F - movlw HIGH ignore_mv - cpfsgt o2_mv_sensor3+1 ; >ignore_mv? - bra get_analog_inputs4a ; No - ; Yes, ignore this reading - clrf o2_mv_sensor3+1 - clrf o2_mv_sensor3+0 + movlw HIGH ignore_mv + cpfsgt o2_mv_sensor3+1 ; >ignore_mv? + bra get_analog_inputs4a ; No + ; Yes, ignore this reading + clrf o2_mv_sensor3+1 + clrf o2_mv_sensor3+0 get_analog_inputs4a: - ; Ignore 1,9mV noise for not-connected inputs - tstfsz o2_mv_sensor3+1 ; >25,5mV? - bra get_analog_inputs4 ; Yes, skip here - movlw .19 - cpfsgt o2_mv_sensor3+0 ; >1,9mV? - clrf o2_mv_sensor3+0 ; no, clear result + ; Ignore 1,9mV noise for not-connected inputs + tstfsz o2_mv_sensor3+1 ; >25,5mV? + bra get_analog_inputs4 ; Yes, skip here + movlw .19 + cpfsgt o2_mv_sensor3+0 ; >1,9mV? + clrf o2_mv_sensor3+0 ; no, clear result get_analog_inputs4: - bcf ADCON0,0 ; power off ADC - bcf adc_running ; =1: The ADC is in use - return + bcf ADCON0,0 ; power off ADC + bcf adc_running ; =1: The ADC is in use + return - global piezo_config ; Sets up piezo sensitivity of heinrichs weikamp Piezo buttons (~30ms) -piezo_config: ; Settings between 20 and 200 - clrf TMR5H - clrf TMR5L ; ~2sec - bcf PIR5,TMR5IF ; Clear flag - bcf switch_right - bcf switch_left + global piezo_config ; sets up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms) +piezo_config: ; Settings between 20 and 200 + clrf TMR5H + clrf TMR5L ; ~2sec + bcf PIR5,TMR5IF ; Clear flag + bcf switch_right + bcf switch_left piezo_config0: btfsc switch_right - bra piezo_config + bra piezo_config btfsc switch_left - bra piezo_config ; Restart on button press - + bra piezo_config ; Restart on button press + btfss PIR5,TMR5IF - bra piezo_config0 ; Wait loop + bra piezo_config0 ; Wait loop - bcf INTCON,GIE - movff opt_cR_button_right,WREG; right button - btfsc flip_screen ; 180° rotation ? - movff opt_cR_button_left,WREG ; Yes, left button - rcall piezo_config_tx + bcf INTCON,GIE + movff opt_cR_button_right,WREG ; right button + btfsc flip_screen ; 180° rotation ? + movff opt_cR_button_left,WREG ; Yes, left button + rcall piezo_config_tx - movff opt_cR_button_left,WREG ; left button - btfsc flip_screen ; 180° rotation ? - movff opt_cR_button_right,WREG; Yes, right button - rcall piezo_config_tx + movff opt_cR_button_left,WREG ; left button + btfsc flip_screen ; 180° rotation ? + movff opt_cR_button_right,WREG ; Yes, right button + rcall piezo_config_tx - movlw .20 ; reserved - rcall piezo_config_tx - movlw .20 ; reserved - rcall piezo_config_tx - bsf INTCON,GIE - return + movlw .20 ; reserved + rcall piezo_config_tx + movlw .20 ; reserved + rcall piezo_config_tx + bsf INTCON,GIE + return -piezo_config_tx: ; Send one byte - movwf uart1_temp ; Store byte - movlw .8 - movwf uart2_temp ; Bit counter - bcf TX3_PIEZO_CFG ; Startbit - rcall piezo_config_wait_bit +piezo_config_tx: ; send one byte + movwf lo ; store byte + movlw .8 + movwf hi ; bit counter + bcf TX3_PIEZO_CFG ; start bit + rcall piezo_config_wait_bit piezo_config_tx_loop: - btfss uart1_temp,0 ; LSB first - bcf TX3_PIEZO_CFG - btfsc uart1_temp,0 ; LSB first - bsf TX3_PIEZO_CFG - rcall piezo_config_wait_bit - rrncf uart1_temp,F - decfsz uart2_temp,F - bra piezo_config_tx_loop - bsf TX3_PIEZO_CFG ; Stopbit - rcall piezo_config_wait_bit - return + btfss lo,0 ; LSB first + bcf TX3_PIEZO_CFG + btfsc lo,0 ; LSB first + bsf TX3_PIEZO_CFG + rcall piezo_config_wait_bit + rrncf lo,F + decfsz hi,F + bra piezo_config_tx_loop + bsf TX3_PIEZO_CFG ; stop bit + rcall piezo_config_wait_bit + return piezo_config_wait_bit: - setf TMR5H - movlw .255-.26 ;26 x 31,5µs = 819us + setf TMR5H + movlw .255-.26 ; 26 x 31,5µs = 819us movwf TMR5L - bcf PIR5,TMR5IF ; Clear flag + bcf PIR5,TMR5IF ; Clear flag piezo_config_wait_bit3: - btfss PIR5,TMR5IF + btfss PIR5,TMR5IF bra piezo_config_wait_bit3 ; Wait loop return - global reset_battery_pointer, reset_battery_internal_only -reset_battery_pointer: ; Resets battery pointer 0x07-0x0C and battery_gauge:5 - extern lt2942_charge_done - btfsc battery_gauge_available ; Something to reset? - call lt2942_charge_done ; Yes, reset accumulating registers to 0xFFFF -reset_battery_internal_only: - clrf EEADRH - clrf EEDATA ; Delete to zero - write_int_eeprom 0x07 - write_int_eeprom 0x08 - write_int_eeprom 0x09 - write_int_eeprom 0x0A - write_int_eeprom 0x0B - write_int_eeprom 0x0C - banksel battery_gauge+0 - clrf battery_gauge+0 - clrf battery_gauge+1 - clrf battery_gauge+2 - clrf battery_gauge+3 - clrf battery_gauge+4 - clrf battery_gauge+5 - banksel common - movlw .100 - movwf batt_percent - return + global reset_battery_pointer +reset_battery_pointer: ; Resets battery pointer 0x07-0x0C and battery_gauge:5 + extern lt2942_charge_done + btfsc battery_gauge_available ; Something to reset? + call lt2942_charge_done ; Yes, reset accumulating registers to 0xFFFF + goto reset_battery_internal_only ; and return + + + global get_analog_switches +get_analog_switches: ; starts ADC and waits until finished + btfsc analog_switches + bra get_analog_switches2 + ; no analog switches + bcf analog_sw2_pressed + bcf analog_sw1_pressed + return ; Done. +get_analog_switches2: + btfsc adc_running ; ADC in use? + return ; Yes, return - global get_analog_switches -get_analog_switches: ; starts ADC and waits until finished - btfsc analog_switches - bra get_analog_switches2 - ; no analog switches - bcf analog_sw2_pressed - bcf analog_sw1_pressed - return ; Done. -get_analog_switches2: - btfsc adc_running ; ADC in use? - return ; Yes, return - - movlw b'00001001' ; left justified - movwf ADCON2 -; movlw b'00000000' ; Vref+ = Vdd - clrf ADCON1 - movlw b'00100101' ; power on ADC, select AN9 - rcall wait_adc - banksel analog_counter - movff ADRESH,WREG - addwf analog_sw2_raw+0 - movlw .0 - addwfc analog_sw2_raw+1 - decfsz analog_counter,F ; continue averaging? - bra get_analog_switches2a ; Yes - ; Done. Compute average - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /2 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /4 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /8 - bcf STATUS,C - rrcf analog_sw2_raw+1 - rrcf analog_sw2_raw+0 ; /16 - movff analog_sw2_raw+0, analog_sw2 - clrf analog_sw2_raw+1 - clrf analog_sw2_raw+0 ; Reset average registers -; movlw .16 -; movwf analog_counter ; only once... -get_analog_switches2a: - banksel common - bcf analog_sw2_pressed - movff opt_cR_button_left,WREG ;20-100 - bcf STATUS,C - rrcf WREG ;/2 -> 10-50 - bcf STATUS,C - rrcf WREG ;/2 -> 5-25 - decf WREG,W ;-1 - decf WREG,W ;-1 - decf WREG,W ;-1 -> 2-22 - banksel analog_sw2 - btfss button_polarity,1;(1= normal, 0=inverted) - bra sw2_inverted - addwf analog_sw2,W ; average (~128) - cpfsgt ADRESH - bra get_analog_sw1 - banksel common - bsf analog_sw2_pressed ; Left button normal - bra get_analog_sw1 + movlw b'00001001' ; left justified + movwf ADCON2 +; movlw b'00000000' ; Vref+ = Vdd + clrf ADCON1 + movlw b'00100101' ; power on ADC, select AN9 + rcall wait_adc + banksel analog_counter + movff ADRESH,WREG + addwf analog_sw2_raw+0 + movlw .0 + addwfc analog_sw2_raw+1 + decfsz analog_counter,F ; continue averaging? + bra get_analog_switches2a ; Yes + ; Done. Compute average + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /2 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /4 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /8 + bcf STATUS,C + rrcf analog_sw2_raw+1 + rrcf analog_sw2_raw+0 ; /16 + movff analog_sw2_raw+0,analog_sw2 + clrf analog_sw2_raw+1 + clrf analog_sw2_raw+0 ; Reset average registers +; movlw .16 +; movwf analog_counter ; only once... +get_analog_switches2a: + banksel common + bcf analog_sw2_pressed + movff opt_cR_button_left,WREG ;20-100 + bcf STATUS,C + rrcf WREG ;/2 -> 10-50 + bcf STATUS,C + rrcf WREG ;/2 -> 5-25 + decf WREG,W ;-1 + decf WREG,W ;-1 + decf WREG,W ;-1 -> 2-22 + banksel analog_sw2 + btfss button_polarity,1 ;(1= normal, 0=inverted) + bra sw2_inverted + addwf analog_sw2,W ; average (~128) + cpfsgt ADRESH + bra get_analog_sw1 + banksel common + bsf analog_sw2_pressed ; Left button normal + bra get_analog_sw1 sw2_inverted: - subwf analog_sw2,W ; average (~128) - cpfslt ADRESH - bra get_analog_sw1 - banksel common - bsf analog_sw2_pressed ; Left button inverted + subwf analog_sw2,W ; average (~128) + cpfslt ADRESH + bra get_analog_sw1 + banksel common + bsf analog_sw2_pressed ; Left button inverted get_analog_sw1: - banksel common - movlw b'00101001' ; power on ADC, select AN10 - rcall wait_adc - banksel analog_counter - movff ADRESH,WREG - addwf analog_sw1_raw+0 - movlw .0 - addwfc analog_sw1_raw+1 - tstfsz analog_counter ; continue averaging? - bra get_analog_switches1a ; Yes - ; Done. Compute average - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /2 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /4 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /8 - bcf STATUS,C - rrcf analog_sw1_raw+1 - rrcf analog_sw1_raw+0 ; /16 - movff analog_sw1_raw+0, analog_sw1 - clrf analog_sw1_raw+1 - clrf analog_sw1_raw+0 ; Reset average registers - movlw .16 - movwf analog_counter ; only once... -get_analog_switches1a: - banksel common - bcf analog_sw1_pressed - movff opt_cR_button_right,WREG ;20-100 - bcf STATUS,C - rrcf WREG ;/2 -> 10-50 - bcf STATUS,C - rrcf WREG ;/2 -> 5-25 - decf WREG,W ;-1 - decf WREG,W ;-1 - decf WREG,W ;-1 -> 2-22 - banksel analog_sw1 - btfss button_polarity,0;(1= normal, 0=inverted) - bra sw1_inverted - addwf analog_sw1,W ; average (~128) - cpfsgt ADRESH - bra get_analog_sw_done - banksel common - bsf analog_sw1_pressed ; right button normal - bra get_analog_sw_done + banksel common + movlw b'00101001' ; power on ADC, select AN10 + rcall wait_adc + banksel analog_counter + movff ADRESH,WREG + addwf analog_sw1_raw+0 + movlw .0 + addwfc analog_sw1_raw+1 + tstfsz analog_counter ; continue averaging? + bra get_analog_switches1a ; Yes + ; Done. Compute average + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /2 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /4 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /8 + bcf STATUS,C + rrcf analog_sw1_raw+1 + rrcf analog_sw1_raw+0 ; /16 + movff analog_sw1_raw+0,analog_sw1 + clrf analog_sw1_raw+1 + clrf analog_sw1_raw+0 ; Reset average registers + movlw .16 + movwf analog_counter ; only once... +get_analog_switches1a: + banksel common + bcf analog_sw1_pressed + movff opt_cR_button_right,WREG ;20-100 + bcf STATUS,C + rrcf WREG ;/2 -> 10-50 + bcf STATUS,C + rrcf WREG ;/2 -> 5-25 + decf WREG,W ;-1 + decf WREG,W ;-1 + decf WREG,W ;-1 -> 2-22 + banksel analog_sw1 + btfss button_polarity,0 ;(1= normal, 0=inverted) + bra sw1_inverted + addwf analog_sw1,W ; average (~128) + cpfsgt ADRESH + bra get_analog_sw_done + banksel common + bsf analog_sw1_pressed ; right button normal + bra get_analog_sw_done sw1_inverted: - subwf analog_sw1,W ; average (~128) - cpfslt ADRESH - bra get_analog_sw_done - banksel common - bsf analog_sw1_pressed ; right button inverted + subwf analog_sw1,W ; average (~128) + cpfslt ADRESH + bra get_analog_sw_done + banksel common + bsf analog_sw1_pressed ; right button inverted get_analog_sw_done: - banksel common - movlw b'10001101' ; Restore to right justified - movwf ADCON2 - btfsc analog_sw1_pressed - return - btfsc analog_sw2_pressed - return - setf TMR1H ; No button pressed, enhance timer1 to overflow quickly - return + banksel common + movlw b'10001101' ; Restore to right justified + movwf ADCON2 + btfsc analog_sw1_pressed + return + btfsc analog_sw2_pressed + return + setf TMR1H ; No button pressed, enhance timer1 to overflow quickly + return END \ No newline at end of file