In questa pagina è presentato un piccolo programma che utilizza la porta C come uscita digitale per accendere un gruppo di otto LED (nota 1).
Purtroppo la curva di apprendimento è piuttosto ripida, soprattutto perché occorre gestire contemporaneamente hardware e software.
Questo programma non fa altro che accendere alcuni LED: un modo per salutare il mondo facendo il verso al più classico dei programmi C per PC (main(){printf "hello world";}. I passi necessari:
La parte significativa dell'hardware è costituito da otto LED con in serie una resistenza da qualche centinaio di ohm, connessi tra massa e gli 8 pin della cosiddetta porta C, cioè i piedini del circuito integrato da RC0 a RC7, numerati da 11 a 18). Ecco lo schema elettrico parziale:
Come operazione preliminare occorre individuare sul foglio tecnico specifico del PIC18 in uso quali sono i pin RC0 → RC7 e quale è (o quali sono) il pin di massa (VSS). Il nome potrebbe cambiare, in particolare nella parte che segue lo / (per esempio: la stringa /T1OSO/T1CK1 potrebbe mancare oppure essere diversa). Analogamente, la numerazione dei piedini potrebbe essere diversa.
Evidentemente lo schema appena riportato è parziale: mancano infatti per esempio tutti i segnali per il collegamento all'ICD e l'alimentazione. In pratica è possibile utilizzare PICdemo oppure PICdemo R2 oppure costruire su breadboard il circuito che ne realizza lo schema completo.
Lo scopo di questo primo codice è accendere alcuni dei LED. Il codice è diviso in due file, che trovate a fine pagina.
Tutti i piedini del PIC 18 hanno molteplici funzioni. Per ora concentriamoci solo sulle porte di Input/Output, spesso indicate come GPIO (General Purpose Input/Output); in particolare esamineremo per prima la modalità di output da utilizzare per "scrivere" su ciascun LED 1 piuttosto che 0, rispettivamente: accenderlo o spegnerlo.
I piedini di I/O del PIC18 sono raggruppati in gruppi di massimo otto, che possiamo indicare con il termine porta X, dove X è una lettera che, a seconda del modello, varia da A ed E. Per poter accendere un LED connesso tra le uscite di questa porta e massa sono necessarie due operazioni:
La documentazione dettagliata è disponibile, per esempio, in una sezione del data book dal titolo indicativo di PORTC, TRISC and LATC Registers. (Nota 4). Per il PIC18F26K20 si trova a pagina 119: è vivamente consigliato leggere le prime righe di tale capitolo!
La funzione di questi bit è già stata brevemente descritta. Il file è specifico per un preciso modello di PIC18 ed è quindi è consigliabile generarlo da zero se non state utilizzando un PIC18F26K20. Non è necessario comprenderne fin da subito il contenuto, anche se è bene leggere i commenti in esso contenuti.
Il codice necessario per questo ed i seguenti esempi è scaricabile a fondo pagina.
Esaminiamo il codice, scaricabile a fondo pagina e utilizzabile senza particolari modifiche per tutti i PIC18 (tranne ovviamente la prima riga).
#include "p18f26k20.inc"
Questa riga include nel file la definizione dei registri dello specifico
PIC18 in uso. Deve necessariamente essere presente. Questo file viene
fornito con l'assemblatore e non deve essere modificato.
CODE 0x0000 ; processor reset vector - Code
start here
Come in molti processori, all'accensione l'esecuzione del codice inizia
all'indirizzo zero (è il cosiddetto vettore di reset). Questa riga
informa il linker che qui comincia il codice, con la parola chiave
CODE ed il numero 0x0 (nota
2)
movlw 0 ; Clear working register (W)
Già abbiamo visto questa istruzione (MOVe
Literal to W). Come per tutte le
istruzione che si incontreranno è comunque vivamente consigliata la lettura
del
foglio tecnico in caso di
dubbi
movwf TRISC ; Copy W to TRIS register (set
PORTC as output)
Abbiamo già visto anche questa istruzione
(MOVe W to File register).
Il registro TRISC ha una funzione particolare: se
posto a 0 configura tutti i pin della porta C come uscite digitali,
esattamente quello che ci serve, visto che abbiamo collegato ad essa 8 LED.
La funzione del registro TRIS e del successivo registro LAT verrà
riesaminata poco più avanti.
Si noti che lo stesso effetto delle due istruzioni recedenti poteva essere ottenuto con una singola istruzione: clrf TRISC.
movlw B'11001011' ; Load in W binary number
1100 1011 (0xCB)
Questa istruzione copia "letteralmente" il
numero binario 11001011 nel registro W. I numeri possono essere espressi in
varie basi, possibilmente da specificare in modo esplicito (nota
3 e nota 5):
movwf LATC ; Copy W to output latch (set some
LED on, some off)
Copia il contenuto del registro W in LATC. Questo registro corrisponde a 8
latch collegati direttamente ai pin della porta C e quindi ai LED: scrivendo
1 il LED corrispondente si accende, scrivendo 0 il LED si spegne (quindi,
nell'esempio, avremo nell'ordine due LED accesi, due spenti, uno acceso, uno
spento, due accesi)
A questo punto il programma può terminare, con l'istruzione sleep.
A volte, in alternativa all'istruzione sleep viene utilizzato un ciclo infinito, con impatti negativi sul consumo energetico, ma dall'effetto pratico identico
sopra
goto sopra ; loop forever (nota 6)
I due file appena creati (con nome qualunque, ma estensione .asm) devono essere salvati nella sezione source file del progetto.
Al termine, il progetto deve presentarsi simile a quanto di seguito mostrato:
Il progetto evidenziato in grassetto è quello principale (tasto destro → Set as Main Program).
Le operazioni di compilazione del codice, trasferimento del codice dal PC al PIC18 ed esecuzione sono realizzate tramite una serie di icone, dal nome auto-esplicativo, leggibile passandoci il mouse sopra:
In generale l'ultima icona permette di effettuare automaticamente anche le operazioni precedenti, per cui è in assoluto quella più usata.
Questo comportamento è analogo a quanto già visto con il simulatore, ma con una differenza significativa: il codice è seguito dall'hardware reale del PIC. Quindi
Per evitare comportamenti a volte incomprensibili, tre avvertenze:
Per programmare o eseguire codice usando un PIC18 reale occorre ovviamente alimentarlo. Il modo più semplice per farlo è configurare il PicKit3 per fornire una tensione di 3,25 V.
Il debug del codice si effettua attraverso:
Il comportamento usando hardware reale invece che simulato ho una significativa differenza: se viene inserito un breakpoint, l'esecuzione si interrompe nel caso reale dopo l'istruzione, non prima.
Durante le sessioni di debug passo-passo le finestre appaiono come si seguito mostrato: in particolare è evidenziato un breakpoint alla linea 14, in rosso, e la posizione attuale del Program Counter alla linea 17, in verde.
Una volta che il programma si comporta come progettato, il PIC18 può essere programmato definitivamente (con gli stessi strumenti già visti) e reso autonomo, semplicemente scollegando l'ICD e fornendo l'alimentazione.
Data di creazione di questa pagina: marzo 2016
Ultima modifica: 23 novembre 2017
Assembly PIC18 - Versione 0.5 - aprile 2018
Copyright 2016-2018, Vincenzo Villa (https://www.vincenzov.net)
Assembly PIC18 di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale