Emulazione EEprom Dati su PIC24 e dsPIC

Non tutti sanno che i PIC24, dsPIC33 e PIC32 non hanno la memoria eeprom per il salvataggio permanente delle variabili. Apparentemente questo può sembrare un ostacolo insormontabile, soprattutto per quelle applicazioni in cui si rende necessario salvare alcuni flag o variabili a runtime da dover poi richiamare ed elaborare anche nei casi in cui venga tolta l’alimentazione.

L’utilizzo di una eeprom esterna è sicuramente la migliore scelta in ogni caso, però alcune volte può essere una scocciatura soprattutto nei casi in cui è necessario miniaturizzare il più possibile, evitare spese inutili o in quei casi in cui abbiamo pochi pin a disposizione. Per tale motivo la Microchip ha approntato una libreria che permette di emulare il funzionamento di una eeprom interna sfruttando la memoria programma.

E’ possibile realizzare questa funzionalità su tutti i picmicro che hanno la possibilità di riscriversi da soli la memoria programma, quindi tale libreria non è limitata soltanto ai pic di fascia alta ma è applicabile anche ad alcuni PIC18. Il vantaggio di questa emulazione è, a detta di microchip, una durata maggiore rispetto a quella offerta da una normale eeprom interna, tra poco capiremo il perchè di questa affermazione.

L’algoritmo alla base di questa libreria, chiamata DEE (Data EEprom Emulation), è abbastanza complesso ma molto semplice da implementare.

Funzionamento della libreria DEE sui pic a 16bit

Sui PIC24F la memoria programma è costituita da word di 24bit. La libreria DEE sfrutta tale word per memorizzare sia il dato che la locazione ad esso associata. In ogni word viene memorizzato il numero di locazione nei bit 23-16, mentre i restanti bit vengono utilizzati per contenere il dato che può quindi essere a 16bit:

Ogni singola memoria EEprom che andiamo ad emulare può contenere fino a 255 indirizzi. Possono essere emulate più EEprom e in questo caso avremo indirizzi continui: se emuliamo N eeprom, con 255 locazioni l’una (questi parametri sono impostabili nella libreria), abbiamo a disposizione gli indirizzi da 0 a (255*N) -1, quindi se emuliamo 2 eeprom abbiamo a disposizione 510 indirizzi (da 0 a 509). Abbiamo a disposizione una locazione in meno dato che questa viene riservata per il salvataggio di alcune informazioni necessarie all’algoritmo. In particolare nella prima locazione di ogni banco eeprom viene memorizzato negli 8 bit alti lo stato della pagina e nei 16 bit bassi il numero di cicli di cancellazione/scrittura dopo i quali la pagina viene dichiarata come “expired” e quindi non più da usare.

Al primo avvio, tutte le pagine si trovano in una condizione in cui gli indirizzi sono tutti a 0xFF e il contenuto a 0xFFFF. Supponiamo di voler memorizzare il valore 0x0202 nella locazione 2, abbiamo questa situazione:

Il dato viene in pratica memorizzato nella prima pagina di memoria programma libera (la prima pagina contiene lo stato e il numero di cicli di cancellazione/scrittura). Ora supponiamo di andare a scrivere il valore 0x0707 nella locazione 7, lo stato dell’eeprom emulata diventa il seguente:

in questa immagine probabilmente c’è un errore, il valore della prima pagina dovrebbe essere 0x0000

Immaginiamo adesso che un’operazione richieda di aggiornare il valore della locazione 2: che non debba più essere 0x0202 ma 0x2222, l’algoritmo ancora una volta memorizza il dato in una pagina vuota:

In fase di lettura, difatti, l’algoritmo scansiona tutte le pagine a ritroso (dal basso verso l’alto) per cercare l’ultimo dato valido per la locazione che gli abbiamo richiesto. Ecco perchè questo sistema aumenta la durata delle celle di memoria: si fa in modo di scrivere quante meno volte possibile sempre sulla stessa cella di memoria, allungandole quindi la vita!

Supponiamo di continuare a scrivere nella nostra eeprom emulata, si arriverà ad un punto in cui andremo a scrivere nell’ultima locazione, dopo la quale la memoria eeprom emulata è finita:

A questo punto l’algoritmo si accorge che l’eeprom a disposizione è esaurita ed esegue quindi un’operazione di compattazione durante la quale fa in modo da eliminare i dati inutili e lasciare unicamente gli ultimi dati aggiornati per ogni locazione, cancellando e liberando altre locazioni:

stato del banco eeprom dopo la compattazione

Solo a questo punto nella prima pagina il valore di numero di cicli viene impostato ad 1 per indicare che in questo banco c’è già stato 1 ciclo di cancellazione e riscrittura. Quando tale numero raggiunge il massimo, impostato in libreria, la pagina viene dichiarata expired e questo segnale viene memorizzato nel campo Page Status: ad ogni modo l’algoritmo prova lo stesso a scrivere se richiesto. Il campo page status contiene altri flag nei quali segnala varie condizioni anomale.

Utilizzo della libreria DEE

Nonostante tutto questo possa apparirvi complicato, l’utilizzo da parte dell’utente finale è semplicissimo. Abbiamo difatti a disposizione soltanto due funzioni come quando utilizziamo una normale eeprom interna: una funzione di scrittura, alla quale passiamo due parametri (locazione e dato da scrivere) e una funzione di lettura alla quale passiamo la locazione da leggere e che restituisce il valore letto:

unsigned int    DataEERead          (unsigned int addr);
unsigned char   DataEEWrite         (unsigned int data, unsigned int addr);

DataEEWrite restituisce 0 se la scrittura è andata a buon fine, 1 in caso contrario.

Per l’utilizzo nei propri programmi bisogna includere nel progetto i files DEE Emulation 16-bit.c e Flash Operations.s tra i sorgenti insieme al programma principale:

e quindi includere DEE Emulation 16-bit.h nel programma principale:

#include "DEE Emulation 16-bit.h"

Nel main bisogna includere all’inizio le seguenti due istruzioni:

DataEEInit();
dataEEFlags.val = 0;

Dopodichè possiamo utilizzare le funzioni di lettura e scrittura come abbiamo visto prima. La libreria di default permette di avere un’eeprom con 510 locazioni da 16bit l’una. Le impostazioni possono essere cambiate agendo nel file DEE Emulation 16-bit.h.

Download

La libreria è disponibile sul sito della Microchip insieme all’application note che ne illustra uso e funzionamento, a questo link.

Edit 27/07/2017: Quel link non è più funzionante (lo lascio per chi vuole provarci con la waybackmachine), la libreria ora si trova a questo link.

Per coloro che hanno una ORbit16™ ho preparato una demo già pronta all’uso che illustra come salvare un valore nell’eeprom emulata, leggerlo e mostrarlo sul display.

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 :)