; *************************************************************************** ; 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. * ; *************************************************************************** #ifndef AQH_AVR_COMMON_EEPROM_R_H #define AQH_AVR_COMMON_EEPROM_R_H ; --------------------------------------------------------------------------- ; @routine Eeprom_ReadByte ; ; Read a byte from EEPROM (see example in ATtiny24/44/84 manual p.19). ; ; @param X EEPROM Address to read from ; @return CFLAG set if address okay, cleared if out of range ; @return R16 byte read ; @return X EEPROM Address incremented ; @clobbers none Eeprom_ReadByte: rcall Eeprom_CheckAddr brcs Eeprom_ReadByte_addrOk ret Eeprom_ReadByte_addrOk: ; call routine with IRQs disabled push r15 inr r15, SREG cli rcall Eeprom_ReadByte_noirq outr SREG, r15 pop r15 sec ret Eeprom_ReadByte_noirq: ; wait until EEPROM ready Eeprom_ReadByte_waitLoop: .ifdef EEPE sbic EECR, EEPE ; wait for previous write to complete (if any) .else sbic EECR, EEWE ; wait for previous write to complete (if any) .endif rjmp Eeprom_ReadByte_waitLoop ; read from EEPROM out EEARH, xh ; set EEPROM address out EEARL, xl sbi EECR, EERE ; start EEPROM read by writing EERE in r16, EEDR ; read data from data register ret ; @end ; --------------------------------------------------------------------------- ; @routine Eeprom_CheckAddr ; ; ; @param X EEPROM Address to validate ; @return CFLAG set if address okay, cleared if out of range ; @clobbers r16 Eeprom_CheckAddr: mov r16, xl subi r16, LOW(EEPROMEND) mov r16, xh sbci r16, HIGH(EEPROMEND) ret ; @end #endif ; AQH_AVR_COMMON_EEPROM_R_H