La memoria EEPROM



La memoria EEPROM e' un modulo di memoria all'interno del microcontrollore in grado di mantenere le informazioni anche a sistema spento. La memoria e' costituita da 64 byte in tutto, accessibili sia in lettura che in scrittura tramite quattro appositi registri, cioe':
  • EECON1
  • EECON2
  • EEDATA
  • EEADR
Il registro EEDATA, mappato in RAM alla locazione 0x08 e banco 0, funziona da porta di ingresso/uscita  per i dati rispettivamente da e verso la EEPROM; in soldoni si puo' dire che tale registro contiene il byte da leggere/scrivere nella EEPROM.
EEADR, mappato in RAM alla locazione 0x09 e banco 0, serve per specificare la locazione di memoria da accedere in memoria EEPROM (cioe' per specificare in che locazione della EEPROM andra' scritto il byte contenuto in EEDATA, oppure per specificare la locazione della EEPROM da leggere) .
La EEPROM permette unicamente di leggere o scrivere un byte alla volta. Una scrittura implica automaticamente la cancellazione del byte precedentemente memorizzato in quella cella di memoria, mentre una lettura non produce alcuna modifica nei dati della EEPROM.
I registri EECON1 e EECON2 sono due registri ausiliari utilizzati per "comandare" la EEPROM posizionati rispettivamente alle locazioni 0x08 e 0x09 del banco 1 della RAM.
EECON1 e' il registro di controllo con implementati solo i cinque bit meno significativi. I bit di controllo RD e WR avviano rispettivamente il processo di lettura e scrittura delle EEPROM; questi due bit possono solo essere settati ad 1, mentre invece vengono riportati a 0 dal pic al completamento della fase di lettura (se RD) e scrittura (se WR).
Il bit WREN (WRite ENable) abilita o disabilita le scritture nella EEPROM; quando viene settato ad 1 permette di effettuare le scritture, quando e' settato a 0 le scritture sono inibite. Al reset del microcontrolle tale bit e' settato a 0.
Il bit WRERR viene settato ad 1 dal pic quando o un reset oppure un time-out del watch dog ha interrotto prematuramente una scrittura nella EEPROM (va ricordato che la scrittura nella EEPROM e' una operazione relativamente lenta se rapportata alla velocita' di esecuzione delle istruzioni di programma).
Il bit EEIF funge da indicatore per il completamento della fase di scrittura. Prima di iniziare una scrittura deve essere posto a 0 e viene posto automaticamente ad 1 dal pic quando la scrittura e' terminata.




Registro EECON1



Il registro EECON2 e' un semplice registro di appoggio utilizzato esclusivamente nella fase di scrittura della EEPROM. Prima di poter scrivere un byte nella EEPROM occorre scrivere in EECON2 una serie prestabilita di valori, cioe' una specie di sequenza di avvio, in grado di abilitare la EEPROM a ricevere il byte in questione. La sequenza deve essere ripetuta ogni volta che si vuole memorizzare un byte.



Lettura



Leggere un byte dalla EEPROM e' estremamente semplice. Per prima cosa occorre scrivere in EEADR l'indirizzo del byte che si vuole leggere e poi settare ad 1 il bit di avvio di lettura (bit RD del registro EECON1). Al prossimo ciclo macchina (4 colpi di clock) il registro EEDATA si carica automaticamente con il valore del byte richiesto che quindi puo' essere letto.

Esempio:
Leggere dalla EEPROM il byte alla locazione 0x0C e memorizzarlo nel registro di lavoro W

BCF    0x03,5         ;selezione del banco RAM 0
MOVLW  0x0C           ;l'indirizzo al quale leggere
MOVWF  0x09           ;lo metto in EEADR 
BSF    0x03,5         ;selezione del banco RAM 1
BSF    0x08,0         ;setto a 1 il bit RD di EECON1
;adesso EEDATA contiene il valore del byte cercato
BCF    0x03,0         ;selezione del banco RAM 0
MOVF   0x08,0         ;copio il valore di EEDATA in W





Scrittura



L'operazione di scrittura di un byte in EEPROM e' relativamente piu' complicata. Per prima cosa occorre disabilitare gli interrupt impostando a 0 il bit GIE di INTCON: in questo modo eventuali interruzioni non verranno prese in considerazione e non andranno a disturbare il processo di scrittura in EEPROM. Adesso occorre impostare in EEADR l'indirizzo al quale vogliamo scrivere il byte ed il registro EEDATA deve essere caricato con il byte in questione. Poi il bit WREN di EECON1 deve essere portato ad 1 per abilitare la scrittura.
Fatto cio' occorre seguire una sequenza standard in grado di attivare la scrittura in EEPROM:

  • Scrittura del valore 0x55 in EECON2
  • Scrittura del valore 0xAA in EECON2
  • Impostare ad 1 il bit WR di EECON1 per avviare la scrittura
  • Riabilitare gli interrupt impostando a 1 il bit GIE di INTCON
Tale sequenza deve essere ripetuta per ogni byte che si vuole scrivere in EEPROM. La disabilitazione degli interrupt non e' obbligatoria ma e' considerata una buona pratica per evitare problemi di scrittura qualora questa venisse interrotta prematuramente da una interruzione esterna.
Al termine della scrittura il bit WR viene automaticamente impostato a 0 mentre il bit EEIF viene posto a 1.
Il programma utente puo' sapere quando avviene il completamento della scrittura semplicemente verificando in un loop il valore del bit WR oppure tramite il piu' efficiente meccanismo delle interruzioni.
Da notare che il bit WREN di abilitazione NON viene riportato a 0 automaticamente, quindi per effettuare una nuova scrittura occorrera' reipostarlo ad 1.
Ecco un esempio di scrittura in EEPROM:

Esempio:
Scrive nella EEPROM il valore 0x02 alla locazione 0x10

BCF    0x03,5         ;selezione del banco RAM 0
MOVLW  0x02
MOVWF  0x08           ;scrive 0x02 in EEDATA
MOVLW  0x10
MOVWF  0x09           ;scrive 0x10 in EEADR

BSF    0x03,5         ;selezione del banco RAM 1
BCF    0x0B,7         ;disabilita tutti gli interrupt
;inizio sequenza di avvio scrittura
BSF    0x08,2         ;imposta ad 1 il bit WREN
MOVLW  0x55
MOVWF  0x09           ;inserisco 0x55 in EECON2
MOVLW  0xAA
MOVWF  0x09           ;inserisco 0xAA in EECON2
BSF    0x08,1         ;bit WR ad 1 -> inizio scrittura
BSF    0x0B,7         ;riabilita gli interrupt
;fine della sequenza