Perche´ il led che ho collegato sulla porta Rxy non si accende? Disattivare comparatore e convertitore A/D

Uno dei problemi più comuni in cui incappano i ragazzi alle prime armi è quello appunto del famigerato led che non si accende. Ovviamente al posto del led ci potrebbe essere qualsiasi altro utilizzatore, ma il led è sicuramente il componente più comune e con il quale per primi si prende confidenza. Volendo tralasciare le cause che non voglio nemmeno prendere in considerazione (breadboard che non fa contatto, led montato al contrario, led bruciato, saldature fatte male) quella più comune è dovuta al fatto di avere collegato il led ad una porta del picmicro che ha anche una funzione analogica (ovvero la porta sul datasheet ha il contrassegno ANx).

Potevo limitarmi a dire: devi scrivere CMCON=7 o cose del genere, ma purtroppo non sono mai stato il tipo che fornisce risposte spicciole e preferisco spiegare le cose fino in fondo in maniera tale che non si possano avere problemi. Avevo cominciato a scrivere queste righe come parte di una pagina dedicata al troubleshooting, ovvero alla risoluzione delle problematiche comuni, ma visto che le righe erano diventate molte ho deciso di metterle in un articolo a parte.

Di default sui picmicro ad 8 bit, la funzione analogica prevale su quella digitale, il che significa che all’accensione (al Power-Up o al POR: Power On Reset) le porte aventi il contrassegno ANx funzionano come ingressi analogici e si trovano quindi in uno stato di alta impedenza. Sui picmicro si sono due periferiche che utilizzano la funzione analogica : il comparatore e il convertitore A/D.

Una lezione sul convertitore A/D è possibile leggerla qui. Il comparatore, invece, è una delle configurazioni degli amplificatori operazionali: confronta due valori di tensione applicati ai due ingressi, se uno dei due è maggiore dell’altro allora viene portata l’uscita del comparatore a livello alto. Quindi anche il comparatore funziona in maniera “analogica” ma non permette, però, di acquisire il valore preciso di tensione sugli ingressi bensì soltanto di capire se un valore è più  alto o più basso rispetto ad un altro.

Su alcuni pic è presente solo il comparatore (es.: PIC16F628 che ne ha due o PIC12F675 che ne ha uno solo), su altri è invece presente il solo convertitore A/D (es.: PIC16F819), su altri sono invece presenti entrambi (es.: PIC16F887).

Nel caso in cui abbiamo collegato il led ad una porta che sul datasheet ha anche il contrassegno ANx allora bisogna disattivare la funzione analogica completamente o parzialmente in maniera tale da poter “liberare” il pin che ci interessa per far accendere il led e quindi utilizzarlo con la sua normale funzione digitale.

Può capitare che su quel preciso pin abbiamo bisogno della funzione digitale mentre su altri potremmo comunque aver bisogno di utilizzare la funzione analogica. Vediamo quindi come si impostano le funzioni analogiche o digitali.

PIC che hanno solo il comparatore

Sui pic in cui è presente il solo comparatore (es.: PIC16F628 – PIC16F628A – PIC16F648 – PIC12F675 ecc) questo viene disattivato agendo sul registro CMCON (Comparator control). Per capire qual è l’impostazione che disattiva il comparatore bisogna controllare nel datasheet qual è la configurazione che permette di farlo: è presente una tabella riassuntiva in genere indicata come Comparator I/O Operating Modes. La configurazione in cui un comparatore è disattivato la si riconosce dal fatto che entrambi gli ingressi del comparatore sono contrassegnati con la lettera D (digital) piuttosto che con A (analog).

Riporto qui delle immagini estratte dalle tabelle in questione relative a vari picmicro per farvi capire:

16F627 / 16F628 / 16F648

Dall’immagine (che non è l’unica presente nella tabella!) vediamo che questo picmicro ha due comparatori e l’impostazione che li disattiva entrambi (vediamo che tutti e due i comparatori hanno entrambi gli ingressi contrassegnati con D) è quella in cui i due bit CM<2:0> si trovano a 111 (ovvero 7 in decimale). In questo caso se non disattiviamo i comparatori e colleghiamo un led ad una delle porte RA0, RA3, RA1, RA2, questo non si accenderà mai perchè la porta, configurata in alta impedenza, non lascia passare corrente. Nel caso in cui potreste aver bisogno della funzione analogica di un comparatore vi basta cercare qual è la configurazione in cui un solo comparatore ha entrambi gli ingressi col contrassegno D e l’altro no.

Riporto qui un altro esempio di un picmicro che ha un solo comparatore:

12F675

Anche in questo caso la configurazione in cui entrambi gli ingressi AN funzionano come digitali è quella in cui i bit CM<2:0> sono a 7.

Il registro CMCON ha anche altri bit che però non servono a nulla se le porte multiplexate con il comparatore non hanno funzione analogica, per cui come regola generale il comparatore sui picmicro che hanno solo il comparatore (e non anche il convertitore A/D),  si disattiva con:

CMCON=7;

Pic che hanno il convertitore A/D o sia convertitore A/D che comparatore

Su questi pic il convertitore A/D ha la precedenza sul comparatore nel caso che quest’ultimo sia presente. In ogni caso la disattivazione della funzione analogica viene eseguita in maniera differente a seconda del pic. Innanzitutto. se non viene utilizzato, è bene spegnere il convertitore A/D in maniera tale da non consumare corrente:

ADON=0;

Dopodichè possiamo passare ad impostare le porte che ci interessano come digitali oppure disattivare completamente la funzione analogica. Alcuni pic permettono di selezionare singolarmente le porte a cui assegnare la funzione analogica. Su tali pic sono presenti i registri denominati ANSEL e ANSELH (es.: il PIC16F887).  Su altri di questi pic, che hanno un numero di pin inferiore, è presente il solo registro ANSEL (es.: il PIC16F88). Su altri ancora (come il PIC16F722) sono presenti i registri ANSELA, ANSELB, ANSELC ecc (uno per ogni banco di porte che ha la funzione analogica) . Tramite questi registri è possibile impostare quali porte devono essere analogiche (bit a 1) o digitali (bit a zero). In questi casi per disattivare completamente le porte analogiche si scrive:

ANSEL=0;
ANSELH=0; // Questo non è presente sui pic con basso numero di pin

Altri pic, invece, non permettono di impostare singolarmente le porte da usare come analogiche bensì è solo possibile scegliere una combinazione tra quelle a disposizione in una tabella in genere identificata come A/D Port configuration control bits che illustra come impostare i bit PCFG del registro ADCON1. In questa tabella sulla sinistra è indicato il valore da dare ai bit di configurazione e a destra le configurazioni assunte dai pin (A= analogico, D=digitale).  Ad esempio sui PIC16F819 e 16F818 abbiamo:

16F818 / 16F819

si vede chiaramente che la configurazione con tutte porte digitali è quella che prevede i bit di PCFG impostati a 011x, ovvero:

ADCON1 = 7; // ma anche ADCON1=6

La stessa configurazione va bene anche per il PIC16F876 / PIC16F877. Fate riferimento al datasheet del pic in vostro possesso.

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)