| 
| 
    
  
  
    
    
 SCRITTURA della EEPROML' 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 datobcf    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 bytecpfseq  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 InterruptSe 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.
 |