; *************************************************************************** ; copyright : (C) 2025 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** .equ BRIGHTNESS_INTERVAL = 97 .equ BRIGHTNESS_FLAGS_VALID_BIT = 7 ; *************************************************************************** ; data .dseg brightnessDataBegin: brightnessTimer: .byte 1 brightnessFlags: .byte 1 brightnessLastValue: .byte 1 brightnessDataEnd: ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine Brightness_Init ; ; Init module. ; ; @return CFLAG always set Brightness_Init: ; preset SRAM data area ldi xh, HIGH(brightnessDataBegin) ldi xl, LOW(brightnessDataBegin) clr r16 ldi r17, (brightnessDataEnd-brightnessDataBegin) rcall Utils_FillSram ; setup pins cbi BRIGHTNESS_ADC_PORT, BRIGHTNESS_ADC_PIN ; disable internal pullup for ADC cbi BRIGHTNESS_ADC_DDR, BRIGHTNESS_ADC_PIN ; set ADC port as input ldi r16, BRIGHTNESS_ADC_MUX ; select input pin, use Vcc as reference voltage out ADMUX, r16 ldi r16, (0 << ADLAR) out ADCSRB, r16 ldi r16, (1 << ADEN) | (1 << ADPS1) | (1 << ADPS0) ; enable, prescaler 8 out ADCSRA, r16 ldi r16, BRIGHTNESS_INTERVAL sts brightnessTimer, r16 sec ret Brightness_Fini: sec ret ; --------------------------------------------------------------------------- ; @routine Brightness_Every100ms @global ; Brightness_Every100ms: lds r16, brightnessTimer dec r16 breq Brightness_Every100ms_readValue sts brightnessTimer, r16 cpi r16, 1 breq Brightness_Every100ms_startMeasure ret Brightness_Every100ms_startMeasure: sbi ADCSRA, ADSC ; start conversion ret Brightness_Every100ms_readValue: sbic ADCSRA, ADSC ret ; return if bit still set, leave brightnessTimer at "1" ; conversion complete, read value ldi r16, BRIGHTNESS_INTERVAL ; restart timer sts brightnessTimer, r16 in r16, ADCL in r17, ADCH ; read value from ADC tst r17 breq Brightness_Every100ms_storeValue ldi r16, 0xff Brightness_Every100ms_storeValue: sts brightnessLastValue, r16 ; convert to 1/0 lds r17, brightnessFlags sbr r17, (1<