Nei PIC, va
ricordato, la memoria dati (RAM) e la memoria programma (Flash) sono due entità
indipendenti a cui si accede con istruzioni differenti.
La memoria RAM disponibile va da 256 a 3900 bytes o più, a seconda del
modello, ed è al di là delle disponibilità dei mid range.
|
La Memoria Dati, o RAM, è costituita da elementi a 8 bit indirizzabili con
12 bit, ovvero su un range di 4 k. Consiste in due tipologie distinte : i General
Purpose Registers (GPR) e gli Special Function Registers (SFR).
-
I GPR, ovvero le celle di memoria RAM, sono utilizzati per salvare dati e variabili durante le elaborazioni
(RAM per uso generico, in lettura e scrittura)
-
Gli SFR sono i registri propri del processore, attraverso cui il
programmatore accede al controllo delle funzioni interni e gestisce I/O,
Timer, oscillatori, ecc. Anche il Work Register W e lo STATUS fanno parte
degli SFR
Sfortunatamente per chi si aspettava una struttura
simile a quella della Memoria Programma, la Memoria Dati è frammentata in un
numero elevato di banchi, fino a 15, ognuno ampio 256 bytes e accessibili con un sistema
a switch come nei
PIC 16.
Ad esempio, a lato lo schema della RAM del PIC18F6722, con tutti
e 15 i banchi attivi.
Questo processore appartiene ad una delle famiglie progettate per
utilizzare memoria programma esterna.
|
Nella famiglia 18F4321 la RAM disponibile occupa il banco 0,
il banco 1 e il banco 15.
|
La divisone in banchi è dovuta alla disponibilità per l' indirizzamento di soli 8 bit negli
opcodes che vanno ad agire sulla Memoria Dati. In
effetti l' indirizzamento complessivo della memoria dati è
effettuato a 12 bit, di cui 8 arrivano dall' istruzione e 4 da un
registro apposito, detto Bank Select Register o BSR,
che nei primi 4 bit, BSR3:0, fornisce un sistema di switch dei
banchi simile a quello dei mid-range.
Il
meccanismo del BS, però, è più efficiente degli RP che sono usati
nei PIC16 .
Per
prima cosa, i bit BSR non stanno nello STATUS, ma nel registro
dedicato e questo consente di modificarli con una istruzione dedicata:
MOVLB
che
carica un valore literal nel registro dei BSR.
|
Inoltre, questo numero è lo stesso che indica il
banco puntato, per cui un:
movlb 3
punta al banco 3 e così via.
Così è possibile visualizzare in uno schema
semplice il funzionamento dei BSR.
Verrebbe da protestare: “Ma come, questi PIC18 aboliscono pagine e semplificano la vita e ora
salta fuori che per lavorare con la RAM bisogna sguazzare in ben 15-banchi-15
!?”.
Però è opportuno conoscere come i progettisti di Microchip hanno risolto la
questione.
In effetti, i metodi messi in opera per semplificare la vita al
programmatore ci sono e sono molto più efficienti di quanto ci si potesse
aspettare (vista anche la necessità di offrire ai compilatori C un supporto
ben più potente di quello offerto dai PIC16) ::
-
In primo luogo i registri speciali (SFR) non sono sparpagliati nei
banchi di memoria, ma sono raccolti TUTTI in un unico banco (la seconda metà
del banco 15).
Quindi, rispetto ai PIC16, non occorre più utilizzare
forsennatamente il banksel per corre dietro ai registri ! E questa è già una
cosa mica male !
-
In secondo luogo, un meccanismo chiamato Access RAM
crea una pagina contenete RAM e SFR e di accesso immediato
Ma prima di procedere in questa direzione, vediamo
qualcosa sui meccanismi di indirizzamento.
NOTE:
I divesri processori possono avere diverse
quantità
di memoria e di banchi : il data sheet di ogni singolo prodotto specifica
chiaramente queste informazioni.
A questo proposito va tenuto presente che il
numero degli SFR può variare sensibilmente tra un processore ed un altro, in
dipendenza dalle funzioni speciali che il chip integra.
Altri processori, come
la famiglia dotata di USB, ha alcuni banchi costituiti da una speciale RAM dual port e
che sono
dedicati al buffer della porta USB e se questa è usata, non possono avere altra
destinazione.
Se però la porta USB è attivata, questi 4 banchi vanno lasciati allo scambio dati tra microcontroller e l' USB Serial Interface
Engine (SIE); in questa situazione, usarli per altri scopi può essere rischioso
in quanto il buffer USB è dinamico. Ovviamente, processori non dotati di USB non dispongono
di questa RAM particolare.
Quindi, una lettura del foglio dati, di fronte ad un componente nuovo, è
indispensabile.
Per quello che riguarda gli SFR, anche se stanno in un unico banco e sono, a pari funzione, praticamente nelle stesse
posizioni di memoria, è sempre ed assolutamente buona norma richiamarli
esclusivamente con le loro label specifiche e
mai
con l' indirizzo assoluto;
questo evita seri problemi nella portabilità del sorgente.
Con un Assembler
valido, come può essere MPASM, non c'è alcuna ragione per non utilizzare
quegli automatismi di conversione simboli-indirizzi che il compilatore fa così
bene da se.
|
|
|
Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.
|