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?
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.
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.
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;
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
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?
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.
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!
E vero che tu lo hai detto, ma io avevo anche risposto chiedendo <<ok, ma come si fa???>>
Persone anziane? Guarda che neanche io sono di primo pelo, eh!
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.
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.
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 ) .
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.