Tutorials - PIC18 by Data Sheet

 

pag. 83 - EEPROM


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:

  1. caricare l' indirizzo da leggere in EEADR

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

  3. lanciare la lettura con il bit RD di EECON1

  4. leggere il dato in EEDATA

 Un esempio del codice

   movlw  indirizzo         ; caricare indirizzo relativo
  movwf  EEADR     
        ; nel puntatore EEPROM
  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 

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.

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 07/12/10.