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 TRIS
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 TRIS, 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.
PORTx
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, che ha
questa struttura:
PORTx
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
-
|
-
|
Rx5
|
Rx4
|
Rx3
|
Rx2
|
Rx1
|
RxO
|
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 Rx5 in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRIS è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 4 Rx4
in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRIS è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 3 Rx3
in lettura : livello logico applicato al pin
RB3 - in
scrittura: nessun effetto perchè il pin solo ingresso
RC3 -
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 2 Rx2
in lettura : livello
logico applicato al pin
in
scrittura: (solo se la direzione in TRIS è 0)
1 =
pin a livello alto
0 =
pin a livello basso
-
bit 1 Rx1
in lettura : livello
logico applicato al pin
in
scrittura:(
solo se la direzione in TRIS è 0)
1 = pin
a livello alto
0 = pin
a livello basso
-
bit 0
Rx0 in lettura : livello
logico applicato al pin
in scrittura:
(solo
se la direzione in TRISG è 0)
1 = pin
a livello alto
0 = pin
a livello basso
Ad esempio, una volta definito RB0
come uscita (bit 0 di TRIS PORTB
= 0), potrò portarlo a livello 1 scrivendo 1 nel bit 0 di PORTB
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 TRIS PORTC
= 1, RC2
è configurato come ingresso. Leggendo PORTC
mi ritroverò nel suo bit 2 il valore del livello logico applicato al pin.
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 TRIS,
anche PORTx è 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).
|