Simple Clock : un semplice orologio con un PIC® MCU a 18 pin e display a led a 7 segmenti
E’ da tempo che ci stiamo lavorando su, da prima che pubblicassi l’articolo sull’utilizzo del Timer1 come base dei tempi per un orologio. Un giorno Luca Gallucci mi manda una email per sapere come procedere nella realizzazione di un orologio con un RTCC, gli dico: devi visualizzare soltanto ora e minuti? Allora perchè non usi soltanto il Timer1 ?
Da quel momento in poi sono balenate numerose idee e sono seguiti parecchi studi e prove, tra vagonate di lucidi buttati, laboratorio ritinteggiato di giallo/ruggine dovuto al percloruro e numerosi display a 7 segmenti che piangono ancora. Un orologio può sembrare in apparenza un’applicazione banale e difatti io stesso fin’ora non mi ero applicato più di tanto in quanto la teoria oramai ce l’avevo tutta in testa, ma talmente tutta che realizzare un orologio mi sembrava una cosa fin troppo banale. Fino a quella email.
Alla fine abbiamo tirato fuori un bel progetto, molto semplice e a tratti minimalista: un orologio compatto ma soprattutto molto preciso che mostra unicamente ora e minuti e fa lampeggiare i puntini ad ogni secondo, con la possibilità di impostare l’ora esatta in maniera rapida ed intuitiva e con la caratteristica, assente anche su molte sveglie moderne, di continuare a mantenere l’orario anche quando la corrente va via. Si tratta di una cosa abbastanza semplice, un progetto per tutti, anche per quelli alle prime armi, ma che non vuole tralasciare alcuni aspetti che ritengo di fondamentale importanza per imparare ad utilizzare i pic in maniera seria e professionale, primo tra tutti l’utilizzo degli interrupt che sono una cosa che ancora tutti non arrivano ad afferrare e per la quale mi batterò fino alla morte. Se volete realizzare progetti seri, con gli attributi, dovete imparare ad usarli (gli interrupt! … ma anche gli attributi!).
L’articolo di oggi è come mio solito molto articolato e descrittivo e potrà risultare interessante anche ai non appassionati di picmicro per numerosi motivi tra i quali una breve digressione sui vari tipi di display a 7 segmenti che si trovano in commercio, una spiegazione che ho ritenuto d’obbligo dal momento che in molti di noi, me compreso, per risparmiare acquistano spesso da Ebay, soprattutto in Cina.
Lo sviluppo di questo orologio ha seguito alcune principali linee guida prima tra tutti l’ utilizzo di componenti comuni. Anche se avevamo alcuni display a led fatti apposta per orologi (ovvero costituiti da 4 cifre più puntini in un unico corpo con i segmenti già collegati tra loro per funzionare in multiplex) abbiamo deciso di usare 4 display separati a catodo comune dato che sono più “popolari” e comunque molto più facili da trovare nei negozi di componenti elettronici. Oltre ai display l’altro componente principale è sicuramente il (o meglio: UN) picmicro, la scelta primaria è ricaduta su un 16F628(A) (dove con la A tra parentesi sto ad indicare: CON o SENZA la A – ricordo che la A fa differenza solo nella modalità di programmazione ma le funzionalità sono identiche), il sostituto del vecchio, stravecchio 16F84. Si possono usare, senza cambiare il software allegato, i pic 16F627(A),16F628(A),16F648(A), altri pic a 18 pin richiedono una minima modifica (ad. es: disattivazione modulo A/D e/o eventuale selezione della frequenza dell’oscillatore interno qualora sia possibile avere più di una frequenza ecc. tutte modifiche che andrò di seguito a descrivere dettagliatamente in modo che ognuno possa avere a casa il suo “Simple Clock”).
Il circuito è quindi realizzato per poter utilizzare un qualsiasi pic a 18 pin purchè sia dotato di clock interno e possibilità di utilizzare il pin MCLR come normale I/O.
In particolare Luca Gallucci ha realizzato il circuito utilizzando un modernissimo e super-perfomante PIC16F1827, forse sprecato per questa applicazione, ma lui ha intenzione di usare quel pic anche per le funzioni accessorie della sua DeLorean e quindi la scelta è giustificata ;)
Anche se, dicevo, la teoria c’era tutta, la parte più complessa è stata forse quella di realizzare un pcb che fosse abbastanza compatto e semplice da montare. Il PCB, alla fine, è possibile realizzarlo in un quarto di eurocard (50x75mm) anche usando basette a singola faccia.
Dopo questa lunga premessa, andiamo ad analizzare le varie parti, sia hardware che software, che compongono questo progetto, talmente semplice e funzionale da essere quasi una “novità non nuova”.
Indice dei contenuti
Il circuito
Qui c’è lo schema completo:
Elenco componenti:
R1 ÷ R8 : resistenza da 220Ω (se il display assorbe 20mA/seg) o da 330Ω (se il display assorbe 15mA/seg) ¼W.
R1 da montare solo sui pic che hanno RA4 a collettore aperto (PIC16F628), in questo caso al posto di R4 si fa un ponte.
R1 da NON montare solo sui pic che hanno RA4 “normale” (PIC16F88, PIC16F819, PIC16F1827), in questo caso R4 va montata
R9, R10, R12, R13 : resistenza da 4.7KΩ ¼W (non fate caso allo schema, devo correggerlo)
R11, R14: resistenza da 220Ω (se il display assorbe 15mA/seg) o da 330Ω (se il display assorbe 20mA/seg) ¼W
R14 da montare solo sui pic che hanno RB1 a collettore aperto (PIC16F1827), in questo caso al posto di R11 si fa un ponte
R14 da NON montare solo sui pic che hanno RB1 “normale” (PIC16F628, PIC16F88, PIC16F819), in questo caso R11 va montata
R15, R16 : resistenza da 10KΩ ¼W
T1 ÷ T4 : transistor NPN BC337 (o equivalente, da almeno 300mA)
D1, D2 : diodo 1N4148 (va comunque bene un diodo qualsiasi)
C1,C2 : condensatore ceramico 27pF (nota: in realtà dipende dal quarzo, vedi paragrafo “collaudo e segnali”)
C3 : condensatore poliestere 100nF (modello miniatura, con passo da 7.5mm)
C4, C5 : condensatore elettrolitico 10μF 16V (si! va bene pure il 50V! stiamo ancora a questo?)
IC1 : PIC16F627 o PIC16F627A o PIC16F628 o PIC16F628A o PIC16F648 o PIC16F648A o PIC16F87 o PIC16F88 o PIC16F819 o PIC16F1827 o un pic qualsiasi a 18 pin che abbia MCLR usabile come uscita e l’oscillatore interno
IC2 : regolatore di tensione tipo 7805 o regolatore qualsiasi in grado di fornire 5V fissi e almeno 300mA con la stessa piedinatura del 7805
Q1 : quarzo 32768Hz (32.768KHz)
CN1 : DC power jack
CN2 : connettore qualsiasi con passo da 2.54mm (consigliato strip maschio a 2 pin o connettore MX254 a due poli)
DISP1 ÷ DISP4 : display led a 7 segmenti catodo comune, altezza cifra 0.56inch (14.2mm), ulteriori informazioni sui display da usare le potete trovare più in basso
zoccolo DIL a 18pin
Non ho potuto inserire il connettore ICSP per la programmazione del picmicro sulla scheda perchè non c’era abbastanza spazio: come detto ho scelto di realizzare la basetta in un quarto di eurocard in maniera tale da usare dimensioni standard e non produrre sprechi. Il picmicro quindi andrà programmato prima di inserirlo nel circuito, usando una breadboard o un’apposita scheda. Giusto per lasciarvi tutte le informazioni su un’unica pagina ho fatto uno schemino un po’ “grezzo” dei collegamenti tra pickit e un pic a 18 pin:
Dal momento che usare MCLR come uscita a volte può causare problemi durante la programmazione, vi prego di darvi una lettura a questo articolo prima di dire che il software del pickit vi dice “no device detected” o “verification of configuration failed”.
Analizziamo quindi le 3 parti che compongono lo schema per capirne il funzionamento: alimentatore, parte picmicro e parte display.
Alimentatore
La parte di alimentazione prevede un connettore jack standard (DC Power Jack) per poter far funzionare l’orologio con un normale alimentatore switching da parete in grado di erogare dai 9 ai 12V con almeno 300mA (ma anche meno in dipendenza dei display usati, vedremo dopo come fare il calcolo). In parallelo all’alimentatore, e forse questa è la parte più bella, è posto un connettore per una batteria esterna di backup. I due diodi fanno in modo che soltanto una delle due sorgenti eroghi corrente ovvero quella a potenziale più alto. Questa idea è stata presa dal documento della Microchip Compiled Tips ‘N Tricks Guide (TIP #7 Battery Backup for PIC MCUs). Su tale documento viene consigliato di usare diodi schottky per la loro caratteristica di introdurre una caduta di tensione molto bassa, per la mia applicazione ho deciso invece di utilizzare dei più comuni 1N4148; non mi interessa perdere 0.7V sulla tensione della batteria: in ogni caso uso tensioni più elevate per poi darle in mano al regolatore, voi comunque potete usare qualsiasi diodo, anche degli 1N4004/1N4007 o dei diodi schottky: in questa applicazione serve soltanto che la “corrente non vada indietro” e nulla più per cui la scelta del diodo non è critica.
Per usare questa soluzione è necessario che la sorgente di alimentazione primaria, ovvero quella che si connette al jack siglato CN1, abbia una tensione più elevata rispetto alla batteria di backup da collegare al connettore CN2.
Sia chiaro, la distinzione di sorgente primaria su CN1 e sorgente di backup su CN2 l’ho fatta esclusivamente per i connettori utilizzati ma non perchè ci sia una motivazione circuitale: in realtà è possibile pure usare la sorgente primaria su CN2 e il backup su CN1, cambia solo la forma dei connettori sul PCB.
Consiglio di utilizzare un alimentatore da 12V come sorgente primaria e una batteria da 9V come sorgente di backup. Quando sono collegate entrambe le fonti di alimentazione, la corrente viene prelevata unicamente dall’alimentatore in quanto il catodo di D2 si trova a potenziale più alto dell’anodo, questo impedisce anche alla corrente fornita dall’alimentatore di fluire all’interno della batteria. Quando la sorgente primaria viene a mancare, D2 entra in conduzione e l’orologio viene quindi alimentato senza interruzioni. La presenza di D1 in realtà in questa applicazione non era necessaria e serve unicamente a fare in modo che la corrente fornita dalla batteria non vada in altri circuiti eventualmente alimentati dalla sorgente primaria esterna, insomma può esservi utile se volete montare l’orologio in auto anche se, montandolo in auto, dovrete fare in modo che su CN1 arrivi la 12V fissa anche a chiave disinserita altrimenti la batteria di backup vi dura molto poco. Così facendo il backup entra in funzione unicamente nei casi in cui la batteria dell’auto è molto scarica o viene rimossa oppure nei casi di messa in moto con batteria esausta. Per quanto detto se usate un alimentatore da 9V con una batteria di backup sempre da 9V è possibile che la corrente venga prelevata dalla batteria anzichè dall’alimentatore, quindi fate attenzione, eventualmente misurate con un tester oppure mettete un ponte al posto di D1 per non perdere i 0.7V dovuti alla giunzione. In ogni caso non è necessario montare anche la batteria, è solo un accessorio. Sicuramente non è conveniente far funzionare l’orologio soltanto con la batteria.
Entrambe le sorgenti vengono mandate in ingresso al regolatore di tensione: un classico 7805, forse sovradimensionato per questo utilizzo (bastava anche un più piccolo 78L05 nel caso in cui il circuito non assorba più di 100mA). In ogni caso è anche possibile utilizzare un regolatore a basso dropout (LDO) per spremere al massimo la batteria o per utilizzare un alimentatore da parete con tensione più bassa (fino a 6V in dipendenza dal regolatore, anche se ormai fanno regolatori di tensione con un dropout fino a 150mV!). Potete anche usare un regolatore switching che abbia la stessa piedinatura del 7805. Se volete utilizzare un alimentatore da 5V dovete omettere il regolatore di tensione e collegare con uno spezzone di filo l’ingresso con l’uscita ed inoltre come batteria di backup dovete usare una pila di valore piu basso, diciamo 3 batterie stilo messe in serie, che forniscono 4.5Volts, in ogni caso misurate sempre col tester le due tensioni: la primaria deve essere più alta del backup.
Il microcontrollore
La parte picmicro non dovrebbe avere bisogno di spiegazioni, come vedete vengono sfruttati tutti gli I/O e quindi per tale motivo è necessario utilizzare un picmicro che abbia MCLR usabile come I/O e che abbia l’oscillatore interno in maniera tale da utilizzare anche i pin destinati al quarzo come normali I/O. Ho già indicato nell’elenco componenti alcuni pic utilizzabili, ovviamente ce ne sono tanti altri.
Quindi, prima che me lo chiediate: il PIC16F84 non va bene.
7 I/O pilotano i segmenti dei display (linee con le lettere da A a G), un I/O pilota i due punti di separazione (dots), 4 I/O pilotano i catodi comuni (K1..4) e gli ultimi due I/O vengono usati per due pulsanti utili per il settaggio dell’orario. Avanzano 2 I/O che usiamo per collegare il quarzo che fa “girare” il Timer1 come visto nell’articolo precedente.
Qualcuno potrebbe obiettare del perchè non è stato usato RA5 insieme agli altri pin destinati agli anodi dei segmenti come sarebbe stato più logico. Chi fa questa domanda ignora che il pin RA5, quando è multiplexato con MCLR, può unicamente essere usato come input ma non come output. Questo è un errore comune in cui incorrono molte persone. Sul datasheet difatti è chiaramente specificato che può essere configurato come input (e basta):
Altri potrebbero obiettare ancora che MCLR quando usato come ingresso è tenuto a livello alto internamente e quindi non è necessaria una resistenza di pullup esterna. Questo è vero in parte. Sicuramente MCLR in questo caso viene tenuto a livello alto internamente, altrimenti il pic non sarebbe in grado di funzionare, ma non su tutti i pic è possibile evitare di montare una resistenza di pullup esterna per rilevare il cambio di stato dovuto, ad esempio, alla pressione di un pulsante. In particolare sul PIC16F628 questa cosa non è specificata sul datasheet e difatti ho eseguito varie prove usando il pulsante senza la pullup esterna, il risultato era che lo stato logico del pin fluttuava di continuo. Sul 16F1827, invece, la questione è chiaramente specificata nel datasheet per cui la resistenza di pullup sul pulsante non è necessaria, anche perchè, in quel caso, il 16F1827 ha la possibilità di abilitare le resistenze di pullup anche sul banco A.
Abilitando le resistenze di pullup su porta B, inoltre, è anche possibile evitare il montaggio di R15, l’ho lasciata sullo schema per sicurezza, in caso qualche pic che non abbiamo preso in considerazione possa avere comportamenti non comuni.
In ogni caso montare le due resistenze di pullup sui pulsanti non fa certo male.
Se utilizzate un picmicro con le caratteristiche adatte a questo progetto, non vi dimenticate di disattivare le porte analogiche o i comparatori qualora fossero presenti. Inoltre dato che alcuni pic con oscillatore interno permettono di selezionare più frequenze di funzionamento, non dimenticate di eseguire questa selezione cercando di scegliere la frequenza più alta. Sul 16F6x8(A) è disponibile unicamente l’oscillatore interno a 4MHz e si setta quindi soltanto dalla word di configurazione. Vi illustrerò dopo un esempio di adattamento.
Display
I display sono collegati per sfruttare la tecnica del multiplexing ma con una particolarità : i due display dei minuti andranno montati a testa in giù per cui i collegamenti sono riarrangiati a tal proposito (A con D, B con E e così via).
Questa idea geniale è venuta a Luca durante la visione della puntata di Chuck Bartowski Stagione 2 Episodio 07 – Chuck Versus the Fat Lady, precisamente al min. 23:25. E’ possibile osservare un fotogramma della scena “chiave” in questo link, basta scorrere la pagina per capire chiaramente cosa intendo.
Così facendo il punto decimale presente sul display dell’unità ore e quello presente sul display decine minuti si vengono a trovare sulla stessa linea parallela alle cifre e vengono usati come separatori di orario e fatti lampeggiare a cadenza di un secondo, penso che siamo i primi sul web a presentare questa soluzione gagliarda. Il display dell’unità minuti poteva essere montato normalmente ma poi esteticamente poteva apparire brutto.
Vi sono quindi 4 comuni transistor PNP che pilotano i catodi, ho scelto i BC337 ma va bene qualsiasi transistor che sia in grado di sopportare tra collettore ed emettitore la corrente necessaria a far funzionare tutti e 8 i led dei segmenti accesi insieme (almeno 300mA nel peggiore dei casi). Vi prego di non mandarmi messaggi dicendo: posso usare il BCxxx, trovatevi il datasheet e leggete il valore di Ice, se è >= 300mA allora va bene. Potrebbero andar bene anche dei transistor in grado di erogare una corrente minore in base al consumo dei display, vedremo dopo come calcolare la corrente consumata.
Per quanto riguarda le resistenze da utilizzare per pilotare gli anodi, la scelta da fare dipende ancora una volta dal display che utilizzate e soprattutto tenendo conto che i pin del picmicro non possono erogare più di 25mA (corrente di picco, ma dovrebbero lavorare a massimo 20mA). I display comuni seguono lo stesso andamento dei normali led, per cui assorbono una corrente di circa 15mA per segmento per cui alimentandoli a 5V è necessaria una resistenza da 330Ω, se siete in dubbio utilizzate il valore di 330Ω. Detto questo dovrebbe essere chiaro il significato dei valori da usare scritti sotto le resistenze R1..R8.
Dato che i pic 16F6x8/16F6x7 hanno RA4 a collettore aperto (il che vuol dire, detto in maniera molto spicciola, che non sono in grado di fornire la tensione positiva ma solo GND) è necessario montare una resistenza di pullup, che nella fattispecie è R1, la quale dovrà avere lo stesso valore delle altre resistenze R1..R8. Ovviamente in questo caso al posto di R4 andrà messo un ponticello. Se invece usiamo un PIC16F1827, PIC16F88, PIC16F819 o un altro PIC che non ha RA4 a collettore aperto, R4 andrà montata e R1 NON va montata (NON va fatto il ponticello in questo caso, dovete soltanto NON montare la R1 e basta). Vi prego di fare attenzione a questo aspetto altrimenti rischiate di bruciare il segmento C del display.
A tal proposito lo dico ancora una volta:
- se usate un pic che ha RA4 a collettore aperto (es: PIC16F628) montare R1 e fare un ponte al posto di R4
- se usate un pic che NON ha RA4 a collettore aperto (es.: PIC16F1827, PIC16F88, PIC16F819) montare R4 e NON montare R1 (nemmeno il ponte dovete fare: lasciate i buchini vuoti, chiaro!)
lo stesso “problema” lo abbiamo con R11 e R14 che servono ad alimentare i puntini di separazione. Dato che i puntini vengono alimentati da RB1 che sul PIC16F1827 è a collettore aperto…
- se usate un pic che NON ha RB1 a collettore aperto (es.: PIC16F628, PIC16F88, PIC16F819) montare R11 e NON montare R14 (lasciare i buchini vuoti!)
- se usate un pic che ha RB1 a collettore aperto (es.: PIC16F1827) montare R14 e fare un ponte al posto di R11
Come vedete ci sono alcuni pic (PIC16F88, PIC16F819) che non hanno nessuna porta a collettore aperto. La logica per la scelta dei valori di R11 e R14 è la stessa di quella per la scelta di R1…R8, in ogni caso sullo schema sono indicati i valori (220 o 330Ω in dipendenza del display utilizzato).
Il PCB
Schemi e layouts in formato pdf possono essere scaricati in fondo all’articolo. I PCB su cui abbiamo eseguito i test sono stati realizzati su basette in vetronite a singola faccia, che sono più comuni. Ovviamente, data la complessità dovuta al collegamento di 4 singoli display, si è dovuti scendere a compromessi che hanno comportato l’utilizzo di 15 ponticelli (oltre all’eventuale altro ponticello da eseguire in base al pic utilizzato). La facciata superiore del pcb, quindi, indica i ponticelli da eseguire ma può anche essere utilizzata, dato che il suo scopo è questo in realtà, per realizzare un circuito a doppia faccia. I 15 ponticelli da eseguire sono indicati in rosso:
La dimensione è molto compatta: 50×75, equivalente ad un quarto di eurocard (il formato più piccolo che generalmente si trova in commercio è la mezza eurocard, di 100×75, con mezza eurocard potete quindi realizzare 2 orologi).
Sul PCB è presente il guard-ring intorno al quarzo come consigliato dal documento Compiled Tips ‘N Tricks Guide, e lo spessore delle piste consente il giusto flusso di corrente per la corretta luminosità dei display. In ogni caso se intendete realizzare il PCB è necessario che la tecnica che usate sia molto pulita, ed in particolare è consigliato il metodo della fotoincisione. Per la foratura sono inoltre necessarie anche punte da 0.6mm previste per i fori destinati ai ponticelli. Se volete il PCB posso anche realizzarvelo io, forarlo e spedirvelo al costo complessivo di 6 euro.
Scelta dei display, luminosità e consumi
Con questo circuito, come dicevo, è necessario utilizzare 4 display a catodo comune, aventi i pin di collegamento disposti in orizzontale sui bordi superiore ed inferiore, la distanza tra le file di pin deve essere di circa 15mm, generalmente i display con questa distanza tra i pin ha la cifra del display con un’altezza di 0.56″ (14.2mm), ma ci sono anche display aventi le stesse dimensioni che hanno la cifra leggermente più piccola. La piedinatura deve essere la seguente:
Questo tipo di display è il più comune.
Su ebay spesso i display a catodo comune vengono indicati con la sigla (CC)
Parlavo prima delle resistenze da montare per garantire la corretta luminosità dei display. Il parametro che dovete andare a vedere sul datasheet del display è indicato come If (Forward Current – corrente diretta, altri produttori invece indicano Ir, corrente inversa). Se il vostro display ha una If di 15mA (0.015A) la resistenza da utilizzare, dato che stiamo alimentando il display a 5V, si calcola come R = 5/0.015 = 333.33Ω. Il valore commerciale più vicino è quello di 330Ohm (puo esservi di aiuto la tabella resistenze con i valori commerciali presente nell’area risorse). Questo è il valore più comune e come dicevo è anche quello da utilizzare se siete in dubbio.
Alcuni display consentono il pilotaggio anche con correnti maggiori, fino a 30/40mA, valori che vanno al di fuori della massima corrente erogabile dai pin del pic che, come dicevo, è massimo 25mA, in questi casi possiamo montare al massimo una resistenza da 220Ω ottenendo ovviamente una luminosità molto ridotta dato che questi display sono fatti appunto per funzionare a 30/40 mA.
Una luminosità più elevata è adatta quando l’orologio deve essere posizionato in zone normalmente illuminate, come ad esempio un soggiorno o la sala da pranzo, se invece dovete posizionare l’orologio in camera da letto, stanza in cui normalmente si vive al buio o comunque con luminosità prossima allo zero, forse è conveniente montare resistenze di valore più alto (tipo 470 o 560Ω) in maniera tale da ridurre la corrente verso i segmenti e di conseguenza anche la luminosità. In questi casi potete anche utilizzare un alimentatore con una valore di corrente erogabile più bassa (e quindi anche più compatto).
I calcoli di consumo teorico li potete fare da voi tenendo conto che il pic usando l’oscillatore interno ha un consumo davvero irrisorio (si parla di cifre che hanno μA come unità di misura) per cui il calcolo può unicamente essere eseguito prendendo in considerazione i soli display. Tenendo conto che in multiplex è in realtà acceso un solo display alla volta e che nel peggiore dei casi sono accesi 8 led (7 segmenti + 1 puntino), usando ad esempio delle resistenze da 470Ohm, ogni segmento riceverà una corrente pari a I=V/R=5/470=10mA che moltiplicato 8 da un consumo di 80mA e quindi potete anche usare un alimentatore da parete da 100mA (per sicurezza). Questo 80mA, ad esempio, lo potete anche usare per scegliere il transistor da utilizzare se non avete il BC337.
La luminosità dei display è generalmente indicata in mcd (millicandele). I valori più comuni di luminosità si aggirano tra le 2.2-2.4mcd. I display economici hanno in genere questo valore di luminosità con un assorbimento medio di 15/20mA per segmento. In ogni caso il valore di luminosità è in dipendenza del colore: i display rossi a parità di corrente hanno valori di luminosità molto più elevati (ad esempio i display rossi della serie HDSP hanno una luminosità tipica di ben 16mcd a 20mA!).
Display più costosi come quelli prodotti dalla Kingbright hanno lo stesso valore di luminosità ma con un assorbimento più basso (15mA) e possono essere inoltre pilotati con un valore di corrente più alto (30mA) e fornire luminosità massime molto elevate.
Molte ditte producono anche display identificati come alta efficienza (HE) ad indicare display con un ottimo compromesso tra luminosità e consumi o super (es.: super red, super rosso) che raggiungono valori di luminosità molto elevati o “high performance”. Potete accorgervi di queste caratteristiche sfogliando il datasheet di un display a 7 segmenti di una marca nota: vedrete che nell’elenco dei dispositivi spesso i display normali sono affiancati da display riportanti sigle come “super” o “high efficiency” o termini simili che indicano appunto che il display standard è anche prodotto in modelli più efficienti ovvero più luminosi o comunque con stessa luminosità ma con consumi ridotti.
Alcuni datasheet di display a 7 segmenti li potete trovare in fondo a questo articolo
Io ho utilizzato display verdi da 2.5mcd e ne sono abbastanza soddisfatto (HDSP-5603). Sconsiglio di usare display cinesi che non arrivano ad almeno 2.4mcd. In ogni caso i display rossi, come dicevo, garantiscono luminosità più elevate.
In ogni caso potrete notare come un display pilotato in multiplex non ha mai la stessa luminosità del display al quale i segmenti vengono accesi in maniera fissa… questo è normale perchè il display rimane acceso per un tempo inferiore rispetto a quello in cui rimane spento. Nel caso dell’orologio, ad esempio, che utilizza 4 display, ogni display resterà spento per un tempo 3 volte superiore a quello in cui rimane acceso. Per tale motivo i display così pilotati, a meno che non si tratti di display ad alta efficienza, possono apparire un po’ smorti o con segmenti meno luminosi se esposti alla luce. Ecco perchè si usa mettere dei vetrini di plexiglass colorato davanti ai display a 7 segmenti: per esaltarne il colore e attenuare i riflessi della luce ambientale (oltre che per ovvi motivi di protezione del circuito). Difatti davanti ai display rossi vediamo quasi sempre un vetro di colore rosso molto scuro, verde scuro di fronte a display verdi e così via. Se i vostri display appaiono fiacchi, prima di pensare a usare display ad alta efficienza, provate a metterci davanti un ritaglio di plexiglass colorato non troppo spesso.
Alcuni vecchi display, come i gloriosi FND500 (non usabili per questa applicazione perchè troppo larghi), avevano già il corpo ricoperto con plastica semitrasparente rossa. In ogni caso se decidete di acquistare display “cinesi” consiglio di comprarli rossi perchè a parità di corrente assorbita appaiono più luminosi o comunque acquistate display fatti per lavorare massimo a 20mA e con un buon valore di luminosità. E’ anche possibile trovare display aventi il corpo nero o grigio scuro anzichè bianco. A volte non è solo una questione di estetica: il corpo scuro fa molto più contrasto con la cifra e permette di visualizzarla meglio.
Giusto per dare la sigla di qualche display a catodo comune utilizzabile:
- MAN6480
- HDSP-5603
- TDSR-5160
- SC56-11GWA
Montaggio
Il layout del pcb è il seguente:
Incomincerete il montaggio dai ponticelli per seguire via via dai componenti più bassi (il quarzo che è da montare coricato, i due diodi, le resistenze) a quelli più alti. Se acquistate componenti da stock, soprattutto i display che su ebay si vendono in lotti anche da dieci pezzi a prezzi irrisori, potrebbe accadere che i piedini di collegamento siano leggermente ossidati. Prima di montare i componenti controllate in che stato si trovano i piedini ed eventualmente ripuliteli con un po’ di carta abrasiva fine o una limetta per le unghie altrimenti non riuscirete a saldarli: alcune piste e piazzole sono molto piccole ed è quindi necessaria una punta molto fine e anche dello stagno fine. Bisogna apporre solo una goccia di stagno e non di più, fare cortocircuiti è molto semplice. Inoltre quella goccia di stagno deve fare subito presa evitando di consumarne molto per far lavorare il disossidante.
Per il montaggio dei display, in maniera da farli venire perfettamente allineati, consiglio di adottare questo trucco: mettete i display con la faccia rivolta verso l’alto e premeteli in verticale verso un oggetto dritto, tipo una riga, fateli andare perfettamente adiacenti gli uni agli altri:
Trattenere quindi i display su un lato con una striscia di scotch da carrozziere:
Mettere un’altra striscia di scotch sul lato opposto:
In questo modo i display formano un’unico corpo e rimangono perfettamente allineati:
lo scotch verrà rimosso una volta saldati i display sulla scheda.
Per la batteria potete usare un connettore qualsiasi con passo da 2.54mm (tipo uno strip maschio) ma poi avete bisogno del connettore femmina. Io ho usato un connettore MX254 a 2 poli (ho comprato un set qui), sulla femmina ho saldato la presa per la batteria a 9V:
Usare un connettore comunque non è necessario, potete benissimo saldare i fili direttamente sul pcb.
Il firmware
Premetto che il software è stato scritto utilizzando l’ultima versione dell’Hitech-C per cui se usate vecchie versioni di MPLAB o anche l’ultima versione la quale alla data attuale non ha ancora il nuovo Hitech-C, potete incorrere in errori di compilazione dovuti al cambio di alcuni nomi mnemonici. Per ulteriori informazioni vi rimando a questo articolo se non l’avete letto.
Il software che gestisce l’orologio è un semplice collage delle mie idee che già vi ho esposto nella lezione sul multiplexing su interrupt e dell’ultimo articolo sull’utilizzo del Timer1 come base dei tempi per un orologio.
L’interrupt su overflow Timer1 è stato calcolato perchè avvenga ogni mezzo secondo anzichè ogni secondo. In questo modo si può ottenere il comportamento dei normali orologi da tavolo: ovvero i puntini di separazione si accendono quando è passato un secondo. In pratica i puntini saranno accesi per mezzo secondo e spenti per un altro mezzo secondo, quindi tra due accensioni successive è passato un secondo. Per realizzare questo si fa in modo che l’inversione di stato, e quindi l’interrupt, avvenga ogni mezzo secondo: basta caricare Timer1 al valore 0xC000 (32768 + (32768/2)). Verrà quindi utilizzata un’ulteriore variabile che tenga conto del mezzo secondo. Quando tale variabile ha raggiunto il valore 2 vuol dire che è passato un secondo e quindi posso incrementare la variabile dei secondi.
Il software usa i pulsanti BT1 e BT2 rispettivamente per il settaggio di minuti e ora. Il loro utilizzo non dovrebbe risultarvi complicato. Viene gestito l’antirimbalzo utilizzando le routine di delay già incluse con l’Hitech-C per cui oltre al main non sono necessari altri files aggiuntivi. Durante l’impostazione dei minuti, ad ogni incremento, vengono anche azzerati i secondi in maniera tale da poter sincronizzare il vostro orologio in maniera precisa con un altro orologio: ad esempio mettere l’orologio un minuto indietro rispetto all’orologio del pc, sul pc osservate anche i secondi, nel momento in cui i secondi sono arrivati a 59 vi tenete pronti a premere il pulsante per incrementare il minuto, in questo modo sono (quasi) sincronizzati anche i secondi.
Il multiplex per le cifre viene gestito dall’interrupt sul Timer0, programmato per scattare ogni 5mS: ogni cifra rimane accesa 5mS e spenta per 15mS, salire ulteriormente causa un vistoso sfarfallamento, già con 5mS siamo al limite. In realtà anche se l’interrupt è a 5mS i diplay rimarranno accesi circa 4mS come vedremo tra un po’.
Adattare il sorgente ad altri PIC
Come detto il sorgente (e l’hex già compilato) sono pensati per i PIC 16F627/628/648 (con o senza la A finale). Per adattarlo al vostro pic sono necessari i seguenti accorgimenti:
- Cambiare la word di configurazione
- Se il picmicro permette di selezionare più frequenze per l’oscillatore interno, selezionare la frequenza più elevata agendo negli appositi registri (OSCCON)
- Cambiando la frequenza dell’oscillatore interno, se è diversa da 4MHz, dovrete ricalcolare i valori da assegnare a Timer0 (TMR0) e al prescaler (OPTION_REG) per fare in modo che l’interrupt capiti sempre ogni 5mS. Vi ricordo che il preload del Timer0 è da modificare in due parti nel codice: all’inizio e nell’IST
- Se il picmicro ha il convertitore A/D o il comparatore, dovete disattivarli
Metto qui un esempio di impostazione per il PIC16F88, che però non ho potuto verificare personalmente. Vi sarà d’aiuto per impostare anche altri pic che non ho preso in considerazione.
Word di configurazione
Il PIC16F88 ha due word quindi si richiama due volte la macro __CONFIG:
__CONFIG (FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF & CCPMX_RB0 & CP_OFF); __CONFIG (FCMEN_OFF & IESO_OFF); |
Ovviamente non tutti i bit hanno un reale significato per questa applicazione ma li ho inclusi tutti in maniera da non generare un warning nel software del pickit, che avvisa quando alcune word di configurazione sono mancanti.
Il 16F88 ha l’oscillatore interno calibrabile agendo sul registro OSCTUNE. Il valore di calibrazione è salvato all’interno del pic e il compilatore introduce da sè le necessarie istruzioni per ricavare tale valore e riversarlo nel registro OSCTUNE. Su altri pic potrebbe essere necessario eseguire questa operazione a mano usando l’apposita macro come descritto nel manuale dell’hitech-c ma questo dovrebbe essere limitato unicamente ad alcuni pic12:
OSCCAL = _READ_OSCCAL_DATA(); |
Arrivati a questo punto vi dico una cosa che molti ignorano e per la quale forse un giorno mi ringrazierete. Usare programmatori della Microchip è importante anche per questo motivo: i dati di calibrazione impostati sul pic di fabbrica vengono cancellati da quei programmatori “stupidi” su seriale o su parallela che in molti ancora si ostinano a utilizzare. i programmatori della microchip, invece, prima di eseguire la cancellazione eseguono la lettura della locazione di memoria in cui è contenuto il valore di calibrazione, eseguono quindi la cancellazione e infine riscrivono il valore di calibrazione precedentemente memorizzato. Come?! Avete già cancellato una volta il pic con quel maledetto JDM?! Ahi ahi ahi… potete sempre divertirvi a ricalibrare a mano l’oscillatore ma non chiedetemi come fare… buon divertimento!
Selezione della frequenza dell’oscillatore interno
OSCCON=0b01110000; // oscillatore interno ad 8MHz while (!IOFS) {continue;} // resto in attesa che l'oscillatore si stabilizzi |
Disattivare gli ingressi analogici
ANSEL=0; // nessuna porta come analogica ADON=0; // modulo A/D spento |
Dato che ora abbiamo selezionato l’oscillatore interno ad 8MHz è necessario cambiare la programmazione per l’interrupt sul Timer0, che è stata fatta per un oscillatore da 4MHz. Dobbiamo quindi cambiare il registro OPTION_REG (ex registro OPTION) per fare in modo che il prescaler sia 1:64 :
OPTION_REG=0b00000101; |
Il preload del Timer0 va bene rimanerlo a 102. Ricordo che per questi calcoli ho fatto tempo fa il programma PicTimer
Tutte queste selezioni vanno ovviamente eseguite nel main.
Collaudo e segnali
Una volta montato tutto il circuito, prima di inserire il picmicro (già programmato!) nello zoccolo, è bene verificare che il montaggio sia ok. Diamo alimentazione su CN1 e con un tester controlliamo che sullo zoccolo, tra i pin 5 (GND) e 14 (+5V) siano presenti 5 volt, colleghiamo la batteria di backup e stacchiamo l’alimentazione principale: devono sempre essere presenti 5V.
Ricontrollate il corretto montaggio delle resistenze e dei ponticelli.
Una volta montato tutto il circuito è possibile osservare la sinusoide a 37KHz sul pin 13:
E’ normale che sull’oscilloscopio non leggete precisamente 32.77 KHz, a parte che è molto difficile riuscire a trovare un quarzo estremamente preciso entrano in gioco numerosi fattori sulla misurazione. In aggiunta potrebbe essere necessario cambiare il condensatore: se l’orologio dopo qualche tempo va indietro rispetto ad uno preso come riferimento, riducete la capacità di carico, se invece va avanti, aumentatela. In questo link ci sono alcune indicazioni.
L’importante è che la sinusoide sia bella netta e precisa come mostrato nell’immagine. Montando il circuito sulla breadboard difatti non otterrete mai una sinusoide del genere e ovviamente l’orologio ne soffrirà in termini di precisione. Misurando con l’oscilloscopio sul pin 7 (RB1), al quale sono collegati i puntini, è possibile osservare l’onda quadra ad 1Hz:
Il livello alto appare “frastagliato”, in pratica si sono una serie di transizioni tra il valore di picco, 5V, e circa 4V:
Questo comportamento probabilmente è dovuto al fatto che in realtà RB1 viene mandato a livello alto anche quando il catodo del display relativo è disattivato. I puntini difatti sono collegati esclusivamente sui display 2 e 3, per cui la transizione tra un display e il successivo, quando RB1 si trova a livello alto per lasciar accesi i puntini, probabilmente causa questo comportamento. Il comportamento difatti è assente quando i puntini si trovano a livello basso. In ogni caso funziona tutto correttamente.
Con l’analizzatore logico è interessante osservare anche il comportamento sui catodi dei display e si nota, con sorpresa, che anche se l’interrupt per il multiplexing scatta ogni 5mS, in realtà i catodi display restano accesi per circa 4mS:
Vedete che tra i punti A e B (tra fronte di salita del segnale di pilotaggio di un catodo e fronte di salita del successivo) ci sono appunto i circa 5mS (4.7mS) calcolati ma in realtà in una singola transizione il display rimane acceso per un tempo inferiore: circa 4mS, con circa 700μS di “latenza” prima di passare all’accensione del catodo successivo:
Realizzazione personale : CLOCK IN THE POT
Io non so come mai mi è venuta in mente l’idea di mettere l’orologio in un vasetto di vetro:
Se volete cimentarvi pure voi avete bisogno di un barattolo con un’apertura sufficiente e non troppo lungo. Per fare una cosa pulita ho fatto in modo che il cavetto di alimentazione esca dal retro facendo un buco nel vetro del barattolo:
Per poter fare il buco nel vetro è necessaria una punta apposita, io la trovai tempo fa in un brico, unica misura. Questa punta ha una foggia un po’ particolare. La punta inoltre era molto lunga e causava vibrazioni nel trapano, per tale motivo l’ho accorciata della metà usando una normale sega per metallo:
Per riuscire a bucare il vetro del barattolo senza fare danni è assolutamente necessario usare un trapano a colonna e bloccare il barattolo in maniera che non ruoti durante l’operazione. E’ inoltre indispensabile indossare una mascherina per le polveri per non respirare la limatura di vetro, che è estremamente pericolosa, e dei guanti e occhialini in caso di rottura del vetro
Per fare il buco è necessario fermarsi ogni tanto altrimenti si rischia di spaccare il barattolo. Una volta fatto il buco bisogna aspettare prima di sciacquarlo in quanto è molto caldo e il contatto con l’acqua lo spacca di sicuro.
Per poter montare il cavetto di alimentazione, dato che il buco sul vetro è piccolo, ho dovuto tagliare il connettore sul cavetto:
E’ necessario quindi togliere il connettore jack (ma potete anche rimanerlo) e saldare i fili direttamente sul retro del PCB. Controllate ovviamente la polarità dell’alimentatore con un tester e saldatelo sul pcb nei punti giusti:
Dato che nel barattolo sarà inclusa anche la batteria da 9V, che ha un corpo metallico, è necessario isolare in qualche modo il retro del PCB. A tal proposito ho messo due pezzetti di biadesivo:
E ho quindi apposto un pezzetto di plastica, è una plastica che si vende a pochi euro nei brico per usi generali, tipo per rivestire i cassetti:
Si inserisce quindi il circuito nel barattolo, posizionando la pila dietro al circuito. Si prende un altro rettangolino di plastica e lo si piega al centro a formare un supporto a V:
Questo supporto, che è elastico grazie alle caratteristiche della plastica utilizzata, servirà a mantenere in posizione il circuito dell’orologio una volta inseritolo nel barattolo dietro al circuito ed inoltre consente di dare la giusta inclinazione:
Il peso della batteria da un lato e del circuito dall’altro consentono al barattolo di bilanciarsi, in ogni caso è opportuno mettere un gommino adesivo al di sotto del barattolo per fare in modo che non ruoti una volta poggiato:
Potrete esporre anche voi il vostro orologio sott’olio in cucina! Sarà ovviamente necessario estrarre la scheda nei cambi di ora
Idee e miglioramenti
Come detto l’orologio così come ve l’ho appena presentato è fatto per essere unicamente un orologio preciso e nulla più. Magari da inserire in una bella scatola colorata, in un barattolo decorato o esposto nudo, da relizzare per divertimento, perchè tutti quelli che giocano coi picmicro prima o poi hanno il desiderio di realizzarsi un orologio da sè e questa, forse, è l’idea più semplice ed efficace in quanto consente una precisione superiore di quella ottenibile con i sistemi utilizzanti il quarzo di sistema, senza ulteriori complicazioni matematiche. Permette inoltre di realizzarsi da se un oggetto utile con componenti comuni e di sperimentare in maniera pratica tante cose che abbiamo imparato fin’ora. Il firmware standard così come ve l’ho appena esposto è stato pensato anche per darvi una base solida da cui partire.
In realtà durante la realizzazione, come sempre, sono venute fuori numerose altre idee, alcune delle quali non intendiamo svelarle perchè facenti parte di un progetto futuro, altre invece le elenco qui in maniera tale che se qualcuno si vuole cimentare può benissimo farlo purchè non vengano utilizzate, così come tutto il resto, per ottenere i bollini da appiccicare alla tessera del concorso vinci l’elettronica a punti.
- montare un cicalino al posto di BT2 (eliminando R15) in maniera da includere anche la funzione di sveglia. Il settaggio dell’orario e dell’allarme potrebbe essere eseguito gestendo la pressione lunga/corta del solo pulsante BT1. Per montare il cicalino potrebbe essere necessario fare un ulteriore foro sul PCB e collegare il cicalino con uno spezzone di cavetto al di sotto. Questa soluzione prevede più esperienza software che hardware e sono convinto che alcuni di voi riusciranno a realizzare questa funzione. Sono fiducioso e aspetto con ansia la vostra realizzazione, anzi al primo che ci riesce gli faccio un regalino. Non è possibile eliminare BT1 in quanto è collegato su RA5 che non ha funzione di input. In ogni caso BT2 è stato messo sulla destra proprio perchè c’è più spazio in quella zona per eseguire eventuali modifiche in tal senso.
- montare un circuitino in parallelo a BT2 per far suonare un cicalino senza rimuovere il pulsante. Gestendo opportunamente la configurazione hardware/software è possibile fare in modo che RB0 sia configurato normalmente come input per gestire BT2, quando invece deve suonare la sveglia si agisce su TRISB2 per configurare B2 come output. In questo caso si deve utilizzare un cicalino non autooscillante e prevedere un’opportuno circuitino con un condensatore che faccia in modo che al cicalino giunga solo l’onda quadra necessaria a farlo suonare e non anche la componente continua che si genera durante la pressione del pulsante. Questa seconda idea è più complicata in quanto prevede un attento studio anche delle conseguenze derivanti dalla pressione di BT2 durante il suono ma consente di avere anche il secondo pulsante per cui in questo caso è necessaria più esperienza hardware che software.
- Una volta riusciti ad implementare l’uso del cicalino, lindicazione di sveglia inserita può essere realizzata facendo in modo che uno dei due puntini rimanga fisso e lampeggi solo l’altro (si deve intercettare quando è attivo il catodo K3 e fare in modo che se l’allarme è inserito, la linea dots sia a livello alto anzichè fargli cambiare stato, in tutti gli altri casi il puntino viene invece fatto lampeggiare)
Ringrazio Luca Gallucci per il supporto tecnico e morale.
Downloads
- PCB e schemi Simple Clock (5355 download)
- Simple Clock - HEX precompilato per PIC16F627/628/648 (con o senza la A finale) (3041 download)
- Simple Clock - sorgente per PIC16F627/628/648 (1704 download)
- Big Clock - porting in Mikrobasic by Marco Pozzuolo (965 download)