I default
Cosa sono, dunque, questi "default" ?
Per capirlo, dobbiamo fare alcune considerazioni:
- il mezzo per accedere alle funzioni interne del microcontroller è
costituito dai registri speciali (SFR - Special Function
Register), come il TRISGPIO
visto ora: modificando i loro bit, il programmatore può gestire I/O,
timer, convertitori, moduli di comunicazione, ecc.
- questi registri SFR sono, quindi, di importanza capitale.
- dovendo
essere modificabili dall' utente, si trovano in RAM, ovvero il loro
contenuto va perso al momento della mancanza di alimentazione.
- il costruttore, allora, fa in modo che all' accensione (reset all'
arrivo della tensione di alimentazione o POR - Power On Reset,
ma anche di altri reset generati da cause diverse)
i bit di questi registri assumano dei valori specifici, detti default .
La scelta del valore di
default deriva dalla linea guida del costruttore di mantenere il chip nelle condizioni di minore
consumo energetico; sarà compito, poi, dell' utente di indirizzare
diversamente le risorse.
Questo privilegia ingressi analogici
rispetto a digitali, ingressi rispetto ad uscite, ecc.
Nel registro TRISGPIO, ad
esempio, abbiamo visto che il default porta tutti i bit utili a 1, ovvero pre-configura la
direzione degli I/O digitali come ingressi.
La conoscenza della situazione
di default permette di capire alcuni meccanismi tipici dei PIC e può essere
utile per risparmiare istruzioni; ad esempio, volendo usare i pin come
ingressi digitali, non occorre agire sul registro di tris, dato che il default
impone già questa scelta.
Per contro, non avendo la certezza della situazione in cui si trovi il chip,
può essere una scelta di sicurezza inizializzare comunque tutti i bit che
corrispondono a pin o funzioni che si dovranno impiegare durante l' esecuzione
del programma.
GPIO
Una volta definito come intendiamo
usare i pin, se in uscita o in ingresso, possiamo leggere lo stato degli ingressi o comandare quello delle
uscite agendo su un altro registro, GPIO,
che ha
questa struttura:
GPIO
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
-
|
-
|
GP5
|
GP4
|
GP3
|
GP2
|
GP1
|
GPO
|
funzione
|
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default
|
- |
- |
x |
x |
x |
x |
x |
x |
-
bit 7:6 non
utilizzati
in
lettura : 0
in
scrittura: nessun effetto
-
bit
5 GP5 in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRISGPIO è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 4 GP4
in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRISGPIO è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 3 GP3
in lettura : livello logico applicato al pin
in
scrittura: nessun effetto perchè il pin solo ingresso
-
bit 2 GP2
in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRISGPIO è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 1 GP1
in lettura : livello
logico applicato al pin
in
scrittura:(
solo se la direzione in TRISGPIO è 0)
1 = pin
a livello alto
0 = pin
a livello basso
-
bit 0
GP0
in lettura : livello
logico applicato al pin
in scrittura:
(solo
se la direzione in TRISGPIO è 0)
1 = pin
a livello alto
0 = pin
a livello basso
Ad esempio, una volta definito GP0
come uscita (bit 0 di TRISGPIO
= 0 ), potrò portarlo a livello 1 scrivendo 1 nel bit 0 di GPIO
e mandarlo a livello 0 scrivendo 0 nello stesso bit.
Se al pin è collegato un LED, esso si accenderà e spegnerà a seconda del
livello imposto al pin.
Se il bit 2 di TRISGPIO
= 1, GP2
è configurato come ingresso. Leggendo GPIO
mi ritroverò nel suo bit 2 il valore del livello logico applicato al pin.
Per 16F506, il discorso è analogo,
riferendolo però ai due registri PORTB e PORTC, dove PORTB sostituisce
GPIO.
La lettura dello stato dei pin è
possibile sia che questi siano configurati come ingressi che come uscite.
Pin
come |
Azione
|
ingressi |
la
lettura rende lo stato elettrico reale del pin in quel momento
|
una eventuale scrittura
del bit configurato come ingresso non ha
effetto.
|
uscite
|
la
lettura rende lo stato elettrico reale del pin in quel momento
|
la scrittura agisce sul latch di
uscita del pin
|
Per comprendere a pieno il funzionamento del circuito che sta a monte del pin
utilizzato come I/O digitale, qui trovate alcune pagine informative.
Questa situazione fa si che in
particolari circostanze si determini l' effetto chiamato R-M-W e che
blocca lo stato di un pin nel caso in cui si acceda con istruzioni che operano
una lettura prima della scrittura (read-modify-write), ad esempio BCF o
BSF. Nel caso in cui il carico applicato al pin fosse elevato, principalmente
dal punto di vista dell' impedenza (che si oppone alla variazione), occorre
mettere in atto qualche sistema per evitare il problema R-M-W, ad
esempio usando dei semplici buffer. Maggiori informazioni su R-M-W
qui.
Come TRISGPIO,
anche GPIO è in RAM e le impostazioni
definite dall' utente durante lo svolgimento del programma vanno perse alla
mancanza di tensione di alimentazione. Per quanto riguarda i già citati
default, nel caso di questo registro, essendo configurati come ingressi digitali al POR,
ovviamente non può venire imposto alcun valore di default (x indica
indeterminato).
|