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
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