problema con Real Time Clock ds1302

Scusate se rompo ancora, ma purtroppo sono nuovo e per via dell'Università mi trovo a svolgere compiti complicati per un novello.

Ho comprato una shield preconfezionata con modulo RTC che lavora con Ds1302

In internet ho trovato questo tutorial เรียนรู้จากครูสยาม: DS1302 RTC Module che purtroppo è in arabo o qualche lingua simile per cui mi sono adattato con codice e figure, ho modificato alcune funzioni read/write aggiornate con l'IDE 1.0.5

Il risultato è senza giorno della settimana, anno giusto, giorno e mese 00, minuti 00 e secondi una volta corretti una volta 00:

2013-00-00 17:21:00
2013-00-00 17:21:33
2013-00-00 17:21:00
2013-00-00 17:21:35
2013-00-00 17:21:00

Questo quanto stampato nella seriale

Sapete che problema può avere?

Scusa ... hai già visto qui : Arduino Playground - DS1302

Mi sembra ci sia un bel po' di informazioni ... in una lingua più comprensibile XD XD XD

Guglielmo

intanto grazie mille per la risposta!!!

avevo già visto la pagina che ho riletto e integrato con questa: DHOB: Real Time Clock (RTC) con DS1302 ed Arduino che di fatto utilizza credo uno sviluppo del link che mi hai mandato.

I collegamenti so che son giusti, li ho fatti sia guardando la scheda sia controllando con la foto, purtroppo però i dati che mi escono sono i più disparati. Il mese va a zero una volta si e una no, l'ora non mi pare rispetti l'indicazione 'iniziale' che gli viene fornita...

Nessuno di voi ha usato questo tipo di RTC in modo che possa studiarmi il funzionamento da un codice che funziona di sicuro?

(adesso faccio una prova 'mia' di tutti i cavi, sia mai che uno conduce male)

Questa è piuttosto vecchiotta ... GitHub - msparks/arduino-ds1302: Arduino library for the DS1302 Real Time Clock chip ma contiene un semplice esempio che dovrebbe essere sicuramente funzionante ... prova.

Se sia l'esempio del PlayGround che quest'altro NON ti funzionano ... io comincerei a dubitare o dell'HW o dei collegamenti ...

Purtroppo di più non so dirti visto che io uso i DS1307 o i DS3231SN ...

Guglielmo

Nonostante fosse quello che ha utilizzato il sito arabo, e che quindi avevo già inserito, ora funziona...probabilmente quelle 2/3 modifiche ai pin che mi faceva fare il sito erano deleterie. Ora capita solo che ogni tanto la lettura di qualche dato va a zero, ma suppongo sia perchè è fatto con cavi volanti...

Allora sono riuscito a risolvere, nel senso che il sensore funziona e ho lo sketch per farlo funzionare.
Il problema s'è semplicemente spostato...i cavi =(

Questo è quello che succede:

Metto i jumper (inaffidabili) e va! -si ogni tanto salta ma compatibilmente con qualche movimento dei cavetti-
Preparo un cavo 'definitivo' in modo da risolvere i salti, lo metto, non va più nulla
Ero solo e senza strumenti ho saldato male così ho preso il tester e controllato tutto: OK
Non contento prendo dei led e provo a vedere se con ogni possibile collegamento va: OK
Lo rimonto: NIENTE DA FARE
Prendo un altro sensore con innesti 'simili' in numero: FUNZIONA (entrambi sono digitali)
Torno su quello: NIENTE

Qualcuno sa dirmi per quale arcano motivo non deve andare?

EDIT: piccolo dettaglio se può servire
in genere mi sparisce del tutto il giorno della settimana, rimane l'anno, e il resto salta tutto a zero. Qualche volta va a zero (2000) anche l'anno

gpb01:
Questa è piuttosto vecchiotta ... GitHub - msparks/arduino-ds1302: Arduino library for the DS1302 Real Time Clock chip ma contiene un semplice esempio che dovrebbe essere sicuramente funzionante ... prova.

Se sia l'esempio del PlayGround che quest'altro NON ti funzionano ... io comincerei a dubitare o dell'HW o dei collegamenti ...

Purtroppo di più non so dirti visto che io uso i DS1307 o i DS3231SN ...

Guglielmo

Scusate, mi inserisco nella discussione per un problema diverso e con il DS1307, visto che lo usi regolarmente. Premesso che mi riferisco a prove fatte un mesetto fa e poi interrotte, è solo per sapere se ne sai qualcosa: schema classico, ad ogni prima alimentazione l'orologio del DS1307 è bloccato, devo per forza staccare e ricollegare l'alimentazione e poi parte senza più fermarsi, almeno fino al prossimo spegnimento; basta far trascorrere qualche ora ed al successivo avvio stesso problema. :cold_sweat:

@Michele : Ciao Michele, schema classico intendi come quello che allego ?

Perché non mi è mai capitato quel problema ... però, come vedi, io ho sempre un piccola batteria che, anche quando tutto è staccato, comunque tiene vivo l'RTC :wink:

Guglielmo

Sì, esattamente quello, anche la batteria tampone e le R di pull-up sul bus :slight_smile: il pin 7 è libero in quanto non mi serve; ho visto in un Topic che UWE consiglia un link su github con uno sketch, me lo sono segnato, può essere che il problema sia di inizializzazione di qualche bit o valore. Grazie della risposta, se hai qualche indicazione non risparmiarmela :wink:

Non è che siano molti bit da inizializzare ... immagino tu abbia il datasheet allegato ... :wink:

Guglielmo

DS1307.pdf (348 KB)

Sì, era per dire, cercavo qualcosa di strano, riproverò per bene, a questo punto poteva essere solo qualche contatto strano sulla bread, ne riparliamo al mio rientro. Grazie XD

con la 1302 mi sono arreso...no vabbè mi è arrivata la 1307 che attendevo per il progetto che dovrò fare e mi concentro su quella, pare che vada (sono ancora ai cavetti volanti) volevo solo sapere come, nel codice che posto qui e recuperato su internet (ho solo modificato la scrittura da lcd a seriale), posso modificare i pin di ingresso dei dati.

So che per l'UNO devo usare 4 e 5, per la MEGA 20 e 21 (SDA e SCL comunque ora non ce l'ho sotto mano) come posso impostare di usarne altri? Perchè avrò una miriade di roba da collegare, non so ancora come sarà disposta quindi mi sarebbe molto di aiuto sapere come posso mettere la mani a tutto. Solo che credo che qui siano impostati nella libreria o qualcosa del genere...

/*
 orologio.pde
 Il programma mostra il funzionamento del modulo
 Modulo Real Time Clock DS1307 della SparkFun
 mostrando ora e data sul monitor seriale
 
 Pin Analogic 4  -> SDA DS1307 Sparkfun
 Pin Analogic 5  -> SCL DS1307 Sparkfun
 
 Creato il 07/07/2012
 da Adriano Gandolfo <http://www.adrirobot.it>
 This example code is in the public domain.
 */

#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68

// Conversione normali numeri decimali in binario decimale
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// Conversione decimale binario a normali numeri decimali
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
/* 
 1) Imposta la data e l'ora del DS1307
 2) Avvia l'orologio
 3) Imposta la modalità di ora in orologio a 24 ore
 */
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second)); // 0 to bit 7 avvia l'orologio
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(0x10); // invia 0x10 (hex) 00010000 (binario) al registro di controllo - si attiva ad onda quadra
  Wire.endTransmission();
}
// Ottiene la data e l'ora dal DS1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Ripristina il puntatore del registro
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  // Alcuni di questi sono necessari, perché le maschere di alcuni bit sono bit di controllo
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f); // Occorre modificare questo se 12 ore am/pm
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void setup()
{

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);
 /*
 Modificare i successivi valori se si desidera impostare l'orologio.
 Occorre attivare la linea setDateDs1307 una volta quindi rimuovere
 la chiamata.
 */
  second = 0;
  minute = 32;
  hour = 17;
  dayOfWeek = 2;
  dayOfMonth = 19;
  month = 8;
  year = 13;

  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);


}
void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  Serial.println(" ");
  switch(dayOfWeek){
  case 1:
    Serial.print("Dom");
    break;
  case 2:
    Serial.print("Lun");
    break;
  case 3:
    Serial.print("Mar");
    break;
  case 4:
    Serial.print("Mer");
    break;
  case 5:
    Serial.print("Gio");
    break;
  case 6:
    Serial.print("Ven");
    break;
  case 7:
    Serial.print("Sab");
    break;
  }
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/20");
  Serial.print(year, DEC);
  Serial.print(" ");
  Serial.print(hour, DEC);
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  
  
  delay(1000);
}

mastraa:
So che per l'UNO devo usare 4 e 5, per la MEGA 20 e 21 (SDA e SCL comunque ora non ce l'ho sotto mano) come posso impostare di usarne altri?

Non puoi usare pin diversi, la periferica hardware che gestisce l'I2C è collegata a quei piedini.
Potresti usare una I2C software su altri pin, ma rimarrebbe una emulazione a carico del micro.

ok, ma se io ho un sensore digitale di temperatura e l'rtc come faccio a farli funzionare insieme?

con la ds1302 avevo trovato uno sketch che usava altri pin...non si può proprio fare?

l'I2C è un bus e ogni periferica ha un proprio indirizzo univoco, quindi non si possono creare conflitti

Nel datasheet, a pag. 6 (http://datasheets.maximintegrated.com/en/ds/DS1307.pdf) c'è scritto

The DS1307 is a low-power clock/calendar with 56 bytes of battery-backed SRAM. The lock/calendar provides seconds, minutes, hours, day, date, month, and year information. The date at the end of the month is automatically adjusted for months with fewer than 31 days, including corrections for leap year.
The DS1307 operates as a slave device on the I2C bus. Access is obtained by implementing a START condition and providing a device identification code followed by a register address. Subsequent registers can be accessed sequentially until a STOP condition is executed.
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 lowcurrent battery-backup mode.
Upon power-up, the device switches from battery to VCC when 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

A che tensione lo alimenti?
Gli dai uno START prima di leggerlo? (potrebbe farlo la libreria in automagico)

ok, credo di essere riuscito a fare ciò che volevo!!! GRAZIE

Tutto sembra ricondurre alla batteria, alla quale in realtà ho dato poco peso nelle prove; ripeto prove al volo e senza convinzione, al rientro terrò conto di tutto ciò. Grazie :slight_smile:

ciao a tutti,
sono un neofita e mi sto appassionando sempre più a questo mondo :grin:

anche io mi sto schiantando con questo componente (DS1302)
quello in mio possesso è questo della foto

come sketch per fare i test ho usato quello in questa pagina
playground.arduino.cc/Main/DS1302
aggiungendo la gestione di un LCD 16x2

dopo essere impazzito per impostare data e ora (per fare in modo che il tutto sia visualizzata correttamente devo staccare e riattaccare i pin 6 e 7 mentre arduino è alimentato... :~ )
ora non riesco a mantenere in memoria i dati (ho anche cambiato la batteria ma il risultato non cambia).
in pratica alimento con batteria da 9V, sul display viene visualizzata l'ora da me impostata (es. 10.05.00), dopo qualche minuto stacco la batteria per qualche secondo, riattacco e l'ora viene resettata a quella che ho impostato all'inizio cioè 10.05.00
il RTC non fa il suo dovere =(

qualcuno riesce a darmi una mano? avete idea di cosa succeda?
la batteria è buona, l'unica cosa che mi viene in mente è che il componente non funzioni
grazie 1000!

Scusa ma senza codice... a me viene il sospetto che tu imposti alle 10:05:00 nel setup()
Logicamente se togli la corrente Arduino si resetta e rifà l'impostazione del RTC a quell'orario.

Dovresti fare uno sketch diverso, che faccia solo impostazione orario nella setup() con loop() vuoto.
A questo punto il tuo sketch completo non richiede più l'impostazione iniziale nel setup()
Ma senza codice... solo supposizioni.