Mercurial > public > hwos_code
comparison src/adc_lightsensor.asm @ 646:5b7fe7777425
3.16 release
author | heinrichs weikamp |
---|---|
date | Thu, 14 Oct 2021 12:03:24 +0200 |
parents | 8c1f1f334275 |
children | 357341239438 |
comparison
equal
deleted
inserted
replaced
642:a9a0188091e4 | 646:5b7fe7777425 |
---|---|
23 ;----------------------------------------------------------------------------- | 23 ;----------------------------------------------------------------------------- |
24 ; Helper Function - wait on ADC to finish conversion | 24 ; Helper Function - wait on ADC to finish conversion |
25 ; | 25 ; |
26 ; bank safe | 26 ; bank safe |
27 ; | 27 ; |
28 global wait_adc | |
28 wait_adc: | 29 wait_adc: |
29 movwf ADCON0 ; select ADC channel | 30 movwf ADCON0 ; select ADC channel |
30 nop ; wait a short moment | 31 nop ; wait a short moment |
31 nop ; ... | 32 nop ; ... |
32 nop ; ..... | 33 nop ; ..... |
259 return ; YES - abort | 260 return ; YES - abort |
260 banksel HW_descriptor ; NO - select bank where hardware descriptor is stored | 261 banksel HW_descriptor ; NO - select bank where hardware descriptor is stored |
261 btfsc ambient_sensor ; - ambient sensor available? | 262 btfsc ambient_sensor ; - ambient sensor available? |
262 bra get_ambient_level1 ; YES - use sensor | 263 bra get_ambient_level1 ; YES - use sensor |
263 banksel isr_backup ; NO - back to ISR default bank | 264 banksel isr_backup ; NO - back to ISR default bank |
264 movff opt_brightness,isr_lo ; - get brightness selection | 265 movff brightness,isr_lo ; - get brightness selection |
265 incf isr_lo,F ; - 0-2 -> 1-3 | 266 incf isr_lo,F ; - 0-2 -> 1-3 |
266 movlw ambient_light_max_high_cr ; - default selection to brightest setting | 267 movlw ambient_light_max_high_cr ; - default selection to brightest setting |
267 dcfsnz isr_lo,F ; - level 0 (eco) selected? | 268 dcfsnz isr_lo,F ; - level 0 (eco) selected? |
268 movlw ambient_light_max_eco ; YES - select eco brightness | 269 movlw ambient_light_max_eco ; YES - select eco brightness |
269 dcfsnz isr_lo,F ; - level 1 (medium) selected? | 270 dcfsnz isr_lo,F ; - level 1 (medium) selected? |
276 banksel isr_backup ; back to ISR default bank | 277 banksel isr_backup ; back to ISR default bank |
277 clrf ADCON1 ; Vref+ = Vdd | 278 clrf ADCON1 ; Vref+ = Vdd |
278 movlw b'00011101' ; power on ADC, select AN7 | 279 movlw b'00011101' ; power on ADC, select AN7 |
279 rcall wait_adc | 280 rcall wait_adc |
280 MOVII ADRESL,ambient_light | 281 MOVII ADRESL,ambient_light |
281 bcf ADCON0,0 ; power off ADC | 282 bcf ADCON0,0 ; power off ADC |
282 | 283 |
284 btfsc ambient_light+1,7 ; result negative? | |
285 return ; Yes, skip this measurement | |
283 ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) | 286 ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) |
284 ; first: divide by 16 | 287 ; first: divide by 16 |
285 | |
286 movlw .4 ; divide by 2^4 = 16 | 288 movlw .4 ; divide by 2^4 = 16 |
287 get_ambient_level1_loop: | 289 get_ambient_level1_loop: |
288 bcf STATUS,C ; clear carry | 290 bcf STATUS,C ; clear carry |
289 rrcf ambient_light+1 ; rotate right high byte, carry into MSB, LSB into carry | 291 rrcf ambient_light+1 ; rotate right high byte, carry into MSB, LSB into carry |
290 rrcf ambient_light+0 ; rotate right low byte, carry into MSB, LSB into carry | 292 rrcf ambient_light+0 ; rotate right low byte, carry into MSB, LSB into carry |
297 movlw .254 | 299 movlw .254 |
298 tstfsz ambient_light+1 ; > 255 ? | 300 tstfsz ambient_light+1 ; > 255 ? |
299 movwf ambient_light+0 ; YES - avoid ADC clipping | 301 movwf ambient_light+0 ; YES - avoid ADC clipping |
300 | 302 |
301 incfsz ambient_light+0,W ; = 255 ? | 303 incfsz ambient_light+0,W ; = 255 ? |
302 bra get_ambient_level2 ; NO - continue | 304 bra get_ambient_level2 ; NO - continue |
303 | 305 |
304 movlw .254 | 306 movlw .254 |
305 movwf ambient_light+0 ; avoid ADC clipping | 307 movwf ambient_light+0 ; avoid ADC clipping |
306 | 308 |
307 get_ambient_level2: | 309 get_ambient_level2: |
308 movff opt_brightness,isr_lo ; get brightness setting | 310 movff brightness,isr_lo ; get brightness setting |
309 | 311 |
310 btfsc RCSTA1,7 ; UART module on? | 312 btfsc RCSTA1,7 ; UART module on? |
311 clrf isr_lo ; YES - set temporary to eco mode | 313 clrf isr_lo ; YES - set temporary to eco mode |
312 | 314 |
313 incf isr_lo,F ; adjust 0-2 to 1-3 | 315 incf isr_lo,F ; adjust 0-2 to 1-3 |
327 | 329 |
328 incf ambient_light+0,F ; +1 | 330 incf ambient_light+0,F ; +1 |
329 cpfslt ambient_light+0 ; smaller than WREG? | 331 cpfslt ambient_light+0 ; smaller than WREG? |
330 movwf ambient_light+0 ; NO - set to max. | 332 movwf ambient_light+0 ; NO - set to max. |
331 | 333 |
332 movff opt_brightness,isr_lo ; get brightness setting | 334 movff brightness,isr_lo ; get brightness setting |
333 incf isr_lo,F ; adjust 0-2 to 1-3 | 335 incf isr_lo,F ; adjust 0-2 to 1-3 |
334 movlw ambient_light_min_high ; default to highest setting | 336 movlw ambient_light_min_high ; default to highest setting |
335 dcfsnz isr_lo,F ; eco setting? | 337 dcfsnz isr_lo,F ; eco setting? |
336 movlw ambient_light_min_eco ; YES | 338 movlw ambient_light_min_eco ; YES |
337 dcfsnz isr_lo,F ; medium setting? | 339 dcfsnz isr_lo,F ; medium setting? |