Tutorials - PIC18 by Data Sheet

 

EEPROM


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:

  1. caricare l' indirizzo da leggere in EEADR

  2. caricare il dato da scrivere in EEDATA

  3. configurare EECON1 per l' accesso alla EEPROM (EEPGD e CFGS = 0)

  4. autorizzare la scrittura portando a 1 WREN di EECON1

  5. bloccare gli interrupt

  6. eseguire la chiave di accesso

  7. avviare la scrittura con il bit WR

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