Leggere un ingresso digitale

Continuiamo in questa pagina ad esaminare l'uso di PORTx per leggere un segnale digitale. I passi precedenti: helloREALworld e le porte di I/O

Leggiamo un bit

Per leggere lo stato di un segnale esterno al PIC18 occorre configurare un pin di una porta come ingresso digitale.

Se una porta è configurata come ingresso digitale:

Consideriamo il pin di una porta senza capacità analogiche (quindi non di tipo ANx; si veda a questo proposito l'osservazione 1). Per esempio può essere usato RB0 (se effettivamente presente nel PIC18 che vogliamo usare). Un programma potrebbe avere la seguente struttura:

Solo se il pin ha anche capacità analogiche, come nel caso dei PIC18F2xK20 è inoltre necessario attivare il buffer digitale in ingresso con una delle due seguenti modalità, se presenti;

Il codice che trovate a fondo pagina legge il valore di RB0 e, in base ad esso, accende o spegne il LED collegato a RC0. In pratica... un filo, anzi uno smart-wire!

L'hardware di riferimento è costituito da un LED, un interruttore e relative resistenze.

Se utilizzate PICdemo oppure PICdemo R2 tutto l'hardware è già presente.

Pull-up interno

L'uso di pulsanti ed interruttori è molto frequente. Per questo i progettisti del PIC18 hanno deciso di includere in alcune porte la resistenza di pull-up (weak internal pull-up). In genere sono previste almeno per PORTB.

A volte l'attivazione è impostata da un singolo bit. Per esempio, se si usa il PIC18F2431, il codice per attivare il pull-up su tutti i pin PORTB è il seguente:

TRISB = 0xFF;          // Set all PORTB pin as input
INTCON2bits.nRBPU = 0; // Enable all input PORTB pullup

Altre volte l'attivazione è impostata da un bit per ogni singolo pin più un bit globale. Per esempio, se si usa  il PIC18F2xK20, il codice per attivare il pull-up sul pin 0 di PORTB è il seguente:

TRISBbits.RB0 = 1;     // Set RB0 as input
INTCON2bits.nRBPU = 0; // PORTB pull-up global enabled
WPUBbits.WPUBS0 = 1    // RB0 pull-up individually enabled
ANSELHbits.ANS12 = 0;  // Digital input buffer of RB0 is enabled (pin 21 = RB0 = AN12)

A fondo pagina il codice completo per PIC18F14K50 che presenta queste caratteristiche.

Antirimbalzo

Uno dei fenomeni che si accompagna sempre alla presenza di interruttori meccanici è il rimbalzo, causato dallo scontro tra i due contatti metallici; ciò produce un andamento della tensione tutt'altro che ideale. In genere il fenomeno è presente solo (o quasi) in chiusura, mentre in apertura, almeno a bassa tensione, non si presenta in modo significativo.

L'immagine reale seguente mostra come un rimbalzo si presenta a livello elettrico: una serie di passaggi da 1 a 0 e viceversa, di durata breve a livello umano, meno di 1 ms in molti casi. Il numero di eventi è tendenzialmente casuale, spesso superiore a 10 o 20.

I "rimbalzo" di un pulsante

I rimbalzi non sono un problema se siamo interessati a sapere se un interruttore è aperto o chiuso. Diventano un problema se siamo interessati a contare quante volte un pulsante è stato premuto... Pensate ad una tastiera!

Tra i metodi antirimbalzo (debounce) possiamo proporre:

L'idea è quella di effettuare due letture del valore del pin inserendo un ritardo (1 o 2 ms) tra di esse. In questo modo eventuali rimbalzi vengono ignorati.

Il codice che trovate a fondo pagina applica questa idea ad un esempio che fa scorrere il LED ogni volta che viene premuto il pulsante. L'hardware è costituito da 8 LED connessi a PORTC e da un pulsante connesso a PORTB0.

Come confronto: provare ad eseguire il codice commentando la linea con il ritardo: se avete un pulsante sufficientemente "rimbalzello" otterrete un generatore di numeri casuali... 

Come approfondimento trovate gli esercizi a fondo pagina.

Osservazioni

  1. Se al pin utilizzato come ingresso digitale è associato anche un ingresso analogico ANx è sempre necessario attivare esplicitamente il buffer digitale in ingresso, pena la lettura di un bit casuale. Per fare ciò occorre agire sui registri ANSEL oppure ANSELH (o simili) oltre che sul registro TRISx. In alternativa è per alcuni processori disponibile un apposito bit tra i configuration bits.
  2. A volte in serie all'interruttore oppure tra interruttore e ingresso digitale viene inserita una resistenza di piccolo valore (poche centinaia di ohm), ininfluente nel funzionamento normale, ma utile per evitare malfunzionamenti nel caso in cui RB0 sia configurato erroneamente come uscita digitale.

Il codice

Esercizi

  1. Realizzare un decoder 3 → 8 (tre interruttori in ingresso, un solo LED acceso su otto in uscita) utilizzando in PIC18.
  2. Realizzare il codice che visualizza su un display a sette segmenti quante volte un pulsante viene premuto
  3. Scrivere il codice che effettua il debounce di un SPDT, sfruttando la stessa idea del latch RS e due pin del PIC18


Data di creazione di questa pagina: dicembre 2014
Ultima modifica: 1 ottobre 2016

Una pagina simile: Leggere un ingresso digitale (in assembly)


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima