Mercurial > public > hwos_code
comparison src/adc_lightsensor.asm @ 623:c40025d8e750
3.03 beta released
| author | heinrichsweikamp |
|---|---|
| date | Mon, 03 Jun 2019 14:01:48 +0200 |
| parents | b87f23fae743 |
| children | cd58f7fc86db |
comparison
equal
deleted
inserted
replaced
| 622:02d1386429a6 | 623:c40025d8e750 |
|---|---|
| 1 ;============================================================================= | 1 ;============================================================================= |
| 2 ; | 2 ; |
| 3 ; File adc.asm V2.99e | 3 ; File adc_lightsensor.asm combined next generation V3.03.2 |
| 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 |
| 12 #include "math.inc" | 12 #include "math.inc" |
| 13 #include "wait.inc" | 13 #include "wait.inc" |
| 14 #include "eeprom_rs232.inc" | 14 #include "eeprom_rs232.inc" |
| 15 #include "i2c.inc" | 15 #include "i2c.inc" |
| 16 | 16 |
| 17 extern reset_battery_internal_only | 17 |
| 18 | 18 adc_light CODE |
| 19 adc_light CODE | |
| 20 | 19 |
| 21 ;============================================================================= | 20 ;============================================================================= |
| 22 | 21 |
| 23 wait_adc: | 22 wait_adc: ; bank-safe |
| 24 movwf ADCON0 | 23 movwf ADCON0 |
| 25 nop | |
| 26 nop | |
| 27 nop | 24 nop |
| 28 bsf ADCON0,1 ; start ADC | 25 bsf ADCON0,1 ; start ADC |
| 29 wait_adc2: | 26 wait_adc2: |
| 30 btfsc ADCON0,1 ; wait... | 27 btfsc ADCON0,1 ; wait... |
| 31 bra wait_adc2 | 28 bra wait_adc2 |
| 32 return | 29 return |
| 33 | 30 |
| 34 global get_battery_voltage | 31 global get_battery_voltage |
| 35 get_battery_voltage: ; starts ADC and waits until finished | 32 get_battery_voltage: ; start ADC and wait until finished |
| 36 btfss battery_gauge_available | 33 btfss battery_gauge_available ; battery gauge IC available? |
| 37 bra get_battery_voltage1 ; normal ostc3 hardware | 34 bra get_battery_voltage_2 ; NO - OSTC hardware without gauge IC |
| 38 | 35 call lt2942_get_accumulated_charge ; YES - read coulomb counter |
| 39 call lt2942_get_accumulated_charge | 36 call lt2942_get_voltage ; - read battery voltage |
| 40 call lt2942_get_voltage | 37 call lt2942_get_temperature ; - read battery temperature |
| 41 call lt2942_get_temperature | 38 tstfsz batt_voltage+1 ; - read voltage < 256 mV ? |
| 42 | 39 bra get_battery_voltage_1 ; NO - proceed |
| 43 tstfsz batt_voltage+1 ; < 256 mV ? | 40 call lt2942_get_accumulated_charge ; YES - re-read coulomb counter |
| 44 bra get_battery_voltage_noretry ; NO | 41 call lt2942_get_voltage ; - re-read battery voltage |
| 45 | 42 call lt2942_get_temperature ; - re-read battery temperature |
| 46 ; Retry | 43 ;bra get_battery_voltage_1 ; - proceed |
| 47 call lt2942_get_accumulated_charge | 44 |
| 48 call lt2942_get_voltage | 45 get_battery_voltage_1: |
| 49 call lt2942_get_temperature | 46 btfsc divemode ; in dive mode? |
| 50 | 47 return ; YES - done |
| 51 get_battery_voltage_noretry: | 48 |
| 52 btfsc divemode | 49 bcf cv_active ; clear CV charing status by default |
| 53 return ; not in divemode | 50 bcf cc_active ; clear CC charing status ny default |
| 54 | 51 bcf LEDr ; switch off red LED |
| 55 bcf cv_active | 52 bcf TRISJ,2 ; activate Chrg-Out output |
| 56 bcf cc_active | 53 bsf CHRG_OUT ; start charger |
| 57 bcf LEDr | 54 btfss CHRG_IN ; charging? |
| 58 bcf TRISJ,2 ; Chrg-Out output | 55 bra charge_cc_active ; YES - charging in CC mode |
| 59 bsf CHRG_OUT | 56 bcf CHRG_OUT ; NO - stop charger |
| 60 | 57 bsf TRISJ,2 ; - set Chrg-Out output to high impedance |
| 61 btfss CHRG_IN | 58 WAITMS d'1' ; - wait 1 ms |
| 62 bra charge_cc_active | 59 btfsc CHRG_IN ; - still charging? |
| 63 | 60 return ; NO - done |
| 64 bcf CHRG_OUT | 61 ;bra charge_cv_active ; YES - charging in CV mode |
| 65 bsf TRISJ,2 ; Chrg-Out high impedance | 62 |
| 66 | |
| 67 WAITMS d'1' | |
| 68 | |
| 69 btfsc CHRG_IN | |
| 70 return ; Not charging, done. | |
| 71 charge_cv_active: | 63 charge_cv_active: |
| 72 decfsz get_bat_volt_counter,F | 64 decfsz get_bat_volt_counter,F |
| 73 return | 65 return |
| 74 movlw .15 | 66 movlw .15 |
| 75 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4,096V)? | 67 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096V) ? |
| 76 bra charge_cc_active ; NO | 68 bra charge_cc_active ; NO |
| 77 bsf cc_active | 69 bsf cc_active |
| 78 bsf cv_active | 70 bsf cv_active |
| 79 bsf LEDr ; indicate charging | 71 bsf LEDr ; indicate charging |
| 80 call lt2942_charge_done ; reset accumulating registers to 0xFFFF | 72 call lt2942_charge_done ; reset accumulating registers to 0xFFFF |
| 85 | 77 |
| 86 charge_cc_active: | 78 charge_cc_active: |
| 87 bsf cc_active | 79 bsf cc_active |
| 88 bsf LEDr ; indicate charging | 80 bsf LEDr ; indicate charging |
| 89 bcf CHRG_OUT | 81 bcf CHRG_OUT |
| 90 bsf TRISJ,2 ; chrg-Out high impedance | 82 bsf TRISJ,2 ; set chrg-Out output to high impedance |
| 91 movlw .15 | 83 movlw .15 |
| 92 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096 V)? | 84 cpfsgt batt_voltage+1 ; battery voltage >= 16*256mV (4.096 V)? |
| 93 bra charge_cc_active2 ; NO | 85 bra charge_cc_active2 ; NO |
| 94 movlw .81 | 86 movlw .81 |
| 95 cpfslt batt_voltage+0 ; battery voltage >= 80mV (+4096mV from batt_voltage+1)? | 87 cpfslt batt_voltage+0 ; battery voltage >= 80mV (+4096mV from batt_voltage+1)? |
| 97 charge_cc_active2: | 89 charge_cc_active2: |
| 98 movlw .10 | 90 movlw .10 |
| 99 movwf get_bat_volt_counter | 91 movwf get_bat_volt_counter |
| 100 return | 92 return |
| 101 | 93 |
| 102 get_battery_voltage1: | 94 get_battery_voltage_2: ; no gauge IC available, use ADC to measure battery voltage |
| 103 ; Additional disable in software | 95 ; additional charging disable in software |
| 104 bsf charge_disable | 96 bsf charge_disable ; set charging-inhibit signal |
| 105 bcf TRISE,2 | 97 bcf charge_enable ; activate charging-inhibit signal |
| 106 bsf adc_running ; =1: The ADC is in use | 98 |
| 107 | 99 bsf adc_is_running ; =1: the ADC is in use |
| 108 movlw b'00100000' ; 2.048V Vref+ -> 1LSB = 500µV | 100 movlw b'00100000' ; 2.048 Volt Vref+ -> 1 LSB = 500 µV |
| 109 movwf ADCON1 | 101 movwf ADCON1 |
| 110 movlw b'00011001' ; power on ADC, select AN6 | 102 movlw b'00011001' ; power on ADC, select AN6 |
| 111 rcall wait_adc | 103 rcall wait_adc |
| 112 | 104 |
| 113 movff ADRESH,batt_voltage+1 ; store value | 105 MOVII ADRESL,batt_voltage ; store value |
| 114 movff ADRESL,batt_voltage+0 ; store value | |
| 115 bcf ADCON0,0 ; power off ADC | 106 bcf ADCON0,0 ; power off ADC |
| 116 | 107 |
| 117 ; Multiply with 2.006 to be exact here... | 108 ; Multiply with 2.006 to be exact here... |
| 118 ; bcf STATUS,C | 109 ; bcf STATUS,C |
| 119 ; rlcf xA+0,F | 110 ; rlcf xA+0,F |
| 120 ; | |
| 121 ; rlcf xA+1,F ; x2 | 111 ; rlcf xA+1,F ; x2 |
| 122 | 112 ; MOVII xA,batt_voltage ; store value |
| 123 ; movff xA+0,batt_voltage+0 ; store value | 113 |
| 124 ; movff xA+1,batt_voltage+1 | 114 bcf battery_is_36v ; by default assume it is a 1.5 battery |
| 125 | 115 MOVII batt_voltage,sub_b ; load measured battery voltage |
| 126 movlw LOW lithium_36v_low | 116 |
| 127 movwf sub_a+0 | 117 ; Check if the battery is a 3.6V lithium |
| 128 movlw HIGH lithium_36v_low | 118 MOVLI lithium_36v_low,sub_a ; load threshold for 3.6 Volt lithium battery |
| 129 movwf sub_a+1 | 119 call cmpU16 ; sub_a - sub_b |
| 130 movff batt_voltage+0,sub_b+0 | 120 btfss neg_flag ; battery voltage > 3.6 V lithium threshold ? |
| 131 movff batt_voltage+1,sub_b+1 | 121 bra get_battery_voltage_9 ; NO - keep assumption of 1.5V battery |
| 132 call subU16 ; sub_c = sub_a - sub_b | 122 bsf battery_is_36v ; YES - set flag |
| 133 ; Battery is 3.6V (> lithium_36v_low?) | |
| 134 btfss neg_flag | |
| 135 bra get_battery_voltage4 ; NO - use 1.5V | |
| 136 bsf battery_is_36v ; YES - set flag (Cleared in power-on reset only!) | |
| 137 | 123 |
| 138 ; Check if the battery is near-dead already | 124 ; Check if the battery is near-dead already |
| 139 movlw LOW lithium_36v_empty | 125 MOVLI lithium_36v_empty,sub_a ; load threshold for near-dead lithium battery |
| 140 movwf sub_a+0 | 126 call cmpU16 ; sub_a - sub_b |
| 141 movlw HIGH lithium_36v_empty | 127 btfsc neg_flag ; battery voltage > dead-battery threshold ? |
| 142 movwf sub_a+1 | 128 bra get_battery_voltage_3 ; YES - battery is still ok |
| 143 call subU16 ; sub_c = sub_a - sub_b | 129 movlw .128 ; NO - battery is probably dead very soon, set ">=24Ah used" |
| 144 ; Battery is not dead yet (> lithium_36v_empty)? | 130 movff WREG,battery_gauge+5 ; - into battery gauge registers |
| 145 btfsc neg_flag | 131 |
| 146 bra get_battery_voltage2 ; YES - battery is still ok | 132 get_battery_voltage_3: ; 3.6V battery gauge mode |
| 147 | 133 ; SMOVFF "by hand" as the macro does not work with arguments that have a '+something' with them |
| 148 ; Battery is probably dead very soon | 134 bcf trigger_isr_updates ; clear flag, it will be set by the ISR in case it had kicked in |
| 149 ; Set ">=24Ah used" into battery gauge registers | |
| 150 movlw .128 | |
| 151 movff WREG,battery_gauge+5 | |
| 152 | |
| 153 get_battery_voltage2: | |
| 154 ; Use 3.6V battery gauging mode | |
| 155 movff battery_gauge+5,xC+3 | 135 movff battery_gauge+5,xC+3 |
| 156 movff battery_gauge+4,xC+2 | 136 movff battery_gauge+4,xC+2 |
| 157 movff battery_gauge+3,xC+1 | 137 movff battery_gauge+3,xC+1 |
| 158 movff battery_gauge+2,xC+0 | 138 movff battery_gauge+2,xC+0 |
| 139 btfsc trigger_isr_updates ; did the ISR kicked in since we cleared the flag? | |
| 140 bra get_battery_voltage_3 ; YES - retry copy | |
| 141 | |
| 159 ; battery_gauge: 6 is nAs | 142 ; battery_gauge: 6 is nAs |
| 160 ; divide through 65536 | 143 ; divide through 65536 |
| 161 ; divide through battery_capacity:2 | 144 ; divide through battery_capacity:2 |
| 162 ; result is in percent | 145 ; result is in percent |
| 163 movff internal_battery_capacity+0,xB+0 | 146 MOVII battery_capacity_internal,xB |
| 164 movff internal_battery_capacity+1,xB+1 | |
| 165 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | 147 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder |
| 166 movff xC+0,lo | 148 movff xC+0,lo |
| 167 ; limit to 100 | 149 ; limit to 100 |
| 168 movlw .100 | 150 movlw .100 |
| 169 cpfslt lo | 151 cpfslt lo |
| 170 movwf lo | 152 movwf lo |
| 171 ; lo will be between 0 (full) and 100 (empty) | 153 ; lo will be between 0 (full) and 100 (empty) |
| 172 movf lo,W | 154 movf lo,W |
| 173 sublw .100 | 155 sublw .100 |
| 174 movwf lo | 156 movwf lo |
| 175 get_battery_voltage3: | 157 get_battery_voltage_4: |
| 176 movlw .100 | 158 movlw .100 ; start with default of 100% |
| 177 cpfslt lo | 159 cpfslt lo ; > 100% |
| 160 movwf lo ; YES - limit to 100% | |
| 161 ; lo will be between 100 (full) and 0 (empty) | |
| 162 ; use 3.6V battery sensing based on 50 mA load | |
| 163 MOVLI lithium_36v_75,sub_a ; load threshold for > 75% | |
| 164 call cmpU16 ; sub_a - sub_b | |
| 165 btfsc neg_flag ; battery voltage above 75% level? | |
| 166 bra get_battery_voltage_5 ; YES | |
| 167 movlw .75 ; NO - set to 75% | |
| 178 movwf lo | 168 movwf lo |
| 179 ; lo will be between 100 (full) and 0 (empty) | 169 get_battery_voltage_5: |
| 180 | 170 ; 50% |
| 181 ; use 3.6V battery sensing based on 50 mA load | 171 MOVLI lithium_36v_50,sub_a ; load threshold for > 50% |
| 182 ; 75% | 172 call cmpU16 ; sub_a - sub_b |
| 183 movff batt_voltage+0,sub_b+0 | 173 btfsc neg_flag ; battery voltage above 75% level? |
| 184 movff batt_voltage+1,sub_b+1 | 174 bra get_battery_voltage_6 ; YES |
| 185 movlw LOW lithium_36v_75 | 175 movlw .50 ; NO - set to 50% |
| 186 movwf sub_a+0 | 176 movwf lo |
| 187 movlw HIGH lithium_36v_75 | 177 get_battery_voltage_6: |
| 188 movwf sub_a+1 | 178 ; 25% |
| 179 MOVLI lithium_36v_25,sub_a ; load threshold for > 25% | |
| 180 call cmpU16 ; sub_a - sub_b | |
| 181 btfsc neg_flag ; battery voltage above 25% level? | |
| 182 bra get_battery_voltage_7 ; YES | |
| 183 movlw .25 ; NO - set to 25% | |
| 184 movwf lo | |
| 185 get_battery_voltage_7: | |
| 186 ; 10% | |
| 187 MOVLI lithium_36v_10,sub_a ; load threshold for > 10% | |
| 188 call cmpU16 ; sub_a - sub_b | |
| 189 btfsc neg_flag ; battery voltage above 10% level? | |
| 190 bra get_battery_voltage_8 ; YES | |
| 191 movlw .10 ; NO - set to 10% | |
| 192 movwf lo | |
| 193 get_battery_voltage_8: | |
| 194 movlw .100 ; maximum is 100 (%) | |
| 195 cpfslt lo ; > 100% ? | |
| 196 movwf lo ; YES - limit to 100% | |
| 197 movf batt_percent,W ; get last battery percentage | |
| 198 cpfsgt lo ; current battery % < last battery % ? | |
| 199 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 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 return | |
| 204 | |
| 205 get_battery_voltage_9: | |
| 206 ; use 1.5V battery voltage mode | |
| 207 ; use approximation (batt_voltage-aa_15v_low)/4 = lo | |
| 208 MOVII batt_voltage,sub_a ; load battery voltage | |
| 209 MOVLI aa_15v_low, sub_b ; load offset | |
| 189 call subU16 ; sub_c = sub_a - sub_b | 210 call subU16 ; sub_c = sub_a - sub_b |
| 190 btfsc neg_flag | 211 bcf STATUS,C ; shift right to divide / 2 |
| 191 bra get_battery_voltage3a | |
| 192 movlw .75 | |
| 193 movwf lo | |
| 194 get_battery_voltage3a: | |
| 195 ; 50% | |
| 196 movlw LOW lithium_36v_50 | |
| 197 movwf sub_a+0 | |
| 198 movlw HIGH lithium_36v_50 | |
| 199 movwf sub_a+1 | |
| 200 call subU16 ; sub_c = sub_a - sub_b | |
| 201 btfsc neg_flag | |
| 202 bra get_battery_voltage3b | |
| 203 movlw .50 | |
| 204 movwf lo | |
| 205 get_battery_voltage3b: | |
| 206 ; 25% | |
| 207 movlw LOW lithium_36v_25 | |
| 208 movwf sub_a+0 | |
| 209 movlw HIGH lithium_36v_25 | |
| 210 movwf sub_a+1 | |
| 211 call subU16 ; sub_c = sub_a - sub_b | |
| 212 btfsc neg_flag | |
| 213 bra get_battery_voltage3c | |
| 214 movlw .25 | |
| 215 movwf lo | |
| 216 get_battery_voltage3c: | |
| 217 ; 10% | |
| 218 movlw LOW lithium_36v_10 | |
| 219 movwf sub_a+0 | |
| 220 movlw HIGH lithium_36v_10 | |
| 221 movwf sub_a+1 | |
| 222 call subU16 ; sub_c = sub_a - sub_b | |
| 223 btfsc neg_flag | |
| 224 bra get_battery_voltage3d | |
| 225 movlw .10 | |
| 226 movwf lo | |
| 227 get_battery_voltage3d: | |
| 228 movlw .100 | |
| 229 cpfslt lo | |
| 230 movwf lo | |
| 231 ; lo will be between 100 (full) and 0 (empty) | |
| 232 movf batt_percent,W | |
| 233 cpfsgt lo ; keep batt_percent on the lowest value found | |
| 234 movff lo,batt_percent ; store value | |
| 235 btfsc battery_is_36v ; but always use computed value for 3.6V battery | |
| 236 movff lo,batt_percent ; store value | |
| 237 bcf adc_running ; =1: the ADC is in use | |
| 238 return | |
| 239 | |
| 240 get_battery_voltage4: | |
| 241 ; use 1.5V battery voltage mode | |
| 242 ; use approximation (batt_voltage:2-aa_15v_low)/4 = lo | |
| 243 movff batt_voltage+0,sub_a+0 | |
| 244 movff batt_voltage+1,sub_a+1 | |
| 245 movlw LOW aa_15v_low | |
| 246 movwf sub_b+0 | |
| 247 movlw HIGH aa_15v_low | |
| 248 movwf sub_b+1 | |
| 249 call subU16 ; sub_c = sub_a - sub_b | |
| 250 bcf STATUS,C | |
| 251 rrcf sub_c+1 | 212 rrcf sub_c+1 |
| 252 rrcf sub_c+0 ; /2 | 213 rrcf sub_c+0 |
| 253 bcf STATUS,C | 214 bcf STATUS,C ; another shift right to divide / 4 |
| 254 rrcf sub_c+1 | 215 rrcf sub_c+1 |
| 255 rrcf sub_c+0 ; /4 | 216 rrcf sub_c+0 |
| 256 movff sub_c+0,lo | 217 movff sub_c+0,lo ; store result |
| 257 bra get_battery_voltage3d ; check limits and return | 218 bra get_battery_voltage_8 ; check limits and return |
| 258 | 219 |
| 259 global get_ambient_level | 220 |
| 221 global get_ambient_level ; called from ISR only, in context bank isr_backup | |
| 260 get_ambient_level: ; starts ADC and waits until finished | 222 get_ambient_level: ; starts ADC and waits until finished |
| 261 btfsc adc_running ; ADC in use? | 223 btfsc sleepmode ; in sleep mode? |
| 262 return ; YES - return | 224 return ; YES - done |
| 263 | 225 btfsc adc_is_running ; NO - ADC in use? |
| 264 btfsc ambient_sensor | 226 return ; YES - return |
| 265 bra get_ambient_level1 ; normal OSTC3 hardware | 227 banksel HW_descriptor ; NO - select bank where hardware descriptor is stored |
| 266 | 228 btfsc ambient_sensor ; - ambient sensor available? |
| 267 banksel isr_backup ; back to bank0 ISR data | 229 bra get_ambient_level1 ; YES - use sensor |
| 268 movff opt_brightness,isr1_temp | 230 banksel isr_backup ; NO - back to ISR default bank |
| 269 incf isr1_temp,F ; adjust 0-2 to 1-3 | 231 movff opt_brightness,isr_lo ; - get brightness selection |
| 270 movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting | 232 incf isr_lo,F ; - 0-2 -> 1-3 |
| 271 dcfsnz isr1_temp,F | 233 movlw ambient_light_max_high_cr ; - default selection to brightest setting |
| 272 movlw ambient_light_max_eco ; brightest setting | 234 dcfsnz isr_lo,F ; - level 0 (eco) selected? |
| 273 dcfsnz isr1_temp,F | 235 movlw ambient_light_max_eco ; YES - select eco brightness |
| 274 movlw ambient_light_max_medium ; brightest setting | 236 dcfsnz isr_lo,F ; - level 1 (medium) selected? |
| 275 | 237 movlw ambient_light_max_medium ; YES - select medium brightness |
| 276 movff WREG,ambient_light+0 ; set to max. | 238 movwf ambient_light+0 ; - store selection |
| 277 movff ambient_light+0,max_CCPR1L ; store value for dimming in TMR7 interrupt | 239 movwf max_CCPR1L ; - store value for dimming in TMR7 interrupt |
| 278 return | 240 return ; - done |
| 279 | 241 |
| 280 get_ambient_level1: | 242 get_ambient_level1: ; using ambient sensor |
| 243 banksel isr_backup ; back to ISR default bank | |
| 281 movlw b'00000000' ; Vref+ = Vdd | 244 movlw b'00000000' ; Vref+ = Vdd |
| 282 movwf ADCON1 | 245 movwf ADCON1 |
| 283 movlw b'00011101' ; power on ADC, select AN7 | 246 movlw b'00011101' ; power on ADC, select AN7 |
| 284 rcall wait_adc | 247 rcall wait_adc |
| 285 | 248 MOVII ADRESL,ambient_light |
| 286 movff ADRESH,ambient_light+1 | |
| 287 movff ADRESL,ambient_light+0 | |
| 288 bcf ADCON0,0 ; power off ADC | 249 bcf ADCON0,0 ; power off ADC |
| 289 | 250 |
| 290 ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) | 251 ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) |
| 291 ; first: divide by 16 | 252 ; first: divide by 16 |
| 292 banksel ambient_light | |
| 293 bcf STATUS,C | 253 bcf STATUS,C |
| 294 rrcf ambient_light+1 | 254 rrcf ambient_light+1 |
| 295 rrcf ambient_light+0 | 255 rrcf ambient_light+0 |
| 296 bcf STATUS,C | 256 bcf STATUS,C |
| 297 rrcf ambient_light+1 | 257 rrcf ambient_light+1 |
| 319 ; movlw .10 | 279 ; movlw .10 |
| 320 ; subwf ambient_light+0,F ; subtract 10 (ADC Offset) | 280 ; subwf ambient_light+0,F ; subtract 10 (ADC Offset) |
| 321 ; btfsc STATUS,N | 281 ; btfsc STATUS,N |
| 322 ; movwf ambient_light+0 ; avoid clipping | 282 ; movwf ambient_light+0 ; avoid clipping |
| 323 | 283 |
| 324 banksel isr_backup ; back to bank0 ISR data | 284 movff opt_brightness,isr_lo ; get brightness setting |
| 325 movff opt_brightness,isr1_temp | |
| 326 | 285 |
| 327 btfsc RCSTA1,7 ; UART module on? | 286 btfsc RCSTA1,7 ; UART module on? |
| 328 clrf isr1_temp ; YES - set temporally to eco mode | 287 clrf isr_lo ; YES - set temporary to eco mode |
| 329 | 288 incf isr_lo,F ; adjust 0-2 to 1-3 |
| 330 incf isr1_temp,F ; adjust 0-2 to 1-3 | 289 |
| 331 | |
| 332 banksel common ; flag is in bank1 | |
| 333 movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting | 290 movlw ambient_light_max_high_cr ; cR and 2 hardware brightest setting |
| 291 | |
| 292 banksel HW_descriptor ; select bank where hardware descriptor and model variant is stored | |
| 334 btfss battery_gauge_available | 293 btfss battery_gauge_available |
| 335 movlw ambient_light_max_high_15V ; 1.5V battery brightest setting | 294 movlw ambient_light_max_high_15V ; 1.5V battery brightest setting |
| 336 btfsc battery_is_36v ; 3.6V battery in use? | 295 btfsc battery_is_36v ; 3.6V battery in use? |
| 337 movlw ambient_light_max_high_36V ; YES - 3.6V battery brightest setting | 296 movlw ambient_light_max_high_36V ; YES - 3.6V battery brightest setting |
| 338 banksel isr_backup ; back to bank0 ISR data | 297 banksel isr_backup ; back to ISR default bank |
| 339 | 298 |
| 340 dcfsnz isr1_temp,F | 299 dcfsnz isr_lo,F |
| 341 movlw ambient_light_max_eco ; brightest setting | 300 movlw ambient_light_max_eco ; eco setting |
| 342 dcfsnz isr1_temp,F | 301 dcfsnz isr_lo,F |
| 343 movlw ambient_light_max_medium ; brightest setting | 302 movlw ambient_light_max_medium ; brightest setting |
| 344 | 303 |
| 345 banksel ambient_light | |
| 346 incf ambient_light+0,F ; +1 | 304 incf ambient_light+0,F ; +1 |
| 347 cpfslt ambient_light+0 ; smaller than WREG? | 305 cpfslt ambient_light+0 ; smaller than WREG? |
| 348 movwf ambient_light+0 ; NO - set to max. | 306 movwf ambient_light+0 ; NO - set to max. |
| 349 | 307 |
| 350 banksel isr_backup ; back to bank0 ISR data | 308 movff opt_brightness,isr_lo |
| 351 movff opt_brightness,isr1_temp | 309 incf isr_lo,F ; adjust 0-2 to 1-3 |
| 352 incf isr1_temp,F ; adjust 0-2 to 1-3 | |
| 353 movlw ambient_light_min_high ; darkest setting | 310 movlw ambient_light_min_high ; darkest setting |
| 354 | 311 dcfsnz isr_lo,F |
| 355 dcfsnz isr1_temp,F | |
| 356 movlw ambient_light_min_eco ; darkest setting | 312 movlw ambient_light_min_eco ; darkest setting |
| 357 dcfsnz isr1_temp,F | 313 dcfsnz isr_lo,F |
| 358 movlw ambient_light_min_medium ; darkest setting | 314 movlw ambient_light_min_medium ; darkest setting |
| 359 dcfsnz isr1_temp,F | 315 dcfsnz isr_lo,F |
| 360 movlw ambient_light_min_high ; darkest setting | 316 movlw ambient_light_min_high ; darkest setting |
| 361 | 317 |
| 362 banksel ambient_light | |
| 363 cpfsgt ambient_light+0 ; bigger than WREG? | 318 cpfsgt ambient_light+0 ; bigger than WREG? |
| 364 movwf ambient_light+0 ; NO - set to min | 319 movwf ambient_light+0 ; NO - set to min |
| 365 banksel common | |
| 366 | 320 |
| 367 movff ambient_light+0,max_CCPR1L ; store value for dimming in TMR7 interrupt | 321 movff ambient_light+0,max_CCPR1L ; store value for dimming in TMR7 interrupt |
| 368 return | 322 return |
| 369 | 323 |
| 370 global get_analog_inputs | 324 |
| 325 ;============================================================================= | |
| 326 ; routines for reading analog-attached external sensors | |
| 327 ; | |
| 328 IFDEF _external_sensor | |
| 329 | |
| 330 global get_analog_inputs ; called from outside ISR only | |
| 371 get_analog_inputs: ; start ADC and wait until finished | 331 get_analog_inputs: ; start ADC and wait until finished |
| 372 bsf adc_running ; =1: The ADC is in use | 332 bsf adc_is_running ; =1: the ADC is in use |
| 373 btfsc TFT_PWM | 333 btfsc TFT_PWM |
| 374 bra get_analog_inputs ; wait for PWM low | 334 bra get_analog_inputs ; wait for PWM low |
| 375 movlw b'00100000' ; 2.048V Vref+ -> 1 LSB = 500 µV | 335 movlw b'00100000' ; 2.048V Vref+ -> 1 LSB = 500 µV |
| 376 movwf ADCON1 | 336 movwf ADCON1 |
| 337 banksel sensor1_mv ; select bank where sensor1_mv is stored | |
| 338 ; Sensor 1 | |
| 377 movlw b'00100001' ; power on ADC, select AN8 | 339 movlw b'00100001' ; power on ADC, select AN8 |
| 378 rcall wait_adc | 340 rcall wait_adc |
| 379 bcf STATUS,C | 341 bcf STATUS,C |
| 380 rrcf ADRESH,F ; /2 | 342 rrcf ADRESH,F ; /2 |
| 381 rrcf ADRESL,W | 343 rrcf ADRESL,W |
| 382 ; add to o2_mv_sensor1:2 | 344 addwf sensor1_mv+0,F ; add to sensor1_mv:2 |
| 383 addwf o2_mv_sensor1+0,F | |
| 384 movf ADRESH,W | 345 movf ADRESH,W |
| 385 addwfc o2_mv_sensor1+1,F | 346 addwfc sensor1_mv+1,F |
| 386 ; divide by 2 | 347 bcf STATUS,C |
| 387 bcf STATUS,C | 348 rrcf sensor1_mv+1,F ; divide /2 |
| 388 rrcf o2_mv_sensor1+1,F ; /2 | 349 rrcf sensor1_mv+0,F |
| 389 rrcf o2_mv_sensor1+0,F | |
| 390 | |
| 391 movlw HIGH ignore_mv | 350 movlw HIGH ignore_mv |
| 392 cpfsgt o2_mv_sensor1+1 ; > ignore_mv ? | 351 cpfsgt sensor1_mv+1 ; > ignore_mv ? |
| 393 bra get_analog_inputs2a ; NO | 352 bra get_analog_inputs1a ; NO |
| 394 ; YES - ignore this reading | 353 CLRI sensor1_mv ; YES - ignore this reading |
| 395 clrf o2_mv_sensor1+1 | 354 get_analog_inputs1a: ; ignore 1.9 mV noise for not-connected inputs |
| 396 clrf o2_mv_sensor1+0 | 355 tstfsz sensor1_mv+1 ; > 25.5 mV ? |
| 397 get_analog_inputs2a: | |
| 398 ; ignore 1.9 mV noise for not-connected inputs | |
| 399 tstfsz o2_mv_sensor1+1 ; > 25.5mV ? | |
| 400 bra get_analog_inputs2 ; YES - skip here | 356 bra get_analog_inputs2 ; YES - skip here |
| 401 movlw .19 | 357 movlw .19 |
| 402 cpfsgt o2_mv_sensor1+0 ; > 1.9mV ? | 358 cpfsgt sensor1_mv+0 ; > 1.9 mV ? |
| 403 clrf o2_mv_sensor1+0 ; NO - clear result | 359 clrf sensor1_mv+0 ; NO - clear result |
| 360 | |
| 404 get_analog_inputs2: | 361 get_analog_inputs2: |
| 362 ; Sensor 2 | |
| 405 movlw b'00100101' ; power on ADC, select AN9 | 363 movlw b'00100101' ; power on ADC, select AN9 |
| 406 rcall wait_adc | 364 rcall wait_adc |
| 407 bcf STATUS,C | 365 bcf STATUS,C |
| 408 rrcf ADRESH,F ; /2 | 366 rrcf ADRESH,F ; /2 |
| 409 rrcf ADRESL,W | 367 rrcf ADRESL,W |
| 410 ; add to o2_mv_sensor2:2 | 368 addwf sensor2_mv+0,F ; add to sensor2_mv:2 |
| 411 addwf o2_mv_sensor2+0,F | |
| 412 movf ADRESH,W | 369 movf ADRESH,W |
| 413 addwfc o2_mv_sensor2+1,F | 370 addwfc sensor2_mv+1,F |
| 414 ; divide by 2 | 371 bcf STATUS,C |
| 415 bcf STATUS,C | 372 rrcf sensor2_mv+1,F ; divide /2 |
| 416 rrcf o2_mv_sensor2+1,F ; /2 | 373 rrcf sensor2_mv+0,F |
| 417 rrcf o2_mv_sensor2+0,F | |
| 418 | |
| 419 movlw HIGH ignore_mv | 374 movlw HIGH ignore_mv |
| 420 cpfsgt o2_mv_sensor2+1 ; > ignore_mv ? | 375 cpfsgt sensor2_mv+1 ; > ignore_mv ? |
| 421 bra get_analog_inputs3a ; NO | 376 bra get_analog_inputs2a ; NO |
| 422 ; YES - ignore this reading | 377 CLRI sensor2_mv ; YES - ignore this reading |
| 423 clrf o2_mv_sensor2+1 | 378 get_analog_inputs2a: ; ignore 1.9 mV noise for not-connected inputs |
| 424 clrf o2_mv_sensor2+0 | 379 tstfsz sensor2_mv+1 ; > 25.5 mV ? |
| 425 get_analog_inputs3a: | |
| 426 ; ignore 1.9 mV noise for not-connected inputs | |
| 427 tstfsz o2_mv_sensor2+1 ; > 25.5 mV ? | |
| 428 bra get_analog_inputs3 ; YES - skip here | 380 bra get_analog_inputs3 ; YES - skip here |
| 429 movlw .19 | 381 movlw .19 |
| 430 cpfsgt o2_mv_sensor2+0 ; > 1.9 mV ? | 382 cpfsgt sensor2_mv+0 ; > 1.9 mV ? |
| 431 clrf o2_mv_sensor2+0 ; NO - clear result | 383 clrf sensor2_mv+0 ; NO - clear result |
| 384 | |
| 432 get_analog_inputs3: | 385 get_analog_inputs3: |
| 386 ; Sensor 3 | |
| 433 movlw b'00101001' ; power on ADC, select AN10 | 387 movlw b'00101001' ; power on ADC, select AN10 |
| 434 rcall wait_adc | 388 rcall wait_adc |
| 435 bcf STATUS,C | 389 bcf STATUS,C |
| 436 rrcf ADRESH,F ; /2 | 390 rrcf ADRESH,F ; /2 |
| 437 rrcf ADRESL,W | 391 rrcf ADRESL,W |
| 438 ; add to o2_mv_sensor3:2 | 392 addwf sensor3_mv+0,F ; add to sensor3_mv:2 |
| 439 addwf o2_mv_sensor3+0,F | |
| 440 movf ADRESH,W | 393 movf ADRESH,W |
| 441 addwfc o2_mv_sensor3+1,F | 394 addwfc sensor3_mv+1,F |
| 442 ; divide by 2 | 395 bcf STATUS,C |
| 443 bcf STATUS,C | 396 rrcf sensor3_mv+1,F ; divide /2 |
| 444 rrcf o2_mv_sensor3+1,F ; /2 | 397 rrcf sensor3_mv+0,F |
| 445 rrcf o2_mv_sensor3+0,F | |
| 446 | |
| 447 movlw HIGH ignore_mv | 398 movlw HIGH ignore_mv |
| 448 cpfsgt o2_mv_sensor3+1 ; > ignore_mv ? | 399 cpfsgt sensor3_mv+1 ; > ignore_mv ? |
| 449 bra get_analog_inputs4a ; NO | 400 bra get_analog_inputs3a ; NO |
| 450 ; YES - ignore this reading | 401 CLRI sensor3_mv ; YES - ignore this reading |
| 451 clrf o2_mv_sensor3+1 | 402 get_analog_inputs3a: ; ignore 1.9 mV noise for not-connected inputs |
| 452 clrf o2_mv_sensor3+0 | 403 tstfsz sensor3_mv+1 ; > 25.5 mV ? |
| 453 get_analog_inputs4a: | |
| 454 ; ignore 1.9mV noise for not-connected inputs | |
| 455 tstfsz o2_mv_sensor3+1 ; > 25.5 mV ? | |
| 456 bra get_analog_inputs4 ; YES - skip here | 404 bra get_analog_inputs4 ; YES - skip here |
| 457 movlw .19 | 405 movlw .19 |
| 458 cpfsgt o2_mv_sensor3+0 ; > 1.9 mV ? | 406 cpfsgt sensor3_mv+0 ; > 1.9 mV ? |
| 459 clrf o2_mv_sensor3+0 ; NO - clear result | 407 clrf sensor3_mv+0 ; NO - clear result |
| 460 get_analog_inputs4: | 408 get_analog_inputs4: |
| 409 banksel common ; back to bank common | |
| 461 bcf ADCON0,0 ; power off ADC | 410 bcf ADCON0,0 ; power off ADC |
| 462 bcf adc_running ; =1: the ADC is in use | 411 bcf adc_is_running ; done with ADC |
| 463 return | 412 return |
| 464 | 413 |
| 465 global piezo_config ; set up piezo sensitivity of heinrichs weikamp piezo buttons (~30ms) | 414 ENDIF ; _external_sensor |
| 466 piezo_config: ; settings between 20 and 200 | 415 |
| 467 clrf TMR5H | 416 ;============================================================================= |
| 468 clrf TMR5L ; ~2sec | 417 |
| 469 bcf PIR5,TMR5IF ; clear flag | 418 global piezo_config ; called from outside ISR only |
| 470 bcf switch_right | 419 piezo_config: ; set up sensitivity of heinrichsweikamp piezo buttons (~30ms) |
| 471 bcf switch_left | 420 clrf TMR5H ; clear TMR5H first |
| 421 clrf TMR5L ; clear TMR5L thereafter | |
| 422 bcf PIR5,TMR5IF ; clear timer 5 overrun flag, will take ~ 2 seconds to overrun after reset | |
| 423 bcf switch_right ; clear left-over button events | |
| 424 bcf switch_left ; ... | |
| 472 piezo_config0: | 425 piezo_config0: |
| 473 btfsc switch_right | 426 btfsc switch_right ; user still pressing the right button? |
| 474 bra piezo_config | 427 bra piezo_config ; YES - loop to wait for release |
| 475 btfsc switch_left | 428 btfsc switch_left ; user still pressing the left button? |
| 476 bra piezo_config ; restart on button press | 429 bra piezo_config ; YES - loop to wait for release |
| 477 | 430 |
| 478 btfss PIR5,TMR5IF | 431 btfss PIR5,TMR5IF ; timeout? |
| 479 bra piezo_config0 ; wait loop | 432 bra piezo_config0 ; NO - not yet, loop |
| 480 | 433 |
| 481 bcf INTCON,GIE | 434 bcf INTCON,GIE |
| 482 | 435 |
| 483 movff opt_cR_button_right,WREG ; right button | 436 movff opt_cR_button_right,WREG ; right button |
| 484 btfsc flip_screen ; 180° rotation ? | 437 btfsc flip_screen ; 180° rotation ? |
| 516 bsf TX3_PIEZO_CFG ; stop bit | 469 bsf TX3_PIEZO_CFG ; stop bit |
| 517 rcall piezo_config_wait_bit | 470 rcall piezo_config_wait_bit |
| 518 return | 471 return |
| 519 | 472 |
| 520 piezo_config_wait_bit: | 473 piezo_config_wait_bit: |
| 521 setf TMR5H | 474 setf TMR5H ; set TMR5H first (to 255) |
| 522 movlw .255-.26 ; 26 x 31,5µs = 819us | 475 movlw .255-.26 ; 26 x 31.5 µs = 819 us |
| 523 movwf TMR5L | 476 movwf TMR5L ; set TMR5L thereafter |
| 524 bcf PIR5,TMR5IF ; clear flag | 477 bcf PIR5,TMR5IF ; clear timer 5 overrun flag |
| 525 piezo_config_wait_bit3: | 478 piezo_config_wait_bit3: |
| 526 btfss PIR5,TMR5IF | 479 btfss PIR5,TMR5IF ; timeout? |
| 527 bra piezo_config_wait_bit3 ; wait loop | 480 bra piezo_config_wait_bit3 ; NO - loop |
| 528 return | 481 return ; YES - done |
| 529 | 482 |
| 530 global reset_battery_pointer | 483 |
| 531 reset_battery_pointer: ; reset battery pointer 0x07-0x0C and battery_gauge:5 | 484 global get_analog_switches ; called from ISR and from sleep mode, returns in bank common |
| 532 extern lt2942_charge_done | |
| 533 btfsc battery_gauge_available ; something to reset? | |
| 534 call lt2942_charge_done ; YES - reset accumulating registers to 0xFFFF | |
| 535 goto reset_battery_internal_only ; and return | |
| 536 | |
| 537 | |
| 538 global get_analog_switches | |
| 539 get_analog_switches: ; start ADC and wait until finished | 485 get_analog_switches: ; start ADC and wait until finished |
| 486 banksel HW_variants ; switch to bank where OSTC model variant is stored | |
| 540 btfsc analog_switches ; does the OSTC have analog switches? | 487 btfsc analog_switches ; does the OSTC have analog switches? |
| 541 bra get_analog_switches2 ; YES | 488 bra get_analog_switches_1 ; YES |
| 542 ; NO | 489 banksel common ; NO - back to bank common |
| 543 bcf analog_sw1_pressed ; NO - clear flag for analog switch 1 | 490 bcf analog_sw1_pressed ; - clear flag for analog switch 1 |
| 544 bcf analog_sw2_pressed ; - clear flag for analog switch 2 | 491 bcf analog_sw2_pressed ; - clear flag for analog switch 2 |
| 545 return ; - done | 492 return ; - done |
| 546 get_analog_switches2: | 493 |
| 547 btfsc adc_running ; ADC in use? | 494 get_analog_switches_1: |
| 495 banksel common ; back to bank common | |
| 496 btfsc adc_is_running ; ADC in use? | |
| 548 return ; YES - abort | 497 return ; YES - abort |
| 549 ; NO | 498 ;bra get_analog_switches_2 ; NO - read switches |
| 499 | |
| 500 get_analog_switches_2: | |
| 550 movlw b'00001001' ; left justified | 501 movlw b'00001001' ; left justified |
| 551 movwf ADCON2 | 502 movwf ADCON2 |
| 552 ; movlw b'00000000' ; Vref+ = Vdd | 503 ; movlw b'00000000' ; Vref+ = Vdd |
| 553 clrf ADCON1 | 504 clrf ADCON1 |
| 554 movlw b'00100101' ; power on ADC, select AN9 | 505 movlw b'00100101' ; power on ADC, select AN9 |
| 555 rcall wait_adc | 506 rcall wait_adc |
| 556 banksel analog_counter | 507 |
| 508 banksel isr_backup ; select bank ISR data | |
| 557 movff ADRESH,WREG | 509 movff ADRESH,WREG |
| 558 addwf analog_sw2_raw+0 | 510 addwf analog_sw2_raw+0 |
| 559 movlw .0 | 511 movlw .0 |
| 560 addwfc analog_sw2_raw+1 | 512 addwfc analog_sw2_raw+1 |
| 561 decfsz analog_counter,F ; continue averaging? | 513 decfsz analog_counter,F ; continue averaging? |
| 562 bra get_analog_switches2a ; YES | 514 bra get_analog_switches_2a ; YES |
| 563 ; NO - done, compute average | 515 bcf STATUS,C ; NO - done, compute average |
| 564 bcf STATUS,C | |
| 565 rrcf analog_sw2_raw+1 | 516 rrcf analog_sw2_raw+1 |
| 566 rrcf analog_sw2_raw+0 ; /2 | 517 rrcf analog_sw2_raw+0 ; /2 |
| 567 bcf STATUS,C | 518 bcf STATUS,C |
| 568 rrcf analog_sw2_raw+1 | 519 rrcf analog_sw2_raw+1 |
| 569 rrcf analog_sw2_raw+0 ; /4 | 520 rrcf analog_sw2_raw+0 ; /4 |
| 576 movff analog_sw2_raw+0,analog_sw2 | 527 movff analog_sw2_raw+0,analog_sw2 |
| 577 clrf analog_sw2_raw+1 | 528 clrf analog_sw2_raw+1 |
| 578 clrf analog_sw2_raw+0 ; reset average registers | 529 clrf analog_sw2_raw+0 ; reset average registers |
| 579 ; movlw .16 | 530 ; movlw .16 |
| 580 ; movwf analog_counter ; only once... | 531 ; movwf analog_counter ; only once... |
| 581 get_analog_switches2a: | 532 |
| 582 banksel common | 533 get_analog_switches_2a: |
| 583 bcf analog_sw2_pressed | 534 bcf analog_sw2_pressed ; default to not pressed |
| 584 movff opt_cR_button_left,WREG ; 20-100 | 535 movff opt_cR_button_left,WREG ; 20-100 |
| 585 bcf STATUS,C | 536 bcf STATUS,C |
| 586 rrcf WREG ; /2 -> 10-50 | 537 rrcf WREG ; /2 -> 10-50 |
| 587 bcf STATUS,C | 538 bcf STATUS,C |
| 588 rrcf WREG ; /2 -> 5-25 | 539 rrcf WREG ; /2 -> 5-25 |
| 589 decf WREG,W ; -1 | 540 decf WREG,W ; -1 |
| 590 decf WREG,W ; -1 | 541 decf WREG,W ; -1 |
| 591 decf WREG,W ; -1 -> 2-22 | 542 decf WREG,W ; -1 -> 2-22 |
| 592 banksel analog_sw2 | |
| 593 btfss button_polarity,1 ; (1= normal, 0=inverted) | 543 btfss button_polarity,1 ; (1= normal, 0=inverted) |
| 594 bra sw2_inverted | 544 bra get_analog_switches_sw2_inv |
| 595 addwf analog_sw2,W ; average (~128) | 545 addwf analog_sw2,W ; average (~128) |
| 596 cpfsgt ADRESH | 546 cpfsgt ADRESH ; pressed? |
| 597 bra get_analog_sw1 | 547 bra get_analog_switches_3 ; NO |
| 598 banksel common | 548 bra get_analog_switches_sw2_pressed ; YES (left button normal) |
| 599 bsf analog_sw2_pressed ; left button normal | 549 |
| 600 bra get_analog_sw1 | 550 get_analog_switches_sw2_inv: |
| 601 sw2_inverted: | |
| 602 subwf analog_sw2,W ; average (~128) | 551 subwf analog_sw2,W ; average (~128) |
| 603 cpfslt ADRESH | 552 cpfslt ADRESH ; pressed? |
| 604 bra get_analog_sw1 | 553 bra get_analog_switches_3 ; NO |
| 605 banksel common | 554 ;bra get_analog_switches_sw2_pressed ; YES (left button inverted) |
| 606 bsf analog_sw2_pressed ; left button inverted | 555 |
| 607 get_analog_sw1: | 556 get_analog_switches_sw2_pressed: |
| 608 banksel common | 557 bsf analog_sw2_pressed ; set left button as pressed |
| 558 | |
| 559 get_analog_switches_3: | |
| 609 movlw b'00101001' ; power on ADC, select AN10 | 560 movlw b'00101001' ; power on ADC, select AN10 |
| 610 rcall wait_adc | 561 rcall wait_adc |
| 611 banksel analog_counter | |
| 612 movff ADRESH,WREG | 562 movff ADRESH,WREG |
| 613 addwf analog_sw1_raw+0 | 563 addwf analog_sw1_raw+0 |
| 614 movlw .0 | 564 movlw .0 |
| 615 addwfc analog_sw1_raw+1 | 565 addwfc analog_sw1_raw+1 |
| 616 tstfsz analog_counter ; continue averaging? | 566 tstfsz analog_counter ; continue averaging? |
| 617 bra get_analog_switches1a ; YES | 567 bra get_analog_switches_3a ; YES |
| 618 ; NO - done, compute average | 568 bcf STATUS,C ; NO - done, compute average |
| 619 bcf STATUS,C | |
| 620 rrcf analog_sw1_raw+1 | 569 rrcf analog_sw1_raw+1 |
| 621 rrcf analog_sw1_raw+0 ; /2 | 570 rrcf analog_sw1_raw+0 ; /2 |
| 622 bcf STATUS,C | 571 bcf STATUS,C |
| 623 rrcf analog_sw1_raw+1 | 572 rrcf analog_sw1_raw+1 |
| 624 rrcf analog_sw1_raw+0 ; /4 | 573 rrcf analog_sw1_raw+0 ; /4 |
| 631 movff analog_sw1_raw+0,analog_sw1 | 580 movff analog_sw1_raw+0,analog_sw1 |
| 632 clrf analog_sw1_raw+1 | 581 clrf analog_sw1_raw+1 |
| 633 clrf analog_sw1_raw+0 ; reset average registers | 582 clrf analog_sw1_raw+0 ; reset average registers |
| 634 movlw .16 | 583 movlw .16 |
| 635 movwf analog_counter ; only once... | 584 movwf analog_counter ; only once... |
| 636 get_analog_switches1a: | 585 |
| 637 banksel common | 586 get_analog_switches_3a: |
| 638 bcf analog_sw1_pressed | 587 bcf analog_sw1_pressed ; default to not pressed |
| 639 movff opt_cR_button_right,WREG ; 20-100 | 588 movff opt_cR_button_right,WREG ; 20-100 |
| 640 bcf STATUS,C | 589 bcf STATUS,C |
| 641 rrcf WREG ; /2 -> 10-50 | 590 rrcf WREG ; /2 -> 10-50 |
| 642 bcf STATUS,C | 591 bcf STATUS,C |
| 643 rrcf WREG ; /2 -> 5-25 | 592 rrcf WREG ; /2 -> 5-25 |
| 644 decf WREG,W ; -1 | 593 decf WREG,W ; -1 |
| 645 decf WREG,W ; -1 | 594 decf WREG,W ; -1 |
| 646 decf WREG,W ; -1 -> 2-22 | 595 decf WREG,W ; -1 -> 2-22 |
| 647 banksel analog_sw1 | |
| 648 btfss button_polarity,0 ; (1= normal, 0=inverted) | 596 btfss button_polarity,0 ; (1= normal, 0=inverted) |
| 649 bra sw1_inverted | 597 bra get_analog_switches_sw1_inv |
| 650 addwf analog_sw1,W ; average (~128) | 598 addwf analog_sw1,W ; average (~128) |
| 651 cpfsgt ADRESH | 599 cpfsgt ADRESH ; pressed? |
| 652 bra get_analog_sw_done | 600 bra get_analog_switches_4 ; NO |
| 653 banksel common | 601 bra get_analog_switches_sw1_pressed ; YES (right button normal) |
| 654 bsf analog_sw1_pressed ; right button normal | 602 |
| 655 bra get_analog_sw_done | 603 get_analog_switches_sw1_inv: |
| 656 sw1_inverted: | |
| 657 subwf analog_sw1,W ; average (~128) | 604 subwf analog_sw1,W ; average (~128) |
| 658 cpfslt ADRESH | 605 cpfslt ADRESH ; pressed? |
| 659 bra get_analog_sw_done | 606 bra get_analog_switches_4 ; NO |
| 660 banksel common | 607 ;bra get_analog_switches_sw1_pressed ; YES (right button inverted) |
| 661 bsf analog_sw1_pressed ; right button inverted | 608 |
| 662 get_analog_sw_done: | 609 get_analog_switches_sw1_pressed: |
| 663 banksel common | 610 bsf analog_sw1_pressed ; set right button as pressed |
| 611 | |
| 612 get_analog_switches_4: | |
| 664 movlw b'10001101' ; restore to right justified | 613 movlw b'10001101' ; restore to right justified |
| 665 movwf ADCON2 | 614 movwf ADCON2 |
| 666 btfsc analog_sw1_pressed | 615 |
| 667 return | 616 banksel common ; back to bank common |
| 668 btfsc analog_sw2_pressed | 617 btfsc analog_sw1_pressed ; right button pressed? |
| 669 return | 618 return ; YES - done |
| 670 setf TMR1H ; no button pressed, enhance timer1 to overflow quickly | 619 btfsc analog_sw2_pressed ; left button pressed? |
| 620 return ; YES - done | |
| 621 setf TMR1H ; NO to both - no button pressed, set timer1 to overflow quickly | |
| 671 return | 622 return |
| 672 | 623 |
| 673 END | 624 END |
