Started working on CNY70 module (doesn't work, yet).

This commit is contained in:
Martin Preuss
2023-05-02 00:03:41 +02:00
parent bcf1674b3b
commit 4a093905e8
6 changed files with 257 additions and 4 deletions

View File

@@ -21,12 +21,12 @@
; AtTiny84
; --------
; VCC 1 14 GND
; PB0 2 13 PA0
; PB0 2 13 PA0 REED_OUT
; PB1 3 12 PA1 COM-DATA
; /RESET PB3 4 11 PA2 [OWI]
; /RESET PB3 4 11 PA2 REED_IN1
; [KEY1] PB2 5 10 PA3 LED
; COM_ATTN PA7 6 9 PA4 TWI-SCL
; TWI-SDA PA6 7 8 PA5
; TWI-SDA PA6 7 8 PA5 REED_IN2
; --------
;
; ***************************************************************************
@@ -67,6 +67,7 @@
;#define MODULES_LCD
#define MODULES_SI7021
#define MODULES_STATS
;#define MODULES_CNY70
.set MODULES_MASK = 0
@@ -91,6 +92,10 @@
#ifdef MODULES_STATS
.set MODULES_MASK = MODULES_MASK | (1<<AQHOME_FW_MODULE_STATS)
#endif
#ifdef MODULES_CNY70
.set MODULES_MASK = MODULES_MASK | (1<<AQHOME_FW_MODULE_CNY70)
#endif
; ---------------------------------------------------------------------------
@@ -102,6 +107,7 @@
.equ VALUE_ID_TEMP1 = 0x01
.equ VALUE_ID_HUM1 = 0x02
.equ VALUE_ID_ADC = 0x03
; ---------------------------------------------------------------------------
@@ -162,6 +168,21 @@
; ---------------------------------------------------------------------------
; ADC/CNY70
.equ CNY70_PORT_LED = PORTB1
.equ CNY70_DDR_LED = DDRB
.equ CNY70_PINNUM_LED = PORTB1
.equ CNY70_PORT_ADC = PORTA5 ; adc5
.equ CNY70_DDR_ADC = DDRB
.equ CNY70_PINNUM_ADC = PORTA5
.equ CNY70_MUX_ADC = MUX5
.equ CNY70_ADCSRB_ADC = ADC5D
; ***************************************************************************
@@ -189,7 +210,11 @@
reti ; OC0B
reti ; OVF0
reti ; ACI
reti ; ADCC
#ifdef MODULES_CNY70
rjmp cny70Isr ; ADCC
#else
reti ; ADCC
#endif
reti ; ERDY
reti ; USI_STR
reti ; USI_OVF
@@ -242,6 +267,9 @@ firmwareStart: rjmp main
#ifdef MODULES_STATS
.include "modules/stats/main.asm"
#endif
#ifdef MODULES_CNY70
.include "modules/cny70/main.asm"
#endif
@@ -260,6 +288,9 @@ sramTimerEnqueueValues: .byte 2
sramTimerSI7021SendTemp: .byte 2
sramTimerSI7021SendHumidity: .byte 2
#endif
#ifdef MODULES_CNY70
sramTimerCny70SendAdc: .byte 2
#endif
#ifdef MODULES_LCD
sramPeriodicalLcdMark: .byte 2
#endif
@@ -297,6 +328,9 @@ timerList:
.dw sramTimerSI7021Measure, SI7021_PeriodicMeasurement, 0, 30 ; every 30s
.dw sramTimerSI7021SendTemp, sendTemp, TIMER_FLAGS_IF_ADDR, 60 ; every 60s
.dw sramTimerSI7021SendHumidity, sendHumidity, TIMER_FLAGS_IF_ADDR, 60 ; every 60s
#endif
#ifdef MODULES_CNY70
.dw sramTimerCny70SendAdc, sendAdc, TIMER_FLAGS_IF_ADDR, 30 ; every 30s
#endif
.dw 0 ; end of list
@@ -354,6 +388,20 @@ sendTemp_okay:
#ifdef MODULES_CNY70
sendAdc:
rcall CNY70_SendAdc
brcs sendAdc_okay
; set timer to 1s to retry later
ldi xl, LOW(sramTimerCny70SendAdc)
ldi xh, HIGH(sramTimerCny70SendAdc)
rjmp Timer_SetValueTo1s
sendAdc_okay:
ret
#endif
; ---------------------------------------------------------------------------
; Called every 100ms. Add your routine calls here. No arguments, no results.
@@ -366,6 +414,11 @@ onEvery100ms:
ldi yh, HIGH(ledA3Sram)
rcall Led_Tick
#endif
#ifdef MODULES_CNY70
rcall CNY70_Every100ms
#endif
ret

View File

@@ -9,6 +9,7 @@
.equ AQHOME_VALUETYPE_UNKNOWN = 0
.equ AQHOME_VALUETYPE_TEMP = 1
.equ AQHOME_VALUETYPE_HUMIDITY = 2
@@ -21,6 +22,7 @@
.equ AQHOME_FW_MODULE_LCD = 5
.equ AQHOME_FW_MODULE_SI7021 = 6
.equ AQHOME_FW_MODULE_STATS = 7
.equ AQHOME_FW_MODULE_CNY70 = 8
.equ AQHOME_FW_TYPE_ATT84_BASE = 0

View File

@@ -136,6 +136,10 @@ initModules:
rcall Stats_Init
#endif
#ifdef MODULES_CNY70
rcall CNY70_Init
#endif
; done
ret

View File

@@ -4,6 +4,7 @@
<subdirs>
bmp280
cny70
com2
comproto
flash

11
avr/modules/cny70/0BUILD Normal file
View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
main.asm
</extradist>
</gwbuild>

182
avr/modules/cny70/main.asm Normal file
View File

@@ -0,0 +1,182 @@
; ***************************************************************************
; 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_FINISHED = 0x02
.equ CNY70_FLAGS_ADC_VALID = 0x04
.equ CNY70_TIMER_100MS = 20 ; every 2s
cny70DataBegin:
cny70Flags: .byte 1
cny70LastData: .byte 1
cny70TimerCounter: .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 and interrupts
sbi CNY70_DDR_LED, CNY70_PINNUM_LED ; set DATA port as output
cbi CNY70_PORT_LED, CNY70_PINNUM_LED ; LED off
cbi CNY70_PORT_ADC, CNY70_PINNUM_ADC ; disable internal pullup for ADC
cbi CNY70_DDR_ADC, CNY70_PINNUM_ADC ; set ADC port as input
ldi r16, (1<<ADLAR) | (1<<CNY70_ADCSRB_ADC) ; "8 bit" mode, disable digital pin input buffer
out ADCSRB, r16
sec
ret
CNY70_Fini:
sec
ret
CNY70_Run:
ret
CNY70_Every100ms:
push r15
in r15, SREG
cli
lds r16, cny70Flags
andi r16, CNY70_FLAGS_ADC_STARTED
brne CNY70_Every100ms_done
lds r16, cny70TimerCounter
inc r16
cpi r16, CNY70_TIMER_100MS
brcc CNY70_Every100ms_startConversion
sts cny70TimerCounter, r16
rjmp CNY70_Every100ms_done
CNY70_Every100ms_startConversion:
clr r16
sts cny70TimerCounter, r16
rcall cny70StartConversion
CNY70_Every100ms_done:
out SREG, r15
pop r15
ret
cny70StartConversion:
sbi CNY70_PORT_LED, CNY70_PINNUM_LED ; LED on
nop
nop
nop
; setup adc
ldi r16, CNY70_MUX_ADC
out ADMUX, r16
; enable adc, enable irq, clear irq, select prescaler 8 (125kHz)
ldi r16, (1<<ADEN) | (1<<ADIE) | (1<<ADIF) | (1<<ADPS1) | (1<<ADPS0)
out ADCSRA, r16
sbic ADCSRA, ADSC ; start conversion
push r15
in r15, SREG
cli
lds r16, cny70Flags
ori r16, CNY70_FLAGS_ADC_STARTED
andi r16, ~CNY70_FLAGS_ADC_FINISHED
sts cny70Flags, r16
out SREG, r15
pop r15
ret
cny70Isr:
push r15
in r15, SREG
push r16
cbi CNY70_PORT_LED, CNY70_PINNUM_LED ; LED off
in r16, ADCH
sts cny70LastData, r16 ; store value
clr r16 ; disable ADC
out ADCSRA, r16
lds r16, cny70Flags
ori r16, CNY70_FLAGS_ADC_FINISHED | CNY70_FLAGS_ADC_VALID
andi r16, ~CNY70_FLAGS_ADC_STARTED
sts cny70Flags, r16
pop r16
out SREG, r15
pop r15
reti
CNY70_SendAdc:
lds r16, cny70Flags
andi r16, CNY70_FLAGS_ADC_VALID
brne CNY70_SendAdc_haveValue
sec
ret
CNY70_SendAdc_haveValue:
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_WriteValue
rjmp COM2_SendPacket