Tutorial → PIC18 in C → helloREALworld

In questa pagina è presentato un semplicissimo programma che utilizza
la porta C del PIC18 come uscita digitale per accendere un LED. SI tratta
della versione "reale" del più classico dei programmi per PC:
main(){printf "hello world";}.
Scrivere il primo programma in C per il PIC18 non è difficile, ma è
utile avere:
- qualche conoscenza di elettronica digitale
- qualche nozione di base sul C
- un'idea della struttura del microcontrollore PIC18
Purtroppo la curva di apprendimento è piuttosto ripida, soprattutto
perché occorre progettare contemporaneamente hardware e software. Per
questo, a volte, l'uso di uno starter kit potrebbe aiutare, risolvendo
almeno in parte i problemi dell'hardware.
Il primo programma: accendiamo un LED
Questo programma non fa altro accendere un LED: un modo per salutare il
mondo facendo il verso al più classico dei programmi C per PC. I passi necessari:
- Realizzare l'hardware, compresa la parte che permette di programmare
il PIC18
- Scrivere il software e programmare il dispositivo, lasciando
connesso il PC
- (effettuare i test e correggere gli errori, operazione da ripetere più e più volte)
- Scollegare il nuovo circuito con il PIC18 e alimentarlo autonomamente
La parte centrale dell'hardware è costituito da un LED con in
serie una resistenza da qualche centinaio di ohm, connessi tra il pin RC0
(porta C, bit 0) e massa:

Come operazione preliminare occorre individuare sul foglio tecnico
specifico del PIC18 in uso quale è il pin RC0 e quale è (o quali sono) il pin di
massa (VSS). Il nome potrebbe cambiare, in particolare nella parte che segue
lo slash (la stringa /T1OSO/T1CK1 dell'esempio
potrebbe mancare oppure essere diversa) . Analogamente, il numero del
piedino potrebbe essere diverso.
Evidentemente lo schema appena riportato è parziale: mancano infatti
tutti i segnali per il collegamento all'ICD e l'alimentazione.
Abbiamo tre scenari possibili:
- Disponiamo di uno starter kit
oppure abbiamo già costruito
un circuito stampato e siamo cosi "fortunati" che il LED è
già connesso. Anche tutti i segnali per il collegamento
all'ICD sono già stati realizzati... Abbiamo quindi già finito
questa prima parte,
prima ancora di cominciare!
Ad esempio se vogliamo utilizzare il PIC18F14K50 possiamo utilizzare il
Low Pin Count
USB Dev kit. Nella documentazione è infatti presente il seguente
schema dove si nota, tra gli altri, la presenza di D1 ed R4:

- Possediamo una debug header. In
questo caso è sufficiente collegare resistenza e LED tra RC0 e massa. I segnali verso l'ICD sono
infatti già connessi. Anche l'alimentazione
deriva dal PC e "non serve". Per esempio, sempre nel caso di un
PIC18F14K50 questo è tutto quanto dobbiamo realizzare:

- Abbiamo il solo microcontrollore. Occorre
collegare cinque segnali verso l'ICD, il LED e la resistenza, tutte le
alimentazioni, i condensatori di disaccoppiamento, la resistenza
collegata al reset. Tutt'altro che trascendentale, ma serve una qualche
attenzione. Quello qui riportato è lo schema completo, corrispondente al
circuito realizzato su breadboard nell'immagine di apertura.
.
A questo punto possiamo collegare l'ICD, che fornirà anche
l'alimentazione e la possibilità di trasferire il software al
microcontrollore.
Il software
Lo scopo di questo primo codice è accendere il LED connesso alla porta C, bit 0. Il codice è diviso in due file, che trovate a fine
pagina.
Configuration Bits
La funzione di questi bit è già
stata descritta. Il file
scaricabile a fondo pagina è specifico per l'esatto modello di PIC18 che
si sta utilizzando e quindi potrebbe essere consigliabile generarlo da zero e non copia&incollarlo.
Alcuni Configuration Bits che potrebbe essere utile osservare:
- Una delle tre seguenti righe (o
simili), a seconda del processore in uso:
#pragma config OSC = IRC // PIC18F2431
#pragma config FOSC = IRCCLKOUT // PIC18F14K50
#pragma config FOSC = INTIO67 // PIC18F2xK20
permette
di utilizzare
il clock interno al PIC18. La sua frequenza dipende del
microcontrollore in uso e da eventuali ulteriori impostazioni, ma al
momento non ci interessa il suo valore.
- #pragma config WDTEN = OFF
disattiva il watchdog. Se non gestito infatti il
microcontrollore verrebbe continuamente resettato automaticamente pochi
millisecondi dopo l'accensione
- #pragma config LVP = OFF
disattiva la programmazione a bassa tensione. Utile se
l'hardware non ne prevede l'uso
Questo header file (con nome qualunque, ma estensione .h -
Osservazione 3) deve essere
salvato nella sezione Header Files del progetto.
Codice C
Esaminiamo il codice, in questo come in altri casi, indipendente dallo
specifico modello di PIC18 in uso. Il codice è
scaricabile a fondo pagina.
- #include "configurationsbits.h"
Questa linea include i
configuration bits più sopra descritti. Ovviamente il nome del
file deve coincidere con quello che abbiamo scelto.
I pin di I/O del PIC18 sono raggruppati in gruppi di massimo otto, indicati
con il termine PORTx, dove x è una lettera che, a seconda del modello, varia
da A ed E. Per poter accendere un LED connesso tra l'uscita 0
della porta C e massa sono necessarie due
operazioni:
- Configurare la porta C come uscita
- Porre alta l'uscita 0 (LSB) della porta C per accendere il LED
La documentazione è disponibile
in una sezione del data book dal titolo indicativo di PORTC,
TRISC and LATC Registers. Di seguito un estratto in cui sono
mostrate le tre tabelle a cui siamo interessati, con evidenziati i bit che
controllano il pin a cui il LED è collegato:

- TRISC = 0x00;
Questo assegnamento configura tutti
gli otto bit della prta C come uscita. Per ricordarsi: zero è anche l'iniziale di...
Output.. Osservazione 1.
- LATC = 0xFF;
Questo assegnamento
porta a livello logico alto tutti gli otto pin della porta C (compreso
RC0, quindi) e quindi il
LED viene acceso. Osservazione 2
- while (1);
Una volta scritto 1, questo è memorizzato in un latch e quindi il LED rimane acceso
anche se il processore fa altro, fino ad una modifica o allo spegnimento.
Questo file (con nome qualunque, ma estensione .c) deve essere salvato
nella sezione source file del progetto.
Al termine, il progetto deve presentarsi come di seguito mostrato.

Il progetto evidenziato è quello principale (tasto destro → Set as Main Program).
Compilazione, programmazione ed esecuzione
Le operazione 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ù comoda.
Per evitare comportamenti a volte incomprensibili, un paio di avvertenze:
- Alcune icone hanno una doppia opzione: programma "di produzione" e
programma di debug: attenzione ad effettuare la scelta corretta
- Alcune opzioni usano automaticamente il progetto principale
- Se modificate aspetti importanti del progetto (per esempio il
modello di microcontrollore), usate l'opzione Clean and Build
Per programmare o eseguire codice usando un PIC18 reale occorre
ovviamente alimentarlo. Il modo più semplice per farlo è
configurare il PicKit3 per fornire la
corretta tensione.
Il debug
Il debug si effettua attraverso:
- l'esecuzione passo passo utilizzando le apposite icone
auto-esplicative
- l'uso dei breakpoint, con un click in corrispondenza del numero
presente su tutte le righe. Il numero dei breakpoint "hardware" è
limitato, i breakpoint "software" sono supportati solo da ICD 3 e
superiori)
- l'uso del cursore per vedere il contenuto delle variabili. In
alternativa: Windows → Debugging → Watch)



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.
Il passo successivo: Continuiamo a salutare...
- Scelta della base numerica. Le seguenti righe di codice hanno gli
identici effetti:
TRISC = 0x00;
// Set all PORTC pin as Output
TRISC = 0b00000000; // Set all PORTC pin as Output
TRISC = 0;
// Set all PORTC pin as Output
Infatti 0x00 = 0 =
0b00000000.
Qui un approfondimento.
- LATC e PORTC. I due seguenti assegnamenti hanno, nel caso di sola scrittura (come
descritto in questa pagina), esattamente lo stesso effetto:
PORTC = 0xFF; // 0b11111111 - Turn on all PORTC pin
LATC = 0xFF; // 0b11111111 - Turn on all
PORTC pin
Qui un approfondimento
- Configurations bits. La scelta di includere i
configuration bits in un header
file è discutibile. Altre opzioni sono inserirli in un separato file
sorgente (.c) appartenente al progetto oppure nel file che contiene il
main()
- Una pagina simile, con codice in assembly:
helloREALworld in assembly
Codice
Esercizi
- Collegare il LED ad una porta diversa (PORTA, PORTB...): individuare
quali pin sono effettivamente presenti e quali sono i registri da
modificare
- Altre esercizi al termine della pagina continuiamo a salutare...
Data di creazione di questa pagina: settembre 2014
Ultima modifica: 20 aprile 2016
Una pagina simile:
helloREALworld (in assembly)