Introduzione alle perifericheData di pubblicazione: 17-10-2003 | Versione Italiana | (No English Version) Parole chiave: - PIC - |
Le porte A e B
Il PIC16F84A dispone di un totale di 13 linee di I/O organizzate in due porte
denominate PORTA A e PORTA B.
La PORTA A dispone di 5 linee configurabili sia in ingresso che in uscita identificate dalle sigle
RA0, RA1, RA2, RA3 ed RA4.
La PORTA B dispone di 8 linee anch'esse configurabili sia in ingresso che in uscita identificate
dalle sigle RB0, RB1, RB2, RB3, RB4, RB5, RB6 ed RB7.
La suddivisione delle linee in due porte distinte � dettata dai vincoli dell'architettura
interna del PIC16F84A che prevede la gestione di dati di lunghezza massima pari a 8 bit.
Per la gestione delle linee di I/O da programma, il PIC dispone di due registri interni per ogni
porta denominati TRISA e PORTA per la porta A e TRISB e PORTB per la porta B.
I registri TRIS A e B, determinano il funzionamento in ingresso o in uscita di ogni singola linea,
i registri PORT A e B determinano lo stato delle linee in uscita o riportano lo lo stato delle linee in ingresso.
Ognuno dei bit contenuti nei registri menzionati corrisponde univocamente ad una linea di I/O.
Ad esempio il bit 0 del registro PORTA e del registro TRIS A corrispondono alla linea RA0 , il bit 1
alla linea RA1 e cos� via.
Se il bit 0 del registro TRISA viene messo a zero, la linea RA0 verr� configurata come linea in uscita,
quindi il valore a cui verr� messo il bit 0 del registro PORTA determiner� lo stato logico di tale
linea (0 = 0 volt, 1 = 5 volt).
Se il bit 0 del registro TRISA viene messo a uno, la linea RA0 verr� configurata come linea
in ingresso, quindi lo stato logico in cui verr� posta dalla circuiteria esterna la linea RA0 si
rifletter� sullo stato del bit 0 del registro PORTA.
Facciamo un esempio pratico, ipotizziamo di voler collegare un led sulla linea RB0 ed uno switch sulla
linea RB4, il codice da scrivere sar� il seguente:
movlw 00010000B
tris B
in cui viene messo a 0 il bit 0 (linea RB0 in uscita) e a 1 il bit 4 (linea RB4) in ingresso.
Si ricorda a tale proposito che nella notazione binaria dell'assembler il bit pi� a destra
corrisponde con il bit meno significativo quindi il bit 0.
Per accendere il led dovremo scrivere il seguente codice:
bsf PORTB,0
Per spegnerlo:
bcf PORTB,0
Per leggere lo stato dello switch collegato alla linea RB4, il codice sar�:
btfss PORTB,4
goto SwitchAMassa
goto SwitchAlPositivo
Stadi d'uscita delle linee di I/O
Per rendere pi� adattabili i PICmicro alle diverse esigenze di utilizzo, la Microchip
ha implementato diverse tipologie di stati d'uscita per le linee di I/O. Esistono quindi
dei gruppi di pin il cui comportamento � leggermente differenziato da altri gruppi.
Conoscendo meglio il funzionamento dei diversi stadi d'uscita potremo sfruttare al
meglio le loro caratteristiche ed ottimizzare il loro uso nei nostri progetti.
Stadio d'uscita delle linee RA0, RA1, RA2 e RA3
Iniziamo dal gruppo di linee RA0, RA1, RA2 ed RA3 per le quali riproduciamo, nella figura seguente,
lo schema dello stadio d'uscita estratto dal data sheet della Microchip:
Come accennato al passo precedente, la configurazione di una linea come ingresso o uscita dipende
dallo stato dei bit nel registro TRIS (TRISA per la porta A e TRISB per la porta B).
Prendiamo come esempio la linea RA0 ed analizziamo il funzionamento dello stadio d'uscita sia
quando la linea funziona in ingresso, che quando funziona in uscita.
Funzionamento in ingresso
Per configurare la linea RA0 in ingresso, dobbiamo mettere a 1 il bit 0 del registro TRISA con l'istruzione:
bsf TRISA,0
Questo determina una commutazione ad 1 dello stato logico del flip-flop di tipo D-latch indicato nel blocco
con il nome TRIS latch. Per ogni linea di I/O esiste uno di questi flip-flop e lo stato logico in cui si trova
dipende strettamente dallo stato logico del relativo bit nel registro TRIS (anzi per meglio dire ogni bit del
registro TRIS � fisicamente implementato con un TRIS latch).
L'uscita Q del TRIS latch � collegata all'ingresso di una porta logica di tipo OR. Questo significa che,
indipendentemente dal valore presente all'altro ingresso, l'uscita della porta OR varr� sempre 1 in quanto uno
dei suoi ingressi vale 1 (vedi tavola della verit�). In questa condizione il transistor P non conduce e mantiene
la linea RA0 scollegata dal positivo d'alimentazione.
Allo stesso modo l'uscita negata del TRIS latch � collegata all'ingresso di una porta AND quindi l'uscita di
questa varr� sempre 0 in quanto uno dei suoi ingressi vale 0 (vedi tavola). In questa condizione anche il
transistor N non conduce mantenendo la linea RA0 scollegata anche dalla massa. Lo stato logico della linea
RA0 dipender� esclusivamente dalla circuiteria esterna a cui la collegheremo.
Applicando 0 o 5 volt al pin RA0, sar� possibile leggerne lo stato sfruttando la circuiteria d'ingresso
del blocco rappresentata dal TTL input buffer e dal latch d'ingresso.
Funzionamento in uscita
Per configurare la linea RA0 in uscita, dobbiamo mettere a 0 il bit 0 del registro TRISA con l'istruzione:
bcf TRISA,0
Questo determina la commutazione a 0 dell'uscita Q del TRIS latch (ed a 1 dell'uscita Q negata).
In questo stato il valore in uscita dalle porte OR e AND dipende esclusivamente dallo stato dell'uscita Q
negata del Data Latch. Come per il TRIS latch, anche il Data Latch dipende dallo stato di un bit in un registro,
in particolare del registro PORTA. La sua uscita negata viene inviata all'ingresso delle due porte logiche OR e AND
e quindi direttamente sulla base dei transistor P ed N.
Se mettiamo a 0 il bit 0 del registro PORTA con l'istruzione:
bcf PORTA,0
otterremo la conduzione del transistor N con conseguente messa a 0 della linea RA0. Se invece mettiamo a 1 il
bit 0 con l'istruzione:
bsf PORTA,0
otterremo la conduzione del transistor P con conseguenza messa a +5 volt della linea RA0. In questa condizione �
sempre possibile rileggere il valore inviato sulla linea tramite la circuiteria d'ingresso.
Stadio d'uscita della linea RA4
Analizziamo ora il funzionamento dello stadio d'uscita della linea RA4 che si differenzia da tutte le altre
linee di I/O in quanto condivide lo stesso pin del PIC16F84 con il TOCKI.
Nella figura seguente viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip:
La logica di commutazione � sostanzialmente identica al gruppo di linee RA0-3 ad eccezione dell'assenza
della porta OR e del transistor P, ovvero di tutta la catena che consente di collegare al positivo la
linea RA4. Questo significa, in termini pratici, che quando la linea RA4 viene programmata in uscita e
messa a 1 in realt� non viene connessa al positivo ma rimane scollegata. Tale tipo di circuiteria d'uscita
viene denominata a "collettore aperto" ed � utile per applicazioni in cui sia necessario condividere uno
stesso collegamento con pi� pin d'uscita e ci sia quindi la necessit� di mettere in alta impedenza una
linea d'uscita senza doverla riprogrammare come linea d'ingresso.
Se vogliamo essere sicuri che la linea RA4 vada a 1 dovremo collegare esternamente una resistenza di
pull-up, ovvero una resistenza collegata al positivo di alimentazione.
Vedremo in seguito l'utilizzo della linea indicata sullo schema TMR0 clock input.
Stadio d'uscita delle linee RB0, RB1, RB2 ed RB3
Anche per questo gruppo di linee rimane sostanzialmente invariata la logica di commutazione. Esse dispongono
in aggiunta una circuiteria di weak pull-up attivabile quando le linee sono programmate in ingresso.
In ingresso infatti, come spiegato precedentemente, le linee vengono completamente scollegate dal PIC in
quanto sia il transitor P che il transistor N sono aperti. Lo stato delle linee dipende quindi
esclusivamente dalla circuiteria esterna. Se tale circuiteria � di tipo a collettore aperto o pi� semplicemente
� costituita da un semplice pulsante che, quando premuto, collega a massa la linea di I/O, � necessario inserire
una resistenza di pull-up verso il positivo per essere sicuri che quando il pulsante � rilasciato ci sia una
condizione logica a 1 stabile sulla linea d'ingresso. La circuiteria di weak pull-up consente di evitare l'uso
di resistenze di pull-up e pu� essere attivata o disattivata agendo sul bit RBPU del registro OPTION .
Nella figura seguente viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip:
La sola linea RB0 inoltre, presenta una caratteristica molto particolare. Essa, quando viene configurata
come linea di ingresso, pu� generare, in corrispondenza di un cambio di stato logico, un interrupt,
ovvero una interruzione immediata del programma in esecuzione ed una chiamata ad una subroutine speciale
denominata interrupt handler. Ma di questo parleremo in seguito.
Stadio d'uscita delle linee RB4, RB5, RB6 e RB7
La circuiteria di commutazione di questo gruppo di linee � identica al gruppo RB0-3. Queste linee dispongono
anche della circuiteria di weak pull-up. In pi� rispetto alle linee RB0-3 hanno uno stadio in grado di rilevare
variazioni di stato su una quansiasi linea e di generare un interrupt di cui parleremo nelle prossime lezioni.
Nella figura seguente viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip:
Input da tastiera
Dopo aver realizzato, nella lezione precedente, le luci in sequenza sfruttando le linee da RB0 a RB3
come linee di output, vediamo ora come si pu� realizzare un input da tastiera configurando le
linee da RB4 a RB7 come linee di input.
Per far questo ampliamo il circuito presentato nella lezione 2 con quattro pulsanti da stampato
denominati SW1, SW2, SW3 ed SW4 e collegati secondo lo schema elettrico riportato di seguito:
Schema elettrico
Ognuno di questi pulsanti collega a massa una linea di ingresso normalmente mantenuta a + 5 volt
da una resistenza (da R6 a R9). Prendendo, ad esempio, il pin 10 del PIC16F84A, questa linea verr�
mantenuta a +5 volt finch� non verr� premuto il tasto SW1 che provveder� a portare la linea ad 0 volt.
Realizziamo un programma d'esempio che accenda ciascuno dei led D1, D2, D3 e D4 in corrispondenza
della pressione di uno dei tasti SW1, SW2, SW3 e SW4.
Il source dell'esempio � riportato nel file INPUT.ASM .
La parte iniziale del programma esegue le stesse funzioni effettuate negli esempi precedenti ed in particolare
le istruzioni:
movlw 11110000B
movwf TRISB
configurano le linee da RB0 a RB3 in uscita per il collegamento con i led e le linee da RB4 a RB7 in
ingresso per il collegamento con i quattro pulsanti. Il resto del programma.
L'istruzione:
bcf STATUS,RP0
Effettua uno swap sul banco di registri 0 in modo che possiamo accedere direttamente allo stato delle linee di I/O.
MainLoop
clrf PORTB
Questa istruzione spegne tutti i led collegati sulla PORTA B and ogni ciclo di loop in modo che possano poi
essere accesi sulla base dello stato dei pulsanti.
btfss PORTB,SW1
bsf PORTB,LED1
Queste due istruzioni vengono eseguite per ogni linea collegata ad un pulsante per verificare se il pulsante
� premuto e per accendere il led corrispondente.
in pratica la:
btfss PORTB,SW1
salta la successiva:
bsf PORTB,LED1
solo se il pulsante SW1 � rilasciato. In caso contrario la esegue accendendo il led. Questa coppia di
istruzioni viene eseguita per ogni tasto.
Il tutto viene eseguito all'interno di un singolo loop tramite l'istruzione:
goto MainLoop
Segnala questo articolo:
Parole chiave: - PIC -
|