Orologio a Up V2.0

Versione potenziata e aggiornata del mitico progetto di ad.noctis, con nuovo MCU, nuovo firmware, nuovi accorgimenti hardware. 


Introduzione

Questo progetto è nato dall'idea di rimodernare un orologio didattico che il mio prof. usa nelle sue lezioni di elettronica. La sua costruzione era pensata per il PIC16F84, che purtroppo non disponeva di alcuni "accessori" indispensabili per la costruzione di un orologio preciso e stabile come, ad esempio, la possibilità di utilizzare il mitico quarzetto da 32768Hz nell'uso combinato con il Timer1. Lasciando da parte la possibilità di aggiungere un RTC, visto che il progetto originale non lo prevedeva (un po’ complicato affiancarlo al PIC16F84, al quale manca l'I²C hardware) e considerando che un punto fermo dell'idea è l'utilizzo del pcb così come disegnato dal prof, qualche tempo fa, (eccetto per il PIC), ho pensato di sostituire il vecchio microcontrollore con un performante PIC16F1827, un po’ esagerato per questo circuito, ma avendone un paio in casa e considerando il basso costo e la piena compatibilità con le precedenti serie, l'ho montato al volo, anche perché, vista la notevole quantità di memoria in più, è possibile integrare diverse opzioni aggiuntive che verranno viste a breve. Lo scopo principale di quest'orologio era, ed è, la comprensione di argomenti come: il settaggio e l'utilizzo del Timer0 e del PIC in generale, la tecnica del multiplexing per il pilotaggio dei display, il funzionamento del decoder CD4511, la gestione dei pulsanti, l'utilizzo degli interrupt. Nel nuovo firmware ho pensato di rimanere fedele alla filosofia didattica, evitando forme di scrittura abbreviate e cercando di commentare il più possibile il codice.

 

 

 

Fig.1 - La prima versione dell'orologio

 

A mio avviso nelle scuole italiane, la vera didattica, quella "pratica", ha perso completamente valore! Buona parte degli insegnanti continua ad utilizzare vecchie argomentazioni, a volte per evitare di imparare qualcosa di nuovo, altre per la mancanza di fondi per gli aggiornamenti. Sono convinto che sia indispensabile partire dalla nozioni di base per poter usare al meglio le nuove tecnologie, ma questo deve essere immediatamente affiancato allo studio e all'utilizzo dei prodotti più recenti disponibili sul mercato, altrimenti si rischia di perdere poi la competitività nel mondo della ricerca e del lavoro, cosa che sta ampiamente succedendo. Fortunatamente la mancanza di innovazione non è mai stato un problema del mio vecchio insegnate ora divenuto amico, che per la cronaca è il mitico professor Marco Gottardo, che tutti voi conoscerete meglio come ad.noctis, il quale, per impegni sempre costanti (ne ha sempre una di nuova in testa), mi ha delegato la riscrittura del codice con un secondo punto fermo: "usa gli ultimi prodotti disponibili", che tradotto significa: utilizzo dell'Mplab X affiancato all'ultimo compilatore sfornato dalla Microchip, ovvero l'XC8, senza dimenticare la sostituzione del precedente PIC con il più recente 16F1827.

 

Specifiche progettuali e schemi elettrici.

Veniamo alle specifiche di progetto: l'hardware, che a suo tempo è stato fatto su un pcb professionale, si compone principalmente di un microcontrollore che comanda un decoder BCD HCF4511BE; il decoder comanda a sua volta i segmenti di 4 display led a catodo comune, attraverso le solite resistenze di limitazione. Da notare che l'accensione del punto decimale viene demandata ad un'uscita del PIC, nel nostro caso RA0, in quanto il decoder può unicamente visualizzare numeri da 0 a 9. I catodi dei singoli display sono comandati direttamente da 4 uscite del PIC, attraverso dei transistor BC337 che, attivati con una specifica sequenza coordinata con il numero da visualizzare, creano l'effetto che tutti i display siano accesi contemporaneamente (tecnica del multiplexing). Sono presenti 4 pulsanti per la regolazione delle ore e dei minuti (S1=H+, S2=H-, S3=M+, S4=M-), con le relative resistenze di pull-up, e un semplice stadio di regolazione con un integrato 7805. L'alimentazione è prelevata da un alimentatore DC da 9V affiancato ad una batteria tampone, sempre da 9V, messa in parallelo all'alimentazione principale attraverso un diodo. Come si può notare dallo schema e dal pcb, si è scelto di montare i display e il circuito di comando su due schede separate, più che altro per aumentare la flessibilità di installazione su un'eventuale contenitore. I pulsanti sono stati saldati direttamente sul pcb, ma nulla vieta di spostarli con spezzoni di filo. Sullo schema del display si possono notare sei connettori a tre vie; quattro di questi sono stati inseriti per dare la possibilità di abilitare singolarmente i punti decimali e ampliare le modalità di visualizzazione. I due restanti, SV2 e SV3, servono per montare il terzo display al contrario, scambiando le linee del punto decimale e del segmento g. In questa modalità, abilitando i punti decimali dei due display centrali, le ore e i minuti saranno separate dai due punti! Questa chicca l’ho vista qui, quindi onore al merito! Per le abilitazioni si fa ovviamente uso dei soliti ponticelli a 2 vie.

 

 


Fig.2 - La versione aggiornata del PCB di controllo 

 

 

 

 

Fig.3 - Schema elettrico del circuito di controllo.

 

 

Lista componenti scheda di controllo.

 

R1,R2,R3,R4,R5,R6,R7,R12:      Resistenze 220 ohm ¼ W

 

R8,R9,R10,R11:                             Resistenze 2.2 kohm ¼ W

 

R13,R14,R15,R16,R17:               Resistenze 10 kohm ¼ W

 

C1:                                                   Condensatore poliestere 0.1 uF

 

C2:                                                   Condensatore elettrolitico 10 uF

C3,C4:                                             Condensatori ceramici 22 pF

 

Q1,Q2,Q3,Q4:                                   Transistor BC337

 

D1,D2:                                                          Diodi 1N4148

 

S1,S2,S3,S4:                                         Pulsanti N.O.

 

 Q5:                Quarzo da 4MHz

IC1:               Decoder HCF4511BE

IC2:               Microcontrollore PIC16F1827

IC3:               Regolatore di tensione LM7805

Accessori:   SV1 - Strip line 12 pin

                      X1- Morsetto 2P per alimentazione scheda

                      Connettore per batteria 9V


Il display, realizzato appositamente per questo progetto, ma che può essere utilizzato per qualsiasi altro progetto a Microcontrollore, è il seguente.

 

Fig.4 - Circuito stampato del Display a uso universale.

 

Fig.5 - Display con alloggiati i 4 digit a 7 segmenti.

Nella foto sovrastante si può notare che non è ancora stata rimossa la pellicola protettiva dai digit del display, tuttavia i numeri sono ugualmente molto nitidi, luminosi in maniera non aggressiva e privi di ogni flikeramento come avveniva nella precedente versione del progetto.

Il PCB del display ha il layout visibile qui sotto.

Fig.6 - Display Layout

Per un normale funzionamento (vedi video) ponticellare SV5 (2-3) per visualizzare il punto lampeggiante, e SV2 (1-2) per accendere il segmento g del terzo digit.

 Lo schema elettrico è semplice ed intuitivo, non fa altro che collegare i 4 digit a un bus comune e a mettere a disposizione i controlli dei catodi comuni in un connettore pensato per essere pin to pin con quello presente nel PCB di controllo. Con questo piccolo stampato è quindi  possibile collegare il display al pcb di controllo usando semplicemente un cavo flat passante.

 

Fig.7 - Schema elettrico del nuovo display, assente nella prima versione. 

COMPONENTI SCHEDA DISPLAY:

 

DIS1,DIS2,DIS3,DIS4: Display a catodo comune

Accessori:                   SV1 - Strip line 12 pin

                                      SV2,SV3,SV4,SV5,SV6,SV7 – Strip line 3 pin

                                      n. 6 ponti 2P per strip line

Il PCB dell'orologio, creato dal prof è invece questo.

 

 

Come vedremo sarà possibile, per le scuole e laboratori didattici, richiedere a specifici negozi autorizzati la fornitura di questi stampati.

Firmware.
Il firmware originale, scritto in assembly, era piuttosto semplice e si dedicava soprattutto all'impostazione del Timer0, alla gestione delle sequenze per il comando del 4511 e all'attivazione dei catodi. Come detto, i 4 pulsanti servivano unicamente per regolare l'ora e la precisione dell'orologio era legata a quella del quarzo e dei relativi condensatori.
Nel nuovo firmware ho aggiunto un paio di cose in più: la funzione di maggior rilievo è il settaggio di tre calibrazioni per la regolazione del clock.  La stessa cosa si potrebbe ottenere sostituendo uno dei due condensatori che comandano il quarzo con un trimmer capacitivo, ma ci tenevo a dimostrare come un circuito basato su pic possa, a parità di hardware esterno, evolversi in qualcosa di nuovo, con funzioni aggiuntive talvolta quasi impossibili per il microcontrollore precedente (vedi ad es. la lettura di tasti touch permessa dal 16F1827). Una seconda funzione, legata alla precedente, è la lettura e il salvataggio di dati sulla eeprom interna del pic, che in questo caso serve per memorizzare il valore delle tre calibrazioni e il segno (+ o -) rispetto al clock campione. La funzione dei tasti è stata modificata in questo modo: premendo singolarmente un tasto, in modalità orologio, si fa la taratura dell'ora come in precedenza; premendo contemporaneamente S1 e S4 si entra nel menù programmazione, da dove si possono settare le calibrazioni e l'abilitazione degli effetti. In questa modalità i tasti assumono un significato diverso: S1= conferma, S2= nessun comando, S3= decrementa valore parametro, S4= incrementa valore parametro. Infine, ho inserito una serie di 5 effetti display per rendere più accattivante l'orologio, che si alternano in modo casuale ad ogni cambio dei minuti. Se soffrite di attacchi epilettici o semplicemente vi urtano i nervi, li potete tranquillamente disattivare dal menù di programmazione.
Da notare che ho scelto di disabilitare la funzione del MCLR, visto che qui non era particolarmente necessaria, anche se nel circuito è presente la resistenza a +Vdd.

Il firmware si compone di diversi blocchi, contenuti nelle varie librerie, ai quali fa capo il file .c principale che gestisce le chiamate alle varie funzioni e contiene il cuore dell'orologio, ovvero la funzione di interrupt. Apro una piccola parentesi: ci sono molti modi per scrivere un programma, più o meno efficaci. In questa prima stesura, per mancanza di tempo, ho mirato più al funzionamento che al codice vero e proprio, scrivendo tutto quello che mi serviva sui file .h e richiamando direttamente le variabili pubbliche. Un progetto così strutturato funziona, ma è fine a se stesso perché rende difficile l'utilizzo delle sue funzioni in altri progetti. Appena ne avrò la possibilità, intendo modificare le funzioni con versioni a passaggio di parametri, decisamente più indipendenti rispetto a questa stesura, che fanno molto uso dei puntatori. In questo modo si svincola la funzione stessa dal codice principale, garantendo una buona portabilità in altri programmi. I file .c conterranno le funzioni vere e proprie, mentre nei file .h verranno inserite solo le relative predichiarazioni. Come detto in precedenza, il codice può essere notevolmente snellito e ottimizzato, ma ho preferito mantenerlo così per agevolarne la comprensione.

Veniamo alla breve spiegazione del codice (maggiori dettagli li potete trovare nei commenti delle varie istruzioni):
il blocco principale è rappresentato dal file OrologioUP_2.0.c che contiene, oltre che ai riferimenti alle varie librerie, al settaggio dei fuses e alle dichiarazioni delle variabili pubbliche, il main principale del programma e la funzione di interrupt, che scandisce il clock dell'orologio. All'accensione vengono recuperati i dati salvati in memoria relativi alle calibrazioni e all'abilitazione degli effetti. In caso di primo avvio, ovvero quando non sono stati impostati i vari parametri, i dati letti dalla memoria riportano valori errati (di solito 255) e questo porta inevitabilmente a problemi. Per questo motivo, gli indirizzi interessati vengono azzerati e i relativi parametri settati a valori di default (calibrazioni a 0, segno positivo, effetti disabilitati). Segue il ciclo while principale: qui, come prima cosa, viene verificata l'abilitazione alla generazione di un effetto display e, in caso positivo, lanciato l’effetto; successivamente viene eseguito un ciclo di visualizzazione dell'ora ed effettuata una serie di verifiche dei pulsanti premuti. Come anticipato, la pressione dei singoli tasti imposta "al volo" l'ora corrente, mentre la pressione contemporanea di S1 e S4 attiva la funzione di programmazione, della quale parleremo fra poco.

Visto che il quarzo utilizzato è da 4MHz, ho previsto il settaggio del prescaler a 8 e quello del preset del Timer0 a 131, valore che poi nella routine di interrupt va incrementato di 2 e diventa 133, in quanto durante la ricarica del Timer0 vengono persi 2 cicli macchina (vedi datasheet). Vediamo come sono saltati fuori questi valori: il Timer0 è in realtà un contatore a 8 bit, cioè conta da 0 a 255, e il suo conteggio viene incrementato di un’unità ogni 4 colpi di clock.  Il mio quarzo è a 4MHz, quindi la frequenza di incremento è pari a 4Mhz/4=1Mhz, che in termini temporali corrisponde ad un tempo di 1/1MHz=1uS. Visto che è possibile impostare il Timer0 affinché parta da un valore diverso da 0, si deve trovare la giusta combinazione fra il valore del prescaler e quello di partenza da caricare, cercando di ottenere dei multipli del secondo per evitare poi calcoli inutili. Io, per semplicità, ho scelto di avere un interrupt ad intervalli di 1ms. Utilizzando la formula: preset= 256 - (t. interrupt / (freq. incr. x prescaler)), si effettuano alcune prove, sostituendo di volta in volta i valori standard del prescaler, che ricordo sono: 2, 4, 8, 16, 32, 64, 128, 256. Dopo alcune prove, in questo caso, si trova che il prescaler è uguale a 8, e il valore del preset diventa quindi: preset= 256 – (0.001 / (0.000001 x 8))= 131.

Sulla base di queste impostazioni, l’interrupt generato provvede costantemente ad  incrementare la variabile dei millisecondi. Quando vengono conteggiati 1000ms "circa", viene incrementata la variabile dei secondi, dopo 60 secondi quella dei minuti e dopo 60minuti quella delle ore. Ho detto "circa" perché l'incremento della variabile dei secondi è soggetto alla modifica da parte delle calibrazioni. Se, ad esempio, a causa degli errori dovuti al quarzo (e relativi condensatori), il mio orologio si prende indietro di 2ms per ogni secondo, devo fare in modo di anticipare l'incremento, sommando al valore 1000 una calibrazione negativa di -2ms. In questo modo, la variabile dei secondi verrà incrementata ogni 998ms (conteggiati dall'orologio), che in realtà corrispondono a 1000ms reali.
Le altre due calibrazioni servono per affinare la correzione. Infatti, mentre la seconda e facilmente tarabile sull'errore riscontrabile nel confronto con un orologio campione (ad es. quello del televideo), eseguito nell'arco di un giorno, per settare la terza è necessario fare riferimento all'errore che si accumula almeno in una settimana, o meglio in un mese. Se le calibrazioni vengono correttamente regolate, consentono di ottenere un'ottima precisione del clock, teoricamente con un errore massimo di 3s per anno. Nella pratica però, questo errore è leggermente superiore, a causa dell'inevitabile dipendenza del clock dalla temperatura. Come si può notare dal codice, le due calibrazioni vengono integrate rispettivamente ogni 100s e ogni 10000s, ovviamente per lavorare solo con numeri interi.

Veniamo ora ai file h. e relative funzioni:
il primo è il file Settaggi.h, che consente di settare i parametri principali del pic, in particolare quelli relativi agli I/O e all'impostazione del Timer0.



Il secondo è il file eepromX_PIC16F1827.h, che serve per dialogare con la memoria eeprom interna del pic. Qui sono racchiuse tre funzioni: una per la lettura e due per la scrittura di dati char in memoria. Ce ne sono due in scrittura in quanto la prima scrive semplicemente il dato senza eseguirne la verifica, mentre la seconda, oltre che a scrivere il dato, esegue un ciclo di lettura dello stesso indirizzo di memoria, confrontando il valore letto con quello precedentemente scritto e ritornando il valore 1, se il dato è scritto correttamente, 0, se invece ci sono stati problemi. Io ho scelto di usare la prima senza verifica perché in questo progetto non ci sono particolari esigenze di affidabilità, ma in applicazioni dove questa è importante, e soprattutto in applicazioni professionali, è bene usare la seconda, magari affiancata a delle routine di gestione degli errori. Entrambe le funzioni di lettura e scrittura sono state ricavate dal datasheet del pic, ho inserito nel nome della funzione lo specifico modello perché per altre serie il codice potrebbe differire leggermente, quindi, prima di utilizzare queste funzioni su altri pic, è bene verificarne la compatibilità.


Il terzo file è Decoder_4511.h, che serve per inviare i giusti comandi appunto al decoder 4511, qui utilizzato per il controllo degli anodi dei 4 display. Questo decoder ha 4 linee di ingresso per la ricezione di un numero in formato BCD (A, B, C,D), più altre 3 linee (qui non usate) per funzioni particolari: la prima, LT (Lamp Test), se posta a massa, accende tutti i segmenti del display; la seconda, BL (Blanking), se posta a massa, spegne tutti i segmenti del display. Questa linea, apparentemente priva di utilità, serve principalmente per uno scopo ben preciso, ovvero, se viene comandata da un'onda quadra di opportuna frequenza, consente di impostare la luminosità del display. Grazie ad un'accurata programmazione però, questo pin diventa superfluo, perché si può agire direttamente sul tempo di visualizzazione di ciascuna cifra, cambiando il valore di conteggio nella routine "pausa" (attualmente impostato fisso a 100). La terza, LE/STROBE (store o strobe), serve per determinare la modalità di visualizzazione della cifra: se posta a massa, visualizza al volo il codice presente in ingresso, se posta a +Vdd, memorizza il codice nel latch interno e lo mantiene fino alla successiva modifica. Il decoder si compone infine, oltre che ai 2 pin di alimentazione, di 7 uscite (a, b, c, d, e, f, g) per il comando degli anodi dei quattro display che, come si può vedere dallo schema, sono tutti collegati in parallelo fra loro. Da qui si capisce che, abilitando tutti i catodi, verrebbe visualizzata la stessa cifra su ogni display. E qui entra in gioco la tecnica del multiplexing. Se ad esempio si devono visualizzare le ore 12.30, bisogna procedere in questo modo: si inviano i comandi corretti al 4511 perché attivi gli anodi per ottenere la cifra 1; si attiva il catodo del primo display e il numero 1 diventa visibile esclusivamente sul primo display; si mantiene questa configurazione per un certo tempo, proporzionato a cavallo fra la luminosità che si vuole ottenere (più la cifra rimane accesa è più risulta luminosa all'occhio) e la fluidità di visualizzazione (più veloce è il tempo di passaggio da una cifra all'altra e meno si nota lo "sfarfallio" dei display). A questo punto si disattiva nuovamente il catodo del display 1, si inviano i comandi al 4511 per visualizzare la cifra 2 e si attiva il catodo del display 2 per un certo tempo e così via. Queste operazioni devono essere ripetute per i restanti due display e una volta che il ciclo finisce ne riparte subito un altro, il tutto centinaia di volte al secondo. Così facendo, si sfrutta l'effetto della persistenza dell'immagine sulla retina, che tappa i "buchi" nei passaggi fra un display e l'altro e ci mostra il nostro bel display come se tutte le cifre fossero accese contemporaneamente e in modo indipendente l'una dall'altra. Tutte le funzioni necessarie per gestire queste operazioni si trovano all'interno della libreria e i comandi per il pilotaggio del 4511 sono direttamente ricavati dalla tabella presente nel datasheet dell'integrato.

Il quarto file, Programmazione.h, serve per la programmazione delle calibrazioni e per l'abilitazione degli effetti del display. Qui è presente una routine generale che viene chiamata dal main e si occupa di attivare le specifiche funzioni per il settaggio dei singoli parametri. Ogni funzione ha al suo interno un ciclo while che mantiene l'attenzione sulla funzione stessa fino a quando non viene salvato il parametro. All'interno di questo ciclo viene prima di tutto eseguita una visualizzazione sul display di quello che sta accadendo, poi viene controllata la pressione dei tasti e, in caso di tasto premuto, attivata la relativa funzione associata al pulsante. All'uscita dal ciclo, ovvero a seguito della pressione del pulsante P1, ogni parametro viene salvato sulla memoria eeprom, sovrascrivendo il valore presente. Da notare che, fra la programmazione di un parametro e l'altro, è presente una protezione per verificare che non ci siano tasti premuti prima di attivare la funzione successiva, questo allo scopo di evitare false impostazioni: immaginate cosa succederebbe senza questa protezione... avete appena premuto P1 e salvato il primo dato e, non avete fatto neanche in tempo a rilasciare il tasto che... l'orologio sta già visualizzando l'ora e in una frazione di secondo ha impostato tutti gli altri parametri... poveretto, bisogna capirlo, alla sua velocità vedeva sempre "ok salva il dato"! La funzione termina con l'azzeramento di tutte le variabili orarie e con il preset del Timer0.

Il quinto e ultimo file è Effetti.h, che serve appunto per la generazione di effetti del display. Io ne ho previsti cinque, ma ognuno con la propria fantasia ne può aggiungere degli altri, memoria permettendo. E qui c'è una cosa da puntualizzare: come detto all'inizio, il codice può essere notevolmente ottimizzato, e questo è valevole soprattutto per questa libreria. Le funzioni che ho creato hanno molto codice ripetuto, che potrebbe essere risparmiato aggiungendo degli opportuni cicli for. Questo però, a mio avviso, va a discapito della leggibilità da parte di chi è neofita di programmazione, e quindi ho deciso di lasciare le funzioni il più estese possibile, ovviamente con la brutta sorpresa della notevole memoria programma impegnata. Demando le spiegazioni degli specifici effetti al codice che è ben commentato.

Calibrazione e regolazione dell'orologio.

 

 

 

Il settaggio delle tre calibrazioni potrebbe essere semplicemente eseguito con l'ausilio di un frequenzimetro o di un oscilloscopio, impostando i rispettivi valori a 0 e prelevando il segnale del clock sul piedino del punto decimale. Dalla lettura si otterrebbe la deviazione rispetto al secondo reale e si potrebbe inserire questa differenza all'interno delle tre calibrazioni ricordando che: il segno è positivo se l'orologio è in anticipo rispetto al secondo reale, negativo se è in ritardo; la prima calibrazione ha una risoluzione di 1ms, la seconda di 0.01ms e la terza di 0.0001ms.


Questo metodo è molto pratico, ma purtroppo non tutti dispongono delle apparecchiature sopra citate. Vediamo quindi come impostare in modo "empirico" le tre calibrazioni:
si parte anche qui con il valore delle tre calibrazioni a 0 e si regola l'ora sulla base di un orologio campione che abbia una certa precisione, ad esempio quello del televideo (io ho utilizzato una sveglia radio controllata), avendo cura di impostare l'ora corretta nell'esatto istante che cambia anche nell'orologio campione (cioè quando i secondi passano da 59 a 00).
Dopo un tempo fisso, mettiamo 1 ora, si cronometra a occhio la differenza dell'ora dei due orologi. Supponiamo che il nostro orologio sia in ritardo di 9 secondi: in un'ora ci sono 3600s, quindi se perde 9s significa che per ogni secondo perde 9/3600= 0.0025s, ossia 2.5ms.
Si imposta quindi il segno della calibrazione a 1 (negativo), il valore della prima calibrazione a 02 e quello della seconda a 50. Quello della terza rimane a 00.


Si regola nuovamente l'ora come prima aumentando però il tempo di verifica del clock e si riaggiustano le calibrazioni facendo un piccolo calcolo aggiuntivo, facciamo un esempio:
dopo 1 giorno il mio orologio è ancora in ritardo di 3s, quindi per ogni secondo perde: 24h x 60m x 60s= 86400s --> 3/86400= 0,0000347s. I valori delle tre calibrazioni si suddividono quindi in: calibrazione 1=00, calibrazione 2=03, calibrazione 3=47, ma questi tre valori non sono quelli che vanno effettivamente memorizzati, perché la prima e la seconda calibrazione contengono già dei valori. In questo caso non facciamo altro che sommare i rispettivi valori che diventano quindi: calibrazione 1= 02+00= 02, calibrazione 2= 50+03= 53, calibrazione 3= 00+47= 47.


A questo punto, il nostro orologio è già abbastanza preciso, ma se vogliamo ottenere le migliori prestazioni dobbiamo eseguire una serie di aggiustamenti a intervalli sempre maggiori fra una verifica e l'altra. Ovviamente, non è il caso di fare 1000 verifiche! Dopo tre o quattro, eseguite nell'arco di una settimana, se ne può fare una definitiva dopo uno o due mesi.
A tal proposito, vediamo un ultimo esempio che potrebbe creare dei problemi:
Supponiamo che, dopo un mese, il nostro orologio è ora in anticipo di 2s. Calcoliamo i valori delle tre calibrazioni:
anticipo rispetto al secondo reale: 30gg x 24h x 60m x 60s= 2.592.000s --> 2/2.592.000= 0,0000007s. La calibrazione 1 vale 0, la calibrazione 2 vale 0, e la calibrazione 3 vale 07, ma questo valore non va sommato come in precedenza, ma sottratto, perché l'orologio è in anticipo e quindi i valori che andremo a memorizzare saranno:
calibrazione 1= 02+00= 02, calibrazione 2= 53+00= 53, calibrazione 3= 47-07= 40.

 

Filmato dell'orologio su youtube.

 

Da questo link potrai scaricare il filmato in formato 3gp visualizzabile sul tuo PC locale oppure seguendo il link lo potrai guardare su youtube.

download filmato zippato del funzionamento dell'orologio Micro-GT

 

 

 

 

http://youtu.be/Jxm6nOF9Jxw

 

Scarica il progetto MPLAB-X

 

Il pacchetto contiene i sorgenti,  in XC8 per il PIC 16F1827  il file .hex per un immediato utilizzo. 

scarica progetto Orologio a Up V2.0

 

Scarica da questo sito Orologio a Up V2.0 in XC

 

Modifiche e migliorie dell'orologio.

L'orologio così come l'ho presentato è molto semplice, anche se sufficientemente preciso e simpatico da vedere, grazie ai vari effetti. In una successiva versione, più evoluta, è possibile ottimizzare il codice, eliminando magari gli effetti (per guadagnare spazio in memoria) e inserendo funzioni aggiuntive quali: la data, il numero del giorno della settimana, il cambio automatico fra l'ora solare e quella legale e, magari, la funzione di sveglia con il pilotaggio di un cicalino. Per fortuna, non ci sono limiti alla creatività, e chiunque può personalizzare il codice a proprio piacimento. D'altra parte, questo è il bello dei microcontrollori, no?

 

Conclusioni.

L’orologio è realizzabile da chiunque, grazie al codice e agli schemi allegati. Per chi volesse i pcb professionali, il pic preprogrammato, il kit da montare o l’orologio finito, può richiederli direttamente a Marco, che ha la paternità dei circuiti stampati e dei progetti originali scrivendogli a ad.noctis@gmail.com

Uno speciale invito è rivolto agli insegnanti, e a chi dirige scuole professionali o laboratori con corsi hobbistici, a procurarselo come progetto didattico per la scuola, in questo caso si potrà passare attraverso il primo negozio che ha ufficialmente aderito alla distribuzione dei KIT Micro-GT, ovvero del marchio che Marco sta lanciando.

Il negozio sui trova a Rovigo all'indirizzo:

Euro  Elettronica di Fabbri Fabiano & C. s.n.c.  Viale Gramsci 134 - 45100 Rovigo tel e Fax  0425 31175

 biglietto da vista del negozio dove procurarsi i kit

 

Per procurarsi il KIT online, chiedere a marco tramite la mail  ad.noctis@gmail.com

 

In tal proposito ringrazio Marco, che fu il mio professore alle scuole superiori, e che ho deciso di riavvicinare nell'estate 2013 iscrivendomi al suo corso di programmazione dei PIC tenutosi presso il centro culturale ZIP di Padova, per avere inserito questo mio contributo alla nascente linea KIT Micro-GT.     

Un saluto a tutti coloro che iniziano ad appassionarsi a questo incredibile mondo che è la programmazione dei microcontrollori.

Vi invitiamo a vistare la community Micro-GT all'indirizzo www.gtronic.it in cui posteremo sempre più lavori analoghi a questo.   

Per qualsiasi ulteriore informazione non esitate a chiedermi. Alla prossima!

Mirco Battistella.

 

Questo progetto è ridistribuibile secondo i termini di licenzaCreative Commons Attribuzione-Condividi allo stesso modo 3.0 Italia

 

  Pagina precedente