Un mobile in rovere
rifinito in gommalacca naturale dal cui frontale i bordi, fortemente
arrotondati, accompagnano la vista verso una piastra nera satinata che
ospita quattro tubi IN12 a cifre fluorescenti ambra ZM1100, con
pilotaggio diretto senza l'artificio del multiplexing. Il
microcontrollore che governa la visualizzazione gestisce un modulo
DCF77 per acquisire l'ora esatta. Molti i problemi incontrati, ma tutti
risolti con successo. Sono partito da zero, senza prendere niente da
Internet: nè il progetto elettrico, e nè tantomeno l'algoritmo, che ho
inventato di sana pianta.
Dopo una lunga serie di
verifiche sperimentali, sono giunto alla conclusione che le
interferenze del generatore switching, usato per produrre i 170 volt
necessari per illuminare i tubi fluorescenti, sono un ostacolo
insormontabile per riuscire a ricevere il debole segnale DCF77, già
disturbato per conto suo vista la notevole distanza dalla quale viene
trasmesso. Rimando al paragrafo dedicato le considerazioni su questo
segnale e sui suoi contenuti. E rimando alla descrizione del software
gli accorgimenti da me studiati e attuati per correggerlo il più
possibile ed estrarne le informazioni orarie. La soluzione da me
adottata per risolvere il problema delle interferenze è quella di
spegnere il generatore durante i (max) 15 minuti dedicati ogni notte
alla ricezione del segnale orario. Questo tempo massimo può essere
cambiato tramite pulsanti, così come l'ora di avvio della ricezione.
Ponendo a zero il timeout, si disabilita la funzione DCF, affidando
l'avanzamento orario unicamente al quarzo.
Dopo altro tempo passato a cercare una spiegazione della mancata ricezione malgrado l’aver escluso il generatore switching, mi sono reso conto che non è possibile alimentare lo schizzinosissimo modulo DCF con la stessa sorgente usata per alimentare anche il microcontrollore. Quindi anziché un solo regolatore 7805 ho optato per due piccoli regolatori indipendenti 78L05. Ed ha funzionato.
Come si nota, nella sua
configurazione definitiva la sezione di alimentazione produce
cinque tensioni, delle quali quattro a 5V stabilizzati (VCC1,
VCC2, VCC3, VCC/VDD) ed una a 170 volts destinata agli anodi dei
quattro tubi usati per mostrare ore e minuti.
VCC1 è
prodotta dallo stesso generatore switching, un modulo facilmente
reperibile per pochi euro su eBay che oltre ai 170
volt (regolabili)
genera anche questa tensione di 5
volt che
uso per alimentare i quattro driver 74141. Venendo a mancare la
tensione di rete, si spegne tutta la parte ad alta tensione ed i driver
che pilotano le cifre.
VCC/VDD alimenta
solo il microcontrollore è ottenuta dal regolatore U6 col riferimento
alzato a 0.7 volts tramite D1. Questo ci permette di interporre un
diodo (D2) che riporta l’output da 5.7 a 5 volt ed al contempo blocca
ritorni dalla batteria tampone e dall’eventuale programmatore ICSP
inserito su J7. La batteria è una pila al litio CR2032 da 3 volts, con
un diodo al germanio posto in serie che blocca il flusso di corrente
entrante dal regolatore se è in funzione, con una perdita di soli 0.2
volt corrispondenti alla tensione di soglia di tale tipologia di diodi.
Il gioco di diodi permette di tamponare la perdita della tensione di
rete con una tensione minima per sostenere il PIC18LF2620, capace di
operare anche al di sotto dei 2.8 volt erogati dalla serie pila-D4. Il
datasheet del componente riporta una tensione minima di funzionamento
di 2.0 volt. La tensione presente sul partitore R5/R6, in caso di
perdita della sorgente principale, scende a zero provocando un
interrupt-on-change su RB2, che induce il passaggio alla modalità a
basso consumo, non prima di aver disabilitato tutti gli output e
restando in ascolto del ritorno della tensione di rete per tornare al
modo nominale di esercizio. In basso consumo (tecnologia Nanowatt di
Microchip), il timer TMR1 continua comunque ad operare, usando il
piccolo quarzo da orologio a 32765 hertz, per incrementare internamente
l’ora corrente (Real time clock). La pila, in questo caso manterrà in
funzione l’orologio anche per 6 mesi.
VCC2 è
derivata dallo stesso regolatore U6 che genera VCC/VDD, sempre tramite
diodo per scendere da 5.7 a 5 volt, e viene usata solo per i due
pulsanti BUT1 e BUT2 che, come appare evidente, funzionano solo in
presenza di tensione di rete. I due pulsanti sono posti sul pannello
posteriore dell’orologio, che è costituito da un circuito stampato
saldato a 90 gradi sul bordo posteriore della scheda principale. Si
rimanda ad un altro capitolo per i dettagli costruttivi.
VCC3 è una
tensione, sempre di 5.0 volt, prodotta dal secondo regolatore U7,
dedicato unicamente al modulo DCF77.
A monte della sezione di
regolazione troviamo il trasformatore di rete protetto da un fusibile,
con un interruttore da pannello non graficato ma inserito in serie al
cordone di alimentazione e posto sul retro dell’apparecchio. Segue il
classico ponte (monolitico) e un grosso condensatore per abbattere il
ripple. Vari condensatori (multistrato) da 100 nF sono impiegati per
eliminare le alte frequenze in prossimità degli elementi sensibili.
Il modulo switching POW1 che
produce l’alta tensione per i tubi, è attivabile/disattivabile tramite
pin RA5 che è mantenuto alto per porre Q2, e di conseguenza Q1, in
saturazione per mantenere acceso il modulo. Da notare che dallo stesso
pin è derivata anche una linea verso il pin PON del modulo DCF77. Il
livello alto generato dal PIC porta il modulo ricevitore in stand-by.
Per avviare la ricezione del segnale radio contenente le informazioni
orarie, occorre porre RA5 a livello logico basso. Questo fa accendere
il ricevitore, ma fa anche spegnere il generatore switching poiché Q1 e
Q2 vanno in interdizione. POW1 e DCF diventano così mutuamente
esclusivi.
I quattro tubi fluorescenti non
sono pilotati con la tecnica del multiplexing ma
costantemente ed in simultanea, prima di tutto perché odio
profondamente lo sfarfallio percepibile con la coda dell’occhio, quando
muovo lo sguardo avendo un display multiplexato nel campo visivo, poi
per non indebolire la luminosità dei tubi, e poi perché ho scelto un
modello di microcontrollore con un gran numero di pin di output.
Inoltre, il modulo switching che genera 170 volt alimenta senza
problemi tutti e quattro i tubi, che consumano circa 2,5 mA ciascuno.
Le linee che pilotano i tubi partono dal microcontrollore e si diramano
verso i quattro driver U1-U4. Alcuni pin di input dei driver sono
connessi direttamente a massa o a VCC1, poiché non tutte le cifre sono
usate e di conseguenza si riduce l’esigenza di pilotaggio. Le decine di
ore possono valere 0-2 mentre le decine di minuti 0-5. Una opportuna
scelta degli output che portano ai tubi semplifica ulteriormente le
connessioni verso la scheda display, saldata a 90 gradi sul bordo
anteriore della scheda principale. Si rimanda al capitolo dedicato alla
costruzione fisica dell’apparecchio per i dettagli. Segue una tabella
che mostra le connessioni scelte. Il software codifica opportunamente
le uscite per ottenere le cifre desiderate, collegate non secondo la
loro assegnazione canonica, ma bensì secondo le esigenze di layout.
Oltre ai tubi, viene pilotato
anche un led giallo ocra che occhieggia da un forellino praticato tra
la seconda e la terza cifra della scheda display. Questo led, il cui
funzionamento può essere anche disabilitato via software tramite i
pulsanti, lampeggia seguendo il trascorrere dei secondi, e in caso di
ricezione del dato ne riflette l’andamento fino a restare fisso quando
è stato rilevato un marker ed è iniziata la raccolta dei bit
utili. Una volta che le informazioni orarie sono state
ricevute con successo il led inizierà a lampeggiare regolarmente ed il
display mostrerà l’ora acquisita. Da notare che il tempo nel quale il
led resta acceso nel lampeggio è proporzionale all’età
dell’informazione oraria ultima ricevuta. Più il lampeggio è breve e
più è fresco il dato, come meglio spiegato nel capitolo dedicato alla
descrizione del software.
I connettori di servizio J6, J7
e J9 sono opzionali, e possono venir omessi in fase di montaggio. Li ho
utilizzati io per le prove: J6 fornisce un segnale a 500 Hz. Se un
frequenzimetro connesso a tale connettore mostra una frequenza diversa
trascorso un minuto dalla prima accensione, abbiamo un problema interno
al software o nella rete quarzo-condensatori collegata ai pin RC0-RC1
del microcontrollore. Si rimanda alla descrizione del software per la
funzione PROBE. J7 è usato per l’In-Circuit-Programming, permettendo di
(ri)programmare il PIC senza rimuoverlo dal suo zoccolo, e su J9 può
venir montata una scheda con 6 led, posti a massa sul pin 1 di tale
connettore tramite altrettante resistenze da 680 ohm. Questi led
permettono di visualizzare gli stati intermedi durante la ricerca
dell’informazione oraria in ricezione, ed altre indicazioni che mi sono
state utili durante la fase di debug.
Sempre parlando di montaggi
modulari e opzioni di implementazione, è persino possibile non
installare alcun modulo ricevitore DCF77. I pulsanti consentono di
impostare manualmente l’orologio, e di forzare l’esclusione del modulo
DCF, impiegando unicamente il quarzo per l’avanzamento dell’orario. La
gestione del modulo ricevitore si avvia alle 3:30 di ogni notte, per
una durata massima di 15 minuti. Generalmente a quell’ora il segnale è
migliore e l’orologio si sincronizza già dopo 2-3 minuti, grazie anche
al mio algoritmo di soppressione dei disturbi.
Tutti i parametri relativi alla gestione del modulo DCF, sono modificabili via pulsanti. Essi vengono anche registrati nella EEprom interna del microcontrollore, per essere ri-letti dopo un eventuale riavvio o reset. Il reset è possibile ottenerlo sia via software premendo BUT1 per oltre 5 secondi, sia via hardware, togliendo il ponticello JP1 e spegnendo l’apparecchio tramite l’interruttore posteriore per 10 secondi. Per dettagli sulle modalità di gestione dei due pulsanti si legga il capitolo dedicato.
Tabella di corrispondenza Cifra Nixie vs Input driver
Le tabelle che seguono permettono di seguire i collegamenti dedicati alle cifre dei tubi Nixie, che non sono quelle canonicamente previste dai driver, ma piuttosto quelle con la posizione dei pin più conveniente per semplificare il layout del circuito stampato sia della scheda principale, che del display. Alcuni pin di input dei driver U1-U4 sono connessi direttamente a GND oppure a VCC1. I valori fissi 0 ed 1 corrispondenti sono rappresentati in grigio nella prima colonna della tabella di destra.
Nota 1 : Blank ottenuto attivando un output del driver non connesso al tubo fluorescente.
Package del drive 74141 e relativa tabella di I/O. Segue anche la piedinatura del tubo Nixie. I pin 12, 13 e 14 non sono presenti nel modello ZM1100 impiegato nell’orologio.
Circuiti stampati e assemblaggio
Il circuito si articola su tre circuiti stampati, assemblati a 90 gradi tra loro, con due fianchi che rendono la struttura molto solida e compatta. Nei link alla fine del progetto troverete i file da scaricare per la realizzazione dei master e la successiava fabbricazione dei circuiti col metodo da voi preferito (io uso la fotoincisione). Sia la scheda con gli zoccoli che quella posteriore, che ospita i pulsanti di controllo, sono state verniciate a spruzzo sul lato componenti con una mano di aggrappante per plastiche e una di vernice nera satinata. Gli zoccoli sono stati realizzati saldando uno ad uno i pin che si possono acquistare facilmente sfusi su ebay. Tali pin sono stati montati nella loro posizione più infossata, che prevede un foro più grande così come indicato dal foglio che viene spedito assieme ai pin stessi.
Nelle immagini che seguono, che senz'altro sono più efficaci delle parole, si illustra l'assemblaggio delle schede, con l'ausilio di due fiancatine che avranno una lunghezza uguale alla profondità della scheda principale.
Seguono immagini sul completamento della scheda zoccoli con i pin a saldare. Si tratta di elementi reperibili su eBay a pochi euro, e sono inseribili in due possibili profondità. Il montaggio prevede di inserirli alla maggiore profondità, aprendo fori di diametro compatibile con quello dei pin. Scheda zoccoli e pannello posteriore sono verniciati nero satinato sul lato componenti, previa applicazione di un aggrappante per plastiche.
L'assemblaggio delle tre schede prevede di saldare le parti che entrano in contatto una volta accostate a 90 gradi. Il layout del circuito principale prosegue in tal modo verso la scheda zoccoli e, sul lato posteriore, verso il pannello che ospita i due pulsanti di controllo. Saldare tra loro anche le aree grandi in rame, per conferire solidità al prodotto:
L'interruttore non è rappresentato nello schema, ma va messo in serie al cordone di alimentazione. Usate un passacavo e sfruttate uno dei fori di areazione. Ricordate di inserire spezzoni di termorestringente prima di saldare il cavo all'interruttore, per poi farli aderire alle saldature:
Segue una immagine che mostra l'inserimento, oltre al modulo generatore da 170V, del ricevitore DCF con le "gambe lunghe" per allontanarlo dal circuito stampato fonte di disturbi, e dell'antenna, montata su un rialzo (ho usato un mobiletto in plastica vuoto) e collegata con un coassiale al ricevitore:
Descrizione del segnale DCF77
Si fa riferimento a Wikipedia per approfondimenti (http://it.wikipedia.org/wiki/DCF77). In sintesi, il segnale a 77500 hertz che codifica l’informazione viene trasmesso da Mainflingen, nei pressi di Francoforte, usando una delle due antenne operative. La sorgente del dato è costituita da un insieme coordinato di tre orologi atomici al cesio. E’ possibile ricevere il segnale con un semplice ricevitore radio dotato di antenna in ferrite accordata sulla frequenza di trasmissione. Il contenuto informativo è organizzato con uno standard molto semplice e prevede un abbattimento di 6db dell’ampiezza della portante all’inizio di ogni secondo, per una durata di 100 o 200 ms, rappresentanti rispettivamente i bit “0” e “1”. Nel 59-esimo secondo, la trasmissione si arresta dando modo agli orologi che ricevono il segnale di sincronizzarsi. Il segnale è propagato con una potenza di 50 KW e copre ampiamente l’Italia, e tutta l’Europa. Durante il giorno i disturbi provocati da fonti esterne, e dalla instabilità della ionosfera, causano problemi in ricezione ma, durante la notte lo strato di Heaviside della Ionosfera si addensa aumentando la riflessività e di conseguenza la copertura del segnale. In tali condizioni, il nostro orologio ha una maggior probabilità di ricevere il segnale e decodificarlo. Segue una mappa della copertura radio:
Segue una grafica che indica la forma del segnale in uscita dal ricevitore:
Segue la tabella di codifica dei 59 impulsi trasmessi ogni minuto:
Nella tabella si trovano elencate altre informazioni, come la data e le informazioni meteo, che il nostro orologio non utilizza. Per questo motivo, la probabilità di ricevere i dati utili (ore e minuti) aumenta, poiché i bit dal 36 al 58 vengono ignorati.
Il ricevitore:
Oltre al ricevitore vero e proprio della SymTrick, si può vedere un simulatore di ricevitore che ho costruito e pubblicato su Grix (http://www.grix.it/viewer.php?page=12218&bakto=%2F%3Ftab%3D0 per gli iscritti) che mi ha permesso di velocizzare le fasi di progettazione del software. Il vero ricevitore captava segnali puliti troppo raramente ed in orari per me proibitivi.
Descrizione del programma
Faccio riferimento al listato MikroC disponibile tra i link presenti in fondo al progetto. Il codice è molto commentato, sia linea per linea che con appositi header. Segue una descrizione funzionale delle parti principali, largamente gestite tramite interrupt.
Ogni millisecondo, l’interrupt
generato dal Timer0 induce, durante la permanenza in stati diversi da
quello nominale “dato orario acquisito”, la lettura dello stato logico
del pin collegato all’uscita del modulo ricevitore DCF77, se presente e
abilitato (ricordo che è un modulo opzionale). L’acquisizione di questo
dato è affidata alla procedura ProcessDcf.
ProcessDcf: Soppressione
dei disturbi ed il riconoscimento dei bit.
L’impulso corrente viene
misurato in durata, aggiornando l’elemento 0 dello stack a tre elementi
PulseWrk. Una volta che il livello logico letto dal modulo DCF77 si
inverte, gli elementi scorrono: l’elemento 2 perde i suoi contenuti per
accogliere quelli dell’elemento 1, che accoglierà quelli dell’elemento
0, ora ripulito e pronto per un nuovo conteggio. Questo permette di
raccogliere gli ultimi tre impulsi provenienti dal ricevitore. Di
seguito ad ogni inversione, dopo la sistemazione dello stack, avviene
l’analisi degli impulsi acquisiti. Questa comporta la fusione di
impulsi più brevi o uguali ad 8 millisecondi con i due adiacenti,
costruendo un nuovo impulso nell’elemento 0 dello stack.
StackWrk, dopo tre impulsi raccolti dal ricevitore. L’impulso centrale è troppo corto:
Livello
logico |
Inizio
impulso (ms) |
Durata
impulso (ms) |
0 |
100.000 |
1 |
1 |
100.051 |
7 |
0 |
100.058 |
43 |
Contenuto di StackWrk dopo la soppressione del disturbo di 7 millisecondi:
Livello
logico |
Inizio
impulso (ms) |
Durata
impulso (ms) |
0 |
100.000 |
51 |
|
|
|
|
|
|
Per decidere la soglia di discriminazione dei disturbi ho dovuto spendere settimane simulando, con un programma in FreeBasic scritto ad hoc, una ricezione disturbata. Modulando la durata e la frequenza degli impulsi spurii nel flusso nominale entrante, ho ottenuto una statistica di successi che ha il suo massimo proprio su tale durata nel parametro usato dall’algoritmo come criterio di soppressione. Per chi fosse incuriosito, metto a disposizione i programmi di simulazione, tra i link in fondo alla pagina. Si tratta solo di materiale di lavoro, ma può essere una base di studio per eventuali approfondimenti. Un esempio della schermata di Nixie2 durante la ricezione simulata:
Nella parte azzurra, in alto nella finestra del programma di simulazione, vediamo il flusso dati intenzionalmente disturbato. La banda verde indica l’impulso “ripulito” dai disturbi, sulla base della discriminante T <= 8 ms. Le funzioni in grigio sono disabilitate per ridurre il carico sulla CPU del pc utilizzato (si preme il numero corrispondente sul tastierino numerico per commutare una funzione tra abilitato e disabilitato). La banda sottile contenente “EB Ok Ok…” mostra i casi di ricezione con “Errore Bit” o con esito positivo (tutti i bit utili raccolti). La funzione 6 “Ricerca statistica automatica”, dopo ore di calcolo provvede a costruire un grafico come il seguente:
L’ipotetica curva che unisce
gli angoli delle zone verdi ha il ginocchio sulla durata di 8
millisecondi. Ulteriori prove sul campo mi hanno poi confermato la
bontà del criterio.
Proseguendo nella procedura ProcessDcf,
a valle della parte che provvede alla rimozione dei disturbi, inizia il
trattamento di quelli che sono ormai promossi ad impulsi stabili.
Se PulseWrk[0] ha una durata
superiore alla discriminante di disturbo (criterio cautelativo, perché
basterebbe una durata 2), senz’altro PulseWrk[1] può essere considerato
stabile, e viene quindi copiato in Pulse[0], previo scorrimento degli
elemento 1 e 2, con perdita del precedente impulso Pulse[2]. Questo
secondo stack di impulsi stabili viene assoggettato al secondo livello
di analisi.
Vengono considerate solo le
transizioni 1>0>1, e viene sottoposta ad analisi la
durata di Pulse[1] e Pulse[2].
Caso in cui l’algoritmo è
ancora in attesa del marker di fine minuto, costituito da una assenza
di modulazione e quindi un livello basso prolungato per 1 intero
secondo: Con una tolleranza di 35 ms, si vede se si susseguono un
livello alto lungo 100 ms (bit 0) o 200 ms (bit 1) in Pulse[2] ovvero
l’elemento più vecchio, ed un livello basso di 1900 o 1800 ms in
Pulse[1], eseguendo le azioni per processare sia il bit che il marker.
Caso in cui l’algoritmo ha già
ricevuto il marker ed è in attesa di un nuovo bit: In questo caso
Pulse[2] e Pulse[1] devono rientrare nelle durate previste per
confermare un bit 0 (100 ms alto seguito da 900 ms basso) o un bit 1
(200 ms alto seguito da 800 ms basso).
Qualsiasi sequenza di durate al
di fuori delle tolleranze fa abortire l’analisi, ponendo l’algoritmo
nello stato di attesa di un nuovo marker di fine minuto per tentare poi
la raccolta dei bit successivi.
ProcessBit:
Raccolta dei bit validi.
La procedura, chiamata da
ProcessDcf dopo il riconoscimento di un bit valido, provvede a
trattarlo secondo la sua posizione nel flusso di dati previsto dal
protocollo DCF77. Inoltre, viene conteggiata la parità corrente,
sommando il bit ad una variabile globale che verrà interrogata alla
fine dei due blocchi di bit rappresentanti i minuti e le ore. Un
conteggio del bit corrente permette di eseguire su di esso l’azione
opportuna. Il bit 35, ovvero la parità sulle ore, chiude la sequenza. I
bit successivi sono ignorati (l’orologio non mostra la data), e si
decreta il successo della raccolta. Gli errori di parità inducono
l’abbandono della raccolta e l’attesa di una nuova sequenza di dati a
partire da un marker valido di fine minuto.
Altre procedure
Il programma provvede, tramite
altre procedure, al trattamento di interrupts provenienti dal
cambiamento di stato sul PIN_POWER, e sull’overflow del Timer1 che è
dotato di un preciso e piccolo quarzo da orologio a 32768 hertz. Il
contatore TMR1 viene inizializzato al valore opportuno per ottenere un
interrupt ogni secondo. La relativa procedura di gestione (Interrupt
service routine), nel caso in cui venga segnalato tale evento, esegue
UpdateRtc. Questa incrementa i valori di secondi (non mostrati),
minuti, ed ore. Il PIN_POWER (definizione che punta al pin del
microcontrollore connesso al partitore “Power sense” è abilitato all’
Interrupt-On-Change, e questo permette alla ISR di trattare la perdita
della sorgente principale di alimentazione. In tale evenienza, l’azione
eseguita consiste nello spegnere tutti gli output ed entrare in modo
“sleep” a basso consumo. E’ uno stato previsto dagli standard Microchip
per consumare pochi microampere e mantenere funzionanti solo
l’Interrupt-On-Change per gestire il ritorno della sorgente di
alimentazione principale, ed il Timer1 per continuare ad aggiornare
l’orologio interno. La pila al litio di tipo CR2032 impiegata come
tampone ha una durata di 6 mesi in regime continuativo. Ma considerando
il cumulo del tempo di black-out in qualsiasi comune italiano, possiamo
affermare che ci basterà almeno per 10 anni.
Il microcontrollore si basa sul
clock interno per tutto ciò che non è aggiornamento dell’orologio
interno ma, per migliorarne comunque la precisione, si sfrutta il
Timer1 (quarzato) per correggere le derive di Timer0 ed aggiustarne
dinamicamente il pre-set. L’uscita PIN_PROBE permette di verificare la
bontà del clock interno “corretto”. Basta connettervi un oscilloscopio
od un frequenzimetro ed osservare la frequenza di 500 Hz, visto che ad
ogni millisecondo ne viene invertito lo stato logico. Siccome le derive
vengono corrette a piccole porzioni alla volta, con una logica
graduale, occorre attendere qualche secondo prima di leggere
esattamente 500 Hz. Questo peraltro permette indirettamente di provare
la qualità di Timer1 e della sua rete quarzata.
Altri dettagli sul
funzionamento del programma possono essere da esso facilmente dedotti,
visto che ho pubblicato anche il sorgente, completamente commentato,
tra i link a fine pagina.
Il Main
Al corpo principale del
programma sono affidate solamente la gestione del display a tubi, il
suo spegnimento in modo ricezione dati per non disturbare il modulo
DCF, e la gestione dei due pulsanti posti sul lato posteriore
dell’apparecchio, per il cui uso si rimanda al capitolo Impostazioni.
Gli stati
Il funzionamento della procedura di gestione dei dati provenienti dal modulo DCF si basa su uno stato interno che assume uno dei seguenti valori, che condizionano le scelte di flusso:
RXSTS_INIT |
Attesa
di un marker di fine minuto |
RXSTS_BIT |
Attesa
di un bit |
RXSTS_BIT0 |
Ricevuto
un bit 0 |
RXSTS_BIT1 |
Ricevuto
un bit 1 |
RXSTS_TOK |
Ricevuto
bit 20 di inizio orario valido |
RXSTS_MIN |
Ricevuti
minuti validi |
RXSTS_OK |
Ricevuto
orario completo |
RXSTS_ERR_TNOK |
Errore
ricevuto bit 20 inizio orario non valido |
RXSTS_ERR_EMIN |
Errore
nel valore dei minuti (>59) |
RXSTS_ERR_EMINPAR |
Errore
di parità nei minuti |
RXSTS_ERR_EHOUR |
Errore
nel valore delle ore (>23) |
RXSTS_ERR_EHOURPAR |
Errore
di parità nelle ore |
RXSTS_ERR_EBIT |
Errore
nei tempi degli impulsi. Bit non riconosciuto. |
Per poter effettuare un
debugging efficace, ho predisposto un connettore sulla scheda
principale dell’apparecchio, per ospitare una scheda di Led
Diagnostici. Nel codice sono disseminate istruzioni per fornire
costantemente informazioni sullo stato corrente e sugli eventi occorsi.
Ovviamente chi si fabbrica un esemplare dell’orologio può ignorare tale
aggiunta. L’emissione di dati diagnostici è peraltro condizionata al
modo DEBUG impostabile tramite una procedura manuale, agendo sui
pulsanti posteriori. Per default, il modo DEBUG è disabilitato.
Un secondo stato è dedicato
alla gestione del display. Nominalmente SETSTS_RUN è lo stato di
esercizio, durante il cui permanere l’orologio mostra l’ora corrente
sul display a tubi ma, se vengono premuti i pulsanti posteriori, lo
stato cambia e, di conseguenza, il display indicherà il parametro in
corso di modifica. Si vedano le procedure nel capitolo dedicato alle
impostazioni manuali. Durante le impostazioni, ovviamente viene
aggiornato l’orologio interno, il cui valore verrà presentato
nuovamente alla fine della procedura. Le impostazioni sono salvate su
EEprom.
L’aggiornamento
automatico dell’ora
Ogni giorno, alle 03:30 vengono
dedicati al massimo 15 minuti alla ricezione di un nuovo dato orario
dal modulo DCF, durante i quali il display viene spento, disattivando
il generatore switching che lo alimenta. Questo per evitare
interferenze nella ricezione. Si evitino peraltro anche le fonti di
disturbo esterne, quali telefonini, tablet o computer, e spegnete luci
al neon e dimmer troppo vicini. Tutto ciò deve essere a debita distanza
dall’orologio pena continui fallimenti nella decodifica dei dati, con
definitivo abbandono dell’aggiornamento allo scadere del timeout di 15
minuti. Ovviamente alla prima accensione l’orologio resta ad oltranza
in attesa di dati indipendentemente dal timeout. L’ora legale è
integrata nel dato orario DCF e pertanto viene presa in conto
automaticamente.
E’ possibile cambiare l’ora
corrente anche tramite le impostazioni manuali. E’ persino possibile
rinunciare al modulo DCF, impostando 0 come tempo massimo di ricezione
dei dati. Ogni parametro indicato è impostabile.
Premendo P1 si interrompe la
ricezione corrente. Premendolo in qualsiasi altro momento si avvia una
nuova ricezione. Maggiori dettagli sono disponibili nel capitolo
Impostazioni.
Il formato dell’ora
E’ possibile scegliere il
formato di default a 24 ore (p.es. 19:35) o 12 ore (p.es. 07:35). E’
possibile sopprimere lo zero iniziale nell’ora. Per default non è
soppresso.
Il led frontale
Il programma gestisce anche il
led frontale destinandolo, oltre che al contrassegno dei secondi che
stanno trascorrendo, anche a mostrare il livello del segnale DCF in
ricezione (a display spento). Si potrà valutare la presenza di disturbi
dalle irregolarità delle accensioni. Una volta raccolto il primo bit
valido, il led si mantiene acceso fisso ad indicare che i dati sono in
corso di raccolta che, una volta terminata, riporta il led a riprendere
il lampeggio standard ed il display a riaccendersi per mostrare l’ora
aggiornata.
Il lampeggio standard è una
funzione disabilitabile da impostazioni, se ritenuta fastidiosa. Si
consideri che il Duty-Cycle del lampeggio varia in funzione dell’età
del dato ultimo raccolto dal ricevitore DCF. Tanto più è vecchia
l’informazione raccolta, tanto più si allunga la porzione di secondo
durante la quale il led rimane acceso. Inizialmente il led si accende
per 50 ms e resta spento per 950 ms. Ogni ora la durata dell’accensione
cresce di 1 ms, per re-impostarsi a 50 ms ad una nuova ricezione andata
a buon fine.
La prima accensione
L’orologio mostra l’efficienza
dei tubi nixie incrementando rapidamente le sue cifre. Anche il led
viene testato. Se si hanno incertezze sulle cifre mostrate è possibile
entrare in modo DEBUG che prevede un incremento manuale delle cifre
tramite pressioni successive dei pulsanti posteriori. Si veda il
capitolo Impostazioni per dettagli sulla procedura di diagnosi.
Dopo il test hardware, si entra
in ricezione del dato DCF senza limiti di tempo. Se non si dispone del
modulo ricevitore, entrare nelle Impostazioni manuali per impostarlo.
E’ sempre possibile resettare l’apparecchio seguendo le modalità descritte nel capitolo Impostazioni, per ri-eseguire quanto sopra detto.
Considerazioni
computazionali
La procedura di gestione degli interrupt (ISR) ha il massimo della criticità nel caso di interrupt per overflow del timer TMR0, poiché ha al massimo 1 millisecondo per portare a termine l’esecuzione. Quando il display è attivo le istruzioni eseguitesono pochissime, poiché la procedura ProcessDcf non viene chiamata ma, nel caso peggiore, ovvero durante la ricezione del dato DCF (max 15 minuti al giorno), il peso computazionale aumenta, poiché viene eseguita l’analisi del livello del segnale. Anche in questo caso, comunque, solamente durante le transizioni si appesantisce l’esecuzione, perché vengono analizzate e, nel caso in cui il bit risulti valido, il codice prosegue ulteriormente con l’immagazzinamento del dato. Ponendoci nel caso peggiore, compilando un estratto “piatto” del codice ottenuto inserendo tutte le istruzioni eseguibili con gli IF che portano al ramo più oneroso, il listato assembler fornisce le operazioni eseguite e permette di calcolare le seguenti statistiche:
Op |
Num |
Cicli
tot |
Op |
Num |
Cicli
tot |
Op |
Num |
Cicli
tot |
ADDLW |
10 |
10 |
BSF |
19 |
19 |
MOVLW |
153 |
306 |
ADDWF |
7 |
7 |
BTFSC |
39 |
117 |
MOVWF |
103 |
103 |
ADDWFC |
8 |
8 |
BZ |
11 |
22 |
RRCF |
36 |
36 |
ANDLW |
19 |
19 |
CLRF |
15 |
15 |
SUBLW |
4 |
4 |
ANDWF |
20 |
20 |
COMF |
1 |
1 |
SUBWF |
27 |
27 |
BC |
3 |
6 |
DECF |
7 |
7 |
SUBWFB |
4 |
4 |
BCF |
19 |
19 |
INCF |
5 |
5 |
XORLW |
10 |
30 |
BNC |
10 |
20 |
INFSNZ |
3 |
9 |
XORWF |
59 |
59 |
BNZ |
32 |
64 |
MOVF |
39 |
39 |
|
|
|
BRA |
10 |
20 |
MOVLB |
35 |
70 |
TOTALE
CICLI |
1066 |
Con il clock interno da 8 MHz, le istruzioni vengono eseguite al rate di 2 Mips. Quindi, al massimo la gestione dell’overflow del timer TMR0 impegna la MCU per 1066/2000000 = 0,53 ms. Questo garantisce che non si verificheranno sovrapposizioni nella gestione dell’evento. Anche considerando una interruzione (ogni secondo) da parte di TMR1 che incrementa l’RTC eseguendo peraltro pochissime istruzioni, non si hanno ragioni per sospettare perdite di eventi a causa del protrarsi dell’esecuzione delle procedure di interrupt.
Descrizione delle impostazioni
L’orologio con la pila inserita non è mai spento ma in Stand-by: L’orario viene aggiornato senza tuttavia visualizzarlo, e mantenuto per circa sei mesi. Agendo sull’interruttore INT si attivano le funzioni di visualizzazione, gestione dei pulsanti e ricezione dcf. I pulsanti indicati con “…” vanno tenuti premuti a lungo. Durante la ricezione del dato dcf, P1 ne anticipa la terminazione ed il ritorno al modo nominale.
Costruzione del mobile
In questa sezione descrivo il mobile che ho progettato e fabbricato per ospitare l'orologio. Anche se usciamo dall'ambito dell'elettronica, la progettazione accurata del mobile non è meno importante di quella relativa agli schemi elettrici ed al programma di gestione. Il materiale da me scelto è il rovere africano. Mi colpivano in particolare colori e venature. Ma è una scelta personale e non vincolante. Se volete seguire questa costruzione, ponete molta attenzione alle misure e non usate chiodi nè viti, ma solo colla vinilica, piccole spine di faggio da 6mm e morsetti. Io uso una unica vite, solo per bloccare il circito nel mobile, tramite la colonnina da 5 mm posizionata sul fondo del circuito stesso sulla longitudine del baricentro, in linea con un foro svasato praticato sul lato inferiore del mobile. Per la finitura ho lavorato le superfici con carte vetrate di grana 150 all'inizio e 600 a finire. Ho scelto la gommalacca naturale, applicata a tampone in tre-quattro passate come prima mano (tra una passata e l'altra l'asciugatura è immediata, poichè il solvente è alcool etilico, molto volatile), un riposo di una notte, poi altra levigatura e mano a finire sempre con tre-quattro passate a tampone, muovendosi in senso rotatorio e velocemente. Il frontalino è molto spesso per poterlo lavorare in modo da creare lo stondo verso l'interno. Lascio parlare le immagini che seguono. Iniziamo dagli ingombri del circuito:
Seguono immagini relative al montaggio della colonnina di ancoraggio. Occorre prendere un segno con una mina sul mobile parzialmente montato, prima di fissare il Top, in modo da praticare un foro nella posizione più precisa possibile sul fondo del contenitore in corso di realizzazione.
Segue il mobile montato e carteggiato con grana 150. Successiva lucidatura con grana 600, applicazione della gommalacca con due mani e carteggiamento intermedio. Montaggio del circuito nel mobile. Per l'applicazione della gommalacca naturale, troverete interessanti tutorial su Youtube, ma vi assicuro che è più semplice di quanto sembri. Per concludere, incollate quattro piedini in gomma sotto al mobiletto.
Elenco dei componenti elettronici
Categoria |
Quantità |
Riferimento |
Valore |
Resistors |
4 |
R1-R4 |
8.2k |
Resistors |
2 |
R5,R6 |
10K |
Resistors |
3 |
R7,R9,R11 |
12k |
Resistors |
1 |
R8 |
680 |
Resistors |
1 |
R10 |
56k |
Capacitors |
4 |
C1,C4,C5,C10 |
100nF |
Capacitors |
1 |
C2 |
2200u |
Capacitors |
3 |
C3,C6,C7 |
22uF |
Capacitors |
2 |
C8,C9 |
33pF |
Capacitors |
1 |
C11 |
3.3uF |
Integrated
Circuits |
4 |
U1-U4 |
74141 |
Integrated
Circuits |
1 |
U5 |
PIC18FL2620 |
Integrated
Circuits |
2 |
U6,U7 |
78L05 |
Transistors |
1 |
Q1 |
BD140 |
Transistors |
1 |
Q2 |
BC547 |
Diodes |
3 |
D1-D3 |
1N4007 |
Diodes |
1 |
D4 |
OA91 |
Diodes |
1 |
D5 |
Yellow
5mm LED |
Diodes |
1 |
D6 |
1N4148 |
Diodes |
1 |
D7 |
3v6
Zener |
Miscellaneous |
1 |
BAT1 |
3V
Lithium |
Miscellaneous |
1 |
FU1 |
0.5A |
Miscellaneous |
1 |
JP1 |
Jumper |
Miscellaneous |
1 |
POW1 |
170V
Generator |
Miscellaneous |
1 |
PT1 |
Rectifier
bridge |
Miscellaneous |
1 |
TRA1 |
220/12+12
1A |
Miscellaneous |
1 |
X1 |
32768Hz
Crystal |
Miscellaneous |
2 |
BUT1,BUT2 |
Momentary
switch |
Miscellaneous |
4 |
DIS1-DIS4 |
IN11
Nixie tube |
Links
Seguono i collegamenti per scaricare tutta la documentazione necessaria per costruire l'orologio, incluso il sorgente MikroC del software, i datasheet ed i siti dove acquistare il modulo di ricezione e il generatore.
Prego solo chi intendesse usare il mio codice MIkroC o i miei schemi
di citarmi come autore e, nel caso di migliorie, di re-inviarmene una copia.
Circuito scheda zoccoli e pannello posteriore
Stampato in bianco e nero del circuito principale (600 dpi)
Stampato in bianco e nero delle schede zoccoli e pannello posteriore (600 dpi)
Serigrafia o stampa da incollare sul lato componenti del circuito principale
Codice sorgente in MikroC del programma di gestione
HEX file pronto per programmare il microcontrollore
Programma di simulazione (sorgente in Freebasic ed eseguibile)
Sito ufficiale di Freebasic per scaricare il compilatore usato nel simulatore
Datasheet del modulo ricevitore DCF77
Caratteristiche dei tubi Nixie
Sito e-commerce che vende il modulo DCF77
Sito e-commerce che vende il modulo Generatore 170V
Sito e-commerce che vende i driver 74141
Sito e-commerce che vende i pin sfusi per creare gli zoccoli dove montare i tubi Nixie
Aggiornamenti
[ Ott 2016 ] Per evitare problemi di surriscaldamento, ho sostituito il ponte raddrizzatore con un modello più robusto, ed ho cambiato anche il generatore di alta tensione necessario per l'alimentazione dei tubi con un modello più efficiente, acquistato su Ebay a questo indirizzo.