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
|
PIC12F508 ha un program counter (PC) 10 bit (PC) in grado di indirizzare un programma
1k 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 512 x 12 (0000h-01FFh) sono fisicamente disponibili.
Un accesso all' area non implementata causerà un wrap-around
verso l' area implementata.
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.
In effetti, l' istruzione iniziale è quella posta alla
locazione 01FFh 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.
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.
|
|
PIC12F509 ha un
PC a 11 bit in grado di indirizzare un programma 2k x 12.
Solamente 1K x 12 (0000h-03FFh) sono fisicamente disponibili.
Un accesso all' area non implementata 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.
In effetti, l' istruzione iniziale è quella posta alla
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.
16F505 ha la stessa struttura di memoria di 12F509.
|
La memoria FLASH conserva quanti scritto anche al mancare della tensione di
alimentazione, quindi il contenuto delle locazioni da 0000h a 03FFh resta
invariato fino a che non viene volontariamente cancellato e/o riscritto.
Memoria RAM
La memoria di dati è composto di registri o byte di 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 PIC12F508 ci sono:
- 7 SFR, da 00h a 06h
- 25 bytes di RAM da 07h a 1Fh
L' area RAM occupa un solo banco, per cui non esiste la necessità
di commutare banchi per accedere a queste risorse di memoria. Questo
rende semplice la gestione in Assembly.
Va ben compreso 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. |
|
Per il PIC12F509 la situazione è più complessa. Ci sono:
- 7 SFR, da 00h a 06h
- 8 bytes di RAM da 07h a 0Fh
- 16 bytes di RAM da 10h a 1Fh
- 16 bytes di RAM da 30h a 3Fh
L' area RAM occupa due banchi, per cui esiste la necessità
di commutarli per accedere a queste risorse di memoria, il che è uno
degli aspetti "antipatici" dei PIC, principalmente per chi
programma in Assembly.
La situazione dei due banchi, però, è tale che l' area tra 00h e
0Fh del banco 0 viene mappata identicamente nel banco 1, per cui
indirizzando una locazione tra 20h e 2Fh darà l' accesso alla
corrispondete locazione tra 00h e 0Fh; ad esempio 05h o 25h si
accederà in ogni caso a OSCCAL. Questo riguarda sia i registri
SFR, sia una piccola area di RAM per uso dati collocata tra 07h e 0Fh
che ha come alias gli indirizzi tra 2Ah e 2Fh.
Questo consente di accedere a tutti gli SFR e a una parte di RAM
indipendentemente dalla selezione del banco. |
Per l' accesso alla rimanente area di RAM tra 30 e 3Fh sarà necessario
ricorrere allo switch di banco effettuato dal bit 5 di FSR:
- FSR<5> = 0 -> Banco 0
- FSR<5> = 1 -> Banco 1
Da notare 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.
La situazione di 16F505 è più complessa, data la maggiore
quantità di RAM disponibile:
|
La RAM dei General Purpose Register è suddivisa in 4 banchi da 16
bytes ciascuno, il cui accesso si otiene attraverso l' indirizzamento con i bit 6:5 del registro FSR.
Come per 12F509, l' area da 00h a 0Fh viene mappata come alias nei
banchi successivi.
Così, gli SFR sono accessibili sempre come alias del
contenuto del banco 0 in tutti i banchi. Quindi, ad esempio, l'
indirizzamento a 05h o 25h o 45h o 65h si
accederà comunque a OSCCAL.
Lo stesso per l' area RAM da 07h a 0Fh. Quindi, ad esempio, l'
indirizzamento a 0Dh, 27h, 47h o 67h consente comunque l' accesso alla
stessa locazione di RAM.
|
L' accesso al rimanente della RAM dei banchi 1/2/3 (30h-3Fh, 50h-5Fh,
60h-6Fh, 70h-6Fh) si ottiene attraverso l' indirizzamento con i bit 6:5 del registro
FSR:
- FSR<6:5> = 00 ->
Banco 0 20h-3Fh
- FSR<6:5> = 01
-> Banco 1 40h-5Fh
- FSR<6:5> = 10 ->
Banco 2 60h-6Fh
- FSR<6:5> = 11
-> Banco 3 80h-7Fh
Attenzione:
- la prima locazione di RAM dati in 12F508/509 si trova a 07h
- in 16F505, invece, la prima locazione di RAM dati si
trova a 08h, dato che c'è un SFR in più rispetto a
12F508/509.
|
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
Per il 16F505 si tratta di bit 6 e bit 5.
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
Per 16F505 la situazione è analoga, con la variazione dovuta al
maggior numero di periferiche integrate:
|