helloREALworld

 Il circuito stampato inserito in una breadboard

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:

L'hardware

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.

Otto LED su bradboard

Il software

Lo scopo di questo primo codice è accendere alcuni dei LED. Il codice è diviso in due file, che trovate a fine pagina.

Le porte

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:

  1. Configurare ciascun piedino della porta come uscita, attraverso il registro con funzione speciale TRISx (Special Function Register, SFR). In particolare per configurare un piedino come uscita occorre scrivere 0 (zero). Per ricordarsi: zero è l'iniziale di... Output
  2. Scrivere 1 in binario su ciascun piedino collegato ad un LED da accendere, attraverso il registro con funzione speciale LATx

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!

Configuration Bits

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.

Codice assembly

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)

Assemblaggio del codice

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:

Progetto MPLAB X in Assembly

Il progetto evidenziato in grassetto è quello principale (tasto destro → Set as Main Program).

Compilazione, programmazione ed esecuzione

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:

Le icone

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

Il debug del codice si effettua attraverso:

Icone per il debig

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 sessione di debug

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.

Codice

Esercizi

  1. Collegare il LED ad una porta diversa da C (per esempio: porta A, porta B...): individuare quali pin sono fisicamente presenti e quali sono i registri da modificare
  2. Altre esercizi al termine della pagina continuiamo a salutare...

Note

  1. In seguito si farà riferimento al PIC18F26K20 in contenitore DIP
  2. In seguito verranno mostrati anche altri "vettori" e quindi la struttura del codice subirà alcune modifiche
  3. Tutte le lettere utilizzate per rappresentare numeri possono indifferentemente essere maiuscole o minuscole
  4. Per il momento ignoriamo lo SFR PORTx, descritto tra i Suggerimenti, in ordine sparso
  5. É importante notare che, se non si specifica la base dei numeri, viene usata la direttiva RADIX che di default è impostato ad esadecimale (e non a decimale, come sembrerebbe essere logico)
  6. La riga sopra goto sopra equivale alla riga goto $, considerata a volte da evitare, ma comoda in alcune situazioni particolari quali la scrittura delle macro

Data di creazione di questa pagina: marzo 2016
Ultima modifica: 23 novembre 2017


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima