Tips & Trick - PIC

 

 

Istruzioni di salto nei PIC a 8 bit


Vediamo, se possibile, di commentare alcuni aspetti della questione.

In primo luogo dobbiamo ricordare che i PIC a 8 bit si dividono in 4 grandi famiglie:

  • Baseline, con core a 12 bit
  • Midrange, con core a 14 bit
  • Enhanced Midrange, con core a 14 bit
  • PIC18F, conc ore a 16 bit.

Essenzialmente, la limitazione del numero di bit disponibili per codificare una istruzione determina le principali differenze delle istruzioni di salto.

Esse sono riducibili a tre gruppi:

  • istruzione di salto incondizionato goto
  • istruzione di salto relativo bra e brw
  • a queste si aggiungono le istruzioni di salto condizionato (btfssc/btfss) che in ogni caso si limitano al salto dell'istruzione successiva e che qui non consideriamo e, per i PIC18F, di salto condizionato dalla situazione dei flag dello STATUS.

Vediamo in una tabella il rapporto tra i vari PIC e le istruzioni di salto:
 

 Famiglia

Core
bit
Opcode Byte Cicli Codifica Limite Operazione
Baseline 12 goto k 1 2      101k kkkk kkkk k@ 9bit
0≤ k ≤511
k->PC<8:0>
STATUS<6:5>->PC<10:9>
Midrange 14 goto k 1 2   10 1kkk kkkk kkkk k@ 11bit
0≤ k ≤2047
k->PC<10:0>
PCLATH<4:3>->PC<12:11>
Enhanced Midrange 14 goto k 1 2   10 1kkk kkkk kkkk k@ 11bit  
0≤ k ≤2047
k->PC<10:0>
PCLATH<6:3>->PC<14:11>
bra k 1 2   11 001k kkkk kkkk k@ 9bit
-256≤ k ≤+255
(PC)+1+k->PC
brw 1 2   00 0000 0000 1011 255 (PC)+(W)->PC
PIC18F 16 goto k 2 2 1110 1111 kkkk kkkk
1111 kkkk kkkk kkkk
k@ 21bit  
0≤ k ≤1048575
k->PC<20:1>

bra k

1 2 1101 0kkk kkkk kkkk k@ 11bit   
-1024≤ k ≤1023
(PC)+2+2k->PC

bc  k
bnc k
bn  k bnn k
bov k bnov k
bz  k bnz k

1 1
(2)
1110 0010 kkkk kkkk
1110 0011 kkkk kkkk
1110 0110 kkkk kkkk
1110 0111 kkkk kkkk
1110 0100 kkkk kkkk
1110 0101 kkkk kkkk
1110 0000 kkkk kkkk
1110 0001 kkkk kkkk
k@ 8bit   
-128≤ k ≤127
(PC)+2+2k->PC

Vediamo i dettagli:

 

BASELINE.

Hanno core (lunghezza istruzione) di 12 bit. Tutte le istruzioni sono a 1 solo byte e sono eseguite in 1 o 2 cicli.
Il Program Counter è a 12 bit. La memoria programma arriva a 2K, divisa in un massimo di 4 pagine da 512k.

Dispone solo del salto incondizionato goto k  dove k è un numero a 9 bit  e quindi consente salti all'interno della pagina da 512 bytes.
L'istruzione, codificata su 1 byte, impiega 2 cicli per l'esecuzione.
Viene eseguita trasferendo k nei nove bit inferiori (bit 8:0) del Program Counter[k->PC<8:0>], mentre i bit superiori del PC sono derivati dai bit 6 e 5 dello STATUS [STATUS<6:5>->PC<10:9>]
Per saltare da una pagina all'altra della memoria programma occorre, quindi, utilizzare i bit di paging dello STATUS.

 

MIDRANGE.

Hanno core (lunghezza istruzione) di 14 bit. Tutte le istruzioni sono a 1 solo byte e sono eseguite in 1 o 2 cicli.
Il Program Counter è a 13 bit. La memoria programma arriva a 8K, divisa in un massimo di 4 pagine da 2k.

Dispone solo del salto incondizionato goto k  dove k è un numero a 11 bit e quindi consente salti all'interno della pagina da 2k.
L'istruzione, codificata su 1 byte, impiega 2 cicli per l'esecuzione.
Viene eseguita trasferendo k negli 11 bit inferiori (bit 10:0) del Program Counter [k->PC<10:0>], mentre  rimanenti 3 bit superiori del PC sono derivati dai bit 4:3 del registro PCLATH [PCLATH<4:3>->PC<12:11>]
Per saltare da una pagina all'altra della memoria programma occorre, quindi, utilizzare i bit di paging del PCLATH.

 

ENHANCED MIDRANGE.

Hanno core (lunghezza istruzione) di 14 bit. Tutte le istruzioni sono a 1 solo byte e sono eseguite in 1 o 2 cicli.
Il Program Counter è a 15 bit. La memoria programma può arrivare a 32K, divisa in un massimo di 16 pagine da 2k.

Dispone del salto incondizionato goto k  dove k è un numero a 11 bit  e quindi consente salti all'interno della pagina da 2k.
L'istruzione, codificata su un byte, impiega due cicli per l'esecuzione.
Viene eseguita trasferendo k negli 11 bit inferiori (bit 10:0) del Program Counter [k->PC<10:0>], mentre  rimanenti 3 bit superiori del PC sono derivati dai bit 6:3 del registro PCLATH [PCLATH<6:3>->PC<14:11>]
Per saltare da una pagina all'altra della memoria programma occorre, quindi, utilizzare i bit di paging del PCLATH.

Dispone anche dell' istruzione bra k  dove k è un numero a 9 bit e quindi consente salti all'interno di una area di 255 locazioni attorno a quella dove è collocata l'istruzione [-256k+255].
L'istruzione, codificata su 1 byte, impiega 2 cicli per l'esecuzione.
Viene eseguita sommando k al Program Counter [(PC)+1+k->PC].
Se l'istruzione punta ad una locazione in una pagina diversa da quella corrente, ma entro il range raggiungibile, non occorre alcuna manovra di paging, dato che viene cambiato l'interro PC.

Inoltre, dispone dell' istruzione brw  dove è il contenuto di WREG a determinare la destinazione del salto; dato che WREG contiene al massimo numeri di 8 bit, sono possibili salti all'interno di una area di 255 locazioni attorno a quella dove è collocata l'istruzione [-256<k<+255].
L'istruzione, codificata su un byte, impiega due cicli per l'esecuzione.
Viene eseguita sommando il contenuto di WREG al  al Program Counter [(PC)+(W)->PC].
Se l'istruzione punta ad una locazione in una pagina diversa da quella corrente, ma entro il range raggiungibile, non occorre alcuna manovra di paging, dato che viene cambiato l'intero PC.

 

PIC18F.

Hanno core (lunghezza istruzione) di 16 bit. Ci sono istruzioni  a 1 o 2 byte.
Il Program Counter è a 21 bit. La memoria programma può arrivare a 128K, non paginata.

Dispone del salto incondizionato goto k  dove k è un numero a 20 bit che consente salti all'interno di tutta l'area della memoria programma.
L'istruzione, codificata su 2 bytes e impiega 2 cicli per l'esecuzione.
Viene eseguita trasferendo k nel Program Counter [k->PC<20:1>]; non occorre alcuna manovra addizionale per saltare da una pagina all'altra.

Dispone anche dell' istruzione bra k  dove k è un numero a 11 bit e quindi consente salti all'interno di una area di 255 locazioni attorno a quella dove è collocata l'istruzione [-256<k<+255].
L'istruzione, codificata su 1 byte e impiega 2 cicli per l'esecuzione.
Viene eseguita sommando k al Program Counter [(PC)+1+k->PC].
Se l'istruzione punta ad una locazione in una pagina diversa da quella corrente, ma entro il range raggiungibile, non occorre alcuna manovra di paging, dato che viene cambiato l'intero PC.

Inoltre sono presenti istruzioni di salto in conseguenza dei flag dello STATUS: bc, bnc, bz, bnz, bov, bnov, bn, bnn.
Per tutte queste il k è a 8 bit, che consente il salto in una area 128 locazioni attorno a quella dove è collocata l'istruzione [-128<k<+127].
Le istruzioni sono codificate su 1 byte e impiegano 1 ciclo se non è effettuato il salto e 2 cicli se è effettuato il salto.
Sono eseguite sommando k al Program Counter [(PC)+2+2k->PC].
Se l'istruzione punta ad una locazione in una pagina diversa da quella corrente, ma entro il range raggiungibile, non occorre alcuna manovra di paging, dato che viene cambiato l'intero PC.


GOTO vs. BRA.

Nei PIC18F, sia bra che goto sono indipendenti dal paging perchè entrambe modificano completamente il contenuto del PC.
E' vantaggioso usare  bra invece di goto nei salti a distanze limitate perchè bra è codificato su 1 byte, mentre goto ne richiede 2, risparmianado memoria programma.

Negli Enhanced Midrange, tutte le istruzioni sono codificate in 1 byte e tanto goto che bra impiegano 2 cicli per l'esecuzione; quindi, da questa parte non ci sono differenze tra una e l'altra.
Il vantaggio di
bra (e brw) è quello di poter passa da una pagina ad un'altra (nel limite del loro range di azione) senza richiedere operazioni di paging, obbligatorie per il goto.


Copyright © afg . Tutti i diritti riservati.
Aggiornato il 28/05/18 .