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.
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):
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
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).
Sito realizzato in base al
template offerto da
http://www.graphixmania.it