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