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