Salta la barra di navigazione [1] - Vai alla barra di navigazione [3] - Scrivimi una mail [4]

La memoria RAM del PIC18

Assembly PIC18 - PIC18 in C - Sommario - Novità - Tutorial - Progetti - Risorse - Non solo elettronica

La memoria RAM del PIC18

I PIC18 contengono diversi tipi di memorie con caratteristiche nettamente diverse. In questa pagina si farà riferimento ai cosiddetti File Registers, che costituiscono la memoria RAM principale del PIC18. La dimensione, a seconda dei modelli, varia fino ad un massimo di 4 096 byte ed è suddivisa in 16 banchi (blocchi da 256 byte ciascuno). Essa include due tipi di registri:

L'accesso ai vari registri avviene secondo due modalità, meglio illustrate nella prosecuzione di questa pagina:

Quasi tutte le istruzioni possono utilizzare entrambi questi metodi di accesso. Il programmatore sceglierà il primo metodo per le variabili usate più frequentemente, il secondo per le variabili di dimensioni più ampie.

Un esempio

L'istruzione movwf (MOVe W register to File register) sposta il dato a 8 bit contenuto del registro W in una qualunque cella di memoria del File Register. Leggiamo nel foglio tecnico la descrizione (nota 1)

MOVWF

La cella di memoria f è identificata da un indirizzo compreso tra 0 e 255 (0000 0000 e 1111 1111 in binario, 0x00 e 0xFF in esadecimale). Si noti l'uso delle parentesi () con il significato di numero contenuto in.

Il secondo argomento dell'istruzione {,a} specifica se deve essere usato l'Access Bank (quando a=0) oppure un altro banco (quando a=1), scelto attraverso il registro BSR. Questo argomento è facoltativo, come indicato dall'uso delle parentesi graffe {} .

Uso dell'Access Bank

Le celle in cui è più facile scrivere o leggere sono le prime 96, con indirizzo da 0 a 0x5F. Gli esempi e gli esercizi di questo paragrafo faranno riferimento a questa modalità, spesso indicata come indirizzamento diretto nell'Access Bank o semblicemente Access.

Osserviamo il seguente spezzone di programma:

 movlw 0x55
 movwf 0x10

La seconda istruzione  copia nel registro con indirizzo 0x10 il contenuto del registro W (cioè, nell'esempio, il numero 0x55). Si noti che è presente il solo indirizzo in cui scrivere, cioè dopo lo 0x10 non vi è nulla. Come sintassi alternativa (e un po' ridondante) si sarebbe potuto scrivere anche movwf 0x10,0 con lo stesso significato. (nota 4)

Esercizio 1

Scrivere un breve programma che usa tale istruzione e ad eseguirlo con il simulatore, osservando il contenuto della Program Memory e dei File Registers. (nota 2).

Esercizio 2

Si consideri il seguente spezzone di programma (senza alcuno scopo reale...). Dopo aver esaminato sui fogli tecnici gli effetti delle istruzioni utilizzate, eseguire passo-passo il programma osservando gli effetti sui vari registri:

 movlw 0x12
 movwf 0x01
 addlw 0x34
 movwf 0x02
 clrf 0x01

Esercizio 3

Scrivere un programma che memoriazza nelle celle di memoria da 0 a 3 i quattro codici ASCII "Ciao". A volte questo modo di rappresentare parole o anche intere frasi viene indicato con il termine stringa. (nota 5)

Nota: per memorizzare nel registro W il codice ASCII del carattere "A" (=0x41) è possibile usare indifferentemente una delle due seguenti forme, identiche negli effetti:

 movlw 0x41
 movlw "A"

Ciao

L'uso dei banchi

Per utilizzare tutte le celle di memoria occorre utilizzare l'indirizzamento diretto di tipo Banked ed il registro speciale BSR. Questo registro di quattro bit contiene il numero del banco che un'istruzione deve utilizzare; in pratica è la prima cifra esadecimale dell'indirizzo. Per esempio il registro 0x56 del banco 0x3 è indicata come registro 0x356; il registro BSR contiene 3.

Per indicare se verrà utilizzata la modalità Banked oppure Access, ciascuna istruzione utilizza una virgola seguita da 0 oppure da 1 dopo l'operando (nota 4):

Esempio:

La scrittura dei quattro bit nel BSR deve essere effettuata con l'apposita istruzione assembly movlb (MOVe Literal to low nibble in Bsr).

Usando il simulatore, il banco che verrà utilizzato è mostrato in alto a destra, a fianco del WREG, del PC e dei flag.

Il banco in uso

Esercizio 4

Simulare il seguente spezzone di programma ed individuare in quali GPR verrà scritto 0xAA.

 movlw 0xAA
 movlb 0x5
 movwf 0x11,1
 movwf 0x22,0
 movlb 0xA
 movwf 0x33,1
 movwf 0x44,0

Esercizio 5

Riscrivere l'esercizio 3 usando celle poste nel banco 8 per memorizzare la stringa "Ciao".

Gli Special Function Registers

Gli SFR sono registri con usi speciali. Tra i principali possiamo individuare tre registri già visti:

Working Register (WREG)

Questo registro è utilizzato per molte istruzioni per contenere risultati e/o operandi. Può essere per molti versi paragonato a quello che in altre architetture è indicato come Accumulatore. Come quasi tutti i registri è formato da 8 bit

Status register (STATUS)

Questo registro contiene i flag della ALU, cioè alcuni bit che hanno un particolare significato dopo l'esecuzione di un'istruzione. Abbiamo già visto una loro breve descrizione.

Bank Select Register (BSR)

Viene utilizzato per selezionare uno dei banchi del File Register

I tre registri WREG, STATUS e BSR descrivono lo stato del processore e possono essere considerati i registri fondamentali del PIC18

Tutti i registri speciali sono sempre direttamente accessibili al codice (è come appartenessero all'Access Bank) e di fatto costituiscono l'ultima parte della memoria RAM.

Note

  1. La descrizione riportata è parziale. In particolare non siamo interessati al extended instruction set
  2. Le celle che vengono modificate sono colorate in rosso
  3. Per indirizzare 4 096 registri sono necessari 12 bit (212 = 4 096). 4 bit identificano uno dei 16 banchi e sono memorizzati nel BSR, 8 bit identificano uno dei 356 registri di ciascun banco e sono memorizzati in parte dell'Istruction Register (IR)
  4. Quando si usa l'assembler, includendo i file opportuni, è possibile indicare l'uso dell'Access Bank anche con la sintassi  movwf 0x10,ACCESS e l'uso dei banchi con la sintassi  movwf 0x10,BANKED
  5. Nel linguaggio C (ed in altri) una stringa è rappresentata come un insieme di caratteri che terminano con il byte 0x00. Quindi la stringa dell'esempio "Ciao" è formata da 5 byte.

 

Data di creazione di questa pagina: gennaio 2017
Ultima modifica: 17 giugno 2017


Assembly PIC18

Inoltre potrebbe essere utile la pagina: PIC18 - Suggerimenti, in ordine sparso

Licenza Creative Commons Attribuzione 4.0 Internazionale


EN - Pagina principale - Sommario - Accessibilità - Note legali e privacy policy - Posta elettronica

XHTML 1.0 Strict - CSS 3