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