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
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.
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.
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 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.
Data di creazione di questa pagina: dicembre 2014
Ultima modifica: 1 ottobre 2016
Una pagina simile: Leggere un ingresso digitale (in assembly)
PIC18 in C - Versione 0.991 - luglio 2019
Copyright 2014-2019, Vincenzo Villa (https://www.vincenzov.net)
PIC18 in C di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale