Newsgroup: it.hobby.elettronica.digitale
Titolo: Come gestire un orario con un RTC I2C

Quando avete la necessità di un orario batterizzato su una scheda a
microcontrollore, voi che soluzione adottate?
Oggi utilizzo un RTC su bus I2C con SRAM interna (con l'orario in BCD)
che viene mantenuta valida grazie ad una batteria da collegare ad un
pin apposito ed un classico quarzo a 32.768kHz.
La soluzione penso sia abbastanza tipica (a meno di non avere micro
con capacità RTC integrate, che poi spesso non sono batterizzabili).
A livello sw che strategia utilizzate? La più semplice è ovviamente
quella di leggere l'RTC sul bus I2C almeno ogni secondo, così da avere
l'orario sempre aggiornato.
Però mi stava venendo in mente di leggere l'orario dall'RTC solo
all'accensione e fidarmi di un interrupt a 1ms per tenere aggiornato
l'orario (naturalmente, rifarei la lettura su I2C magari ogni giorno).
Un po' come fa Linux.
Così potrei liberare un po' il bus I2C e risparmiare un po' di tempo.
E' un'idea malsana? In questo caso è meglio convertire tutto ad un
contatore di secondi oppure lasciare l'orario così come letto ed
incrementare i numeri BCD?

 ha scritto nel messaggio 
news:dc7910d2-9af2-4610...@a21g2000prj.googlegroups.com...





Io al powerup vado a leggere ore/minuti/secondi e li imposto nel mio 
"orologio interno" che esegue altre temporizzazioni sotto interrupt e che è 
aggiornato ogni 10ms.
Per tutte le operazioni e visualizzazioni utilizzo le variabili 
dell'orologio interno.
Allo scadere di ogni minuto vado a leggere l'RTC i2c eseguendo un refresh 
delle variabili.
Roberto P. 

 refresh delle variabili.
Ogni minuto? Perché così spesso? Hai paura che l'orologio interno si 
sfasi troppo con quello dell'RTC, oppure semplicemente per evitare di 
avere in sw delle cognizioni sul calendario?
Infatti potresti doverti trovare a contare, con l'orologio interno, a 
partire dall'orario 28/02/2010 23:59:59. Devi sapere se passare al 01/03 
oppure al 29/02.

 ha scritto nel messaggio 
news:in2b8u$565$1...@nnrp.ngi.it...

Esattamente per questo.
Si potrebbe fare anche alla scadenza di ogni ora, ma già un minuto è per me 
un tempo biblico...
Roberto P. 

 Cosě potrei liberare un po' il bus I2C e risparmiare un po' di tempo.
Dipende da cosa ci devi fare con l'orario.
In generale se devo visualizzare da qualche parte ora e data mi 
sincronizzo con l'RTC esterno all'accensione, poi sfrutto l'interrupt 
fornito sempre dall'RTC a 1 Hz per aggiornare la struttura interna.
Implementare un RTC "software" č abbastanza banale, anche la funzione 
per gli anni bisestili č reperibile ovunque.
Viceversa se l'RTC ti serve per generare allarmi o eventi potrebbe 
essere interessante sfruttare proprio il chip esterno per svegliare il 
micro al momento giusto anziché andare a leggere sempre l'ora.
Ancora, se la scheda deve invece restare accesa 24/7 ogni tanto si va a 
risincronizzarsi.
Marco

 l'orario sempre aggiornato.
Io utilizzo (quando davvero è necessario un RTC) il DS3234 (è SPI, non I2C 
ma il discorso è analogo) e mi faccio generare un interrupt ogni secondo.
Dato che per avere l'interrupt al secondo successivo devo comunque 
interagire con l'RTC (azzerare il flag di allarme) ne approfitto per 
sincronizzare il mio timer interno di generazione delle cadenze 
sottomultiple di 1 secondo.
Mi spiego: se riesco a fare un timer per esempio di 5ms (in realtà lo si 
riesce a fare soltanto facendo un interrupt leggermente più lungo e invece 
che azzerare il timer settarlo ad un valore opportuno), avrò per esempio:
1, 5, 10, 25, 50, 100, 250, 500  millisecondi e per cadenze superiori a 1 
secondo conteggio gli interrupt associati all'RTC
mi sono spiegato?
Per le mie applicazioni, comunque, ogni secondo leggo anche tutto il resto. 
A pensarci bene un burst di qualche decina di byte ogni secondo è davvero 
poco... per applicazioni di datalogging "lento" posso permettermi anche un 
po' di overhead sulla SPI! Magari però non è sempre così... ancora deve 
capitarmi una situazione dove mi servono informazioni dettagliate su 
data/ora e problemi di overhead!
Ciao
CG