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

In fase di sviluppo Stesura preliminare In fase di sviluppo

I PIC18 contengono diversi tipi di memoria con caratteristiche nettamente diverse:

La memoria dati è implementata con memoria RAM statica. Viene spesso indicata con il termine Registers oppure File Register

La dimensione, a seconda dei modelli, varia fino ad un massimo di 4 096 byte ed è suddivisa in 16 banchi da 256 byte ciascuno. Essa include due tipi di registri:

L'accesso ai vari registri avviene secondo due modalità:

Tutte le istruzioni (nota 1) 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.

Gli Special Function Registers

Questi registri hanno usi specifici. Tra i principali possiamo individuare:

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, spesso identificati dalla loro lettera iniziale. I principali:

In genere sono utilizzati nelle istruzioni di salto condizionato. Esempio:

Bank Select Register (BSR)

Già abbiamo visto questo registro, poche righe qua sopra.

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

Registro per il controllo delle periferiche

Ciascuna periferica è controllata da un insieme di registri speciali. A titolo di esempio, alla pagina helloREALworld in assembly sono descritti i registri TRISC e LATC, relativi alla periferica porta C.

Tutti i registri speciali sono sempre direttamente accessibili al codice e di fatto costituiscono la seconda parte dell'Access Bank

Variabili create nell' Access Bank

Questa è la modalità più semplice ed efficiente per creare variabili; è la stessa modalità usata per gli SFR.

Le variabili da memorizzare all'interno dell'Access Bank devono essere dichiarate dopo la parola chiave  UDATA_ACS, specificando una label e la dimensione in byte. Per esempio il codice seguente chiede all'assemblatore di riservare lo spazio necessario per memorizzare tre variabili (a, b, c)

    UDATA_ACS
a  res 1
b  res 1
c  res .90

Qualche osservazione:

L'uso è piuttosto intuitivo. Per esempio, per memorizzare il numero 5 nelle variabili "a" e "b":

  movlw 0x05
  movwf a
  movwf b

Di seguito il codice generato in corrispondenza del codice appena mostrato, in cui è effettivamente stato inserito dall'assemblatore, in modo automatico, lo switch ACCESS:

0000 0E05 MOVLW 0x5         21: movlw 0x05
0002 6E00 MOVWF 0x0, ACCESS 22: movwf a
0004 6E01 MOVWF 0x1, ACCESS 23: movwf b

Scorrendo il codice generato scopriamo che la variabile "a" ha indirizzo 0x000 (banco 0x0, indirizzo 0x00), la variabile "b" 0x001 (banco 0x0, indirizzo 0x01). La scelta del banco 0 è sottointesa per tutte le variabili in Access Bank.

Variabili create in un generico banco

Per utilizzare tutta la RAM disponibile, è necessario utilizzare i banchi.

Per riservare spazio per una variabile all'interno di un generico banco è necessario utilizzare la parola chiava UDATA, associata ad una label. Per esempio il codice esemplificativo seguente riserva:

primo   UDATA
a       res 1
b       res .200

secondo UDATA
a1      res 1
a2      res 1
b1      res .200

acs     UDATA_ACS
a_acs   res 1

Qualche osservazione:

L'uso di una variabile posta in un banco richiede obbligatoriamente la selezione preventiva del banco in cui si trova; è consigliabile, invece dell'uso diretto dello special register BSR, l'utilizzo della direttiva assembler banksel, tradotta nell'opportuna istruzione assembly movlb (MOVe Literal to low nibble in Bsr), ricavando automaticamente l'indirizzo del banco in cui la variabile si trova.

Per esempio, per le variabili più sopra definite, è possibile utilizzare il seguente codice:

  movlw 0x05  

  banksel a
  movwf a

  banksel a2
  movwf a2
  movwf a1

  movwf a_acs

Si noti che:

Di seguito il listato generato in corrispondenza del codice appena mostrato, in cui è effettivamente stato inserito dall'assemblatore, in modo automatico, lo switch BANCKED per tutte le variabili che lo richiedono:

0000 0E05 MOVLW 0x5         28: movlw 0x05
                            29:
0002 0101 MOVLB 0x1         30: banksel a
0004 6F00 MOVWF 0x0, BANKED 31: movwf a
                            32:
0006 010E MOVLB 0xE         33: banksel a2
0008 6F01 MOVWF 0x1, BANKED 34: movwf a2
000A 6F00 MOVWF 0x0, BANKED 35: movwf a1
                            36:
000C 6E00 MOVWF 0x0, ACCESS 37: movwf a_acs

Scorrendo il codice possiamo osservare, per esempio, che la variabile "a" ha indirizzo 0x100 (banco 0x1, indirizzo 0x00) e che la variabile "a2" ha indirizzo 0xE01 (banco 0xE, indirizzo 0x01). Queste assegnazioni potrebbero comunque cambiare senza alcun preavviso (nota 2)

Indirizzamento indiretto

Questo tipo di indirizzamento permette al PIC18 di accedere a tutta la RAM senza usare il concetto di banco, ma sfruttando il registro speciale a 12 bit FSR (File Select Registers, nota 3) ed il registro speciale INDF (INDirect File operand):

Il PCI18 possiede tre di tali insiemi di registri: FSR0, FSR1, FSR2 e corrispondenti INDF0, INDF1 e INDF2

Vediamo un esempio, in cui viene scritto il numero 0x55 in una variabile var qualunque, usando la coppia di registri FSR0 e INDF0:

primo   UDATA
var     res 1

        lfsr FSR0, var
        movlw 0x55
        movwf INDF0

Si noti che non è presente alcun riferimento al banco in cui var si trova.

Oltre a INDFx sono disponibili anche altri registri virtuali:

Stack software

Una breve descrizione intuitiva di cosa è uno stack.

PIC18 non possiede uno stack per uso generico. Questa struttura può essere realizzata, peraltro in modo estremamente potente, utilizzando le istruzioni appena viste:

Questa modalità è particolarmente comoda quando utilizzata in associazione ad opportune macro (qui un esempio)

Note

  1. L'istruzione movff (MOVe File register to File register) è l'unica che ignora questa modalità e permette lo spostamento diretto tra due registri qualunque
  2. in realtà è possibile forzare il compilatore all'uso di determinati banchi, ma questo passaggio è spesso inutile e, quindi, dannoso. Comunque, volendosi fare del male forzando l'uso del banco 3:
    terzo UDATA 0x300
  3. In realtà sono due registri a 8 bit, uno usato solo parzialmente
  4. PIC18 non possiede uno stack per uso generale come altri processori. Un particolare implementa con strutture separate lo stack software dei registri e lo stack hardware degli indirizzi
  5. Per le modifiche legate all'introduzione del set di istruzioni estese, si rimanda ai fogli tecnici

Ultima modifica di questa pagina: 23 maggio 2016


Assembly PIC18

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