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