salvare dati su eepron

salve,
come da titolo avrei bisogno per favore d'aiuto nel salvare dei dati sulla eepron... (utilizzo un Mini Pro)
non avendolo mai fatto non vorrei fare "casini"

ho dei dati che sono fissi (colonna in giallo) e due dati variabili (in verde) dove il secondo è decimale... la colonna in rosso è ottenuta dalla divisione dalle due colonne verdi....

io avrei bisogno di salvare appunto questi due valori "verdi"...

potete aiutarmi nel farlo e se ci sono degli esempi simili da dove trarre spunto tanto meglio...
grazie mille
Roberto

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.

Buon giorno,
grazie mille per la dritta... almeno ho una base di partenza
anche se per me è abbastanza arabo...
siccome per fare il calcolo che mi serve ho dovuto convertire in numeri in "float" e forse le cose si complicano?

grazie
Roberto

>0101001000: Ti allego un interessante documento sulla EEPROM che ti consiglio di studiare attentamente :wink:

Guglielmo

EEPROM.pdf (181 KB)