Files
aqhomecontrol/avr/modules/cny70/main.asm
2024-12-15 18:20:54 +01:00

142 lines
3.2 KiB
NASM

; ***************************************************************************
; copyright : (C) 2023 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. *
; ***************************************************************************
; doesn't work, yet
; ***************************************************************************
; data
.dseg
.equ CNY70_FLAGS_ADC_STARTED = 0x01
.equ CNY70_FLAGS_ADC_UPDATED = 0x02
cny70DataBegin:
cny70Flags: .byte 1
cny70LastData: .byte 1
cny70DataEnd:
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; Init module.
;
; IN:
; - nothing
; OUT:
; - CFLAG: set if okay, clear on error
; USED:
CNY70_Init:
; preset SRAM data area
ldi xh, HIGH(cny70DataBegin)
ldi xl, LOW(cny70DataBegin)
clr r16
ldi r17, (cny70DataEnd-cny70DataBegin)
rcall Utils_FillSram
; setup pins
sbi CNY70_LED_DDR, CNY70_LED_PIN ; set DATA port as output
sbi CNY70_LED_PORT, CNY70_LED_PIN ; LED off
cbi CNY70_ADC_PORT, CNY70_ADC_PIN ; disable internal pullup for ADC
cbi CNY70_ADC_DDR, CNY70_ADC_PIN ; set ADC port as input
ldi r16, CNY70_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
sec
ret
CNY70_Fini:
sec
ret
CNY70_Run:
lds r16, cny70Flags
andi r16, CNY70_FLAGS_ADC_UPDATED ; new value?
breq CNY70_Run_done ; nope, jump
rcall CNY70_SendAdc ; send value
brcc CNY70_Run_done ; jump on error
lds r16, cny70Flags ; value sent, clear flag
andi r16, ~CNY70_FLAGS_ADC_UPDATED
sts cny70Flags, r16
CNY70_Run_done:
clc
ret
CNY70_OnTimer:
lds r16, cny70Flags
andi r16, CNY70_FLAGS_ADC_STARTED
breq CNY70_OnTimer_startConversion
; conversion is running, complete?
sbic ADCSRA, ADSC
ret ; only if bit still set
; conversion complete, read value, set flags
lds r16, cny70Flags
andi r16, ~CNY70_FLAGS_ADC_STARTED
ori r16, CNY70_FLAGS_ADC_UPDATED
sts cny70Flags, r16
in r16, ADCH ; read value from ADC
sts cny70LastData, r16
sbi CNY70_LED_PORT, CNY70_LED_PIN ; LED off
nop
nop
nop
ret
CNY70_OnTimer_startConversion:
cbi CNY70_LED_PORT, CNY70_LED_PIN ; LED on
lds r16, cny70Flags
ori r16, CNY70_FLAGS_ADC_STARTED
sts cny70Flags, r16
sbi ADCSRA, ADSC ; start conversion
ret
CNY70_SendAdc:
ldi r16, 0xff ; destination address
ldi r17, VALUE_ID_ADC ; value id
ldi r22, AQHOME_VALUETYPE_UNKNOWN
lds r18, cny70LastData ; value
clr r19
ldi r20, 1 ; denominator
clr r21
ldi xl, LOW(com2SendBuffer)
ldi xh, HIGH(com2SendBuffer)
rcall CPRO_WriteReportValue
rjmp COM2_SendPacket