SCRITTURA della EEPROM
L' accesso alla scrittura di un byte in EEPROM è
relativamente semplice e richiede una procedura simile a quella vista per la
FLASH, adto che non è una operazione istantanea, ma coinvolge una
temporizzazione:
-
caricare l' indirizzo da leggere in EEADR
-
caricare il dato da scrivere in EEDATA
-
configurare EECON1 per l' accesso alla EEPROM (EEPGD e
CFGS = 0)
-
autorizzare la scrittura portando a 1 WREN di EECON1
-
bloccare gli interrupt
-
eseguire la chiave di accesso
-
avviare la scrittura con il bit WR
-
riavviare gli interrupt
Non è possibile iniziare una scrittura in EEPROM se quella
precedente non è completata: il flag di segnalazione è il bit WR che va a
0 al termine del tempo di scrittura.
In effetti, durante la scrittura della EEPROM, il
microcontroller non va in stallo come accadeva nella scrittura della FLASH,
ma è sempre operativo; il termine del tempo di scrittura si rileverà
allora dallo stato del flag WR (anche qui, circa 2 ms).
Comunque, anche in questo caso, le istruzioni che vanno dall' applicazione
della chiave di sicurezza 55h-AAh all' avvio della scrittura non possono
essere disturbate da interrupt, che, se presente, va bloccato.
Questo rende evidente la differenza tra la scrittura in
FLASH e quella in EEPROM.
Il flag WR può essere testato all' inizio della routine di
scrittura o alla fine, a seconda di come si voglia organizzare l'operazione.
Un esempio del codice:
;***************************************************************
;
Scrittura
di 1 byte in EEPROM - subroutine
;*********************************************************
; EEPWrite
- entrata con il dato da
scrivere in
WREG
;
L' indirizzo a cui scrivere deve trovarsi in EEADR
; La routine è bloccante, ovvero rilascia solo al
completamento
; della temporizzazione di scrittura
;---------------------------------------------------------------
EEPWrite
movwf EEDATA
;
carica dato
bcf EECON1, EEPGD ;
accesso alla EEPROM
bcf
EECON1, CFGS ; deseleziona zona
configurazione
bsf
EECON1, WREN
;
abilita scrittura
bcf
INTCON, GIE
;
stop interrupt
movlw
0x55
;
chiave
movwf
EECON2
movlw 0xAA
movwf EECON2
bsf
EECON1, WR ; avvia
scrittura
bsf
INTCON, GIE ; riavvia
interrupt
bcf
EECON1, WREN ; disabilita
scritture
btfsc
EECON1, WR ; check per fine
tempo
bra
$-4
; no - wait
return
; si - fine
|
Come per la FLASH,
è opportuno verificare il dato scritto:
;***************************************************************
; Scrittura
di 1 byte in EEPROM - subroutine
;*********************************************************
; EEPWrite
- entrata con il dato da
scrivere in WREG
;
L' indirizzo a cui scrivere deve trovarsi in EEADR
;
All' uscita:
; - il valore letto si trova in WREG
; - in caso di errore, un flag EEP_ERR viene posto a 1
; - EEADR è incrementato di 1
; La routine è bloccante, ovvero rilascia solo al
completamento
; della temporizzazione di scrittura
;---------------------------------------------------------------
; Impiego memoria
; EEP_Temp ; 1 byte per
salvataggio dato
; EEP_ERR ; 1 bit
come flag di errore
;---------------------------------------------------------------
EEPWrite
movwf EEDATA
;
carica dato
movwf
EEP_temp
; salva per verifica
bcf
EEP_ERR
; clear flag di errore
bcf EECON1, EEPGD ;
accesso alla EEPROM
bcf
EECON1, CFGS ; deseleziona zona
configurazione
bsf
EECON1, WREN
;
abilita scrittura
bcf
INTCON, GIE
;
stop interrupt
movlw
0x55
;
chiave
movwf
EECON2
movlw 0xAA
movwf EECON2
bsf
EECON1, WR ; avvia
scrittura
bsf
INTCON, GIE ; riavvia
interrupt
bcf
EECON1, WREN ; disabilita
scritture
btfsc
EECON1, WR ; check per fine
tempo
bra
$-4
; no - wait
rcall EEPRead
; legge byte
cpfseq EEP_temp
; compara con quello salvato
bsf
EEP_ERR ; se
diversi, set flag
return
; ritorno |
Ovviamente è sempre inteso che se il programma non utilizza
interrupt, non è necessario il blocco, nè tanto meno il riavvio.
La EEPROM in Interrupt
Se il codice scritto qui sopra utilizza un polling per il test
di fine scrittura, è possibile effettuare l' operazione anche in interrupt.
Sono interessati tre bit:
-
il bit EEIE < PIE2:4> abilita una chiamata
interrupt allo scadere del tempo di scrittura.
-
Il bit EEIF <PIR2:4> va a 1 quando il tempo
è scaduto e va
resettato da software.
-
Il bit EEIP <IPIR2:4> permette di configurare l' interrupt come primario o
secondario.
Può essere interessante rilevare come Microchip abbia
associato la stessa posizione dei bit relativi ad un interrupt nei tre
registri relativi, rendendo più semplici le operazioni.
L' interrupt di fine tempo scrittura della EEPROM è un
interrupt periferico ed è controllato da GIEL nel caso di singola
priorità.
Nella doppia priorità segue le regole relative.
NOTA:
Una funzione di interrupt analoga non è disponibile per la FLASH, in quanto il processore
va in stallo durante cancellazione e scrittura
|
|
|
Copyright © afg. Tutti i diritti riservati.
Aggiornato il 07/12/10.
|