Indice |
Abstract
Questo articolo non vuole essere una trattazione teorica completa del mondo dei microcontrollori Microchip(d'ora in poi PIC), ma semplicemente una piccola guida di riferimento per chi inizia ora o ha iniziato da poco. Per capire come valutare, cioè in base a quali parametri, scegliere una soluzione piuttosto che un'altra. Ci chiederemo perché spesso si preferisce iniziare con Arduino & company piuttosto che con una demoboard/scheda di sviluppo(prodotta dalla Casa Costruttrice) che costa la metà(ed ha molte più periferiche, più potenza di calcolo, maggior numero di I/O) e proveremo a spiegarne il perché.
Analisi dei propri obbiettivi
Prima di procurarci l'occorrente necessario per scrivere il nostro programma, bisogna analizzare i nostri obbiettivi. Dobbiamo chiederci: "Io cosa voglio fare con questi PIC?"
Possiamo rispondere in molti modi diversi, ma limitiamoci ad analizzare il caso in cui la risposta sia: "Utilizzarli per hobby, ne ho sentito parlare bene da un amico/ne ho letto su una rivista(o sito web) e voglio imparare ad utilizzarli", che è la risposta più comune tra chi inizia. Nel caso si voglia utilizzarli per lavoro allora il discorso si complica un pò di più, però a noi non interessa molto per ora, stiamo infatti iniziando da poco e direi che non è proprio il caso di preoccuparci di queste cose!
Dunque, abbiamo capito che il nostro è un hobby, che abbiamo un'oretta o due da dedicare a questo nuovo mondo e ne siamo affascinati, direi che ora siamo pronti per capire cosa serve per iniziare!
Le basi
Prima di tutto è fondamentale avere "pazienza, una discreta conoscenza dell'inglese e tanta voglia di imparare, sia dai propri errori, sia da documenti in inglese(datasheet, libri e application notes)"
Senza le basi, non si va da nessuna parte, in nessuna materia. Questo è un dato di fatto, innegabile ed evidente. Allora come facciamo?
Chi non è uscito da un istituto tecnico/professionale non può praticare quest'hobby?
Ovviamente può, ma prima deve conoscere qualcosa di elettronica di base, come i concetti di tensione, corrente, resistenza, la differenza tra valori analogici e valori digitali. Il concetto che manda in tilt molte persone che non hanno studiato elettronica di base bene è quello di potenziale di riferimento. C'è chi lo chiama massa,chi terra e chi zero Volt. Per chiarire una volta per tutte la differenza tra questi concetti(usati molto spesso in contesti sbagliati) rimando ad un chiarissimo articolo di un guru di ElectroYou, IsidoroKZ
I requisiti HW/SW
Diamo per scontato che conosciamo abbastanza bene questi concetti di base, vogliamo dunque concentrarci su questi benedetti microcontrollori. La domanda che si insinua nella nostra testolina di neofita è: "Ma di cosa ho bisogno?"
Facciamo dapprima un breve viaggio nel mondo della programmazione in generale per farci un'idea abbastanza chiara, e da lì poi dedurremo ciò che ci servirà! Partiamo con un semplice esempio:
Il browser che stiamo utilizzando per visualizzare questa pagina web(IE,Firefox,Chrome,Safari ecc...) è anzitutto un software, cioè un insieme di istruzioni che dicono all'hardware(Il nostro PC) quali operazioni svolgere. Questa definizione farà inorridire coloro che di programmazione ne capiscono, ma è importante partire dalle basi per capire effettivamente cosa dobbiamo fare. Il software che utilizziamo è di tipo eseguibile, cioè ci basta cliccarci sopra(o "lanciarlo" da riga di comando) perchè si avvii e faccia il suo compito. Bene, è chiaro che questo software eseguibile non viene dal nulla(affermazione idiota) ma è stato scritto da qualcuno in un linguaggio di programmazione. Chiariamo meglio quest'affermazione! Ad esempio, un giorno un programmatore si sveglia e decide di scrivere il suo browser personale. Allora va al suo PC e apre un editor di testi(nel caso più semplice) e inzia a scrivere il codice nel suo linguaggio di programmazione preferito. Quando ha finito non ha ancora un programma eseguibile, ma solo un file che contiene migliaia di istruzioni(file sorgente), né più né meno. Allora cosa fa? Cerca un altro software che gli permetta di ottenere da questo file pieno di istruzioni un file eseguibile, cioè pronto a svolgere il suo lavoro. Dopo qualche ricerca scopre che esistono vari tipi di software che svolgono questa funzione, e capisce che si differenziano tra loro per il linguaggio di programmazione che accettano in ingresso e per il sistema operativo su cui "girano"(Windows,Linux,Mac,FreeBSD ecc ecc). Scopre che alcuni sono a pagamento, altri gratis, altri Open Source, altri sono concessi in licenza ecc...
Questi software si chiamano compilatori. Decide quindi di scaricare il compilatore adatto al suo linguaggio di programmazione, lo installa e leggendo il manuale capisce una cosa importante: Non basta solo il compilatore a trasformare il file sorgente in un file eseguibile. Scopre che il compilatore produce in output un file che non è eseguibile direttamente, ma che ha bisogno di qualcos'altro(chiariremo tra poco cosa). Leggendo sempre il manuale, il programmatore scopre che il file restituito dal compilatore è di tipo oggetto(solitamente questi file hanno estensione .obj), cioè non è né un file sorgente né un file eseguibile. Inizia a chiedersi l'utilità di questo file, quindi inizia a cercare sul suo manuale a cosa serve questo file. Capisce che questo file non è altro che la traduzione del file sorgente(contenente istruzioni in un generico linguaggio di programmazione) in un file che contiene codice macchina, cioè istruzioni che solo il computer può capire. Per rendere questo file eseguibile il nostro programmatore ha bisogno di un altro software in grado di prendere come ingresso un file di tipo obj e restituire un file eseguibile(di solito di tipo exe). Scopre che il software che fa al caso suo è un linker cioè un software che collega i moduli del nostro file oggetto in modo da poterlo rendere eseguibile. A questo punto, il nostro programmatore(se non ha commesso errori nella stesusra del codice sorgente) ha pronto il suo bel file eseguibile! Ma cosa sono questi moduli menzionati poco fa? Beh non è questa la sede più adatta per spiegarli, per questo rimando a wikipedia(Programmazione). Riassumendo molto brevemente un concetto che richiederebbe un libro intero, possiamo dire che il 99% delle volte un programma non viene eseguito per come è stato scritto, ma effettua dei salti nel codice, cioè esegue o meno alcune istruzioni/parti di programma a seconda del verificarsi o o meno di alcune condizioni. Non c'è da preoccuparsi se questo non è chiaro fin da subito, lo diventerà con la pratica e lo studio. Quindi, in maniera molto breve, il linker si occupa di "organizzare" questi salti nel codice, collegando appunto i vari moduli tra loro. Questa spiegazione semplice non è del tutto esaustiva, ma ce la facciamo bastare.
Ok, questa situazione va bene per scrivere programmi per PC, ma per i micrcocontrollori? Beh, l'iter da seguire è uguale, cambiano solo i tipi di file(chiariremo meglio dopo) per questo non è possibile utilizzare gli stessi compilatori/linker utilizzati solitamente per lo sviluppo di software sul PC. Quindi per iniziare a programmare questi microcontrollori abbiamo bisogno(per quanto riguarda il Software) di:
- Un qualsiasi editor di testi
- Un Compilatore a loro dedicato
- Un Linker a loro dedicato
Non molto in fondo! Ora prima di scaricare tutto questo, vi dico che esiste un IDE(Integrated Developement Environment) che comprende in sé un editor di testi, un compilatore(selezionabile a seconda della famiglia di microcontrollori utilizzata) e un linker ottimizzato per i microcontrollori.
Prima di scaricarlo e di iniziare a smanettarci un po', prendiamo in considerazione l'idea di scegliere quale tipo di microcontrollori utilizzare.
I microcontrollori Microchip
In questa guida sono stati scelti i microcontrollori Microchip(PIC) per la loro enorme diffusione e ampia documentazione disponibile in rete. Ci tengo però a precisare che esistono validissime alternative a questi microcontrollori, prodotti da ATMEL, FREESCALE, NXP, e altri produttori che sono anch'essi ottimi prodotti! Quindi chiariamo che la scelta è stata fatta in base alle personalissime preferenze dell'autore e dal fatto che sono in molti a voler iniziare con questo tipo di microcontrollori. Da notare che non ho citato il blasonato Arduino in quanto non lo ritengo molto utile per un neofita(e a maggior ragione per chi ha già un po' di esperienza in questo campo). Anche questo è un personalissimo parere. Il motivo è che al programmatore che utilizza Arduino viene nascosta la complessità della programmazione del microcontrollore, in un certo senso il "divertimento". Questo perché è tutto preconfezionato, non si deve fare quasi nulla per avere un programma già funzionante. Questo tipo di approccio non è consigliato, in quanto se un giorno si volesse sviluppare con una piattaforma più complessa/architettura diversa non si saprebbe nemmeno da dove incominciare, perché quello che su Arduino si fa con una funzione, in un altro micro si fa con 5 o 6 istruzioni. La differenza dove sta? Con il primo si programma, con il secondo si impara a programmare. Utilizzando la seconda piattaforma/micro si capisce cosa bisogna realmente fare per ottenere un certo risultato, facendo propri i concetti di registro, operatore sui bit, operazioni di set e reset di pin ecc ecc... Con Arduino invece tutto questo lo fa il compilatore, impedendovi di capire cosa bisogna realmente fare per ottenere quel risultato. Quindi dove sta la principale differenza? Programmando la seconda piattaforma si può poi passare ad altre piattaforme molto agevolmente, dato che i concetti di base sono quelli(sopra menzionati), che sono già stati acquisiti(anche a furia di sbatterci la testa più e più volte), con Arduino è molto più difficile, in quanto questi concetti vengono mascherati da una o più funzioni, che sono ovviamente assenti nelle altre piattaforme. Riprenderemo questo discorso in seguito.
Ora iniziamo a dare un'occhiata al sito Microchip! Scopriamo che i PIC si dividono per applicazione(USB, Display, Applicazioni mediche ecc ecc...), per dimensione in bit cioè ne esistono da 8 bit, da 16 bit e 32 bit. Chiaro che la complessità nel programmarli(e le performance) cresce al crescere della dimensione, quindi gli 8 bit saranno i più semplici, i 32 i più complessi. Analizzaremo dopo, in maniera breve le principali differenze tra questi PIC. Essi si dividono pure per famiglie, quindi abbiamo la famiglia dei PIC16 e PIC18 che sono a 8 bit, la famiglia dei PIC24, dsPIC30 e dsPIC33 e la famiglia dei PIC32 che sono a 32 bit(dei veri "mostri" in quanto a prestazioni!).
Iniziare dai PIC32 è davvero(molto) complesso, in quanto richiedono conoscenze di un certo livello, quindi lasciamoli stare per ora. I PIC24 sono un buon compromesso, ma se iniziamo da ora sono abbastanza difficili, per ora lasciamoli stare. I PIC18 sarebbero ottimi, ma presentano alcuni aspetti abbastanza ostici per chi inizia davvero ora, quindi "buttiamoci" sui PIC16 per farci le ossa, in quanto dopo non sono molto consigliati, in quanto costano quanto un PIC24 e hanno delle loro prestazioni. Da utilizzare solo se si hanno già nel cassetto o per farsi le ossa.
Ci sono molti PIC nella famiglia dei PIC16, contrassegnati dalla sigla PIC16FXXX(A) dove XXX rappresenta 3 numeri e la A tra parentesi indica che può esserci come non esserci(non cambia nulla a livello di programmazione). Ora vediamo un attimo cosa bisogna avere a livello Hardware per poterlo programmare e poi affronteremo la programmazione vera e propria!
Il Programmatore(oggetto e non persona)
Il programmatore(inteso come oggetto e non come una persona) è un dispositivo in grado di trasferire dal PC al PIC il programma compilato e linkato precendemente. Come funziona? A grandi linee, ha 2 interfacce, una USB da collegare al computer(è fornito di software che ne installa i driver e il programma relativo alla sua gestione) e di un'altra interfaccia composta da 6 pin(contatti elettrici) da collegare al PIC da programmare. Vedremo dopo in dettaglio come collegarlo.
Ci tengo a dire che il programmatore va comprato dalla casa produttrice(Microchip), in quanto solo così ci si può garantire un prodotto supportato e perfettamente funzionante! Per il web girano molti programmatori autocostruiti/cloni, lasciateli perdere, non sono affatto utili e con i soldi che spendete per comprarli/costruirli ve ne comprate uno ufficiale dal negozio online e siete sicuri che funziona!
Il programmatore consigliato è il PicKit3, l'ultimo nato di casa Microchip che permette di programmare tutti i nuovi PIC. Io personalmente ho ancora il "vecchio" modello PicKit2(al tempo non era uscito il PicKit3), che per le mie esigenze è ottimo! Non mi ha mai dato problemi, e se viene tenuto bene può durare anche parecchi anni!
Quindi ora sappiamo che questo programmatore è un dispositivo HW che trasferisce i file compilati e linkati(file con estensione .hex) dal PC al nostro PIC. Quindi è questo l'unico requisito HW, apparte una Breadboard(che serve per montare i circuiti senza dover saldare i componenti), questa si presume si abbia già quando ci si interessa di microcontrollori.
MPLAB IDE
Qualche riga fa abbiamo parlato di un IDE, un misterioso programma che racchiude in sè un editor di testi, un compilatore e un linker. Ma la sua utilità qual'è? Non posso scaricare ognuno di questi programmi a parte e utilizzarli singolarmente?
Certo che è possibile farlo, ma non molto consigliato agli inizi. L'utilizzo di un IDE permette di avere in un unico programma tutto ciò di cui abbiamo bisogno per programmare i nostri PIC! L'IDE in questione si chiama MPLAB e si trova in due versioni, la versione 8.83 che è quella più "vecchia", e la versione X che è la più nuova, abbastanza differente dalla versione 8. L'utilizzo dell'una o l'altra non è così importante, è più una decisione personale. Io utilizzo ancora la versione 8 in quanto mi trovo davvero bene con quella, ma nulla vieta di utilizzare la versione X. Qualora si decida di utilizzare l'ultima versione, questo articolo è ottimo per capire come funziona! Dall'esperto di PIC, paolino! Paolino ha anche scritto un'ottimo libro sui PIC, consigliato assolutamente se volete imparare qualcosa :)
Il linguaggio di programmazione
Esistono vari linguaggi di programmazione per i PIC, i più diffusi sono: Assembly, Basic e C.
Il linguaggio con cui consiglio di iniziare è il C, anche sui PIC16. Alcuni dicono che sui PIC16 sia meglio l'assembly, in quanto non hanno molte risorse, ma il problema è che tale linguaggio è abbastanza "ostico" per chi non ha mai fatto programmazione. Non è molto difficile da imparare, ma ci si deve dedicare un bel pò. Il C invece è più "intuitivo" come linguaggio di programmazione, in quanto è di alto livello(cioè più vicino a noi). E' anche vero che non è ottimizzato perfettamente, quindi un programma in C occuperà un pò più di spazio sul PIC e sarà un pò più lento, ma non è così significativa la differenza e questo a noi basta. In fondo i nuovi PIC della famiglia PIC16(16F887,16F913,16F1454, ecc ecc...) hanno così tanta memoria programma/dati che non è quasi necessario utilizzare l'assembly. NON sto dicendo che l'assembly sia un cattivo linguaggio(tutt'altro), solo che a parere mio, conviene utilizzare il linguaggio C, almeno agli inizi. Se poi ci dovesse essere necessità di ottimizzare alcune parti di codice, esse possono essere scritte in assembly, meglio di così! :)
Sintesi
Dopo tutta questo leggere, riassumiamo in una semplice lista i componenti HW/SW di cui abbiamo bisogno!
- MPLAB IDE(scaricabile a partire da qui)
- Compilatore Linguaggio C(scaricabile a partire da qui)
- Programmatore PicKit2/3(qui e qui)
Questo è tutto ciò di cui abbiamo bisogno per programmare i nostri PIC!
A breve spero di fare un tutorial sulla programmazione dei PICmicro!