Files
aqhomecontrol/avr/modules/brightness/main.asm
2025-06-23 19:21:49 +02:00

131 lines
3.1 KiB
NASM

; ***************************************************************************
; 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, (1 << 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, ADCH ; read value from ADC
sts brightnessLastValue, r16
; convert to 1/0
lds r17, brightnessFlags
sbr r17, (1<<BRIGHTNESS_FLAGS_VALID_BIT) ; set valid bit
sts brightnessFlags, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine Brightness_GetValue @global
;
; @return CFLAG set if there is a value, cleared otherwise (standard api)
; @return R16 value
; @clobbers R16
Brightness_GetValue:
lds r16, brightnessFlags
sbrs r16, BRIGHTNESS_FLAGS_VALID_BIT
rjmp Brightness_GetValue_retNc
lds r16, brightnessLastValue
sec
ret
Brightness_GetValue_retNc:
clc
ret
; @end