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