Tutorials - PIC

 

PIC12F508/509 e 16F505


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:

 


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 06/05/13.