Le avr libc, sono parte integrante del compilatore avr-gcc, ti mettono a disposizione varie funzioni per la gestione della EEPROM, si spazia dalla semplice scrittura/lettura di una cella fino ad arrivare alla gestione delle varie tipologie di dati in modo "trasparente" al tuo codice.
In particolare abbiamo il gruppo delle AvrLibc EEMEM function che ti permettono di memorizzare nella EEPROM dei dati quasi allo stesso modo con cui lo fai nella ram.
Elenco funzioni EEMEM:
/************** AvrLibc EEMEM function *****************
uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__
uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__
uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__
float eeprom_read_float (const float *__p) __ATTR_PURE__
void eeprom_read_block (void *__dst, const void *__src, size_t __n)
void eeprom_write_byte (uint8_t *__p, uint8_t __value)
void eeprom_write_word (uint16_t *__p, uint16_t __value)
void eeprom_write_dword (uint32_t *__p, uint32_t __value)
void eeprom_write_float (float *__p, float __value)
void eeprom_write_block (const void *__src, void *__dst, size_t __n)
void eeprom_update_byte (uint8_t *__p, uint8_t __value)
void eeprom_update_word (uint16_t *__p, uint16_t __value)
void eeprom_update_dword (uint32_t *__p, uint32_t __value)
void eeprom_update_float (float *__p, float __value)
void eeprom_update_block (const void *__src, void *__dst, size_t __n)
*********************************************************/
Al lato pratico per usare queste funzioni come prima cosa devi includere eeprom.h, dichiari la varie variabili usando la EEMEM, dopo di che puoi leggerle e scriverle nel solito modo, sempre usando EEMEM.
Esempio pratico con tre variabili diverse.
#include <avr/eeprom.h>
// dichiarazione variabili EEPROM, devono essere globali
uint32_t EEMEM variabile_1_EEP;
uint16_t EEMEM variabile_2_EEP;
uint8_t EEMEM variabile_3_EEP;
// dichiarazione variabili RAM, non sono necessarie se usi i valori EEPROM
// direttamente senza doverli elaborare
uint32_t variabile_1;
uint16_t variabile_2;
uint8_t variabile_3;
/* codice dentro la setup/loop */
// lettura dati da EEPROM
variabile_1 = eeprom_read_dword(&variabile_1_EEP);
variabile_2 = eeprom_read_word(&variabile_2_EEP);
variabile_3 = eeprom_read_byte(&variabile_3_EEP);
// scrittura dati in EEPROM, il metodo update prima di scrivere legge il contenuto
// della EEPROM e solo se è diverso dal valore in ram scrive la EEPROM
// in questo modo si preserva la vita della EEPROM
eeprom_update_dword(&variabile_1_EEP, variabile_1);
eeprom_update_word(&variabile_2_EEP, variabile_2);
eeprom_update_byte(&variabile_3_EEP, variabile_3);
In pratica grazie ad EEMEM non devi "impazzire" per gestire le singole celle della EEPROM e scomporre/ricomporre i byte che compongono i vari tipi di dato.