From ebba98ef162ec35f7ae8e4abf570202d72eaad27 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 21 Apr 2025 00:43:50 +0200 Subject: [PATCH] si7021: honour PRESENT flag, added GetValue --- avr/modules/si7021/main.asm | 50 ++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/avr/modules/si7021/main.asm b/avr/modules/si7021/main.asm index 0ccc96e..8f146c8 100644 --- a/avr/modules/si7021/main.asm +++ b/avr/modules/si7021/main.asm @@ -1,5 +1,5 @@ ; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss +; copyright : (C) 2025 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** @@ -12,6 +12,8 @@ ; *************************************************************************** ; defines +.equ SI7021_FLAGS_PRESENT_BIT = 7 + .equ SI7021_FLAGS_PRESENT = 0x80 .equ SI7021_FLAGS_TEMP_VALID = 0x40 .equ SI7021_FLAGS_HUM_VALID = 0x20 @@ -19,6 +21,10 @@ .equ SI7021_FLAGS_ERROR_MASK = 0x07 +.equ SI7021_VALUE_TEMP = 0x01 +.equ SI7021_VALUE_HUMIDITY = 0x02 + + ; *************************************************************************** ; data @@ -105,6 +111,8 @@ SI7021_OnTimer: push r15 cli lds r17, si7021Flags + sbrs r17, SI7021_FLAGS_PRESENT_BIT ; investigate PRESENT BIT + rjmp SI7021_OnTimer_error ; jmp if PRESENT bit clear mov r16, r17 andi r16, SI7021_FLAGS_LASTWASTEMP 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: lds r16, si7021Flags