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 [-256≤k≤+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.
|