Order of precedence for pin function
Abbiamo visto che ogni pin
ha disponibili tre diverse funzioni. Se abbiamo qualche idea di come utilizzare quella
di I/O digitale, resta da chiarire come utilizzare le altre.
E in questo si celano alcune delle
difficoltà di base per l' utente che affronta per la prima volta questi
processori.
E queste difficoltà, delle piccole trappole poste sul percorso del
principiante, derivano tutte dalla linea guida citata prima, ovvero dalla
volontà del costruttore di assegnare ai default le condizioni di minimo
consumo energetico.
Il foglio dati da
una indicazione essenziale nella tabella 5-4 (foglio dati DS41268B-page 34)
Come abbiamo visto, nonostante la semplicità dei moduli integrati, tutti i
pin possono assumere differenti funzioni, di cui quella di GPIO si trova al
livello di precedenza più basso.
Che cosa si intende con questo? Semplicemente che una determinata
configurazione dei registri sovra scrive un' altra a precedenza inferiore.
Questo può mettere in difficoltà chi voglia utilizzare un pin come semplice
I/O digitale. Vediamo in dettaglio.
Questa è una "trappola" in cui cade il principiante o chi si
accinge ad usare per la prima volta questo chip. Così, volendo utilizzare GP2, dove sono prioritarie altre funzioni rispetto a quella di semplice I/O
digitale, il LED collegato al pin resterà ostinatamente spento !
Per quanto riguarda le funzioni attribuibili ai pin, possiamo dividerle in
due gruppi.
Il primo riguarda funzioni che vanno definite con la configurazione (__CONFIG)
che sarà descritta più avanti e che si trova al di
fuori della gestione attraverso il programma vero e proprio:
- sul pin 4 l' alternativa a GP
3
è la funzione di reset MCLR, che viene selezionata nella configurazione
sul pin 3 l' alternativa a GP4
è la funzione dell' oscillatore esterno, che viene selezionata nella configurazione
sul pin 2 l' alternativa a GP5
è la funzione dell' oscillatore esterno, che viene selezionata nella configurazione
Del secondo gruppo fanno parte le funzioni che sono attribuibili
attraverso la programmazione di bit nei registri di controllo, operazione
che deve essere effettuata durante l' esecuzione del programma:
- sul pin 7 l' alternativa a GP
0
è la funzione di ingresso analogico, che viene selezionata da programma con
un apposito registro di controllo
- sul pin 6 l' alternativa a GP1
è identica
alla precedente
- sul pin 5 l' alternativa a GP2
è più complessa, in quanto il pin può essere assegnato:
- ad un ingresso analogico (AN2)
- all' ingresso di conteggio esterno (T0CKI)
del timer
- all' uscita digitale del comparatore (C1OUT)
Una differenza essenziale tra i due gruppi è che le opzioni del primo,
una volta impostate in fase di scrittura della memoria del chip, non possono
essere modificate durante l' esecuzione del programma. Ad esempio, l'
assegnazione della funzione di oscillatore estero è fissata nella
configurazione e non può essere modificata da programma, cosicchè i pin GP4
e GP5
assumono la funzione di ingresso e uscita del circuito esterno di
oscillatore e non potranno essere usati per altro fino ad una nuova
riscrittura del chip.
Invece, le funzioni relative al secondo gruppo possono essere modificate
solo attraverso il programma e questo, dove necessario, può essere operato
dinamicamente. Ad esempio, il pin GP2
potrebbe essere definito come ingresso per il timer e in un' altra fase di
lavoro programmato come ingresso digitale.
Una situazione come quella qui descritta è caratteristica inevitabile
dei microcontroller, dove esiste la possibilità di disporre di un numero
elevato di funzioni programmabili, ma non di una quantità sufficiente di
pin per supportarle tutte contemporaneamente. Sta all' utilizzatore definire
con chiarezza quali sono le funzioni da attribuire ai pin ed agire di
conseguenza sui registri di programmazione.
Parlando dei default, abbiamo visto che la filosofia di base è quella di
assegnare loro la situazione di minimo consumo energetico. Ne risulta che la
funzione più "gettonata", ovvero quella di semplice I/O digitale,
viene a trovarsi al fondo della lista delle priorità e che per attivarla
occorre una serie di manovre preliminari a volte non proprio evidenti.
Il foglio dati, comunque, ci viene in aiuto con una ulteriore tabella in
cui sono indicate le azioni necessarie per liberare i pin:
Le celle in colore grigio indicano che il bit relativo non incide sulla
scelta. Quelli a fondo chiaro indicano le permutazioni con cui si può
arrivare ad utilizzare la funzione digitale del pin.
Una prima occhiata alla tabelle getta chiunque nello sconforto: poter
usare la più semplice funzione richiesta a un pin del microcontroller,
quella di ingresso o uscita digitale, necessita un discreto lavoro!
Una nota: altri PIC più semplici, ovvero con un numero minore di
periferiche, come 10F200, presentano una situazione di accesso ai pin meno
ingarbugliata. Si è voluto comunque utilizzare 12F510 per la possibilità
di avere disponibili il massimo delle funzioni dei Baseline in un solo chip
a basso numero di pin.
Vediamo la cosa organizzata in una tabella diversa:
Pin |
Possibilità |
GP0 |
La funzione di ingresso analogico del modulo ADC è privilegiata
dal fatto questa selezione è quella che minimizza il consumo di
corrente. Per disporre del pin come GPIO occorre disabilitare la
funzione analogica e quella di comparazione. |
GP1 |
Situazione analoga a GP0. Per
disporre del pin come GPIO occorre disabilitare la funzione analogica e
quella di comparazione. |
GP2 |
E' un pin "complicato", in quanto vi concorrono ben 4
diverse funzioni. Occorre disabilitare la funzione
analogica(/comparatore e quella di ingresso T0CKI |
GP3 |
Diventa automaticamente ingresso digitale se è stato impostato _MCLRE_OFF
nel CONFIG |
GP4 |
Diventa automaticamente I/O digitale se è stato scelto nel CONFIG
l' oscillatore interno |
GP5 |
Diventa automaticamente I/O digitale se è stato scelto nel CONFIG
l' oscillatore interno |
Quindi:
per
usare i pin come semplici GPIO occorre:
Pin |
Azione |
Dove |
SFR |
Bit |
GP0 |
disabilitare AN0
disabilitare comparatore |
da
programma |
ADCON0
CM1CON0 |
ANS1:0
= 00, 01
C1ON = 0 |
GP1 |
disabilitare
AN1
disabilitare comparatore |
ADCON0
CM1CON0 |
ANS1:0
= 00, 01
C1ON = 0 |
GP2 |
disabilitare
AN2
disabilitare comparatore
disabilitare T0CKI |
ADCON0
CM1CON0
OPTION |
ANS1:0
= 00
C1ON = 0
T0CS = 0 |
disabilitare
AN2
disabilitare uscita comparatore
disabilitare T0CKI |
ADCON0
CM1CON0
OPTION |
ANS1:0
= 00
C1T0CS=1, C1OUTEN=1
T0CS
= 0 |
GP3 |
disabilitare
MCLR |
da
CONFIG |
config_word |
_MCLRE_OFF |
GP4 |
abilitare
INTOSC |
_INTOSC |
GP5 |
|
Per quanto riguarda 16F506, il foglio dati riporta la tabella
5-6 (DS41268B-page 36) relativa al PORTB, con una situazione
analoga a quella sopra riportata. Inoltre è necessaria la tabella 5-7
relativa al PORTC.
Da notare che la funzione T0CKI
viene spostata su PORTC,5.
Osserviamo che sono stati citati altri registri di controllo,
oltre ai già considerati TRIS e GPIO: vediamo a cosa servono.
|