Orologio con ST6 e LCD
 

ATTENZIONE: Chi ha realizzato questo o altri progetti presenti in questo sito, per favore può inviarmi sulla mia email delle foto delle sue realizzazioni? Vorrei metterle qui on-line in modo che siano visibili e possano servire da spunto per nuove idee, realizzazioni diverse o modifiche , seguendo in questo modo lo spirito di questo sito che è a favore della divulgazione e conoscenza gratuita dell'elettronica.
Inoltre se voi, mentre inviate le foto dei vostri prototipi, mi autorizzate a mettere on-line insieme alle foto almeno il vostro nome e la vostra email, potrete essere contattati o potrete contattare un altro utente che ha realizzato lo stesso progetto in modo da poter fare insieme dei confronti costruttivi.
Vi ringrazio anticipatamente, Tony


Introduzione:
Realizzare un orologio che sia soddisfacentemente preciso sembra una cosa facile soprattutto utilizzando un microprocessore. Nel corso degli anni ho realizzato diversi orologi e sveglie incontrando svariate difficoltà, ad esempio: nella stesura del programma di un microcontroller ST6, più precisamente ST62x65, ho fatto diverse prove usando il timer, il timer autoricaricabile ed infine eseguendo delle routines calcolate, queste ultime, presentano il grandissimo inconveniente di dover essere "aggiustate" (il più delle volte sperimentalmente) con ritardi vari per ottenere la maggior precisione possibile. Un secondo problema consiste nei black out, quando viene a mancare la tensione di alimentazione l'orologio si azzera, questo presenta un problema non da poco se ci si fida del proprio orologio ad esempio per svegliarsi. Questo problema può essere risolto solo con una batteria di backup di una certa dimensione.

Queste soluzioni non mi sono piaciute e dopo vari sforzi, mi sono imposto di usare in abbinamento all'ST6 un integrato scelto ad hoc con le funzioni di orologio, calendario, sveglia e non di meno, una memoria ram il cui contenuto è protetto dai black-out come per l'orologio, relativamente semplice da interfacciare con l'ST6 e così ho deciso di usare il chip prodotto da Dallas/Maxim DS1306 che è un RTC (Real Time Clock) interfacciato via SPI, interfaccia presente nel micro ST62x65.

Principio di funzionamento dell'orologio:
Nella fase di impostazione del DS1306 viene impostata a on la generazione del segnale di output a 1Hz, il microcontroller ST6 riceve questo segnale in input e cicla sul suo fronte, quando il fronte dal livello logico zero passa al livello logico uno, l'ST6 richiede via SPI al DS1306 la nuova data e nuova ora; per recuperare tempo ed evitare di riscrivere sul display la data ad ogni secondo, viene effettuato il test sul cambio del giorno, per cui, viene sempre riscritta solamente l'ora e se il giorno è cambiato, viene riscritto anche il giorno.


Descrizione del SOFTWARE:
Il sorgente del programma è lungo più di 2000 righe ed oltre alle funzioni di gestione del display LCD 2 righe per 16 caratteri contiene le funzioni sotto elencate.

Flusso del programma:

Inizializzazione periferica SPI del micro ST6: 9600 baud, polarità normale e fase invertita.

Inizializzazione del DS1306: abilitazione alla scrittura, output 1Hz abilitato, interrupts 0 e 1 disattivati, trickle charge disattivato.

Ricezione dello stato degli allarmi zero e uno, on/off. Questo stato allarmi è gestito dalla variabile alsts (alarm status) dove il bit 0 gestisce l'allarme zero ed il bit 1 gestisce l'allarme 1, questa variabile viene memorizzata all'interno del DS1306 nella prima cella della user ram (20h).

Inizializzazione dell'LCD e relativa accensione.

Visualizzazione del copyright (3 secondi)

Ricezione di ora e data dal DS1306, conversione e visualizzazione sul display LCD. Al fine di essere più veloci e riscrivere meno caratteri, viene memorizzato il giorno e così la data sul display non viene più riscritta se il giorno non cambia; questo velocizza la conversione e visualizzazione.

Verifica dello stato allarmi: se almeno un allarme è attivo, ad ogni ciclo vengono confrontati i secondi, se i secondi sono 00, viene confrontata l'ora dell'allarme zero, se l'ora è ok, si confrontano i minuti e se anche loro sono ok, viene attivato l'out di allarme; lo stesso vale per l'allarme uno. Il test viene inzialmente eseguito solo sui secondi per uscire dalla routine il più presto possibile.

A questo punto viene testato se l'utente ha premuto il pulsante P1 per entrare nel menù di setup dove è possibile impostare orologio, calendario, allarmi e l'attivazione/disattivazione degli stessi. Se il pulsante non è premuto, viene sentito il fronte del segnale in ingresso bit zero porta C, se il fronte è basso, ricarica il watch dog e ricicla sul pulsante P1, altrimenti, se il fronte è alto, il programma richiede al DS1306 l'ora, la converte da BCD ad ASCII e la visualizza sul display LCD. Il segnale in ingresso sul bit 0 della porta C non è altro che il segnale con frequenza di 1Hz in uscita dal DS1306.

Impostazione:

Funzioni pulsanti:
P1 = Menù / Ok / Pulsante 1
P2 = Successivo / Pulsante 2
P3 = Incrementa / Pulsante 3

Mentre l'orologio è in funzione in modalità normale, premendo il pulsante P1 si entra nella modalità di Impostazione; come si può comprendere facilmente dalla descrizione dei pulsanti, premendo il pulsante P3 si incrementa l'impostazione corrente premendo il pulsante P2 si passa all'impostazione successiva ad esempio:

Entrando nel menù di impostazione, l'orologio blocca la visualizzazione (pur continuando il conteggio del tempo) ed il cursore lampeggia sulla posizione del giorno della settimana. Se il giorno è Lun (Lunedì) premendo il pulsante P3 si passa a Mar (Martedì) così facendo fino a Dom. Terminata questa impostazione, premendo il pulsante P2 si passa all'impostazione successiva che in questo caso è il giorno del mese…

La sequenza delle impostazioni è:

Giorno della settimana, giorno del mese, mese, anno, ore, minuti, secondi

Poi passa alla seconda pagina e prosegue con:

Allarme 1: Ore, minuti, ON/OFF

Allarme 2: Ore, minuti, ON/OFF

Il ciclo viene ripetuto all'infinito finché non si preme il pulsante P1, premendolo appare il menù di uscita impostazione con le seguenti voci:
1 Ora (imposta ora e data)
2 Sveglie (imposta orari e ON/OFF)
3 Esce (ignora tutte modifiche effettuate)

Ho scelto di passare tramite un menù di uscita per diversi motivi:
1) Era difficile sincronizzare l'ora, così ho fatto in modo che l'utente imposti data e ora compresi i secondi, poi, guardando un orologio di riferimento, un secondo prima del secondo impostato, l'utente preme il pulsante P1 e sincronizza l'ora.
2) L'utente avrebbe potuto entrare nel menù di impostazione semplicemente per visualizzare l'orario delle sveglie senza voler apportare modifiche.
3) Se l'utente è entrato per errore nel menù, può uscire tramite l'opzione 3 senza essere obbligato a reimpostare qualcosa.

Sveglie:
L'orario e lo stato delle sveglie (ON/OFF) vengono memorizzati all'interno del DS1306 e ogni volta che l'orologio viene alimentato, questi dati vengono prelevati dall'ST6. E' stata scelta questa strategia perché in caso di black-out le sveglie ed il loro stato non si azzerassero. Dopo aver messo a punto il funzionamento dell'orologio, ho messo a punto la gestione delle sveglie e come prima impostazione ho impostato i due allarmi già presenti nel DS1306, dopo un po' di prove ho scartato questo metodo per via degli interrupt del DS1306, l'impiego di altri due input dell'ST6 ecc… così ho scelto di memorizzare i dati delle sveglie nella ram del DS1306 ed eseguire il confronto con l'ora ed i minuti correnti non di continuo ma solo quando i secondi sono uguali a 00.
Ho scelto di dare un timeout alle sveglie di 120 secondi in modo che, qualora nessuno sentisse la sveglia che sta suonando, quest'ultima non suonasse all'infinito ma se nessuno la spegne in due minuti, quest'ultima si spenga automaticamente.

Per spegnere la sveglia che sta suonando, premere il pulsante P2.


Precisione/LCD


Precisione:
Ho provato a pilotare il DS1306 tramite un quarzo a 32.768Khz ma ho notato che a causa della deriva termica la differenza in un mese è arrivata anche a 4 minuti, così ho eliminato il quarzo ed ho inserito l'oscillatore compensato DS32KHz sempre prodotto da Dallas/Maxim e devo dire che la precisione è diventata impressionante. Ho fatto diversi controlli nell'arco degli ultimi due mesi con 3 orologi Oregon Scientific (radiocontrollati tramite il segnale DCF77) e dopo un mese ho notato uno scostamento massimo inferiore a un secondo.

LCD:
L'Lcd 16x2 è stato preso dal kit di Nuova Elettronica LX1208N ma va benissimo qualsiasi altro dislplay LCD standard 16 caratteri per 2 righe. In questo caso occorre fare attenzione alla nuova piedinatura e verificare il valore della resistenza di cadura posta sull'alimentazione della retroilluminazione che per il display indicato è di 4,7 ohm e si trova collegata al pin 15 dell'LCD.



Schema elettrico


Prototipo


Prototipo con ST62T65


Prototipo (Oscillatore compensato DS32 e batt. litio)


Prototipo (visto da sopra)


Prototipo (LCD in modalità normale)
Gli ultimi 2 caratteri indicano lo stato delle sveglie, in questo caso,
1 indica sveglia 1 attiva mentre la sveglia 2 è disattivata



Prototipo (LCD prima pagina menù impostazione)


Prototipo (LCD seconda pagina menù impostazione)


Prototipo (LCD pagina uscita menù impostazione)

Prototipo (con alimentatore)


Data sheet DS1306 DS1306.PDF (287k)
Data sheet DS32Khz DS32Khz.PDF (453k)
File .HEX per ST62x65 DS.zip (8k)

Il file .HEX nonchè il contenuto di queste pagine è stato rilasciato per applicazioni didattiche SENZA fine di lucro. Per qualsiasi altro tipo di applicazione potete contattarmi via email.

Sono ben accette modifiche e migliorie

© Copyright  tony@microt.it