si7021: honour PRESENT flag, added GetValue

This commit is contained in:
Martin Preuss
2025-04-21 00:43:50 +02:00
parent b995f1c3fb
commit ebba98ef16

View File

@@ -1,5 +1,5 @@
; *************************************************************************** ; ***************************************************************************
; copyright : (C) 2023 by Martin Preuss ; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de ; email : martin@libchipcard.de
; ;
; *************************************************************************** ; ***************************************************************************
@@ -12,6 +12,8 @@
; *************************************************************************** ; ***************************************************************************
; defines ; defines
.equ SI7021_FLAGS_PRESENT_BIT = 7
.equ SI7021_FLAGS_PRESENT = 0x80 .equ SI7021_FLAGS_PRESENT = 0x80
.equ SI7021_FLAGS_TEMP_VALID = 0x40 .equ SI7021_FLAGS_TEMP_VALID = 0x40
.equ SI7021_FLAGS_HUM_VALID = 0x20 .equ SI7021_FLAGS_HUM_VALID = 0x20
@@ -19,6 +21,10 @@
.equ SI7021_FLAGS_ERROR_MASK = 0x07 .equ SI7021_FLAGS_ERROR_MASK = 0x07
.equ SI7021_VALUE_TEMP = 0x01
.equ SI7021_VALUE_HUMIDITY = 0x02
; *************************************************************************** ; ***************************************************************************
; data ; data
@@ -105,6 +111,8 @@ SI7021_OnTimer:
push r15 push r15
cli cli
lds r17, si7021Flags lds r17, si7021Flags
sbrs r17, SI7021_FLAGS_PRESENT_BIT ; investigate PRESENT BIT
rjmp SI7021_OnTimer_error ; jmp if PRESENT bit clear
mov r16, r17 mov r16, r17
andi r16, SI7021_FLAGS_LASTWASTEMP andi r16, SI7021_FLAGS_LASTWASTEMP
brne SI7021_OnTimer_hum brne SI7021_OnTimer_hum
@@ -444,6 +452,46 @@ si7021Muls16x16_32_done:
; ---------------------------------------------------------------------------
; @routine SI7021_GetValue @global
;
; @param R16 value to get (SI7021_VALUE_TEMP, SI7021_VALUE_HUMIDITY)
; @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 R16
SI7021_GetValue:
cpi r16, SI7021_VALUE_TEMP
breq SI7021_GetValue_temp
cpi r16, SI7021_VALUE_HUMIDITY
breq SI7021_GetValue_hum
SI7021_GetValue_clcRet:
clc
ret
SI7021_GetValue_temp:
lds r16, si7021Flags
andi r16, SI7021_FLAGS_TEMP_VALID
breq SI7021_GetValue_clcRet
lds r18, si7021LastTemp ; value
lds r19, si7021LastTemp+1
ldi r20, 100 ; denominator
rjmp SI7021_GetValue_finishValue
SI7021_GetValue_hum:
lds r16, si7021Flags
andi r16, SI7021_FLAGS_HUM_VALID
breq SI7021_GetValue_clcRet
lds r18, si7021LastHumidity ; value
lds r19, si7021LastHumidity+1
ldi r20, 1 ; denominator
SI7021_GetValue_finishValue:
clr r21
sec
ret
; @end
SI7021_SendTemp: SI7021_SendTemp:
lds r16, si7021Flags lds r16, si7021Flags