Mercurial > public > hwos_code
comparison src/adc_lightsensor.asm @ 631:185ba2f91f59
3.09 beta 1 release
| author | heinrichsweikamp |
|---|---|
| date | Fri, 28 Feb 2020 15:45:07 +0100 |
| parents | 237931377539 |
| children | 4050675965ea |
comparison
equal
deleted
inserted
replaced
| 630:4cd81bdbf15c | 631:185ba2f91f59 |
|---|---|
| 1 ;============================================================================= | 1 ;============================================================================= |
| 2 ; | 2 ; |
| 3 ; File adc_lightsensor.asm combined next generation V3.06.1 | 3 ; File adc_lightsensor.asm combined next generation V3.08.8 |
| 4 ; | 4 ; |
| 5 ; | 5 ; |
| 6 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | 6 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. |
| 7 ;============================================================================= | 7 ;============================================================================= |
| 8 ; HISTORY | 8 ; HISTORY |
| 18 adc_light CODE | 18 adc_light CODE |
| 19 | 19 |
| 20 ;============================================================================= | 20 ;============================================================================= |
| 21 | 21 |
| 22 wait_adc: ; bank-safe | 22 wait_adc: ; bank-safe |
| 23 movwf ADCON0 | 23 movwf ADCON0 ; select ADC channel |
| 24 nop | 24 nop ; wait a short moment |
| 25 bsf ADCON0,1 ; start ADC | 25 bsf ADCON0,1 ; start ADC |
| 26 wait_adc2: | 26 wait_adc2: |
| 27 btfsc ADCON0,1 ; wait... | 27 btfsc ADCON0,1 ; ADC done? |
| 28 bra wait_adc2 | 28 bra wait_adc2 ; NO - wait |
| 29 return | 29 return ; YES - done |
| 30 | 30 |
| 31 global get_battery_voltage | 31 global get_battery_voltage |
| 32 get_battery_voltage: ; start ADC and wait until finished | 32 get_battery_voltage: ; start ADC and wait until finished |
| 33 btfss battery_gauge_available ; battery gauge IC available? | 33 btfss battery_gauge_available ; battery gauge IC available? |
| 34 bra get_battery_voltage_2 ; NO - OSTC hardware without gauge IC | 34 bra get_battery_voltage_2 ; NO - OSTC hardware without gauge IC |
| 35 call lt2942_get_accumulated_charge ; YES - read coulomb counter | 35 bsf battery_is_36v ; YES - gauge IC available, 3.6V battery |
| 36 call lt2942_get_accumulated_charge ; - read coulomb counter | |
| 36 call lt2942_get_voltage ; - read battery voltage | 37 call lt2942_get_voltage ; - read battery voltage |
| 37 call lt2942_get_temperature ; - read battery temperature | 38 call lt2942_get_temperature ; - read battery temperature |
| 38 tstfsz batt_voltage+1 ; - read voltage < 256 mV ? | 39 tstfsz batt_voltage+1 ; - read voltage < 256 mV ? |
| 39 bra get_battery_voltage_1 ; NO - proceed | 40 bra get_battery_voltage_1 ; NO - proceed |
| 40 call lt2942_get_accumulated_charge ; YES - re-read coulomb counter | 41 call lt2942_get_accumulated_charge ; YES - re-read coulomb counter |
| 41 call lt2942_get_voltage ; - re-read battery voltage | 42 call lt2942_get_voltage ; - re-read battery voltage |
| 42 call lt2942_get_temperature ; - re-read battery temperature | 43 call lt2942_get_temperature ; - re-read battery temperature |
| 43 ;bra get_battery_voltage_1 ; - proceed | 44 ;bra get_battery_voltage_1 ; - proceed |
| 44 | 45 |
| 45 get_battery_voltage_1: | 46 get_battery_voltage_1: |
| 47 rcall get_battery_voltage_low ; check for battery low condition | |
| 46 btfsc divemode ; in dive mode? | 48 btfsc divemode ; in dive mode? |
| 47 return ; YES - done | 49 return ; YES - done |
| 48 | 50 |
| 49 bcf cv_active ; clear CV charing status by default | 51 bcf cv_active ; clear CV charing status by default |
| 50 bcf cc_active ; clear CC charing status ny default | 52 bcf cc_active ; clear CC charing status ny default |
| 59 btfsc CHRG_IN ; - still charging? | 61 btfsc CHRG_IN ; - still charging? |
| 60 return ; NO - done | 62 return ; NO - done |
| 61 ;bra charge_cv_active ; YES - charging in CV mode | 63 ;bra charge_cv_active ; YES - charging in CV mode |
| 62 | 64 |
| 63 charge_cv_active: | 65 charge_cv_active: |
| 64 decfsz get_bat_volt_counter,F | 66 decfsz get_bat_volt_counter,F ; decrement counter, became zero? |
| 65 return | 67 return ; NO - not yet, done |
| 66 movlw .15 | 68 movlw .15 ; YES - battery voltage >= 16*256mV (4.096V) |
| 67 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096V) ? | 69 cpfsgt batt_voltage+1 ; - ... ? |
| 68 bra charge_cc_active ; NO | 70 bra charge_cc_active ; NO |
| 69 bsf cc_active | 71 bsf cc_active ; YES - set CC charging status |
| 70 bsf cv_active | 72 bsf cv_active ; - set CV charging status |
| 73 bsf LEDr ; - indicate charging | |
| 74 call lt2942_charge_done ; - reset accumulating registers to 0xFFFF | |
| 75 WAITMS d'10' ; - wait 10 ms | |
| 76 bcf LEDr ; - indicate charging | |
| 77 bsf get_bat_volt_counter,0 ; - set counter to 1 | |
| 78 return ; - done | |
| 79 | |
| 80 charge_cc_active: | |
| 81 bsf cc_active ; set CC charging mode | |
| 71 bsf LEDr ; indicate charging | 82 bsf LEDr ; indicate charging |
| 72 call lt2942_charge_done ; reset accumulating registers to 0xFFFF | 83 bcf CHRG_OUT ; |
| 73 WAITMS d'10' | |
| 74 bcf LEDr ; indicate charging | |
| 75 bsf get_bat_volt_counter,0 ; =1 | |
| 76 return | |
| 77 | |
| 78 charge_cc_active: | |
| 79 bsf cc_active | |
| 80 bsf LEDr ; indicate charging | |
| 81 bcf CHRG_OUT | |
| 82 bsf TRISJ,2 ; set chrg-Out output to high impedance | 84 bsf TRISJ,2 ; set chrg-Out output to high impedance |
| 83 movlw .15 | 85 movlw .15 ; battery voltage >= 16*256mV (4.096 V) |
| 84 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096 V)? | 86 cpfsgt batt_voltage+1 ; ... ? |
| 85 bra charge_cc_active2 ; NO | 87 bra charge_cc_active2 ; NO |
| 86 movlw .81 | 88 movlw .81 ; YES - battery voltage >= 80mV (+4096mV from batt_voltage+1) |
| 87 cpfslt batt_voltage+0 ; battery voltage >= 80mV (+4096mV from batt_voltage+1)? | 89 cpfslt batt_voltage+0 ; - ... ? |
| 88 bra charge_cv_active ; YES | 90 bra charge_cv_active ; YES |
| 89 charge_cc_active2: | 91 charge_cc_active2: |
| 90 movlw .10 | 92 movlw .10 ; NO - set counter to 10 |
| 91 movwf get_bat_volt_counter | 93 movwf get_bat_volt_counter ; - ... |
| 92 return | 94 return ; - done |
| 93 | 95 |
| 94 get_battery_voltage_2: ; no gauge IC available, use ADC to measure battery voltage | 96 get_battery_voltage_2: ; no gauge IC available, use ADC to measure battery voltage |
| 95 ; additional charging disable in software | 97 ; additional charging disable in software |
| 96 bsf charge_disable ; set charging-inhibit signal | 98 bsf charge_disable ; set charging-inhibit signal |
| 97 bcf charge_enable ; activate charging-inhibit signal | 99 bcf charge_enable ; activate charging-inhibit signal |
| 98 | 100 |
| 99 bsf adc_is_running ; =1: the ADC is in use | 101 bsf adc_is_running ; =1: the ADC is in use |
| 100 movlw b'00100000' ; 2.048 Volt Vref+ -> 1 LSB = 500 µV | 102 movlw b'00100000' ; 2.048 Volt Vref+ -> 1 LSB = 500 µV |
| 101 movwf ADCON1 | 103 movwf ADCON1 ; ... |
| 102 movlw b'00011001' ; power on ADC, select AN6 | 104 movlw b'00011001' ; power on ADC, select AN6 |
| 103 rcall wait_adc | 105 rcall wait_adc ; take measurement |
| 104 | |
| 105 MOVII ADRESL,batt_voltage ; store value | 106 MOVII ADRESL,batt_voltage ; store value |
| 106 bcf ADCON0,0 ; power off ADC | 107 bcf ADCON0,0 ; power off ADC |
| 107 | 108 |
| 108 ; Multiply with 2.006 to be exact here... | 109 ; Multiply with 2.006 to be exact here... |
| 109 ; bcf STATUS,C | 110 ; bcf STATUS,C |
| 128 bra get_battery_voltage_3 ; YES - battery is still ok | 129 bra get_battery_voltage_3 ; YES - battery is still ok |
| 129 movlw .128 ; NO - battery is probably dead very soon, set ">=24Ah used" | 130 movlw .128 ; NO - battery is probably dead very soon, set ">=24Ah used" |
| 130 movff WREG,battery_gauge+5 ; - into battery gauge registers | 131 movff WREG,battery_gauge+5 ; - into battery gauge registers |
| 131 | 132 |
| 132 get_battery_voltage_3: ; 3.6V battery gauge mode | 133 get_battery_voltage_3: ; 3.6V battery gauge mode |
| 133 ; SMOVFF "by hand" as the macro does not work with arguments that have a '+something' with them | 134 ; SMOVQQ "by hand" as the macro does not work with arguments that have a '+something' with them |
| 134 bcf trigger_isr_updates ; clear flag, it will be set by the ISR in case it had kicked in | 135 bcf trigger_isr_updates ; clear flag, it will be set by the ISR in case it had kicked in |
| 135 movff battery_gauge+5,xC+3 | 136 movff battery_gauge+5,xC+3 |
| 136 movff battery_gauge+4,xC+2 | 137 movff battery_gauge+4,xC+2 |
| 137 movff battery_gauge+3,xC+1 | 138 movff battery_gauge+3,xC+1 |
| 138 movff battery_gauge+2,xC+0 | 139 movff battery_gauge+2,xC+0 |
| 198 cpfsgt lo ; current battery % < last battery % ? | 199 cpfsgt lo ; current battery % < last battery % ? |
| 199 movff lo,batt_percent ; YES - take new value (keep batt_percent on the lowest value found) | 200 movff lo,batt_percent ; YES - take new value (keep batt_percent on the lowest value found) |
| 200 btfsc battery_is_36v ; using a 3.6 volt battery? | 201 btfsc battery_is_36v ; using a 3.6 volt battery? |
| 201 movff lo,batt_percent ; YES - take new value (always use computed value for 3.6V battery) | 202 movff lo,batt_percent ; YES - take new value (always use computed value for 3.6V battery) |
| 202 bcf adc_is_running ; done with ADC | 203 bcf adc_is_running ; done with ADC |
| 203 return | 204 ;bra get_battery_voltage_low ; check for battery low condition (and return) |
| 205 | |
| 206 get_battery_voltage_low: | |
| 207 ; check for battery low condition | |
| 208 movlw battery_warn_level_36+1 ; get threshold for 3.6 Volt battery warning, incremented by 1 | |
| 209 btfss battery_is_36v ; actually a 3.6 Volt battery detected? | |
| 210 movlw battery_warn_level_15+1 ; NO - replace with 1.5 Volt battery warning, incremented by 1 | |
| 211 bsf battery_low_condition ; set battery low condition by default | |
| 212 cpfslt batt_percent ; current battery level <= warning threshold ? | |
| 213 bcf battery_low_condition ; NO - clear battery low condition | |
| 214 return ; - done | |
| 215 | |
| 204 | 216 |
| 205 get_battery_voltage_9: | 217 get_battery_voltage_9: |
| 206 ; use 1.5V battery voltage mode | 218 ; use 1.5V battery voltage mode |
| 207 ; use approximation (batt_voltage-aa_15v_low)/4 = lo | 219 ; use approximation (batt_voltage-aa_15v_low)/4 = lo |
| 208 MOVII batt_voltage,sub_a ; load battery voltage | 220 MOVII batt_voltage,sub_a ; load battery voltage |
| 494 get_analog_switches_1: | 506 get_analog_switches_1: |
| 495 banksel common ; back to bank common | 507 banksel common ; back to bank common |
| 496 btfsc adc_is_running ; ADC in use? | 508 btfsc adc_is_running ; ADC in use? |
| 497 return ; YES - abort | 509 return ; YES - abort |
| 498 btfsc cc_active ; NO - charging? | 510 btfsc cc_active ; NO - charging? |
| 499 bra get_analog_switches0 ; YES - abort (And clear both flags) | 511 bra get_analog_switches0 ; YES - abort (and clear both flags) |
| 500 ;bra get_analog_switches_2 ; NO - read switches | 512 ;bra get_analog_switches_2 ; NO - read switches |
| 501 | 513 |
| 502 get_analog_switches_2: | 514 get_analog_switches_2: |
| 503 bsf adc_is_running | 515 bsf adc_is_running |
| 504 bcf ADCON2,ADFM ; left justified | 516 bcf ADCON2,ADFM ; left justified |
| 505 clrf ADCON1 | 517 clrf ADCON1 |
| 506 movlw b'00100101' ; power on ADC, select AN9 | 518 movlw b'00100101' ; power on ADC, select AN9 |
| 507 rcall wait_adc | 519 rcall wait_adc |
| 508 | 520 |
| 509 banksel isr_backup ; select bank ISR data | 521 banksel isr_backup ; select bank ISR data |
| 609 | 621 |
| 610 get_analog_switches_sw1_pressed: | 622 get_analog_switches_sw1_pressed: |
| 611 bsf analog_sw1_pressed ; set right button as pressed | 623 bsf analog_sw1_pressed ; set right button as pressed |
| 612 | 624 |
| 613 get_analog_switches_4: | 625 get_analog_switches_4: |
| 614 bsf ADCON2,ADFM ; restore to right justified | 626 bsf ADCON2,ADFM ; restore to right justified |
| 615 bcf adc_is_running | 627 bcf adc_is_running |
| 616 banksel common ; back to bank common | 628 banksel common ; back to bank common |
| 617 btfsc analog_sw1_pressed ; right button pressed? | 629 btfsc analog_sw1_pressed ; right button pressed? |
| 618 return ; YES - done | 630 return ; YES - done |
| 619 btfsc analog_sw2_pressed ; left button pressed? | 631 btfsc analog_sw2_pressed ; left button pressed? |
| 620 return ; YES - done | 632 return ; YES - done |
