Corso programmazione microcontrollori PIC® in C (aggiornamento MPLAB X) – Gestione pulsanti
Questo tutorial rappresenta un aggiornamento della vecchia lezione 6, a cui vi rimando per tutta la parte di teoria. Qui aggiorniamo soltanto la parte pratica. Se vi siete persi gli aggiornamenti precedenti (soprattutto il primo che illustra i passaggi salienti della migrazione dall’accoppiata MPLAB IDE 8/Hitech PIC C a quella nuova MPLAB X IDE/XC8), ricordatevi che si trovano nella nuova categoria PIC nuovo corso (per tutte le lezioni vecchie, invece, c’è la ricerca).
La differenza con il vecchio circuito, illustrato nella lezione 6 è che stiamo utilizzando un PIC16F887 al posto del PIC16F877A, e i pulsanti sono 4 anzichè 2 e così anche i led sono 4.
Da ricordare: i pulsanti chiudono verso GND, per cui la pressione di un pulsante porta l’IO a livello logico basso, quindi in caso di pulsante non premuto l’IO deve essere tenuto a livello alto: questo si fa utilizzando delle resistenze di pull-up (resistenza tra pin e tensione alimentazione), che lasciano scorrere una debole corrente (10KΩ vanno bene) e quindi non creano eccessivi assorbimenti o cortocircuiti nel momento in cui chiudiamo a GND. In molti casi i PICmicro hanno già resistenze di pull-up integrate. Nel caso del PIC16F887 si possono abilitare nel registro OPTION_REG portando a zero il relativo bit (è un bit negato, quindi funziona al contrario, c’è difatti la lettera n minuscola – nRBPU):
OPTION_REGbits.nRBPU=0; // abilito resistenze di pull-up su portB |
Questo abilita le resistenze su tutti i pin del banco B: non c’è altra possibilità.
Dato che ho detto che sto aspettando il PIC16F18877 che è l’ultimo attuale sostituto del vecchissimo PIC16F877A (e ha anche un sacco di funzionalità in più) do anche dei tips per questo pic: nel caso di PICmicro più nuovi performanti, come appunto lo è il PIC16F18877, le resistenze di pull-up interne sono presenti su tutti i pin e possono essere abilitate singolarmente agendo nei registri WPUx (dove x=A,B,C,D,E a seconda del banco). Se per esempio voglio abilitare la resistenza di pull-up soltanto sulla porta RD5, per il PIC16F18877, scriverò:
WPUDbits.WPUD5=1; |
Ricordo che sul 16F18877 ci sono anche le porte analogiche su tutti i pin, quindi se vogliamo utilizzare il pin RD5 come ingresso digitale dobbiamo disattivare la funzione analogica su di esso e quindi impostarlo come ingresso:
ANSELDbits.ANSD5=0; // disattivata porta analogica su RD5 TRISDbits.TRISD5=1; // impostato RD5 come ingresso |
Ricordo ancora una volta che adesso i nomi dei registri e dei singoli bits da scrivere nel codice sono gli stessi, identici, riportati nei datasheets e che quando dobbiamo agire su un singolo bit del registro, faremo riferimento al nome del registro seguito dalla parola “bits” in minuscolo e quindi dal punto.
Detto questo passiamo al nostro esempio. Il circuito è il seguente:
Nel codice sorgente ho riportato 4 diversi esempi di gestione dei pulsanti, in modo che potrete verificare voi stessi cosa accade nella realtà. Ogni pulsante è collegato ad un led per illustrare vari comportamenti:
- Pulsante 1: funziona in modalità monostabile. Premendolo il led si accende, non appena si rilascia, il led si spegne.
- Pulsante 2: funziona in modalità bistabile (ovvero cambia stato ad ogni pressione, modalità detta anche set-reset), ma, se si tiene premuto, la condizione di pressione viene verificata di continuo con il risultato che il led lampeggia.
- Pulsante 3: funziona in modalità bistabile ma il codice viene bloccato fino a che non si rilascia il pulsante. Questa è la modalità che preferisco quando devo controllare qualcosa in modalità bistabile.
- Pulsante 4: dovrebbe essere una modalità bistabile, ma vedete che senza routine di antirimbalzo, il comportamento è imprevisto: è il sistema da non utilizzare mai per la gestione di un pulsante meccanico.
Vedrete che vengono utilizzati dei delays per gestire l’antirimbalzo, come già spiegato nel vecchio tutorial.
Fate attenzione ad una cosa: nel codice due pulsanti sono collegati a RB6 e RB7: questi due pin sono utilizzati anche dal PICkit per la programmazione/debug, per cui se utilizzate gli stessi ingressi, non potete tenere il PICkit collegato altrimenti interferisce con RB6 e RB7, per cui dovete per forza di cose utilizzare l’alimentazione esterna, oppure, se state utilizzando un circuito su millefori, potete cambiare le porte tanto ormai siete bravi; io ho fatto così perchè sto usando la Freedom II e li due pulsanti sono collegati su RB6 e RB7.
Ulteriori informazioni sono riportate nelle note del sorgente. Buon download e buon esperimento.