Leggere un ingresso digitale

PIC18: leggere un ingresso digitale

Continuiamo in questa pagina ad esaminare l'uso di PORTx per leggere un segnale digitale proveniente dall'esterno

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:

Realizziamo il circuito mostrato, collegando un interruttore al pin RB0 (che quindi andrà configurato come ingresso digitale) ed un LED al pin RC0 (che quindi andrà configurato come uscita digitale):

Se si utilizza PICdemo oppure PICdemo R2 è già presente il LED e l'interruttore, ma non R1, da aggiungere utilizzando una breadboard (ma è meglio prima leggere il paragrafo successivo).

Il programma di esempio ha la seguente struttura:

Il codice lo trovate a fondo pagina. In pratica abbiamo realizzato... un filo, anzi uno smart-wire!

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.

Queste resistenze sono in genere disattivate. L'attivazione deve avvenire in due passaggi, descritti nel paragrafo 10.3.1 di pagina 116 dei fogli tecnici:

Se viene attivata la resistenza interna di pull-up, non è più necessario utilizzare la resistenza esterna (R1 nello schema precedente)

Il codice lo trovate a fondo pagina, praticamente uguale al precedente se non nelle due istruzioni che attivano il pull-up interno.

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.

Come approfondimento trovate gli esercizi a fondo pagina.

Osservazioni

  1. 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.
  2. 1 è l'iniziale di Input, 0 di Output :-)
  3. A volte alcuni pin in ingresso possono avere funzioni digitali oppure, in alternativa, analogiche. La scelta va impostata attraverso la scrittura di appositi registri speciali (per esempio ANSEL oppure ANSELH) oppure impostando gli opportuni configurations bits. In questa pagina si suppone che sia stato utilizzato il file di configurazione già usato in altri esempi, contenente la riga seguente:
    CONFIG PBADEN = OFF ; PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
    Si legga a questo proposito la nota al termine di pagina 116 dei fogli tecnici

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. [Avanzato] Realizzare il codice che conta quante volte è premuto un pulsante; è necessario effettuare il debounce , inserendo un opportuno ritardo
  3. [Avanzato] Realizzare il codice che visualizza su un display a sette segmenti quante volte un pulsante viene premuto
  4. [Avanzato] 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: marzo 2016
Ultima modifica: 14 luglio 2017


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima