re-enabled CCS811 module, adapted to latest changes.

This commit is contained in:
Martin Preuss
2025-06-05 22:44:27 +02:00
parent 08a1313ba5
commit 284539fd52
4 changed files with 87 additions and 88 deletions

View File

@@ -144,6 +144,9 @@
#ifdef MODULES_CCS811
.include "modules/ccs811/main.asm"
#ifdef MODULES_NETWORK
.include "modules/ccs811/send.asm"
#endif
#endif
#ifdef MODULES_TCRT1000

View File

@@ -154,6 +154,10 @@ sysOnEveryMinute:
bigcall AppStats_OnEveryMinute
#endif
#ifdef MODULES_CCS811
bigcall CCS811_OnEveryMinute
#endif
bigjmp onEveryMinute
; @end

View File

@@ -16,6 +16,8 @@
.equ CCS811_FLAGS_RESETTED = 0x40
.equ CCS811_FLAGS_VALIDDATA = 0x20
.equ CCS811_VALUE_TVOC = 0x01
.equ CCS811_VALUE_CO2 = 0x02
.equ CCS811_WAITMS_AFTER_RESET = 50
.equ CCS811_WAITMS_AFTER_START = 50
@@ -38,7 +40,6 @@
.equ CCS811_MEASUREMODE = (0<<CCS811_MEASUREMODE_DM2_BIT) | (1<<CCS811_MEASUREMODE_DM1_BIT) | (1<<CCS811_MEASUREMODE_DM0_BIT)
;.equ CCS811_MEASUREMODE = (0<<CCS811_MEASUREMODE_DM2_BIT) | (1<<CCS811_MEASUREMODE_DM1_BIT) | (0<<CCS811_MEASUREMODE_DM0_BIT)
.equ CCS811_INTERVAL = 60
; ***************************************************************************
@@ -48,7 +49,6 @@
ccs811DataBegin:
ccs811Flags: .byte 1
ccs811Timer: .byte 1
ccs811ResponseData: .byte 5
ccs811DataEnd:
@@ -80,9 +80,6 @@ CCS811_Init:
ldi r17, (ccs811DataEnd-ccs811DataBegin)
rcall Utils_FillSram
ldi r16, CCS811_INTERVAL
sts ccs811Timer, r16
; check for fw mode, valid app
rcall ccs811ReadStatus
brcc CCS811_Init_error
@@ -160,66 +157,28 @@ CCS811_Fini:
; - CFLAG: set if okay, clear on error
; USED:
CCS811_OnTimer:
CCS811_OnEveryMinute:
in r15, SREG
push r15
cli
lds r16, ccs811Flags
andi r16, CCS811_FLAGS_ACTIVATED
breq CCS811_OnTimer_ret
lds r16, ccs811Timer
dec r16
cpi r16, 2
breq CCS811_OnTimer_measure
cpi r16, 1
breq CCS811_OnTimer_sendCO2
tst r16
breq CCS811_OnTimer_sendTVOC
sts ccs811Timer, r16
rjmp CCS811_OnTimer_ret
CCS811_OnTimer_measure:
lds r16, ccs811Flags
andi r16, ~CCS811_FLAGS_VALIDDATA
sts ccs811Flags, r16
rcall ccs811ReadMeasurement
; brcc CCS811_OnTimer_ret
brcc CCS811_OnTimer_storetimerret
; rcall ccs811SendDebug ; debug
brcc CCS811_OnTimer_ret
lds r16, ccs811ResponseData+4
andi r16, (1<<CCS811_STATUS_DATAREADY_BIT)
; breq CCS811_OnTimer_ret
breq CCS811_OnTimer_storetimerret ; jmp if data not ready
breq CCS811_OnTimer_ret ; jmp if data not ready
lds r16, ccs811Flags
ori r16, CCS811_FLAGS_VALIDDATA
sts ccs811Flags, r16
rjmp CCS811_OnTimer_storetimerret
CCS811_OnTimer_sendCO2:
lds r16, ccs811Flags
andi r16, CCS811_FLAGS_VALIDDATA
; breq CCS811_OnTimer_ret
breq CCS811_OnTimer_storetimerret
rcall ccs811SendCo2
rjmp CCS811_OnTimer_storetimerret
CCS811_OnTimer_sendTVOC:
lds r16, ccs811Flags
andi r16, CCS811_FLAGS_VALIDDATA
; breq CCS811_OnTimer_ret
breq CCS811_OnTimer_storetimerret
rcall ccs811SendTvoc
; rjmp CCS811_OnTimer_storetimerret
CCS811_OnTimer_storetimerret:
lds r16, ccs811Timer
dec r16
brne CCS811_OnTimer_storetimer
ldi r16, CCS811_INTERVAL
CCS811_OnTimer_storetimer:
sts ccs811Timer, r16
CCS811_OnTimer_ret:
pop r15
out SREG, r15
clc
ret
@@ -405,54 +364,43 @@ ccs811ReadData_error:
; @end
ccs811SendDebug:
ldi r16, 0xff ; destination address
ldi r17, VALUE_ID_DEBUG ; value id
ldi r22, 0
lds r18, ccs811ResponseData ; value
lds r19, ccs811ResponseData+1
lds r20, ccs811ResponseData+2
lds r21, ccs811ResponseData+3
ldi xl, LOW(com2SendBuffer)
ldi xh, HIGH(com2SendBuffer)
rcall CPRO_WriteReportValue
rjmp COM2_SendPacket
; ---------------------------------------------------------------------------
; @routine CCS811_GetValue @global
;
; @param R16 value to get (CCS811_VALUE_TVOC, CCS811_VALUE_CO2)
; @return CFLAG set if value available, cleared otherwise
; @return R19:R18 value
; @return R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @clobbers
ccs811SendCo2:
ldi r17, VALUE_ID_CO2 ; value id
ldi r22, AQHOME_VALUETYPE_CO2
lds r18, ccs811ResponseData+1 ; value
lds r19, ccs811ResponseData
rjmp ccs811SendAny
ccs811SendTvoc:
ldi r17, VALUE_ID_TVOC ; value id
ldi r22, AQHOME_VALUETYPE_TVOC
lds r18, ccs811ResponseData+3 ; value
lds r19, ccs811ResponseData+2
rjmp ccs811SendAny
ccs811SendAny:
mov r16, r18 ; check for FF FF
and r16, r19
inc r16
brne ccs811SendAny_send ; send only if data is not FFFF
CCS811_GetValue:
lds r17, ccs811Flags
andi r17, CCS811_FLAGS_VALIDDATA
breq CCS811_GetValue_noData
cpi r16, CCS811_VALUE_TVOC
breq CCS811_GetValue_retTvoc
cpi r16, CCS811_VALUE_CO2
breq CCS811_GetValue_retCo2
CCS811_GetValue_noData:
clc
ret
ccs811SendAny_send:
ldi r16, 0xff ; destination address
CCS811_GetValue_retTvoc:
lds r18, ccs811ResponseData+3 ; value
lds r19, ccs811ResponseData+2
ldi r20, 1
clr r21
ldi xl, LOW(com2SendBuffer)
ldi xh, HIGH(com2SendBuffer)
rcall CPRO_WriteReportValue
rjmp COM2_SendPacket
rjmp CCS811_GetValue_secRet
CCS811_GetValue_retCo2:
lds r18, ccs811ResponseData+1 ; value
lds r19, ccs811ResponseData
ldi r20, 1
clr r21
CCS811_GetValue_secRet:
sec
ret
; @end

View File

@@ -0,0 +1,44 @@
; ***************************************************************************
; 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. *
; ***************************************************************************
.cseg
; ---------------------------------------------------------------------------
; @routine CCS811_SendTVOC
CCS811_SendTVOC:
ldi r16, CCS811_VALUE_TVOC
rcall CCS811_GetValue
brcc CCS811_SendTVOC_end
ldi r17, VALUE_ID_TVOC ; VALUE ID
ldi r22, AQHOME_VALUETYPE_TVOC ; VALUE TYPE
rcall Main_SendValueReport
CCS811_SendTVOC_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine CCS811_SendCO2
CCS811_SendCO2:
ldi r16, CCS811_VALUE_CO2
rcall CCS811_GetValue
brcc CCS811_SendCO2_end
ldi r17, VALUE_ID_CO2 ; VALUE ID
ldi r22, AQHOME_VALUETYPE_CO2 ; VALUE TYPE
rcall Main_SendValueReport
CCS811_SendCO2_end:
ret
; @end