Real Time Clock RTC DS1307

Dunque, il mio problema e' come discriminare se il chip RTC funziona o no.
La libreria che uso e' la DS1307RTC.h

Nel codice ho scritto:

setSyncProvider(RTC.get); // the function to get the time from the RTC
setSyncInterval(1); // set the number of seconds between re-sync

if(timeStatus()!= timeSet)
{
Serial.println("RTC Not working");
SignalFrom=FALSE;
}
else
{
Serial.println("RTC has set the system time");
SignalFrom=RTC_IN;
};

Il problema e' ch sia con il chip inserito nella testboard che senza chip mi dice sempre l'RTC ha settato tutto.
Cosa sbaglio?
:frowning:

Hai provato questo esempio

http://bildr.org/2011/03/ds1307-arduino/
Quello setta il RTC e poi ogni secondo stampa l' ora e la data sul terminale.

Se questo funziona vuol dire che funziona il RTC e il collegamento.
Ciao Uwe

Quando ho usato il DS1307 non ho usato quella lib ma un'altra chiamata RTClib, che non mi ricordo dove l'ho presa. Con essa il controllo è

Wire.begin();
RTC.begin();

if (! RTC.isrunning()) {
  Serial.println("RTC is NOT running!");
}

Cmq si tratta di controllare il bit 7 del registro h00 e verificare se l'oscillatore è acceso o spento. Quando cade la tensione, quel bit va a 0, segno che l'orologio è fermo.

leo72:
Cmq si tratta di controllare il bit 7 del registro h00 e verificare se l'oscillatore è acceso o spento. Quando cade la tensione, quel bit va a 0, segno che l'orologio è fermo.

Questo mi piace, ma...
come si fa?
:slight_smile:

Ciao
Ugo

Non sarà la soluzione migliore perchè devi uplodare uno sketch solo per testare il bus i2c, comunque è una soluzione iper veloce ed affidabile...prova questo i2c scanner ti dirà subito se Arduino vede il chip collegato.

Bello ed utile il codice che hai postato....
:*

Attenzione: quel codice fa un scan solo dei primi 100 indirizzi non dei 127 possibili.
Devi cambiare:
byte end_address = 100;
in
byte end_address = 127;

Ciao Uwe

Ottimo. Funziona!
Alla fine il controllo del modulo vero e proprio si riduce a questo :

if(twi_writeTo(I2C_addr, &data, 0, 1))
{
// Serial.println("RTC Not working");
SignalFrom=FALSE;
}
else
{
// Serial.println("RTC has set the system time");
SignalFrom=RTC_IN;
};

Dove "I2C_addr" e' l'indirizzo del modulo RTC.

Grazie mille!
Appena m'arriva vado ad incasinarmi con il timing prelevato dal modulo GPS, state pronti a ricevere altre domande :slight_smile:

Ugo

Non ho capito il tuo codice ma non mi pare che sia un controllo corretto.
Il DS1307 può anche rispondere, quindi essere raggiungibile (e ciò implica che hai usato il giusto indirizzo, che il bus I2C è impostato correttamente e che il codice è corretto) ma l'RTC interno può essere fermo, segno che ha avuto un blackout e l'orologio non cammina. Nel caso in cui quel flag sia a 1, devi riprogrammare l'orario per far ripartire l'orologio.

leo72:
Non ho capito il tuo codice ma non mi pare che sia un controllo corretto.
Il DS1307 può anche rispondere, quindi essere raggiungibile (e ciò implica che hai usato il giusto indirizzo, che il bus I2C è impostato correttamente e che il codice è corretto) ma l'RTC interno può essere fermo, segno che ha avuto un blackout e l'orologio non cammina. Nel caso in cui quel flag sia a 1, devi riprogrammare l'orario per far ripartire l'orologio.

Urca... che pulce nell'orecchio!
Dunque, a me interessa controllare che l'RTC sia funzionante e che "cammini", non mi interessa invece sapere se l'orario e' corretto (lo uso come contasecondi).
Cosi' discrimino se RTC funziona e comunica, ma come faccio ad essere sicuro che "cammina"? Come lo controllo?

Grazie
Ugo

Te l'ho già detto... =(

Cmq si tratta di controllare il bit 7 del registro h00 e verificare se l'oscillatore è acceso o spento. Quando cade la tensione, quel bit va a 0, segno che l'orologio è fermo.

leo72:
Te l'ho già detto... =(

Cmq si tratta di controllare il bit 7 del registro h00 e verificare se l'oscillatore è acceso o spento. Quando cade la tensione, quel bit va a 0, segno che l'orologio è fermo.

Suvvia non fare quella faccetta triste, ci vuol pazienza con le persone anziane! :wink:
E vero che tu lo hai detto, ma io avevo anche risposto chiedendo <<ok, ma come si fa???>>
:slight_smile:

Ugo

Persone anziane? Guarda che neanche io sono di primo pelo, eh! :sweat_smile:

Cmq usando le funzioni dei bit del linguaggio Arduino.
Mandi un comando di lettura al DS1307 e richiedi il valore del registro 0x00 poi fai un bel bitRead del 7° bit.

leo72:
Persone anziane? Guarda che neanche io sono di primo pelo, eh! :sweat_smile:

Va bene, vorra' dire che anch'io dovro' mettere pazienza con te XD

Cmq usando le funzioni dei bit del linguaggio Arduino.
Mandi un comando di lettura al DS1307

Un comando di lettura qualsiasi? Tipo:

timeStatus()!= timeSet;

puo' bastare?

e richiedi il valore del registro 0x00

Qui casca l'asino (io) :blush:

Ti consiglio di usare una libreria per questo chip. Va bene anche quella di Adafruit

Una volta che l'hai messa basta fare un if (!Rtc.isrunning()) { codice } per inserire un check per controllare se l'orologio sta camminando. Ovviamente se non comunica con l'orologio, è successo qualcosa oppure la connessione non è buona. Quella lib ha anche 3 esempi di codice per vedere come usarla.

leo72:
Ti consiglio di usare una libreria per questo chip. Va bene anche quella di Adafruit
GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC Arduino library

Una volta che l'hai messa basta fare un if (!Rtc.isrunning()) { codice } per inserire un check per controllare se l'orologio sta camminando. Ovviamente se non comunica con l'orologio, è successo qualcosa oppure la connessione non è buona. Quella lib ha anche 3 esempi di codice per vedere come usarla.

Provato con uno dei tre esempi (DS1307.pde) ma non funziona.
Si ripropone paro-paro il problema che avevo all'inizio, cioe' che se avvio il tutto, e l'RTC non funziona ok, mi avvisa, ma se avvio il tutto regolarmente e sfilo il chip durante il running non mi avvisa che l'RTC non funziona piu' (ovviamente inserendo if (!Rtc.isrunning()) nella funzione loop ) .

Ugo

ugomarinelli:
Provato con uno dei tre esempi (DS1307.pde) ma non funziona.
Si ripropone paro-paro il problema che avevo all'inizio, cioe' che se avvio il tutto, e l'RTC non funziona ok, mi avvisa, ma se avvio il tutto regolarmente e sfilo il chip durante il running non mi avvisa che l'RTC non funziona piu' (ovviamente inserendo if (!Rtc.isrunning()) nella funzione loop ) .

Eh?!?
Cioè sfili il chip mentre sta funzionando?? Argh! Non lo fare....
Cmq cosa intendi con il non ti avvisa più? Quando? Riavviando il programma?

leo72:
Eh?!?
Cioè sfili il chip mentre sta funzionando?? Argh! Non lo fare....

Ormai l'ho fatto. Anche piu' volte.

leo72:
Cmq cosa intendi con il non ti avvisa più? Quando? Riavviando il programma?

Significa che il codice che mi hai dato tu:

if (! RTC.isrunning())
Serial.println("RTC is NOT running!");

NON stampa nulla.
E, come t'ho gia' detto, questo controllo lo faccio dentro loop().
Quindi ad ogni "giro" lui dovrebbe testare se il chip fa il suo dovere o no.
Peccato che non lo fa.

Ok. Allora forse è un bug di quella libreria. Prova a cercarne un'altra oppure fai come ti ho detto, è il modo più semplice.

leo72:
Ok. Allora forse è un bug di quella libreria. Prova a cercarne un'altra oppure fai come ti ho detto, è il modo più semplice.

Ok, faro' un po' di test in giro, grazie comunque per lo sbattimento.

BTW... ho visto che hai solo 35 anni. Esattamente 2/3 dei miei.
:wink:

Ugo