Area SX srl - Informatica e Microelettronica
0
Torna a: Home Page Soluzioni Microcontrollori PIC Introduzione alle periferiche

Introduzione alle periferiche

Data di pubblicazione: 17-10-2003 | Versione Italiana  | (No English Version)The English version of this article does not exists
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 -

Data di pubblicazione: 17-10-2003Hits: 35468
I marchi citati sono proprietà dei titolari dei relativi diritti. Le caratteristiche tecniche e i prezzi riportati sono indicativi e soggetti a variazioni senza preavviso. Le foto non hanno valore contrattuale. Nonostante accurate verifiche, il presente documento può contenere prezzi o specifiche errati. Area SX si scusa in anticipo e si impegna ad evitare tali imprecisioni.

 Area SX store
In questa sezione puoi ordinare direttamente i prodotti descritti in questo articolo
PICSTART+;P16F628A
Tutti i prezzi indicati sono espressi in Euro con IVA e spese di trasporto escluse. I prezzi si riferiscono al singolo pezzo
DescrizioneCodicePrezzo

Rivenditori Social Contatti Condizioni
Area SX s.r.l
Via Stefano Longanesi 25
00146 Roma

Tel: +39.06.99.33.02.57
Fax: +39.06.62.20.27.85
P.IVA 06491151004
Condizioni di vendita
Procedura di rientro in garanzia
Condizioni per i rivenditori