La EEPROM DATI
Finora abbiamo trascurato una delle caratteristiche più interessanti del PIC16F84, la EEPROM DATI. Colmiamo ora questa lacuna andando ad analizzare il funzionamento di questo utilissimo componente dell'architettura interna del PIC16F84.
La EEPROM DATI è una particolare area di memoria da 64 byte nella quale possiamo scrivere i valori numerici che vogliamo che non vengano persi in caso di mancanza di tensione di alimentazione.
Si intuisce immediatamente quanto possa essere utile questo tipo di memoria. Pensate, ad esempio, ad un sistema anti intrusione in cui il PIC deve mantenere il codice di accesso anche quando il sistema è spento in modo che non sia necessario riprogrammarlo ogni volta che si riaccende il sistema, oppure ad una chiave elettronica realizzata con un PIC che riceve alimentazione solo quando l'utente inserisce la chiave nel lettore..
In tutti questi casi la EEPROM DATI integrata nel PIC16F84 garantisce un ottimo livello di sicurezza nella conservazione dei dati, unito ad una relativa facilita' d'uso.
La memoria EEPROM è scrivibile e leggibile in condizioni di normale alimentazione e senza dover ricorrere ad alcun programmatore esterno. Le modalità di accesso sono notevolmente diverse dalla memoria RAM dei REGISTER FILE e devono seguire una serie di procedure particolari atte ad evitare eventuali perdite di dati in condizioni di funzionamento anomale.
Registri speciali per l'accesso alla EEPROM dati
Per accedere alla EEPROM DATI vengono utilizzati i seguenti registri speciali:
- EEADR è il registro utilizzato per indirizzare una delle 64 locazioni di memoria EEPROM in cui si desidera effettuare una lettura o scrittura di un dato.
- EEDATA è il registro che viene usato per inviare un byte alla EEPROM in scrittura oppure per ricevere un byte dalla EEPROM in lettura.
- EECON1 ed EECON2 sono due registri ci controllo utilizzati nelle operazioni di lettura e scrittura come descritto di seguito.
Scrittura di un dato su EEPROM
Vediamo ora come si può scrivere un dato su una locazione EEPROM. Ipotizziamo di voler scrivere il valore decimale 10 nella locazione 0 della EEPROM dati.
La prima operazione da compiere è scrivere nel registro EEADR l'indirizzo della locazione di memoria che intendiamo scrivere. Possiamo usare per far questo le seguenti istruzioni:
movlw 0 movwf EEADR
Nel registro EEDATA dobbiamo ora scrivere il valore che intendiamo inviare alla locazione EEPROM indirizzata con il registro EEADR:
movlw 10 movwf EEDATA
A questo punto dobbiamo settare il flag WREN (WRite ENable) contenuto nel registro di controllo EECON1 per poter abilitare l'accesso alle successive operazioni di scrittura.
Dato che il registro EECON1 è situato nel banco registri 1, dovremo indirizzare questo banco settando il bit RP0 del registri STATUS prima di accedere al registri EECON1:
bsf STATUS,RP0 ;Swap to bank 1 bsf EECON1,WREN ;Enable Write
Ora dobbiamo eseguire una sequenza di scritture sul registro EECON2 per comunicare al PIC che abbiamo intenzione di scrivere sulla EEPROM. Questa sequenza rappresenta una specie di codice di accesso alla EEPROM e serve ad evitare scritture accidentali in caso di funzionamento anomalo del PIC dovuto a sbalzi di tensione, errori si programmazione. In pratica dobbiamo scrivere i due valori esadecimali 55h e AAh in sequenza nel registro EECON2:
movlw 55h ;Write 55h to EECON2 movwf EECON2 movlw AAh ;Write AAh to EECON2 movwf EECON2
Arrivati a questo punto abbiamo effettuato tutte le operazioni preliminari per scrivere sulla EEPROM e ci rimane solo di avviare la scrittura settando il flag WR (WRite) del regsistro EECON1 con l'istruzione:
bsf EECON1,WR ;Begin write
L'hardware del PIC impiega un certo tempo a partire da questo momento per programmare la cella EEPROM con il valore da noi inviato. Quando l'operazione ha avuto termine, l'hardware del PIC ci avverte azzerando nuovamente il flag WR del registri EECON1.
Se nel nostro programma decidiamo di aspettare che la cella sia stata programmata prima di proseguire dovremo inserire il seguente loop di attesa:
WriteDoneLoop btfsc EECON1,WR ;Writing done ? goto WriteDoneLoop ;No, wait ... ;Yes, continue ..
Per evitare questa attesa è possibile richiedere all'hardware del PIC di generare un interrupt di avvenuta programmazione.
Per scrivere un nuovo valore nella stessa cella EEPROM non è necessario effettuare operazioni di cancellazioni della cella ma semplicemente ripetere le stesse operazioni di scrittura..
Lettura di un dato da EEPROM
Vediamo ora come si rilegge quello che abbiamo appena scritto sulla locazione di memoria EEPROM.
Assicuriamoci anzitutto di essere tornati sul banco registri 0 azzerando nuovamente il flag RP0 del regsitri STATUS:
bcf STATUS,RP0 ;Swap to bank 0
Quindi scriviamo in EEADR l'indirizzo di memoria che vogliamo leggere:
movlw 0 movwf EEADR
Comunichiamo all'hardware del PIC che intendiamo leggere la locazione di memoria indirizzata da EEADR settando il flag RD (ReaD) del registro di controllo EECON1. Ricordiamoci, pero, di passare prima al banco registri 1 dove si trova appunto il registro EECON1:
bsf STATUS,RP0 ;Swap to bank 1 bsf EECON1,RD
A questo punto possiamo immediatamente leggere dal registro EEDATA il valore contenuto nella locazione di memoria richiesta. Anche in questo caso dobbiamo pero prima di tutto ricordarci di passare al banco registri giusto:
bcf STATUS,RP0 ;Swap to bank 0 movf EEDATA,W
Nel registro accumulatore W, ora c'è il dato letto dalla EEPROM.