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. |
|