Buona parte dei PIC contiene un' area di memoria realizzata
in tecnologia EEPROM.
Similmente alla FLASH, si tratta di memoria il cui contenuto
non è volatile, ovvero, una volta scritto, non va perso con la mancanza
della tensione di alimentazione.
Si tratta di un array separato sia dalla memoria programma
che dalla memoria dati,, dedicato al salvataggio di dati necessari al
programma e che possono essere conservati a lungo.
Ogni cella può essere scritta circa 1 m volte e mantiene i dati per 100
anni (... dato da verificare !).
Il suo contenuto può essere letto e scritto durante il normale
funzionamento del microcontroller, per tutto il range delle tensioni di
alimentazioni ammesse.
Non essendo sui bus dati i istruzioni, la EEPROM non è
accessibile direttamente, ma solamente attraverso l' indirizzamento
indiretto. La sua allocazione in memoria è nella parte più alta, ad
indirizzi assoluti da 0xF00000 in su.
A questo scopo sono disponibili 4 SFR:
-
EECON1
-
EECON2
-
EEDATA
-
EEADR
I primi due sono registri di controllo, in condivisione con
la memoria FLASH.
Le funzioni di EECON1 sono state dettagliate nelle pagine riguardanti la
memoria FLASH.
Come detto, il bit EEPGD a livello 0 indirizza le operazioni alla EEPROM.
CFGS a zero seleziona l' area di memoria.
EECON2, come detto, è un registro virtuale.
EEDATA è il registro in cui si scambiano i dati richiesti (analogo quindi
al TABLAT della FLASH) all' indirizzo indicato da EEADR.
La scrittura nella EEPROM richiede un meccanismo analogo a
quello della FLASH, ma è possibile scrivere byte per byte, con una evidente
velocizzazione dell' operazione.
Anche la lettura richiede l' uso degli SFR dedicati, ma è una operazione
molto semplice
I PIC18 dispongono generalmente fino a 256 bytes di EEPROM,
tutti indirizzabili con EEADR: F00000h sarà l' indirizzo relativo 00h,
F00001h sarà 01h e così via.
LETTURA della EEPROM
L' accesso alla lettura di un byte in EEPROM è
relativamente semplice e si compone di alcune fasi:
-
caricare l' indirizzo da leggere in EEADR
-
configurare EECON1 per l' accesso alla EEPROM (EEPGD e
CFGS = 0)
-
lanciare la lettura con il bit RD di EECON1
-
leggere il dato in EEDATA
Un esempio del codice
che può essere
messo come una macro o inserito in una subroutine per leggere un certo
numero di bytes.
Ad esempio, come subroutine:
;***************************************************************
; Lettura di 1 byte in
EEPROM - subroutine
;*********************************************************
; EEPRead - entrata con l' idirizzo da leggere in WREG
; EEPRd - entrata con l' indirizzo da leggere in
EEADR
; All' uscita della subroutine:
; - il contenuto di EEADR è incrermentato di 1
; - il dato letto si trova in WREG
;---------------------------------------------------------
EEPRead
movwf EEADR
; carica indirizzo
EEPRd
bcf EECON1, EEPGD ;
accesso alla EEPROM
bcf
EECON1, CFGS ; deseleziona zona
configurazione
bsf
EECON1, RD ; avvia
lettura
movf
EEDATA, W ;
trasferisci dato letto in WREG
incf
EEADR,f ;
EEADR = EEADR + 1
return
|
Da osservare che, a parte il tempo necessario per le diverse
operazioni, la lettura del dato in EEPROM non richiede temporizzazioni a
nessuna frequenza di clock.