Tutorial → PIC18 →
Assembly → Il primo programma
→ Le prime istruzioni
Il PIC18 è un
processore RISC che può eseguire 75 istruzioni diverse (nota
1). In questa pagina vedremo come interpretare le informazioni contenute nei
fogli tecnici che descrivono un'istruzione. In genere è poco utile
imparare a memoria tutte le istruzioni: è sufficiente conosce quelle usate
più frequentemente e, soprattutto, imparare a leggere
i fogli tecnici che le
descrivono.
L'istruzione
Come primo esempio utilizzeremo l'istruzione movlw 0x55
della quale già abbiamo visto il funzionamento.
Le singole istruzioni del microcontrollore sono tutte descritte nella parte
terminale dei fogli tecnici (nello specifico del
PIC18F26K20 a partire
da pagina 341, ma gli indici
sono fatti per essere usati...). La struttura usata nella descrizione è
simile per tutte le istruzioni:
Esaminiamo quanto viene scritto:
- Il nome dell'istruzione cerca di richiamare il suo comportamento:
MOVe Litterlal to W
(muovi letteralmente nel registro W). In genere viene chiamato
codice mnemonico
- Syntax mostra come l'istruzione dovrà apparire nel
codice sorgente che andremo a scrivere, inclusi eventuali argomenti (se
opzionali tra {}). Il nome delle istruzioni può
essere sia maiuscolo che minuscolo (case insensitive)
- Operands indica che l'unico (in questo caso) operando k dovrà essere
un numero compreso tra 0 e 255, cosa ovvia visto che W è un registro a 8
bit
- Operation descrive simbolicamente l'operazione
eseguita. In particolare "→" indica che un numero viene copiato in un
registro
- Status Affected indica l'elenco dei
flag modificati (in questo caso nessuno)
- Encoding mostra la sequenza binaria corrispondente
all'istruzione. Confrontarla con quanto mostrato
nella pagina precedente dove la
stessa sequenza è scritta in esadecimale
- Description ha un ovvio significato...
- Words lo spazio occupato in memoria dall'OpCode, misurato in parole da 16 bit
- Cycles indica il tempo necessario per l'esecuzione
dell'istruzione. La "strana" unità di misura è 4 periodi di clock del
processore (nell'esempio, con clock a 1 MHz: 4µs)
- Q Cycles Activity mostra le quattro fasi che, in
questo caso, sono necessarie per completare l'istruzione.
- Infine, un esempio d'uso
Qualche osservazione secondaria:
- Per quasi tutte le istruzioni del PIC18, i campi Word
e Cycles coincidono e sono pari a 1.
- Nella Program Memory abbiamo visto
che l'istruzione movlw 0x55 è stata codificata come
0x0E55. Ricostruiamo a
mano l'istruzione, facendo il lavoro dell'assemblatore:
- Il primo byte è quello riportato nel foglio tecnico:
0000 1110 (=0x0E)
- Il secondo byte (0x55) è il numero da
caricare nel registro W, indicato nel foglio
tecnico con la lettera k
- Potrebbe essere utile rispondere ai quesiti 1, 2
e 3
Gli Status Bits
Gli Status Bits sono una serie di 5
flag che identificano particolari
situazioni generate dalle operazioni aritmetiche, logiche o di altro tipo.
Ciascun flag è una variabile booleana e vale 0 oppure 1 (o anche:
Vero oppure Falso) ed è indicato da una lettera:
- Carry: potrebbe essere visto come il nono bit del
risultato di una operazione aritmetica a otto bit. Può indicare, a
seconda dell'operazione, il riporto delle operazioni di somma
e sottrazione oppure viene usato in alcune operazioni di rotazione o shift
(scorrimento dei bit a destra o a sinistra).
Ad esempio sommando i numeri binari a otto bit 0000_0001 e 1111_1111, il
risultato è 1_0000_0000, cioè 0000_0000 con il riporto di 1. Tale
riporto verrà memorizzato nel flag C.
- (in genere poco rilevante) Digit Carry: è simile al carry, ma interviene
come riporto tra il 4 bit che formano un byte. Viene utilizzato per le
operazioni in
aritmetica BCD.
- Zero: indica che un risultato di una operazione è zero
- OVerflow: indica un riporto tra il sesto ed il
settimo bit; è utilizzato nelle operazioni in complemento a due, cioè
per la gestione dei numeri negativi
- Negative: indica il valore del settimo bit, cioè
il segno di un numero in complemento a due
In genere i flags sono utilizzati nelle istruzioni di salto condizionato,
cioè per eseguire alcune istruzioni piuttosto che altre a seconda del
risultato di una operazione
Usando il simulatore. il valore dei flag è mostrato accanto al valore del
PC e del registro W, usando una lettera maiuscola oppure minuscola. Ad
esempio:
- z (come nell'esempio mostrato) significa che il risultato
dell'ultima operazione eseguita non è zero
- Z significa che il risultato è zero
- c (come nell'esempio mostrato) significa che
l'ultima operazione eseguita non ha prodotto riporto
- C significa che è presente un riporto
- ...
(certo non è il massimo di leggibilità...)
I salti
Il primo programma visto è formato da istruzioni eseguite
in ordine sequenziale, cioè ordinatamente una dopo l'altra. Il PIC possiede
varie istruzioni che permettono di eseguire le istruzioni non in ordine
sequenziale: qui ne vedremo tre, molto simili ed indicate con il nome
generico di salto.
Salto incondizionato
Questa istruzione permette di eseguire una istruzione posta in una
qualunque cella della memoria programma, saltando in avanti o
indietro all'interno del programma.
Per esempio il programma appena mostrato, dopo l'esecuzione
dell'istruzione goto 0x00002 eseguirà
l'istruzione posta all'indirizzo di memoria 0x00002
(cioè addlw 0x01), all'interno di un ciclo infinito di incremento del contenuto
di WREG. Prima di proseguire, eseguire passo passo
il programma.
Facciamo riferimento al foglio tecnico:
Come si legge nella descrizione il Program Counter assume un valore
qualsiasi di 20 bit (5 cifre esadecimali), permettendo di eseguire una
qualunque istruzione. (nota 2)
Il calcolo dell'indirizzo della cella in cui è contenuta l'istruzione che
si vuole eseguire (0x00002 nell'esempio) è
piuttosto noioso e deve essere rifatto ogni volta che di aggiunge o toglie
un'istruzione. Per fortuna può essere calcolato automaticamente
dall'assemblatore usando le label.
Branch (diramazione) incondizionato
L'istruzione bra, a partire dal nome, è molto simile alla precedente.
Essa somma (o sottrae) al valore del Program
Counter un numero compreso tra -1024 e 1023, permettendo al programma di
andare avanti (o indietro) saltando fino ad un massimo di circa 1000
istruzioni rispetto all'istruzione stessa di bra.
A volte questo tipo di salto è indicato come salto relativo,
mentre il goto è indicato come salto assoluto.
Queste istruzioni sono illustrate in questa pagina.
Branch condizionati
I salti condizionati permettono di eseguire un'istruzione piuttosto che
un'altra a seconda del valore di uno dei flag. Sono la base dei
costrutti che ad alto livello vengono indicati come
if-then-else oppure cicli while-do e
for.
Queste istruzioni sono illustrate in questa pagina.
Quesiti
- [Avanzato] Assemblare "a mano" l'istruzione addlw 0x10: leggendo il foglio tecnico, scrivere la sequenza binaria
ed
esadecimale corrispondente. Usare l'assemblatore (o quanto mostrato
nella pagina precedente) per verificare
la correttezza.
- [Avanzato] Assemblare "a mano" l'istruzione sleep
- [Avanzato] Descrivere il funzionamento ed assemblare "a mano" l'istruzione
andlw 0x20
- Eseguire lo stesso programma della
pagina precedente usando come valori iniziali 0xE8; 0x70, 0xF0: come
variano i flag C, Z, N, OV?
- Eseguire il programma mostrato in questa pagina: come variano i
flag C, Z, N, OV?
Nota
- In realtà sono presenti anche otto istruzioni estese.
- Si noti che vengono impostati solo 20 dei 21 bit usati per
indirizzare la memoria flash, in quanto il bit meno significativo è
sempre zero. Quindi le celle sono al massimo 221 (2 MB) ma le
istruzioni possono essere al massimo 220 da 2 byte ciascuna
- Inoltre c'è un riporto memorizzato nel flag C, ma in questo esempio
non è rilevante
Data di creazione di questa pagina: gennaio 2017
Ultima modifica di questa pagina:24 ottobre 2017