Nixy

Di Stefano Purchiaroni


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.

 

 

 



 

Descrizione del circuito

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 principale

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

Datasheet del quarzo

Caratteristiche dei tubi Nixie

Datasheet del PIC18F2620

Datasheet dei driver 74141

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.

[ Apr 2017 ] Con l'autorizzazione dell'autore, pubblico di seguito alcune foto dell'esemplare costruito dal mio amico Fabrizio. Top e base del mobile sono in lamiera d'acciaio inox traforata ritagliati da ripiani di una scaffalatura metallica, poi carteggiati e piegati ad arte. Il frontalino, sempre ricavato dalla stessa lamiera, è verniciato a spruzzo con nero opaco, e lascia uscire solo la parte esterna dei tubi nixie. I fianchi sono in noce molto venato, ricomposti da frammenti di mostrine per infissi e successivamente mordenzati e trattati con gommalacca ma lasciando le venature a vista.