Tutorial → PIC18 → Assembly
→ HelloREALworld → 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:
- una tensione di circa 0 V viene letta come valore 0 logico
- una tensione pari a circa VDD viene letta come 1 logico
- tensioni intermedie vengono lette come 1 oppure 0, in modo piuttosto casuale,
ovviamente in funzione di quale delle due precedenti situazioni è
più vicina. Per un approfondimento, cercate sul foglio tecnico VIH
oppure VIL, valori non coincidenti per tutti i pin. Analogamente
producono risultati casuali i pin non collegati a nulla
- Infine, tensioni superiori a VDD oppure inferiori a GND possono
essere distruttive per il PIC18
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).
- Quando l'interruttore SW1 è chiuso, la tensione di ingresso a RB0 vale 0 V
e quindi l'ingresso verrà letto come zero logico: il
pulsante è infatti un cortocircuito verso massa.
Osservazione 1
- La resistenza R1 è la resistenza di pull-up: "tira su" la tensione
di ingresso quando l'interruttore è aperto. In questo caso la tensione
di ingresso è (circa) VDD e quindi verrà letto come uno logico. Si noti che, in assenza di tale resistenza il
valore letto sarebbe casuale. Il valore della resistenza di pull-up è
poco rilevante, in genere si sceglie di poche decine di KΩ.
Il programma di esempio ha la seguente struttura:
- Configura il pin RB0 come ingresso, mettendo a 1 il bit 0
del registro speciale TRISB (osservazione 2).
Questa operazione è descritta nelle prime righe del capitolo 10.2 dei
fogli tecnici del PIC18F25K20 (pagina 116, da leggere)
bsf TRISB, 0 ; per una maggiore leggibilità è forse
meglio scrivere "bsf TRISB, RB0", dall'identico significato
- (In alcuni casi, ma non in questo, è necessario attivare i
buffer digitali in ingresso: osservazione 3)
- Configura il pin RC0 come uscita digitale, mettendo a 0 il
bit 0 del registro TRISC (osservazione 2).
Nell'esempio in realtà tutti i pin di PORTC sono stati configurati come
uscite digitali, come già descritto nella pagina
helloREALworld:
clrf TRISC
- All'interno di un loop infinito, legge il valore del pin RB0 e, in base al suo valore,
accende o spegne il LED. Per conoscere il valore dell'ingresso RB0, è necessario leggere il bit 0 del registro PORTB
btfss PORTB, 0 ; per motivi di leggibilità è forse
meglio scrivere: btfss PORTB, RB0
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:
- Occorre, per ciascun pin, attivare individualmente la resistenza di
pull-up, agendo sul registro WPUB:
bsf WPUB, 0 ; attiva le resistenza di pull'up per RB0
- Occorre abilitare globalmente tutte le resistenze di pull-up
attivare, agento sul bit 7 del registro INTCON2 (pagina 103)
bcf INTCON2, 7
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 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:
- Usare pulsanti migliori: aiuta, ma assolutamente non risolve
- Usare un deviatore (SPDT) ed un latch RS: è la soluzione ideale, ma costa,
occupa spazio e richiede un deviatore. Questo metodo lo trovate
descritto in tutti i libri di elettronica digitale, appena vengono
introdotti i flip-flop RS
- Usare un gruppo RC: funziona, ma costa e occupa spazio
- Usare il software, la soluzione qui descritta
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.
- 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.
- 1 è l'iniziale di Input, 0 di Output :-)
- 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
- Realizzare un decoder 3 → 8 (tre interruttori in ingresso, un
solo LED acceso su otto in uscita) utilizzando in PIC18.
- [Avanzato] Realizzare il codice che conta quante volte è premuto un
pulsante; è necessario effettuare il debounce , inserendo un
opportuno ritardo
- [Avanzato] Realizzare il codice che visualizza su un display a sette segmenti
quante volte un pulsante viene premuto
- [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