Tutorials - PIC

 

PIC16F526


Gli I/O digitali

Per quanto riguarda le altre funzioni, possiamo iniziare da quella più semplice, ovvero I/O digitale.

Come I/O digitale si intende che il pin può essere utilizzato come ingresso per livelli logici, ovvero che possono assumere due valori:

1 livello alto high level H Vh
0 livello basso low level L Vl

Quindi, con una alimentazione Vdd=5V il livello basso sarà circa uguale a 0V e quello alto uguale a circa 5V
In effetti esiste una certa area in cui il valore è considerato basso (<0.8V) o alto (>2V). 
Al di fuori di questi valori il segnale applicato è irregolare e può essere fonte di errori di interpretazione da parte del circuito logico di ingresso.
Dati completi sulle caratteristiche elettriche dei pin le trovate nel foglio dati alla tab. 10-1.

Il passaggio dal livello alto a quello basso si chiama fronte di discesa (falling edge).
Il passaggio dal livello basso a quello alto si chiama fronte di salita (rising edge).

Le transizioni da un livello all' altro sono spesso utilizzate per sincronizzare segnali o come indicatori di evento.
 
Nei PIC i pin sono ingressi a tecnologia CMOS, quindi con alta impedenza e bassissimo assorbimento di corrente (1uA). Altre informazioni sugli ingressi digitali dei PIC le trovate qui.
La funzione di ingresso digitale ci permette di rilevare lo stato di interruttori, contatti, encoder, linee di comunicazione, ecc.

Analogamente, nell' uso del pin come uscita sarà reso un livello di tensione maggiore di Vdd-0.7V quando si imposta il pin a livello alto e minore di 0.6V quando lo si imposta a livello basso. Nei PIC i pin in uscita hanno driver MOS complementari che possono erogare (source) o assorbire (sink) fino a 25mA. Se occorre più corrente, si aggiungerà un buffer esterno. Maggiori informazioni sugli I/O digitali dei PIC le trovate qui.
La funzione di uscita digitale ci permette di comandare LED, lampade, relays, motori, display, linee di comunicazione, ecc.


Ingressi e uscite

I pin con funzione di I/O digitale possono, per prima cosa, essere configurati come linee di ingresso o come linee di uscita (I/O - Input/Output). 
Ovviamente non è possibile per un pin svolgere entrambe le funzioni nello stesso momento!

Dovrebbe essere più o meno noto che i pin in funzione digitale sono raccolti logicamente in gruppi, detti PORT.
Questi gruppi sono tipicamente composti da 8 bit (8 bit = 1 byte), anche perchè il bus della memoria dati, che comprende sia la RAM che i registri di controllo degli I/O (SFR) è a 8 bit.

Nel nostro caso, chip ha due gruppi da 6 bit ciascuno, PORTB e PORTC, con lo stesso aspetto:

PORTB Bit 7 6 5 4 3 2 1 0
label - - RB5 RB4 RB3 RB2 RB1 RB0
pin - - 2 3 4 11 12 13
 
PORTC Bit 7 6 5 4 3 2 1 0
label - - RC5 RC4 RC3 RC2 RC1 RC0
pin - - 5 6 7 8 9 10

Essendoci solamente 6 pin validi, i bit 6 e 7 dei registri non hanno alcuna funzione: leggendoli, si leggerà  0 e scrivendoli non si avrà alcun effetto.

Il livello del pin in funzione di uscita è applicabile a volontà dal programmatore, scrivendo nel registro PORTx attraverso il programma.
Leggendo il registro si avrà il valore del livello logico applicato al pin..

Al reset il valore di questi bit è casuale e deve essere inizializzato da programma a seconda del loro uso..

Osserviamo la relazione tra i pin del chip, le label relative alla funzione digitale e i bit del PORT.
Ad esempio, il bit 4 del PORTB sarà RB4 e corrisponderà al pin 3 del chip; e così via.

Nella mappa di memoria dell' area dei registri (area RAM) abbiamo che PORTB si trova all' indirizzo 06h. Quindi, in valori assoluti, per identificare RB4 potremmo scrivere:

6,4

ovvero il bit 4 del registro all' indirizzo 6.  Però, l' uso di valori assoluti per identificare le risorse del microcontroller è decisamente contrario allo scopo dei linguaggi di programmazione.  Dal punto di vista del programmatore, un bit (corrispondente ad un pin) sarà indicato, invece, nella forma simbolica, ovvero con la sua label. Per essere precisi, con la forma:

PORTB, RB4

Va tenuto presente che, prima di utilizzare il pin come uscita o come ingresso occorre configurarlo, attraverso le istruzioni del programma, agendo sul registro di direzione.

Il diagramma a lato rappresenta la struttura semplificata di in pin di I/O dei Baseline.

Il buffer di uscita è realizzato con una coppia complementare di MOSFET. Come ingresso, la linea è protetta dalle sovratensioni con una coppia di diodi.

Il livello applicato all' ingresso è riportabile sul bus dati attraverso un gate (RD port) che viene aperto dalla lettura del registro GPIO.

La funzione di uscita è eseguita con i supporto di due latch:

  • Il Data Latch conserva il dato scritto in uscita, caricato il livello imposto sul bus dati alla scrittura del registro GPIO 
  • il valore conservato nel latch viene passato al buffer di uscita solamente se il TRIS Latch è stato caricato con 0, scrivendo il registro TRIS

Il Data Latch corrisponde al gruppo di bit raccolti nel registro PORTx, visto sopra.

Il Tris Latch corrisponde ai bit del registro TRISx, del tutto analogo ai precedenti. TRISx è una locazione di memoria RAM a 8 bit. Ognuno dei bit corrisponde ad un pin. Il valore 1 o 0 scritto in quel bit stabilisce la direzione del pin.

Per potere assegnare ai pin la funzione di ingresso o di uscita, si deve agire su un registro apposito, in questo caso chiamato TRIS, il quale stabilisce la direzione.

Il nome "tris" è abbreviazione di tri-state ed è usato qui per indicare il fatto che il pin possa essere programmato come uscita (con impedenza basssa) o come ingresso (con impedenza molto alta).

Da notare che TRIS non fa parte della mappa di memoria RAM, in quanto è un registro particolare, a sola scrittura, la quale è possibile unicamente attraverso una speciale istruzione tris, tipica dei Baseline.

Ovviamente, essendo due i port, si dovrà indicare nell' oggetto dell' istruzione TRIS a quale ci si riferisce; quindi si avrà:

tris  PORTB
tris  PORTC

Il registro ha questa struttura:

TRIS

bit

7 6 5 4 3 2 1 0

nome

-

-

-

-

-

-

-

-

funzione

- - W W W W W W

default

- - 1 1 1 1 1 1
  • bit 7:6   non utilizzati

  • bit 5    Direzione Rx5 : I/O
               1 = ingresso
               0 = uscita

  • bit 4    Direzione Rx4: I/O
               1 = ingresso
               0 = uscita

  • bit 3    Direzione Rx3 : solo ingresso
               1 = ingresso

  • bit 2    Direzione Rx2: I/O
               1 = ingresso
               0 = uscita

  • bit 1    Direzione Rx1: I/O
               1 = ingresso
               0 = uscita

  • bit 0    Direzione Rx0: I/O
               1 = ingresso
               0 = uscita

Come per PORTx, essendoci solamente 6 pin validi, i bit 6 e 7 del registro non hanno alcuna funzione: leggendoli, si leggerà 0 e scrivendoli non si avrà alcun effetto.
Il valore assegnabile è tipico e comune per tutti i PIC:

1 pin configurato come ingresso
0 pin configurato come uscita


Al reset tutti i bit sono forzati a 1, ovvero i pin sono intesi come ingressi digitali. Se voglio usare i pin come uscite, devo mettere a 0 i bit corrispondenti.
Ad esempio, nel caso di RB5, dovrò mandare a 0 il bit 5 del TRIS relativo, il che fa diventare il pin 2 una uscita digitale.

movlw  b'00011111'
tris   PORTC

Fa eccezione PORTB,3:

RB3 è alternativo alla funzione di Master Clear (MCLR), opzione scelta nella configurazione.
Per la struttura interna del chip, il pin è utilizzabile solamente come ingresso digitale e quindi il bit 3 di TRISGPIO è sempre fisso a livello 1.

Quindi, ad esempio:

  • scrivendo 11110001 in TRIS PORTC si impostano come uscita i pin RC1, RC2 e RC3, mentre gli altri sono ingressi.
  • scrivendo 11110001 in TRIS PORTB si impostano come uscita il pin RB1 e RB2; il fatto di aver indicato a 0 il bit 3 non ha alcun effetto dato che RB3 è utilizzabile solo come ingresso.
Il registro TRIS è a sola scrittura, ovvero il suo contenuto può essere solo scritto, usando la speciale istruzione tris, presente nel set dei PIC Baseline, ma non può essere riletto.

Essendo il registro in RAM, il contenuto va perso al mancare della tensione di alimentazione; quindi si tratta di uno dei registri che è necessario inizializzare ai valori voluti durante l'esecuzione del programma.
Però, la struttura di avvio al reset che si genera quando viene applicata l' alimentazione (Power On Reset - POR) agisce in modo tale da scrivere 1 in tutti i bit utili del registro. Questa pre definizione del valore dei bit si chiama default al POR.

Quindi:


al reset, tutti gli I/O digitali sono pre configurati come ingressi. Dovendo usarli come uscite sarà necessario mettere a 0 i bit corrispondenti nel registro TRIS.

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 18/10/13.