La memoria
Riserviamo per ultima una trattazione della memoria, che interesserà principalmente chi vuole capire più a fondo
il funzionamento dei PIC e chi programma in Assembly; meno importante per
chi programma in C o simili.
In questi PIC troviamo due tipi di memoria:
- un' area di memoria FLASH, che comprende la memoria programma
(program memory), la configuration word e il registro ID
- un' area di memoria RAM che comprende la RAM dati e gli SFR
Trovate
qui qualche chiarimento, se occorre, per quanto riguarda il problema di
banchi e pagine.
Memoria programma
|
PIC12F519 ha un program counter (PC) 11 bit (PC) in grado di indirizzare un programma 2k x 12 (ricordiamo
che l' ampiezza delle istruzione dei Baseline è 12 bit, mentre il bus
dati è a 8 bit - ved. architettura
Harvard).
Solamente il primi 1k x 12 (0000h-03FFh) sono fisicamente disponibili.
L' area da 0440h a 7FFh non è implementata e un accesso causerà un wrap-around
verso l' area implementata.
L' area complessiva di 1k è divisa in due pagine da 512 ciascuna a
causa della limitatezza dell' indirizzo che è contenibile negli
opcodes. L' accesso alle pagine si ottiene agendo sul bit PA0 dello STATUS.
Il vettore di reset, ovvero la locazione a cui va posta la prima
istruzione del programma, si trova, come solito per i PIC, a 0000h.
La locazione 03FFh contiene il valore di calibrazione dell'oscillatore
interno. Questo valore non deve essere cancellato o sovra scritto,
come abbiamo visto nelle pagine dedicate al clock.
L' area tra 0400h e 043Fh è occupata da una sezione di memoria
Flash che può essere utilizzata durante il programma come area dati.
L' accesso a questa zona si effettua come se si trattasse di una
EEPROM (vedere più avanti).
Lo stack a 12 bit è di soli due livelli, quindi limita il numero
degli annidamenti di chiamate a subroutine. Non ci sono meccanismi che
indichino un overflow o underflow dello stack; quindi è
responsabilità del programmatore di evitare questi errori.
Nel set Baseline
non ci sono istruzioni di manipolazione dello stack.
|
La memoria FLASH conserva quanti scritto anche al mancare della tensione di
alimentazione, quindi il contenuto delle locazioni da 0000h a 043Fh resta
invariato fino a che non viene volontariamente cancellato e/o riscritto.
Memoria RAM
La memoria di dati è composta di registri o byte in RAM, ovvero di memoria
scrivibile e leggibile a volontà, ma che perde quanto contenuto al momento in
cui la tensione scende sotto un valore minimo di mantenimento o viene a
mancare del tutto. Nella stessa area sono implementati i registri di
controllo SFR.
In effetti, Microchip divide i registri in due gruppi funzionali:
- Special Function Registers (SFR)
- e registri di uso generale (General Purpose Register - GPR).
I registri SFR includono TMR0, il Program Counter (PCL), lo
STATUS, i registri di I/O e il file
di indirizzamento indiretto (FSR). Sono SFR anche tutti i
registri utilizzati per controllare la configurazione delle risorse interne.
I registri di uso generale sono la vera e propria RAM dati, sotto il comando delle
istruzioni del programma.
|
Per il PIC12F519 ci sono:
L' area RAM occupa DUE banchi. Il Banco0 comprende
gli indirizzi da 00h a 1Fh:
- 11 SFR, da 00h a 06h e da 20h a 26h
- 8 bytes di RAM da 07h a 0Fh
- 16 bytes di RAM da 10h a 1Fh
il Banco1 comprende gli indirizzi da 20h a 3Fh::
- 11 SFR, da 20h a 26h
- 8 bytes di RAM da 27h a 2Fh
- 16 bytes di RAM da 30h a 3Fh
Per prima cosa dobbiamo notare che gli SFR del Banco1 sono solo parzialmente copie
di quelli del Banco0, in quanto appaiono i tre registri EExxx
necessari alla gestione della Flash dati.
Quindi, indirizzando, ad esempio,
- 05h si accederà a OSCCAL e indirizzando
- 25h si accederà a EEDATA.
Mentre indirizzando:
- 03h o 23h si accederà comunque allo STATUS
|
L' area di RAM tra 27h e 2Fh è un alias della RAM tra 07h e 0Fh, per cui,
indirizzando, ad esempio:
- 0Ah o 2Ah si accederà comunque alla stessa cella di RAM.
Invece, l' area tra 10h e 1Fh e quella tra 30h e 3Fh sono completamente
indipendenti. Per accedere alla locazione 35h, ad esempio, sarà necessario
passare nel Banco1.
In questi PIC extra semplici l' accesso al Banco 1, cioè al terzo blocco di RAM (quello da 30h a
3Fh) e ai registri di gestione della EEPROM, si effettua con l' indirizzamento indiretto attraverso il
bit 5 del registro FSR:
- FSR<5> = 0 -> Banco 0
- FSR<5> = 1 -> Banco 1
Va considerato che, seppure General Purpose Register e SFR sono
entrambi "RAM", i primi non vanno usati per conservate dati,
poichè sono in relazione con la gestione delle varie funzioni del
processore; solamente i GPR saranno da impiegare come aree di memoria
volatile per i dati.
Possiamo anche notare che i registri TRISGPIO
e OPTION non appaiono nella mappa della memoria in quanto sono SFR speciali a
sola scrittura, accessibili rispettivamente ed esclusivamente con le
istruzioni tris e option.
Può essere utile dare uno sguardo anche la tabella riassuntiva degli SFR, in cui
appaiono i valori di default al reset.
La tabella riporta:
- l' indirizzo assoluto del registro nella mappa della memoria RAM
- il nome (label) del registro
- gli mnemonici relativi ai bit
- il valore di default al POR (x indica un valore casuale)
- la pagina del foglio dati dove sono sono descritti nel dettaglio questi
registri
In particolare:
- il bit 5 dello STATUS costituisce lo switch di pagina per accedere alla
parte superiore della memoria programma:
- PA0 = 0 -> primi 512 bytes
- PA0 = 1 -> restanti 512
bytes
- il bit 5 di FSR costituisce lo switch per accedere ai banchi:
- FSR<5> = 0 -> Banco 0
- FSR<5> = 1 -> Banco 0
Queste informazioni riguardano la programmazione Assembly, dove è cura del
programmatore il dirigere il flusso di istruzioni alla giusta
destinazione. Nell' uso di compilatori, invece, è il compilatore che
provvede a commutare banchi o pagine a seconda della necessità.
- Sempre nello STATUS, il bit 7 (GPWUF) va a 1 dopo un reset prodotto dal
wake-up dovuto al cambio di stato dei pin
|