Salvataggio dati complessi in EEprom

Illustro in questo articolo due semplici funzioni utilizzabili per salvare e recuperare da eeprom (sia interna che esterna) dati in formato “complesso”, ovvero variabili float, strutture e qualsiasi altro tipo di dato con una lunghezza superiore ad 8 bit. Le due funzioni in questione si appoggiano a funzioni “semplici” qualsiasi in grado di scrivere e leggere un dato ad 8 bit da eeprom.

Per maggiori informazioni e funzioni su come utilizzare l’ eeprom interna fate riferimento a questo articolo, per le eeprom esterne fate riferimento a quest’altro articolo.

Le due funzioni a cui ci appoggiamo sono EEPROM_WRITE che è quella in grado di scrivere su eeprom un dato ad 8 bit (ricordo che alle funzioni di scrittura va sempre passato il valore della variabile e la cella di memoria in cui scrivere) e quindi EEPROM_READ la funzione in grado di leggere il valore contenuto nel numero di cella passato come argomento. Queste due funzioni di base sono già definite nel compilatore della Hitech per l’utilizzo dell’eeprom interna. Nel caso in cui il vostro compilatore non supporti tali funzioni o avete necessità di sfruttare le routine di salvataggio dati complessi con eeprom esterne, modificate i nomi di queste due funzioni e soprattutto fate attenzione al giusto ordine degli argomenti per la funzione EEPROM_WRITE.

//*****************************************************************************
//Funzione per salvare dati complessi in EEPROM
//*****************************************************************************
void to_eeprom (void *ptr,unsigned char dim,unsigned char start_position)
{
 unsigned char k,mom;
 for (k=0;k<dim;k++)
 {
 mom = ((unsigned char*) ptr)[k];
 EEPROM_WRITE(start_position+k,mom);
 }    
 
 return;
}
//*****************************************************************************
//Funzione per recuperare dati complessi in EEPROM
//*****************************************************************************
void from_eeprom (void *ptr,unsigned char dim,unsigned char start_position)
{
 unsigned char k,mom;
 for (k=0;k<dim;k++)
 {
 mom = EEPROM_READ(start_position+k);
 ((unsigned char*) ptr)[k]=mom;
 }    
 
 return;
}
//**************************************************************************/

Il funzionamento è molto semplice: la funzione di scrittura (to_eeprom) accetta in ingresso un puntatore a void, ossia un puntatore a qualsiasi tipo di dato, viene quindi fornita la lunghezza del tipo di dato da salvare e infine il primo indirizzo in cui cominciare a salvare. All’interno della funzione, viene eseguito un cast del tipo di dati in char, il vettore passato come argomento viene quindi scansionato come fosse un array di char, ogni singolo byte viene quindi salvato con una funzione standard di scrittura.

La funzione di lettura (from_eeprom) funziona all’inverso e il primo parametro è un puntatore in cui andare a salvare i dati recuperati dall’eeprom.

Esempio di utilizzo con variabili float

Questo esempio salva la variabile float dato nell’eeprom a partire dalla locazione 0x00, una variabile float in ram occupa normalmente 4bytes:

float dato=3.141592;
to_eeprom (&dato, 4, 0x00);

Per recuperare il dato si fa in maniera analoga:

float dato;
from_eeprom (&dato, 4, 0x00);

Esempio di utilizzo con strutture

Definisco una struttura di esempio composta da un char, un float e un intero a 16bit e la salvo in eeprom a partire dall’indirizzo 0x04:

struct struttura
{
char dato1; //occupa 1 byte
float dato2; //occupa 4 byte
int dato3; //occupa 2 byte
} test_struttura; // il tipo di dato "struttura" occupa 7 byte: 1+4+2
 
to_eeprom(&test_struttura,7, 0x04);

Per recuperare la struttura:

from_eeprom(&test_struttura, 7,0x04);

Possiamo utilizzare le funzioni anche su array di strutture:

struct struttura test_array_di_strutture[5]; // questo array occupa 7*5=35 byte
to_eeprom(&test_array_di_strutture,7*5, 0x40); // scrivo a partire da 0x40
from_eeprom(&test_array_di strutture, 7*5,0x40); // leggo

Le funzioni sono state testate con Hitech-C per PIC18 ma dovrebbero funzionare correttamente con qualiasi compilatore ANSI.

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)