ELEMANIA
PIC16F690 - Scrittura/lettura EEPROM

Abbiamo già accennato al fatto che il PIC possiede due tipi di memorie permanenti (EEPROM):

Abbiamo già trattato della programmazione (scrittura) della memoria EEPROM di programma. Ci occuperemo qui invece della lettura della EEPROM di programma e della lettura e scrittura della EEPROM dati.

EEPROM di programma: lettura run-time

Normalmente la memoria di programma viene scritta al momento della programmazione del PIC, ma il suo contenuto non viene utilizzato dal programma in esecuzione. Il PIC16F690 consente tuttavia di leggere (ma non di scrivere) la memoria di programma run-time, cioè durante l'esecuzione. Ciò avviene attraverso il seguente meccanismo (per la verità un po' tortuoso):

  1. Bisogna scrivere l'indirizzo (12 bit) della locazione di memoria che si vuole leggere nella coppia di registri EEADR e EEADRH. EEADR contiene il byte meno significativo (LSB) dell'indirizzo, mentre i restanti 4 bit devono essere scritti in EEADRH.
  2. Bisogna selezionare la memoria EEPROM di programma attraverso il bit 7 (denominato EEPGD) del registro EECON1 che dev'essere settato (posto a 1). Quando questo bit è a zero, significa invece che si vuole effettuare un'operazione sulla memoria EEPROM dei dati.
  3. Bisogna fornire alla memoria un comando di lettura (RD) attraverso il bit7 di EECON1 che dev'essere anch'esso settato (posto a 1).
  4. Il dato (cioè l'istruzione di programma a 14 bit contenuto nella locazione di memoria indirizzata) viene quindi reso disponibile nella coppia di registri EEDAT e EEDATH (contenenti rispettivamente il byte meno significativo e i 6 bit più significativi). Si osservi che il dato non è disponibile immediatamente, ma solo dopo un ciclo "a vuoto" di istruzione. In pratica la successiva istruzione dopo il comando RD viene ignorata (di solito si usa una NOP).

Qui sotto viene mostrato un esempio di lettura di un dato dalla memoria di programma:

BANKSEL EEADRH

MOVLW ...  ; 4 bit più significativi dell'indirizzo da leggere
MOVWF EEADRH ;
MOVLW ... ; 8 bit meno significativi dell'indirizzo da leggere
MOVWF EEADR ;

BANKSEL EECON1
BSF EECON1, EEPGD ; setta il bit EEPGD (memoria di programma)
BSF EECON1, RD ; setta il bit RD

NOP ; questa istruzione viene ignorata (serve per dare tempo al PIC di leggere in EEPROM)

BANKSEL EEDAT
MOVF EEDAT, W ; copia il byte meno significativo in W
...
MOVF EEDATH, W ;copia i 6 bit più significativi in W

Data EEPROM

Il PIC contiene anche al proprio interno una EEPROM con organizzazione 256 x 1 Byte da utilizzare per scrivere dati permanenti sul microcontrollore. Tale area di memoria può essere letta e scritta da programma o scritta al momento della programmazione del PIC.

Il meccanismo fa uso dei registri EEADR e EEDAT: l'indirizzo a 8 bit (da 0 a 0FF) della locazione di Data EEPROM che si vuole accedere dev'essere scritto in EEADR e quindi il contenuto (sempre a 8 bit) di tale locazione di memoria è disponibile in EEDAT. Qui sotto è mostrato un esempio di lettura di un dato dalla Data EEPROM:

BANKSEL EEADR

MOVLW ... ; indirizzo a 8 bit della locazione da leggere
MOVWF EEADR ; l'indirizzo da leggere è copiato in EEADR

BANKSEL EECON1
BCF EECON1, EEPGD ; azzera il bit EEPGD (Data EEPROM)

BCF EECON1, RD ; lettura

BANKSEL EEDAT
MOVF EEDAT, W ;W = EEDAT

Si noti che, a differenza della lettura dalla memoria di programma, in questo caso il dato è disponibile immediatamente (non occorre nessuna NOP dopo il comando RD).

Qui invece è mostrato un esempio di scrittura nella Data EEPROM:

BANKSEL EEADR

MOVLW ... ;
MOVWF EEADR ; indirizzo su cui scrivere
MOVLW ... ;
MOVWF EEDAT ; data che si vuole scrivere

BANKSEL EECON1
BCF EECON1, EEPGD ; seleziona EEPROM dati

BSF EECON1, WREN ; abilita la scrittura in memoria

; tutta la parte che segue è una sequenza di istruzioni necessaria per la scrittura:
BCF INTCON, GIE ; disabilita gli interrupt
MOVLW 55h ;
MOVWF EECON2 ; scrive il valore 55h sul registro EECON2
MOVLW AAh ;
MOVWF EECON2 ; scrive AAh su EECON2

BSF EECON1, WR ; setta WR per iniziare la scrittura

BSF INTCON, GIE ; abilita nuovamente gli interrupt
SLEEP ; attende un interrupt che indica il termine della scrittura
BCF EECON1, WREN ; disabilita la scrittura

Si noti come la scrittura in EEPROM sia notevolmente più complessa della lettura, in quanto richiede una precisa sequenza di operazioni e fa uso degli interrupt.

Un modo più semplice per scrivere la EEPROM dei dati consiste nel dichiararne i valori iniziali nel sorgente assembly, per esempio nel seguente modo:

; qui sopra c'è il resto del programma

ORG 0x2100 ; indirizzo iniziale della data EEPROM
DE 1,2,3,4 ; assegna alle prime quattro locazioni i valori 1, 2, 3, 4


END ; direttiva di fine compilazione

Come si può notare la memoria EEPROM dei dati viene mappata a partire dall'indirizzo 0x2100. Si noti che questo indirizzo (a 14 bit) non può essere usato nelle istruzioni di programma, come per esempio la MOVLW (si tratta di un valore convenzionale scelto perché non appartiene allo spazio di indirizzi di nessuna delle altre memorie). La direttiva DE assegna i valori specificati alle locazioni in memoria a partire dalla prima (0x2100) fino alla quarta (0x2103).

Si osservi che questa modalità di scrittura in EEPROM, a differenza della precedente, viene fatta al momento della programmazione (scrittura) del dispositivo; invece la modalità "da programma" consente di scrivere la EEPROM dati durante l'esecuzione (run time).

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it