YAC, LED clock



YAC sta per Yet Another Clock. In effetti in rete circolano centinaia di progetti di orologi digitali con termometro. Ammetto perciò che non si sentiva gran che la necessità di un ulteriore schema. Tuttavia, vista la genesi dell'oggetto e i successivi sviluppi, mi sono deciso a pubblicare la mia esperienza. Ecco come sono andate le cose...
All'inizio fu Jose Pino. Su www.josepino.com si trova uno schema minimale per un orologio digitale basato su processore PIC. Ho pensato fosse ottimo per utilizzare alcuni display che avevo nel cassetto. Rispetto allo schema originale ho inserito dei transistor sugli anodi dei display con funzione di buffer per non sovraccaricare le uscite del microprocessore. Bene, anzi malissimo: terminata la realizzazione il circuito aveva un funzionamento bizzarro e ben lontano da quello che mi aspettavo, con numeri incoerenti per qualche secondo, poi il blocco su 88:88. Controllo più volte i collegamenti, ma niente. Firmware corrotto? Riscarico, riprogrammo il chip. Niente. A questo punto scrivo alcune righe di codice per far visualizzare a rotazione le cifre, finalmente un risultato positivo. Dunque la parte hardware era a posto; purtroppo josepino non pubblica il sorgente, quindi se volevo l'orologio non mi restava altro che scrivere il firmware da zero.

La routine principale
Il primo problema da affrontare perchè un PIC possa funzionare da orologio è quello di contare i secondi incrementando un contatore. Nella maggioranza dei casi viene sfruttato un interrupt del micro che si attiva ogni 256 o 65536 cicli di operazioni (timer a 8 o 16 bit, 1 ciclo di operazioni = 4 cicli di clock). Peccato che i quarzi solitamente usati non hanno frequenza multipla di questi valori, così che, nel caso di timer a 16 bit e quarzo da 4 MHz, il secondo trascorre dopo 15.258 eventi di interrupt. Questo significa che ogni 4 secondi circa avrò un errore temporale di un interrupt, cioè 65536 cicli di operazioni, pari a 65 millisecondi: 58 secondi ogni ora, quasi 23 minuti al giorno. Usando un timer a 8 bit, un secondo trascorre dopo 3906.25 eventi di interrupt, con un errore ogni 4 secondi di 0.25 millisecondi, 0.22 secondi l'ora, 5 secondi al giorno. Trascurabile? Forse, e magari recuperabile con le tolleranze dei componenti, ma sicuramente fastidioso. Proseguire su questa strada apportando dei correttivi alla routine di conteggio migliora le cose ma non le risolve. Dopo essermi documentato un po' ecco la soluzione:
  1. creo un totalizzatore nel quale carico il numero di operazioni che il micro esegue in un secondo, pari ad un quarto della frequenza di clock, nel mio caso 4.000.000 / 4 = 1.000.000;
  2. ad ogni evento di interrupt, decremento il totalizzatore di 65535;
  3. quando la rimanenza è minore di 65535, incremento il contatore dei secondi, ricarico il totalizzatore, il secondo è trascorso.
Insomma, più o meno: il trucco sta nel ricaricare il totalizzatore con il milione di istruzioni per secondo PIU' la rimanenza appena ottenuta. In questo modo automaticamente viene riassorbito l'errore accennato in precedenza, in quanto per azzerare nuovamente il totalizzatore saranno necessari 15 eventi oppure 16 a seconda dei casi. Azzardo: per 3 secondi basteranno 15 interrupt, per il 4° ne serviranno 16. Il bello è che se utilizzo un quarzo che oscilla a 3.579.500, oppure 4.915.200 la routine non cambia di una virgola, basta specificare il valore corretto per il totalizzatore. In questo modo si possono utilizzare quarzi di recupero relegati da anni nel cassetto. A realizzazione ultimata, dopo alcuni giorni di osservazione, è possibile modificare "di fino" il valore di incremento fino ad una precisione a mio avviso invidiabile, dal momento che ogni unità modifica il conteggio di circa mezzo secondo a settimana, (nel caso di quarzi con frequenza maggiore anche meno) ben più della deriva termica dei componenti.

Le funzioni
Superato lo scoglio degli interrupt mi sono dedicato alla rifinitura del firmware. Per quanto riguarda le funzioni tipicamente richieste ad un orologio ho attinto alle librerie trovate in rete nell'archivio del forum di CCS, che produce il compilatore C utilizzato per questo progetto. Sono utilizzate solo funzioni base, quindi con poco sforzo è possibile adattare il sorgente anche per altri compilatori tipo PICC, mikro C e via dicendo. Ho implementato la regolazione dell'ora, la gestione della data, anche l'anno bisestile... Il micro aveva ancora un sacco di memoria disponibile, così ho pensato di collegare ad un ingresso un sensore di temperatura tipo 18s20 della Dallas/Maxim, aggiungendo al sorgente le funzioni per la lettura della temperatura e la visualizzazione a rotazione, tipo gli orologi che si vedono ai lati delle strade, per intenderci. Era rimasta ancora un po' di memoria. Ho aggiunto la routine per visualizzare la temperatura con risoluzione di 1/10 di grado, ma ancora rimanevano alcuni bytes.. Per puro scopo didattico, ho inserito una funzione (TACH) che mediante un sensore collegato al pin 4 del micro è in grado di visualizzare il numero di impulsi al minuto. Lo scopo era di realizzare un contagiri utilizzando un sensore a forchetta e una ruota fonica, o magari un anemometro. In effetti ho verificato il funzionamento della routine applicando un segnale a 50 Hz all'ingresso senza aver mai ultimato il sensore. Ma prima o poi....

Schema elettrico
Lo schema elettrico, così come il circuito stampato, è diviso in due parti, una contenente il PIC e la parte di alimentazione, l'altra la parte display. In fase di realizzazione, le due schede sono accoppiate rame contro rame e i collegamenti sono assicurati da connettori strip passo 100 mils.

Disposizione componenti


Circuito stampato


Elenco componenti

Tipo/valore Quantità Riferimento
27pF 2 C1, C2
0.1uF 2 C3, C5
47uF 25V 1 C6
100uF 10V 1 C4
1N4148 2 D2, D5
Doppio display anodo comune MAN6910 2 DISP1,DISP2
1N4148 1 D3
DS 18s20 1 DS1820
BC327 4 Q6, Q7, Q8, Q9
BC547 5 Q1,Q2,Q3,Q4,Q5
470 ohm 9 R4,R5,R6,R7,R8,R9,R10,R11,R12
4.7 Kohm 9 R13,R14,R15,R16,R17,R18,R19,R20,R23
10 Kohm 4 R1, R3, R21, R22
100 Kohm 1 R2
PIC 16F628 1 U1
uA7805 1 U2
4 MHz XTAL 1 X1

..Dimenticavo il sorgente in CCS C, la libreria 1wire per il colloquio con la sonda di temperatura Dallas DS1820 e il firmware compilato per il PIC 16F628 con quarzo da 4 MHz. Mancano solo alcune immagini della realizzazione.






Bigger and (not) Better
Qualche anno dopo il montaggio mi sono deciso a costruire un mobile in legno per una variante di questo progetto realizzata con display di 7 centimetrii. Schema elettrico e firmware sono leggermente modificati in quanto i segmenti dei display necessitano di 8-9 volt / 20 mA per accendersi correttamente. Nonostante la falegnameria non sia esattamente il mio forte il risultato è più che accettabile.


praz2004 chiocciola libero punto it