Flash dati
L'area della Flash dati è accessibile in lettura e scrittura durante lo
svolgimento del programma. Non fa parte della mappa di memoria indirizzabile
direttamente, ma deve essere indirizzata indirettamente.
Le operazioni di lettura della flash dati si svolgono in un normale ciclo
istruzione, mentre la scrittura richiede un tempo maggiore (2-5 ms).
La Flash dati consente un numero elevato di operazioni di scrittura (1M di
volte mediamente), ma se la temperatura di lavoro è elevata il numero si
riduce rapidamente (10 volte meno se >85°C).
Le operazioni si basano su tre registri dedicati, che si trovano nel Banco1
della RAM:
- EECON : questo registro contiene i bit di controllo delle
operazioni sulla flash dati
- EEDATA : questo registro contiene il dato in lettura o scrittura
- EEADR : questo registro è un puntatore che contiene l' indirizzo
della locazione su cui operare
Il foglio dati non fa parola della struttura del registro di controllo, che
dovrebbe essere questa:
EECON
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
-
|
-
|
-
|
FREE
|
WRERR |
WREN
|
WR
|
RD
|
funzione
|
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default
|
- |
- |
- |
0 |
x |
0 |
0 |
0 |
-
bit 7:5 non
utilizzati
in lettura : 0
in scrittura: nessun effetto
-
bit
4 FREE : forza la cancellazione di una riga
1 =
abilita cancellazione
0 =
lettura
-
bit 3 WRERR 1
= scrittura terminata in modo errato (MCLR, WDT, ecc)
0 =
nessun errore
-
bit
2 WREN 1 = abilita scrittura
0 =
impedisce la scrittura
-
bit 1 WR
1 = avvia una scrittura
0 = scrittura
completata
-
bit
0 RD 1 = avvia una lettura
0 = lettura
completata
I bit di comando FREE, WREN,
WR e RD sono
riportati a 0 in hardware una volta eseguita l' operazione o se le sequenze di
accesso non sono eseguite in modo corretto (vedi esempi successivi).
Il foglio dati è avaro di informazioni sulla gestione della Flash dati,
che ,per sua definizione, non è la classica EEPROM integrata negli altri PIC
non Baseline. In particolare:
- non ci sono indicazioni sulla funzionalità del bit WRERR
- non viene considerata negli esempi forniti la rilettura dei flag WR/RD
per verificare la conclusione dell' operazione
Vediamo comunque quanto suggerito per la scrittura e la lettura della Flash
dati.
Lettura della Flash dati.
Per leggere una locazione di memoria flash dati l'utente deve:
- Scrivere nel registro EEADR l' indirizzo della locazione voluta
- Impostare il bit RD del registro EECON. Questa operazione
fa si che il contenuto della cella puntata da EEADR sia trasferito
nel registro EEDATA
- Leggere il contenuto della locazione voluta nel registro EEDATA
L'esecuzione del programma è sospesa mentre il ciclo di lettura è in corso.
Ecco un esempio di codice:
BANKSEL EEADDR
; banco 1
movf
EE_ADDR, W ; w =
indirizzo da leggere
movwf EEADR
; al puntatore
bsf
EECON, RD ;
legge contenuto flash dati
movf
EEDATA, W ;
W = contenuto dell' indirizzo puntato |
Il foglio dati specifica che la
chiave per la lettura è l' istruzione bsf
EECON,RD e che altre sequenze di istruzioni non sono accettate.
Scrittura della Flash dati.
L' operazione di scrittura è leggermente più complessa. La memoria flash
dati è organizzata in una matrice di 8 file di 8 bytes ciascuna.
Occorre cancellare le celle prima di scriverle: viene cancellata una riga alla volta e
scritta un byte alla volta. Occorre cancellare tutta una riga anche solo per
scrivere una locazione.
In generale, la procedura per scrivere un byte di dati è:
- Individuare la riga che contiene l'indirizzo dove il byte verrà scritto.
- Se ci sono altre informazioni in quella riga che devono essere salvate, copiare i byte
della riga dalla flash dati alla RAM
- Eseguire una cancellazione di riga della riga
- Scrivere il nuovo byte di dati e i byte salvati negli indirizzi appropriati
della Flash dati
Per prevenire la corruzione accidentale della Flash dati, è implementato
un sistema di protezione che richiede una sequenza di sblocco da avviare ogni
volta si cancelli o scriva nella Flash.
Per cancellare una riga, occorre effettuare le seguenti operazioni:
- Caricare in EEADR un indirizzo della riga che deve essere cancellata.
- Impostare a 1 il bit FREE del registro EECON
- Impostare a 1 il bit WREN di EECON per consentire l'accesso in scrittura
- Impostare a 1 il bit WR di EECON per avviare il ciclo di cancellazione.
Eseguita la fase 4, il ciclo di cancellazione richiede un certo tempo (da 2
a 4 ms), durante il quale il
processore resterà fermo in attesa della conclusione dell'operazione sulla Flash
prima di riprendere l'esecuzione del programma.
Ecco un esempio di codice:
BANKSEL EEADDR
; banco 1
movf
EE_ADDR, W ; w =
indirizzo da cancellare
movwf EEADR
; al puntatore
bsf
EECON, FREE ; chiave di
abilitazione
bsf
EECON, WREN ;
bsf
EECON, WR ;
attesa cancellazione |
La chiave per la cancellazione è data dalla sequenza delle istruzioni.
Se il bit WREN non è impostato nel ciclo di istruzione dopo il bit FREE,
questo verrà cancellato in hardware, impedendo l' operazione.
Se il bit WR non viene impostato nel ciclo di istruzioni dopo WREN, questo verrà
cancellato in hardware, impedendo l' operazione.
Una volta che una cella è cancellata, nuovi dati possono essere scritti.
La sequenza seguente deve essere eseguita per un singolo byte da scrivere:
- Caricare EEADR con l'indirizzo.
- Caricare EEDATA con i dati da scrivere.
- Impostare il bit WREN per consentire l'accesso in scrittura alla
Flash.
- Impostare il bit WR per avviare il ciclo di scrittura .
Eseguita la fase 4, l' esecuzione del programma è sospesa in attesa
della fine del ciclo di scrittura, che richiede dai 2 a 5ms per completarsi.
Ecco un esempio di codice:
BANKSEL EEADDR
; banco 1
movf
EE_ADDR, W ; w =
indirizzo da scrivere
movwf EEADR
; al puntatore
movf
EE_DATA, W ; w =
dato da scrivere
movwf EEDATA
; al puntatore
bsf
EECON, WREN ;
bsf
EECON, WR ;
attesa scrittura |
La chiave per la scritura è data dalla sequenza delle istruzioni:
- si può utilizzare solamente la
sequenza di bsf indicata
- se il bit WR non viene impostato nel ciclo di istruzioni dopo
che il bit 'WREN è impostato, questo verrà cancellata in hardware, impedendo
l' operazione.
Una volta effettuata una scrittura, è buona norma verificare che il dato
sia stato correttamente scritto.
Ecco un esempio di codice, da accodare la precedente:
movf EEDTA
, W ; l'indirizzo
è quello
; della precedente scrittura
bsf
EECON, RD ;
lettura
xorw
EEDATA, W ;
comparazione con XOR
movwf EEDATA
; al puntatore
btfss
STATUS, Z ;
se uguali, salta istruzione successiva
goto EEWRERR
; se no gestisci l' errore |
L' abilitazione della protezione del codice da rilettura con _CP_ON
in
CONFIG non ha effetto sulla Flash dati.
Per ottenere la protezione di questa area occorre agire sul bit
_CPDF.
|