RTC e ora errata

Buonasera a tutti, vi chiedo aiuto per la prima volta riguardo ad un problema con l'RTC ds1307 e arduino MEGA.

Ho scaricato la libreria RTClib.h, ho collegato 5V e GND e poi direttamente SCL con SCL e SDA con SDA.

Ho impostato data e orario attuale da codice ma sul monitor seriale mi ritornano valori decisamente sballati, anche se i secondi vanno avanti esattamente ( data 27/15/2099 ora 0:3:34 )

Questo è il codice se essere d'aiuto. una cosa che forse vi è utile sapere è che se lasciavo serial.begin(57600) come da esempio mi uscivano simboli strani, niente a che vedere con data e ora, mettendolo al classico 9600 almeno segna qualcosa di decente:

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(2014,03,12,21,24,00));
}
}

void loop () {
DateTime now = RTC.now();

Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.println();
delay(3000);
}

Grazie per l'aiuto!

... le resistenze di pull-up sul bus I2C ???

Guglielmo

E la batteria tampone? Ce l'hai messa?
Ho riscontrato di persona che senza batteria il DS1307 si comporta in modo strano, alle volte dando numeri senza senso.

leo72:
Ho riscontrato di persona che senza batteria il DS1307 si comporta in modo strano, alle volte dando numeri senza senso.

In caso di assenza, è obbligatorio connettere a massa il pin su cui dovrebbe essere connessa la batteria ... :wink:

... Pagina 6 del datasheet.

Guglielmo

gpb01:
In caso di assenza, è obbligatorio connettere a massa il pin su cui dovrebbe essere connessa la batteria ... :wink:

... Pagina 6 del datasheet.

Malefici datasheet... ]:smiley: ]:smiley:
Comunque io di solito uso il PCF8563 come RTC, quindi sono parzialmente perdonato. :sweat_smile:

Vi ringrazio innanzitutto per la disponibilità!

Guglielmo, avevo trovato uno schema dove diceva di mettere le resistenze di pull up da 1k, ma mettendole non funziona più niente, non sò se magari il valore sia errato o cos'altro potrebbe essere. Usandole mi ritorna "" 165/165/2165 165:165:57 "".

Leo72, la batteria tampone è presente.

bubba21:
Leo72, la batteria tampone è presente.

Ok presente; ma anche piena? :wink: :wink: :wink: :wink:

Ciao Uwe

bubba21:
Guglielmo, avevo trovato uno schema dove diceva di mettere le resistenze di pull up da 1k, ma mettendole non funziona più niente, non sò se magari il valore sia errato o cos'altro potrebbe essere. Usandole mi ritorna "" 165/165/2165 165:165:57 "".

bubba21, le resistenze di pull-up NON sono una cosa che puoi decidere se mettere o meno, SONO obbligatorie e fanno parte delle specifiche del bus I2C, quindi, salvo non siano già presenti su qualche altro device collegato al bus, DEVI mettere due resistenze (una per SCL e una per SDA) vero il +5V da ... 3.3K vanno bene (probabilmente anche 4.7K) ed i fili di collegamento [devono essere molto corti](http://devono essere molto corti). Guarda anche lo schema nella prima pagina del datasheet ...

QUI un piccolo tutorial sul bus I2C ...

Guglielmo

Leo72, si ho controllato, è 3.9V, (mi pare di aver letto che il range arriva fino a 3.5V oppure sono in errore?).

Guglielmo, purtroppo le mie nozioni di elettronica sono veramente basse, sto studiando piano piano ma è dura. Questa mattina prima di andare a lavoro (sì sono pazzo! :slight_smile: ) ho acceso il computer al volo, accorciato i fili (anche se non sò quanto sia il massimo, io esco dal ds1307 con 5cm di fili vado sulla bradboard e con altri 10cm di filo vado all'arduino) e messo due resistenze da 4.7k in pull up (non avevo al momento quelle da 3.3k).

Ho avviato il tutto e ha iniziato a segnarmi ora e data corretta come impostato da codice (avevo impostato l'orario di ieri).

Dopo aver verificato appunto che funzionasse il tutto ho modificato giorno e ora ad oggi mattina ma niente da fare, resta memorizzato quello della notte. Ho provato a togliere la batteria tampone e spegnere l'arduino. Ho ricaricato il codice ma a quel punto ha iniziato a ritornarmi ora e data errate, a memoria non le ricordo ma erano simili a quelle che avevo inizialmente: data 27/15/2099 ora 0:3:34 .

Ti ringrazio per i link, questa sera se trovo un attimo inizio a studiarci su, grazie ancora a tutti per l'aiuto!

bubba21 ... vuoi imparare qualche cosa ? ... leggiti con pazienza le 16 pagine che compongono QUESTO thread ...
... sono molto semplici, a volte divertenti, a volte surreali, ma, se li sai estrarre, dentro ci sono parecchi consigli che ti possono essere utili ... specie nella seconda metà :wink:

Buona lettura ...

Guglielmo

Aggiungo, per esperienza personale, che la batteria a volte non fa ben contatto con i terminali del porta batteria.

Oltre che a me, è capitato anche ad un altro paio di utenti.

Guglielmo, grazie per lo spunto, l'ho letto velocemente mentre mangiavo e sembra davvero molto interessante, lo salvo subito nei preferiti! :wink:

cyberhs, ho notato questa cosa, vado a memoria, ma mi sembra che se tolgo la batteria legge "165/165/2165 165:165:57", ma ripeto, vado a memoria, questa sera rifaccio la prova per esserne certo e per escludere che sia la batteria.

Ricapitolando quando finisco di lavorare se ho un minuto provo a mettere le resistenze di pull up da 3.3k e vedo che dice.

Grazie ancora per l'aiuto. :slight_smile:

Backup Supply Input for Any Standard 3V Lithium Cell or Other Energy Source. Battery voltage must be held between the minimum and maximum limits for proper operation. Diodes in series between the battery and the VBAT pin may prevent proper operation. If a backup supply is not required, VBAT must be grounded. The nominal power - fail trip point (VPF) voltage at which access to the RTC and user RAM is denied is set by the internal circuitry as 1.25 x VBAT nominal. A lithium battery with 48mAh or greater will back up the DS1307 for more than 10 years in the absence of power at +25°C

When VCC falls below 1.25 x VBAT, the device terminates an access in progress and resets the device
address counter. Inputs to the device will not be recognized at this time to prevent erroneous data from being written to the device from an out - of - tolerance system. When VCC falls below VBAT, the device switches into a low-current battery-backup mode. Upon power-up, the device switches from battery to VCCwhen VCC
is greater than VBAT +0.2V and recognizes inputs when VCC is greater than 1.25 x VBAT. The block diagram in Figure 1 shows the main elements of the serial RTC.

La comutazione tra alimentazione 5V e batteria avviene con riferimento alla tensioen di batteria ( 1,25* VBAT ) che sono 3,75V se la batteria é a 3,0V ma 4,875 se la batteria é a 3,9V. I 5V della USB possono essere facilmente sotto 4,875V e percui il RTC va in protezione non permettendo acesso ai registri e percui non riesci a programmarlo. Prova con una batteria 3,0V oppure senza batteria mettendo il Pin VBAT a massa.

Ciao Uwe

uwefed, grazie per l'aiuto.

Le sto provando tutte ma niente da fare, sto diventando scemo, anche perchè i collegamenti sono davvero banali alla fine!

Ho messo le resistenze di pull up da 3k3, tolto la batteria, rimessa, messo in corto bat e ground ma niente da fare, continuo ad avere risposte strane.

Per esempio ho tolto la batteria, messo in corto BAT e GND, riattaccato la usb, caricato il programma con l'orario aggiornato ed è partito al primo colpo. Tolto alimentazione sempre tramite usb, ridata e non va più, la data e l'ora che mi ritorna è 31/15/2099 0:0:43 .

Riavviato un'altra volta ancora, la data viene sbagliata come sopra, l'ora invece esatta :~

Non riesco a trovare una logica in questi errori.

... vedi perché io, per parlare con DS1307 mi rifiuto di usare librerie preconfezionate (... a parte ovviamente la Wire) ... :roll_eyes: :roll_eyes: :roll_eyes:

Guglielmo

bubba21:
Per esempio ho tolto la batteria, messo in corto BAT e GND, riattaccato la usb, caricato il programma con l'orario aggiornato ed è partito al primo colpo. Tolto alimentazione sempre tramite usb, ridata e non va più, la data e l'ora che mi ritorna è 31/15/2099 0:0:43 .

Riavviato un'altra volta ancora, la data viene sbagliata come sopra, l'ora invece esatta :~

Non riesco a trovare una logica in questi errori.

Senza batteria é ovvio ch non mantiene i dati.
Ciao Uwe

Guglielmo, ma dici che è un problema di libreria?!

Uwefed, quello si, però ogni volta gli mandavo via lo sketch con l'ora dalla quale sarebbe dovuto partire

bubba21:
Guglielmo, ma dici che è un problema di libreria?!

Non posso saperlo visto che ... non la uso ... come hai visto nel thread che ti ho linkato ... il DS1307 è un chip così semplice, che preferisco gestirlo io direttamente :wink:

Guglielmo

gpb01:
Non posso saperlo visto che ... non la uso ... come hai visto nel thread che ti ho linkato ... il DS1307 è un chip così semplice, che preferisco gestirlo io direttamente :wink:

Guglielmo

Purtroppo sono alle prime armi, sarebbe davvero dura gestire anche una cosa così semplice :slight_smile:

Invece ho fatto delle prove, ho usato un altro esempio dove viene "dichiarato" RTC_Millis RTC anzichè RTC_DS1307 RTC e questo funziona perfettamente (stavo facendo le prove senza batteria con il ponte tra Vbatt e GND).

Ho tolto il ponte, inserito la batteria e nella solita riga di codice "aggiusto" l'ora RTC.adjust(DateTime(2014,03,13,23,44,20))
Ogni volta che vado in monitor seriale (anche senza spegnere alimentazione) il conteggio si resetta all'ora impostata da codice invece che proseguire.

La stessa prova l'ho rifatta togliendo la batteria e rimettendo il ponte. Senza togliere alimentazione ho semplicemente aperto il monitor seriale, l'ho chiuso e l'ho successivamente riaperto, e anche in questo caso il conteggio è ripartito dall'ora impostata da codice. Qualche suggerimento? :slight_smile:

Mi sembra più che normale ...
... ogni volta che apri il monitor seriale, avviene un RESET di Arduino ... è voluto così da progetto ed è il modo in cui il bootloader riesce a caricare i programmi !

La soluzione è modificare il programma in modo che NON imposti l'ora ogni volta che parte, ma solo se gli dai un comando di farlo !!!

Guglielmo