Corso programmazione PICMicro in C – Lezione 2 – Installazione strumenti di sviluppo, descrizione del circuito di base

Aggiornamento Ottobre 2017
La Microchip ha rilasciato nuovi tool per lo sviluppo: MPLAB X IDE e i compilatori XC. Per far fronte alle novità e per non riscrivere tutti gli articoli daccapo, ho scritto delle lezioni integrative per consentire il passaggio dai vecchi strumenti a quelli nuovi. Le nozioni teoriche riportate negli articoli “vecchi” sono ancora valide. Per quanto concerne la scrittura del codice, l’utilizzo dell’IDE, i codici di esempio ecc, fate riferimento alle nuove lezioni che si trovano nella categoria PICmicro nuovo corso.

In questa seconda lezione incominceremo a “preparare il terreno” per i nostri primi, semplici esperimenti. Verranno utilizzati esclusivamente strumenti di sviluppo software gratuiti (anche se presentanti delle limitazioni, che per i nostri scopi non influiranno), e che quindi potete scaricare e installare senza problemi di licenze per incominciare a entrare nel fantastico mondo della programmazione dei microcontrollori PICMicro in linguaggio C. Ovviamente, trattandosi di un argomento abbastanza complesso, che abbraccia sia elettronica che informatica, sono richieste quantomeno conoscenze di elettronica di base e un minimo di dimestichezza con la programmazione. Per quanto riguarda la programmazione in C, consiglio di dare una buona lettura all’ottimo manuale Tricky C presente nella sezione risorse. Anche se la programmazione in C per i microcontrollori ha qualche “stranezza”, rispetto a quella per il computer, bisogna almeno sapere in C come si effettua un ciclo, come si scrive una funzione ecc, anche se cercherò di spiegarlo. Inoltre vi conviene sapere da subito, se già non la sapete, la differenza tra i sistemi decimale, binario ed esadecimale, per questo vi rimando ad un precedente articolo.

Prima di andare avanti, prego di leggere il disclaimer  qualora non sia già stato fatto.

ATTENZIONE!!! La Microchip ha cambiato tutta la toolchain di sviluppo! Fate riferimento a questo nuovo articolo e lasciate perdere l’installazione di questi strumenti vecchi.

Per iniziare abbiamo bisogno di componenti sia software che hardware:

Software
MPLAB® IDE
Hitec-C (versione Lite, già inclusa in MPLab con l’installazione completa)
Software di programmazione

Hardware
Un programmatore per picmicro
Una scheda di sviluppo
Un PiCMicro

Riguardo alla scelta del PICMicro, nelle mie lezioni userò prevalentemente un PIC16F877A, che costa relativamente poco (circa 8/9 euro) ed è molto ricco di periferiche. Avremo naturalmente bisogno anche di altri piccoli componenti (led, resistenze, pulsanti, display lcd ecc) che però vedremo di volta in volta in ogni lezione. Vediamo quindi dove e come recuperare tutti questi componenti uno per uno.

Installazione di MPLAB® IDE e Hitec-C

Scarichiamo MPLAB® IDE dal sito della Microchip: MPLAB® IDE (nel momento in cui scrivo, l’ultima versione disponibile è la 8.33, scaricabile in fondo alla pagina dove c’è il link indicato come MPLAB IDE v8.33 Full Release Zipped Installation). MPLAB® IDE è una suite di sviluppo: si tratta in pratica di un ambiente all’interno del quale possono essere integrati vari compilatori, sistemi di debugging (sistemi che servono a capire “dove stiamo sbagliando”) ecc. Insieme ad MPLAB viene installato anche MPASM che è il compilatore assembler (il linguaggio di programmazione predefinito per i PICMicro), che però non utilizzerò nelle mie lezioni: c’è già tanto materiale in giro su questo argomento, primo fra tutti l’ottimo tutorial PICMicro By examples di Sergio Tanzilli, che consiglio comunque caldamente di leggere. Ci tengo a precisare che alcune guide per l’assembler che si trovano in giro su alcuni siti sono copiate pari pari da tale tutorial senza nemmeno dare credito all’autore, questa è una cosa davvero scorretta e ignobile. Anche se in PICMicro by examples si fa riferimento ad un PIC16F84, ormai non più utilizzato (è stato sostituito dal 16F628, che è anche compatibile pin to pin), le regole di base sono valide per tutti i PICMicro, ed è una lettura che non può mancare a chi comincia a programmare i PICMicro: ha fatto la storia!

Installiamo dunque MPLAB® IDE. Lanciato il setup, quando ci verrà chiesto di scegliere che tipo di installazione effettuare, rimaniamo la scelta di default: completa. Tale modalità di installazione include anche Hitec-C. Alla fine dell’installazione verrà presentata la finestra:

programmare_picmicro_installazione_MPLAB_01

Scegliere Si, verrà installato anche l’Hitec-C:

programmare_picmicro_installazione_MPLAB_02

L’Hitec-C è un compilatore che ci permette di programmare in C per i PICMicro, la versione inclusa nell’installazione di MPLab è quella che permette di programmare in C i PICMicro delle famiglie 10,12 e 16, per tale motivo, ad un certo punto dell’installazione, si presenterà questa finestra che ci chiede se vogliamo installare anche il compilatore per le famiglie 18 e 32 (che però dovrà essere scaricato da internet, in quanto non è incluso nell’installazione standard di MPLAB)

programmare_picmicro_installazione_MPLAB_03

Qui possiamo anche rimanere tutto così com’è, senza selezionare nulla, e premere Next. Ci verrà chiesta la selezione della lingua

programmare_picmicro_installazione_MPLAB_04

Purtroppo dobbiamo scegliere inglese, spuntate anche la casella affianco (add to environment path) se avete intenzione di utilizzare il compilatore anche da riga di comando (ma non penso…). Completata l’installazione, da Start->Programmi->HI TECH Software->Hi TECH Pro for the PIC10-12-16 MCU Family, selezionare “Activate or Trial Pro Mode”

programmare_picmicro_installazione_MPLAB_05

Questo ci permette di selezionare come si dovrà comportare l’installazione di Hitec-C:

programmare_picmicro_installazione_MPLAB_06

Come vedete possiamo disporre di un’installazione completamente funzionante, senza limitazioni, ma per soli 45 giorni, di una versione completa (ma per la quale dobbiamo pagare!) e una versione Lite, senza limiti di tempo, ma con performance ridotte, selezioniamo la terza opzione come da immagine e premiamo Next.

La versione LITE non ci permetterà di utilizzare tutti i PICMicro disponibili (ma fortunatamente il “nostro” 16F877 rientra) e non potremo scrivere programmi molto lunghi perchè la compilazione è limitata a 2000H (=8192) word di programma. Per le applicazioni semplici che utilizzeremo in queste lezioni, 8192 word di programma sono più che abbondanti. Svantaggio principale della versione LITE è che l’output finale non è ottimizzato: la versione full a pagamento permette difatti di ottenere un codice eseguibile (cioè quello da caricare sul PICMicro) più pulito e generalmente più piccolo del 50% rispetto a quello generato dalla versione LITE.

L’installazione è completa.

Programmatore e software di programmazione

Del programmatore abbiamo già discusso nella lezione precedente. Non posso darvi un consiglio preciso su cosa utilizzare, tutto dipende dai gusti, dalla tasca e dalla voglia di imparare. Posso soltanto dirvi che io ho cominciato con il classico programmatore seriale JDM, che poi ho scoperto essere una vera “ciofeca” dal momento che non rispetta nessuno standard di programmazione e poteva essere utilizzato soltanto con il PIC16F84, il quale veniva programmato anche a stento! Per cui almeno questo ve lo voglio dire: all’inizio, se volete imparare e cimentarvi su più di un PICMicro, non usate un programmatore su seriale, sbatterete la testa inutilmente cercando di capire dove state sbagliando! Sono passato quindi ad un programmatore su parallela, che garantisce una ottima affidabilità e compatibilità. Tutti i programmatori su parallela sono cloni del ProPic2, e uno dei più validi in giro tra quelli che ho provato è quello proposto da Sergio Fiocco sul suo sito (qui c’è anche uno schema di un Propic2 clone con la descrizione di come vanno usati software). Tale programmatore è sicuramente ottimo, ma presenta lo svantaggio di dover utilizzare la porta parallela, che su molti pc, portatili in primis (per non parlare dei netbook!), non è più presente (non utilizzate adattatori USB/Parallelo! Ve lo dico da ora: funzionano per il 50% delle applicazioni!). Consiglio la realizzazione di tale programmatore perchè è un’esperienza da fare e permette di capire il meccanismo di programmazione dei PICMicro che è pur sempre una cosa importante.

Personalmente sono passato quindi ad un prodotto della Microchip, il PICKit2, che a mio avviso è davvero ottimo soprattutto per i principianti, e permette di programmare varie famiglie di PIC (compresi i 18F -la famiglia successiva ai 16F- per non parlare dei dsPIC, e delle famiglie 24F e 30F) nonchè memorie EEprom di tipo I2C, SPI e Microwire (e non è cosa da poco!). Quindi: fate voi. Se volete spendere qualcosina, andate tranquillamente sul PICKit2 (io l’ho acquistato su Robot-Italy), il PICKit2 viene fornito in versione standard o compreso di una scheda di sviluppo, è uscito anche il PICKit3, ma il prezzo è più elevato.  Io comunque è al Pickit2 che farò riferimento durante le lezioni. Tenete conto che ha un ottimo supporto e vengono anche rilasciati aggiornamenti del firmware (si, il Pickit2 è aggiornabile, in maniera semplicissima, come vedremo tra poco). Gli utenti di Linux e Mac purtroppo si dovranno accontentare di un software di programmazione a riga di comando, perchè per tali sistemi operativi la Microchip, almeno per ora, non ha rilasciato software a interfaccia grafica.

Quindi: un programmatore, per poter trasferire i dati sul PICMicro ha bisogno di un software di programmazione.

Solo per utilizzatori del PICKIT2
Se avete acquistato tale programmatore, il software è già incluso nel CD in dotazione, io generalmente non installo mai i software forniti sul cd perchè potrebbero essere datati. Scarichiamo il software e il firmware del Pickit2 dal sito della Microchip da questa pagina

Dobbiamo scaricare, in fondo alla pagina, i files denominati come PICkit2 vX.XX Install (scegliere magari la versione con il .NET Framework se non avete installato tale componente aggiuntivo di Windows)  e PICKit2 Firmware vX.XX. Il primo è il software di programmazione, il secondo è il firmware da caricare sul programmatore.

Lanciamo il setup del PICKit2 (l’ultima versione al momento in cui scrivo è la 2.61). A fine installazione colleghiamo il PICKit2 alla porta USB e lanciamo il programma PICKit2. Dobbiamo caricare il firmware sul programmatore: si tratta del file PK2V023200.hex contenuto nel secondo file zip che avete scaricato prima.

Piccola nota: mentre fate l’operazione di scrittura del firmware (FLASH in gergo), non staccate la porta USB, sarebbe anche meglio avere un gruppo di continuità in caso andasse via la corrente.

Dal Menù “Tools” selezioniamo “Download PICKit2 Operating System”:
programmare_picmicro_flash_PICKit2

selezioniamo il file PK2V023200.hex, diamo l’OK, Il PICKit2 verrà flashato con l’ultima versione del sistema operativo. Nella finestra dei messaggi appare la scritta “Downloading New PICKit Operating system” e si accende il led “Busy” sull’unità, la barra di progressione avanza, viene quindi fatta una verifica e infine il PICKit ed è pronto per funzionare:
programmare_picmicro_flash_PICKit2_02

Tale operazione verrà fatta allo stesso modo ogniqualvolta sarà disponibile sul sito della Microchip un aggiornamento del firmware. In caso di problemi durante l’aggiornamento del firmware rivolgetevi al rivenditore del PICKit2 o alla Microchip. Quando viene aggiornato il firmware, dovrà essere aggiornato anche il software di programmazione e viceversa, difatti software di programmazione e firmware procedono insieme: sul forum della Microchip spesso gli utenti del PICKit2 rilasciano una “lista dei desideri (wishlist)” delle funzioni che vorrebbero vedere implementate sul loro programmatore. Altra nota molto interessante è che la Microchip rilascia i codici sorgente sia del firmware che del software di programmazione (scritto in vb.net).

Per i programmatori su parallela e seriale i software generalmente più utilizzati sono ICProg e EpicWin, fate riferimento ai siti ufficiali e ai vari forum di elettronica per capire come usare tali software. Ripeto: qui descriverò unicamente l’utilizzo del PICKit2 e del suo software.

Circuito di base

Passiamo ora a vedere come deve essere composto un circuito di base che permette l’utilizzo dei PICMicro (in questa sede mi riferirò sempre al PIC16F877 anche se in generale le regole sono valide un po’ per tutti i PICMicro)

programmare_picmicro_schema_circuito_base_16F877_thumb

In questo circuito di base dobbiamo focalizzare l’attenzione su 3 zone:

Alimentazione

programmare_picmicro_schema_base_alimentazione

I PICMicro funzionano alla tensione standard tipica degli integrati TTL: 5V (ci sono anche quelli in grado di funzionare a tensioni molto inferiori, ma la tensione standard è questa). I 5 volt devono giungere al PICMicro stabilizzati, quindi forniti da un regolatore di tensione di tipo 7805 o simili.

Molti nelle loro applicazioni, soprattutto di robotica, preferiscono avere a bordo della scheda dei regolatori a basso drop-out, anche detti regolatori LDO (tipo l’ LM2940CT-5.0). Cosa significa? Un regolatore di tipo 7805 può accettare in ingresso una tensione minima di 7/8 volts (generalmente la tensione minima di ingresso dei normali regolatori 78XX è pari alla tensione di regolazione + 2÷3 volts, con tensioni più basse non viene garantita la stabilità e il funzionamento), il che significa, ad esempio, che già non possiamo alimentare il tutto con una batteria a 6 volts. I regolatori a basso drop-out permettono invece tensioni in ingresso molto basse, prossime alla tensione di regolazione (generalmente 0,5÷1 volt + tensione nominale) (ovvio che se il regolatore è da 5V e voi in ingresso ce ne mettete 4, non funziona!). Tali regolatori, soprattutto quando si realizzano circuiti destinati a funzionare con batterie, permettono un’autonomia maggiore, ma costano di più e sono più difficili da trovare. Ripeto: tale scelta viene fatta soltanto in applicazioni particolari (robot con batterie piccole). A noi basterà un alimentatore stabilizzato.

I 5Volt vanno portati ai pin 11 e 32 (indicati come Vdd, alcuni li indicano come Vcc) e i pin 12 e 31 (Vss o GND) vanno a massa. Come vedete c’è un piccolo condensatore sull’alimentazione (C1), tale condensatore va messo il più vicino possibile ai pin 11/12 o 32/31 e serve a filtrare verso massa eventuali disturbi sulla linea dell’alimentazione, va bene un condensatore in poliestere da 100nF (0.1µF).

Il PIC 16F877 come vedete ha i pin di alimentazione sdoppiati (cioè ci sono 2 Vdd e 2 Vss), collegateli sempre insieme, se è stato creato così, un motivo ci sarà e probabilmente sta nell’elevato consumo di corrente con tutte le periferiche interne accese. Ovviamente non tutti i PICMicro hanno i pin di alimentazione sdoppiati, il 16F876 ad esempio ha UN Vdd e 2 Vss, la maggior parte invece ha solo UN Vdd e UN Vss. Vi basta sapere soltanto che tutti i Vdd vanno all’alimentazione (positiva) e tutti i Vss vanno a massa.

Oscillatore (Clock)

programmare_picmicro_schema_base_clock

I microcontrollori hanno bisogno di una sorgente di clock, ovvero di un circuito che genera un’onda quadra a frequenza costante. Questo serve alla circuiteria interna del picmicro per scandire a tempo le operazioni e far funzionare i timers. Tutti i dispositivi digitali che eseguono operazioni hanno bisogno di un clock. I PICMicro possono funzionare con una grande varietà di sorgenti di clock: molti hanno un oscillatore interno (come il PIC16F628), che permette addirittura di risparmiare 2 pin (quelli destinati all’oscillatore esterno) che potranno essere utilizzati per altri scopi e semplificano la realizzazione del circuito: il clock è interno al PIC, non ci dobbiamo preoccupare di crearlo all’esterno e i 2 pin che servono per il clock li possiamo utilizzare per fare altro!
L’oscillatore interno però generalmente non è stabile quanto un quarzo esterno e non andrebbe utilizzato in applicazioni che richiedono grande precisione. Sui PICMicro tale modalità di clock viene generalmente speficata con la sigla INTOSC (INTernal OSCillator) e prevede una frequenza standard non modificabile (ad esempio 4MHz sul 16F628).

La presenza di un oscillatore interno è molto comoda ad esempio quando si devono realizzare circuiti piccolissimi e che devono avere un bassissimo consumo: un telecomando ad esempio, alimentato con una piccola batteria, in tali casi le scelte vanno sicuramente sui pic della serie 12F (quelli ad 8 pin) e non tutti, ma quelli che possono anche funzionare a tensioni molto basse (il 12F675 ad esempio che ha un oscillatore interno da 4MHz calibrato al ±1% e una tensione minima di funzionamento pari a soli 2V). Il 16F877 da noi utilizzato non ha l’oscillatore interno, quindi non ci occuperemo di questa modalità.

L’oscillatore esterno è sicuramente più utilizzato, si tratta in pratica di realizzare un piccolo circuitino che genera il clock. La configurazione classica per un oscillatore esterno è quella disegnata nello schema: un quarzo  (Q1) con in serie due condensatori (C2 e C3) che vanno verso massa e i terminali del quarzo sui pin Clock IN e Clock OUT del PICMicro.

Ci sono varie modalità di funzionamento per un oscillatore esterno al quarzo fatto in questo modo. Tali modalità vengono indicate dalla Microchip con le sigle LP, XT e HS. LP sta per “Low Power” e questa modalità prevede l’utilizzo di un quarzo a bassa frequenza. Il termine Low Power vuole sottolineare il fatto che tale oscillatore ha un basso consumo di corrente (di contro abbiamo una bassissima velocità di esecuzione delle operazioni e non ci possiamo permettere di realizzare cose troppo complicate). XT sta per XTal (abbreviazione di Crystal=Cristallo, il quarzo è difatti un cristallo!) e si utilizza per avere un buon compromesso tra velocità di esecuzione e consumi, prevede l’utilizzo di quarzi con un range di frequenze intermedio. Infine HS sta per High Speed (alta velocità) e prevede l’uso di quarzi ad alta frequenza (e quindi una maggiore frequenza di clock che porta a tempi di esecuzione delle istruzioni più bassi). La modalità HS porta naturalmente anche ad un maggior consumo, ma ci permette di realizzare cose più complesse perchè la cpu esegue i calcoli molto più velocemente. Ogni PICMicro ha queste modalità di funzionamento e il suo range di frequenze di quarzi per le varie modalità, dovremo sempre fare riferimento al Datasheet del componente in nostro possesso per vedere come operare e quali componenti utilizzare. Il datasheet del 16F877 è scaricabile in fondo all’articolo, e qui c’è un estratto che indica per ogni modalità quali quarzi e condensatori utilizzare per avere il giusto clock:

programmare_picmicro_clockLP-XT-HS_tabella

Per i nostri tutorial, sul PIC16F877, utilizzeremo la modalità HS con un quarzo da 20MHz (che è la massima frequenza di funzionamento per il 16F877). Dalla tabella potete vedere che con un quarzo da 20MHz si possono utilizzare come C2 e C3 valori da 15 a 33pF, generalmente ci si piazza sempre su un valore intermedio per cui 22pF vanno benissimo. Perchè ci si piazza su un valore intermedio? Perchè a pagina 146, sotto questa tabella, è chiaramente specificato che valori più alti del condensatore portano ad una maggiore stabilità ma richiedono un tempo di assestamento maggiore, quindi un valore di mezzo per noi è più che sufficiente.

Altra modalità di clock è la RC esterna: si può difatti generare un clock utilizzando semplicemente una resistenza e un condensatore come illustrato sempre a pagina 146:

programmare_picmicro_clockRC

Se proprio ci tenete ad utilizzare questa modalità (che come detto sopra: non garantisce una temporizzazione costante) per i valori potete fare riferimento a quanto indicato sul datasheet. In questo modo si utilizzerà soltanto il pin 13 (Clock IN), e dal pin 14 (Clock OUT) uscirà un’onda quadra pari alla frequenza di oscillazione divisa per 4.

La scelta del tipo di clock (se INTOSC, oppure LP,XT,HS o RC) andrà inoltre comunicata al PICMicro quando andremo a scrivere il programma (oppure se tralasciamo di scriverlo nel programma, dobbiamo impostarlo sul software di programmazione, ma questa è una soluzione che non preferisco perchè a volte ci si dimentica, causando malfunzionamenti). Ogni PICMicro ha difatti un registro di configurazione (quelli della serie 18F ne hanno più d’uno!) nel quale si andranno a settare vari parametri di funzionamento generale: la scelta del tipo di oscillatore è uno di questi. I vari parametri che costituiscono il registro di configurazione (chiamato anche Configuration Word – Parola di configurazione) prendono il nome di FUSES (fusibili, non chiedetemi il perchè di questa scelta del nome!), il registro di configurazione del 16F877 è descritto a pagina 144 del suo datasheet, ci occuperemo in altre lezioni di come va impostato.

Circuito di reset

programmare_picmicro_schema_base_reset

Tutti i PICMicro presentano sempre (oltre ovviamente ai pin di alimentazione, ai 2 pin per il Clock e ai 2 pin di programmazione) un pin chiamato MCLR (Master CLeaR). La funzione, anzi le funzioni di questo pin sono importantissime. Quando tale pin viene portato a 13.5Volt, il PICMicro capisce che deve entrare in modalità di programmazione (ecco perchè il JDM non riesce a programmare quasi nessun tipo di PIC!), per cui si prepara a ricevere i dati di programmazione sul pin denominato PGD (Program Data) e il clock di programmazione sul pin PGC (Program Clock). Quando MCLR viene messo a 5 volt (o tensione di funzionamento del PICMicro), il PICMicro capisce che deve portarsi in modalità di esecuzione programma (e quindi i pin PGD e PGC non hanno più funzione di programmazione). Infine quando MCLR viene portato a massa (0Volt), il PICMicro si mette in modalità RESET: termina l’esecuzione del programma e il microcontrollore rimane in standby fino a quando MCLR non viene portato nuovamente a 5Volt: quando questo accade, il programma ricomincia daccapo. Per tale motivo su tutti i circuiti di base per lo sviluppo è generalmente previsto un pulsante che “tira a massa” MCLR (denominato RESET sul nostro schema, va bene un normale pulsantino normalmente aperto da circuito stampato) e che ha quindi la funzione di resettare il pic e fargli ricominciare l’esecuzione del programma dall’inizio. Normalmente tale pin viene portato a 5 volt tramite una resistenza (R1 sullo schema. Tale resistenza viene anche chiamata resistenza di Pull-Up. Pull Up vuol dire: tirare verso l’alto, difatti tale resistenza porta il pin a potenziale alto, ovvero a 5 Volt). Per R1 usiamo un valore di 10KΩ. La funzione del diodo D1 (va bene un normale 1N4148) in serie alla resistenza è presto detta: se predisponiamo il circuito con un connettore ICSP (per permettere la programmazione del PIC direttamente sulla scheda di utilizzo), quando il PIC verrà programmato, su tale pin arriveranno 13.5 Volt e il diodo ha il compito importantissimo di bloccare tale tensione per non farla andare sulla linea di alimentazione a 5Volt, se ciò accadesse, oltre al PIC andrebbe in fumo anche il programmatore e altro! (Questo è probabilmente uno dei motivi per i quali è stata introdotta la programmazione a basso voltaggio: LVP Low Voltage Programming, di cui però non ci occuperemo in questa sede).

Sul nostro schema è inoltre previsto il connettore ICSP che ci permetterà di programmare il nostro PIC16F877 senza continuamente staccarlo e ricollegarlo allo zoccolo (io sono sempre di una sana, vecchia opinione: le cose quanto più vengono “smosse”, meno durano!).

programmare_picmicro_ICSP

Nello schema, per il connettore di programmazione (generalmente chiamato HEADER, anche se la Microchip con il termine Header identifica un connettore utilizzato sia per programmazione che per debug), viene seguita la stessa disposizione del PICKit2 (il pin AUX di tale programmatore non viene utilizzato per queste applicazioni). Se utilizzate un programmatore differente o uno di vostra invenzione/realizzazione, rispettate la disposizione dei pin! Ovviamente il fatto che i pin PGD e PGC siano connessi al connettore di programmazione non vi vieta di utilizzarli anche per le normali operazioni di I/O, che possono essere messe in parallelo.

Una scheda base del genere è di facile realizzazione: farla su una basetta millefori, per chi ha un minimo di esperienza, è un gioco da ragazzi. Poi ovviamente possiamo anche acquistare le schede di sviluppo, vendute un po’ dovunque, questa ad esempio ha anche una sezione per la comunicazione RS232 (anche la Microchip vende le sue). Personalmente il tutorial lo illustrerò utilizzando una scheda denominata “Freedom“, realizzata da Mauro Laurenti e ordinabile (previa offerta di supporto) sul suo sito.

programmare_picmicro_scheda_freedom

Aggiornamento: Mauro Laurenti ha rilasciato la seconda versione del suo sistema di sviluppo: Freedom2, tale sistema di sviluppo, rispetto al precedente, è molto più ricco di periferiche e integra sulla scheda anche led, pulsanti, lcd ecc, che sono utilissimi per fare prove senza doverli collegare all’esterno.

Ne approfitto ancora una volta in questa sede per ringraziarlo e complimentarmi dell’ottimo lavoro svolto.

Il connettore ICSP presente sulla scheda Freedom non segue la piedinatura del PICKit2,(questo non vale per la scheda Freedom2, la quale ha il connettore standard ICSP), quindi in tal caso dovrete realizzarvi un adattatore, qui c’è un diagramma che illustra la disposizione dei pin del PICKit2 e della scheda Freedom, per realizzare un adattatore potete utilizzare i classici strip di contatti da stampato ai quali salderete una piattina:

programmare_picmicro_corrispondenza_PICKit2-Freedom

Per sapere come vanno collegato il PICKit2 ai vari tipi di PICMicro e alle EEPROM, potrebbe esservi utile questo nostro articolo : adattatore multizoccolo per pickit2.

Tale scheda non è un prodotto commerciale e presenta molte utili predisposizioni che ci permettono di realizzare tante applicazioni senza perdite di tempo, nonchè i connettori separati per ogni gruppo di porte, ma… cosa sono le porte?

Le porte dei PIC

Le porte di un PICMicro, a livello fisico, sono i pin di ingresso/uscita (I/O) del microcontrollore, a livello software invece sono i registri che comandano/leggono lo stato dei pin di I/O. Le porte vengono suddivise in gruppi, rappresentati con lettere (abbiamo le porte A, le porte B ecc. in dipendenza dal PICMicro, sui PIC a 8 pin invece si utilizza una denominazione differente: si chiamano General Purpose – GP, ma la sostanza non cambia assolutamente). Diamo un occhio alla pagina 3 del datasheet del pic16F877:

programmare_picmicro_pinout_PIC16F877

Voglio chiarire innanzitutto una cosa che sembra stupida ma è molto importante per chi è alle prime armi: un singolo microcontrollore può essere commercializzato in vari formati, i microcontrollori utilizzati a livello hobbystico  sono quelli nel formato chiamato PDIP (per il pic16F877: 40 pin disposti su due file da 20) e generalmente presentano una lettera P alla fine della sigla (Esempio: PIC16F877A I/P , la I indica il range di temperatura e la P il formato PDIP, come indicato a pag. 231 del datasheet). Chiarisco questo perchè ho notato come alcuni ragazzi, tramite siti che vendono componenti elettronici online, ordinano i pezzi senza accorgersi che un singolo microcontrollore viene venduto in formati differenti e così si vedono recapitare a casa microcontrollori che non potranno mai utilizzare. Abbiate buon occhio e chiedetevi perchè in uno stesso catalogo ci sono due componenti con la stessa sigla!

Stampiamoci la pagina 3 del datasheet e teniamola sempre sott’occhio! Sul PIC16F877 abbiamo 6 porte A (pins 2-7, indicati come RA0-RA5), 8 porte B (pins 33-40: RB0-RB7), 8 porte C (pins 15-18 e 23-26 : RC0-RC7), 8 porte D (pins 19-20 , 21-22 e 27-30: RD0-RD7) e 3 porte E (pins 8-10: RE0-RE2), per un totale di ben 33 porte di I/O , che non è da poco per un microcontrollore che costa sugli 8/9 euro.

Come potete notare ogni pin ha più di una sigla: a parte la sigla standard (lettera R seguita dalla lettera che identifica il gruppo di porte e quindi il numero progressivo), segue una sigla che ci aiuta a capire (vedremo poi col tempo!) quali sono le altre funzioni che può avere questo pin a parte quella standard di I/O.

Ogni porta ha sempre la funzione standard di I/O: tramite il software che andremo a caricare sul PICMicro, possiamo dire ad esempio se la porta RA0 deve essere configurata per inviare un segnale all’esterno (Output) oppure per ricevere un segnale (Input). Difatti il funzionamento I/O di tutte le porte è comandato da appositi registri (un registro è una particolare locazione di memoria del dispositivo, dedicata a funzioni specifiche, come quella, ad esempio, di stabilire appunto i pin come devono funzionare), chiamati registri TRISTATO che permettono di dire al PICMicro come deve configurare un determinato PIN (se come uscita o se come ingresso).

A questo punto può esservi utile la definizione di “three state” su wikipedia: http://it.wikipedia.org/wiki/Three_state

In pratica un pin può trovarsi normalmente in 2 stati logici: livello basso e livello alto. Il 3° stato consiste in un livello logico indeterminato, che viene definito alta impedenza (Hi Z). Quando il pin si trova in uno stato di alta impedenza può “leggere” uno stato logico proveniente dall’esterno: in pratica il pin che si trova in alta impedenza, ovvero non ha un livello logico, assumerà il livello logico che gli viene imposto dall’esterno. Per tale motivo quando il pin viene settato come ingresso (perchè deve “leggere” dall’esterno), esso va in alta impedenza. Gli altri due stati (livello logico alto o basso) si ottengono semplicemente impostando il pin come uscita (nel registro TRISx) e selezionando quindi il livello di uscita del pin (nel registro PORTx).

I registri tristato vengono indicati con la sigla TRIS seguita dalla lettera del gruppo di porte: TRISA, TRISB ecc, vedremo in seguito come funzionano a livello di programmazione).

Un pin speciale, inoltre, può anche essere configurato per non avere più la classica funzione di I/O ma piuttosto per avere un’altra funzione (e questo si fa utilizzando altri registri appositi, in questo caso il settaggio dei registri tristato viene generalmente bypassato anche se non sempre è così, soprattutto sui pic vecchi): ecco perchè RA0 (pin 2) ha anche la denominazione AN0: questo pin può difatti funzionare o come normale pin di I/O (RA0) oppure come pin di acquisizione di un segnale ANalogico (AN0) (il pic16F877 ha difatti a bordo una periferica interessantissima: un convertitore Analogico/Digitale a 10bit, che può avere fino a 8 canali, gli 8 canali analogici sono i pin contrassegnati anche con le sigle AN, notate come le porte analogiche non fanno tutte parte di uno stesso gruppo di porte ma sono invece distribuite sul alcune porte A e sulle porte E. In particolare la porta RA4, pin 6, non può avere la funzione analogica anche se tutte le altre porte A possono averla).

In questo caso si dice che il pin è multiplexato con un’altra funzione.

Altri potrebbero ancora chiedere: perchè su quell’immagine è riportato PIC16F874A/877A ? Semplice: perchè quel pinout (ovvero la disposizione dei pin, con le relative denominazioni) vale sia per il PIC16F874A che per il PIC16F877A (ovvero: sono pin to pin compatibili. Questi sono due chip molto simili, la differenza tra l’uno e l’altro è illustrata a pagina 5 del datasheet). Fate domande! Siate curiosi, chiedetevi perchè, percome! E’ questa la via da seguire per capire perfettamente il funzionamento di qualsiasi cosa!

Ovviamente se un pin viene configurato per avere una funzione speciale, non potrà più essere utilizzato come Input, se viene configurato come Input, non può essere utilizzato come Output. Impareremo di volta in volta a utilizzare le varie funzioni che un pin può avere, per cui ecco perchè ho detto stampatevi pagina 3 e tenetela sott’occhio: vi aiuta a capire come vanno interpretate le sigle dei pin, vi aiuta a capire come sono disposti i pin. Ma non è solo la pagina 3 ad essere importante! LO SONO TUTTE senza nessuna distinzione! Un datasheet è la parte più importante di un componente elettronico: non potete mai assolutamente pensare di sviluppare una qualsiasi applicazione elettronica se non avete a portata di mano il datasheet dei componenti che utilizzate! Tenete conto che ogni azienda sviluppa prima il datasheet e poi in base ad esso realizza il componente.

Altri documenti molto importanti sono le Application Note che illustrano come utilizzare varie famiglie di componenti e come realizzare delle applicazioni. In fondo all’articolo è possibile scaricare il manuale della Microchip con le informazioni da sapere quando si programma una MCU della famiglia Mid-Range (il 16F877 rientra in tale famiglia).

Appuntamento alla prossima lezione, in cui vedremo come realizzare il primo programma in C, compilarlo, caricarlo sul PICMicro e vederlo in funzione!

Lasciate commenti, mi raccomando.

Downloads

[download#38]
[download#39]
[download#41]
[download#40]

» Vai all’ indice delle lezioni e delle risorse del corso di programmazione

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)