Arduino RTC DS1307

Sim meu código altera a hora,executo-o quando quiser. Sim tenho Vbat ligado a pilha(+).
A unica coisa que difere do video é que não tenho um condensador entre o pino Vcc e Ground do RTC.
Acham que pode ser o problema, não ter condensador de acoplamento?

Quando dizes que atrasa... atrasa quanto? um segundo num dia? ou uma hora num dia?
Como estás a testar isso?

Fiz a montagem do circuito numa breadboard.
Acerto a hora e desligo do arduino, depois ligo novamente e vejo se esta correto. O atraso é muito significativo, de horas.

Ok... Desculpa perguntar isto, mas por vezes...

Quando acertas a hora, e enquanto o Arduino está ligado... vês a hora andar para a frente, correcto?
Ao desligares o Arduino, tomas nota da hora?

Quando ligas o Arduino de volta, a hora é igual à que tinhas antes de desligares o Arduino? Ou andou para a frente?

Já deixaste o sistema com o Arduino ligado o mesmo número de horas para ver se o atraso se repetia com o Arduino ligado?

Não tens um condensador para ligar no chip? Uma das coisas que poderá estar a acontecer é ao desligares o Arduino haver uma descarga do circuito e o chip ficar meio maluco... um condensador na alimentacão do circuito ajuda a evitar isso.

Estou a assumir que a pilha está boa também...

Outra coisa que podes fazer é activar a onda quadrada de saída e colocar essa saída ligada a um arduino para contar os pulsos de saída... aí podes ver se o relógio deixa de contar ou vai deslizando com o tempo.
Nota também que as capacitâncias em breadboard são bem chatas... e interferem com circuitos de temporizacão.

Quando acerto as horas vejo a contagem e esta correta. Já fiz também a experiência de deixar o Arduino ligado e não se atrasa.
Depois tomo nota das horas e desligo-o, reparo ao ligar novamente que ocorreu um atraso. Não parou mas a hora esta com um atraso que torna-se cada vez mais significativo dependendo do tempo que o arduino esta desligado.
Nao consigo entender, a pilha esta alimentar o RTC corretamente e já verifiquei várias vezes as ligações.
Desde já obrigado pela ajuda!

Vou fazer o que me sugeriste, colocar condensador na alimentação. Condensador de quanto? Pergunto isto, visto que já fiz isso mas talvez tenha utilizado um condensador com um valor errado. Também já estou numa fase que não sei mais que fazer.

10 micro é um valor corriqueiro que deve chegar...

Experimenta meter uma onda quadrada a sair do chip para perceberes se ele para de contar ou se está com uma frequência errada... isto se tiveres um osciloscópio.

Se voce procurar nesse documento: http://www.emesystems.com/pdfs/parts/DS1307_xtal.pdf , vera que existem especificações dos componentes internos do cristal (capacitores, ESR, resistência e etc) que é interno ao cristal, se o seu cristal estiver fora da especificação o DS ira produzir o efeito que reporta.

Edson

Se você usou um cristal como o da foto, pode ser esse o problema. Em circuitos com o DS1307, normalmente vejo um cristal diferente, como o desse circuito RTC:

Não sei qual a diferença entre eles, mas pode ser este o problema.

Edson-ECK:
Se voce procurar nesse documento: http://www.emesystems.com/pdfs/parts/DS1307_xtal.pdf , vera que existem especificações dos componentes internos do cristal (capacitores, ESR, resistência e etc) que é interno ao cristal, se o seu cristal estiver fora da especificação o DS ira produzir o efeito que reporta.

Alguma explicacão então porque é que o cristal funciona de maneira diferente quando alimentado com o Arduino?

Já tive muitos problemas usando breadboards, coisas que milagrosamente funcionaram com a soldagem dos componentes. E condensadores as vezes fazem milagres :wink:

Se funciona com o arduino não faz muito sentido não funcionar com a bateria (a não ser que a bateria esteja no osso).

A bateria é nova e já confirmei a sua tensão. E não tenho nenhum osciloscópio para efetuar o teste que me aconselharam.
Meu cristal é igual ao link que postaram (32.768KHz):

Esta dentro das especificações.
Não consigo perceber porque com Arduino funciona corretamente e sem acontece este problema.

se importaria de postar o codigo completo em que isso ocorre?

Este é o código,criei uma biblioteca.

#include "rtc.h"
#include <arduino.h>
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

void rtc::Write(){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); 
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.endTransmission();
}


void rtc::Read()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
second = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read() & 0x3f); 
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void rtc::AcertarDataHora()
{
Wire.begin();
second = 30; 
minute = 34; 
hour = 20; 
dayOfWeek = 5; 
dayOfMonth = 3; 
month = 10; 
year = 13;
Write();
}

Alguém tem alguma sugestão para a resolução deste problema?

Após testes mais rigorosos percebi que o atraso acontece em ambos os casos, com o Arduino ou apenas com a pilha de backup. O atraso é sequencial.
Estou utilizar um cristal de 32.768KHz e resistências pull-up de 10k.

Testou com outra lib ou só com a que fez?
http://playground.arduino.cc/Code/time

Sim já fiz o teste com outros códigos e o mesmo acontece. Não consigo perceber qual o problema.
Obrigado pela ajuda!

Só agora percebeu que o problema ocorre sempre? Como você testava antes?

Tens algo mais ligado na protoboard? Tentou outro Crystal, RTC, Fonte de alimentação, Baterias, fios, resistores, tudo? rs

Eu estava com preguiça, então peguei o exemplo daqui: http://www.arduinoecia.com.br/2013/04/real-time-clock-rtc-ds1307.html

Fiz poucas alterações, ficam mantidos os créditos.

//Programa : Data e Hora com DS1307
//Autor : Arduino & Cia

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; 
byte run = 0;
unsigned long lastMillis = millis();

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0){
    char inChar = (char)Serial.read(); 
    if (inChar == 'A'){
      SelecionaDataeHora(); //Esta linha pode ser retirada apos setar a data e hora
    }
  }
  
  unsigned long currentMillis = millis();
  if (currentMillis - lastMillis >= 1000) {
    Mostrarelogio();
    lastMillis = currentMillis;
  }
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 0; //Valores de 0 a 59
  byte minutos = 10; //Valores de 0 a 59
  byte horas = 13; //Valores de 0 a 23
  byte diadasemana = 6; //Valores de 0 a 6 - 0=Domgino, 1 = Segunda, etc.
  byte diadomes = 5; //Valores de 1 a 31
  byte mes = 10; //Valores de 1 a 12
  byte ano = 13; //Valores de 0 a 99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

//As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));

  Wire.write(zero); //Start no CI
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  { //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

void Mostrarelogio(){
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111); 
  int diadasemana = ConverteparaDecimal(Wire.read()); 
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());

  //Mostra a data no Serial Monitor
  Serial.print("Data: ");
  Serial.print(diadomes);
  Serial.print("/");
  Serial.print(mes);
  Serial.print("/");
  Serial.print(ano);
  Serial.print(" ");
  Serial.print("Hora : ");
  Serial.print(horas);
  Serial.print(":");
  Serial.print(minutos);
  Serial.print(":");
  Serial.print(segundos);
  switch(diadasemana)
    {
      case 0:Serial.print(", Domingo");
      break;
      case 1:Serial.print(", Segunda");
      break;
      case 2:Serial.print(", Terca");
      break;
      case 3:Serial.print(", Quarta");
      break;
      case 4:Serial.print(", Quinta");
      break;
      case 5:Serial.print(", Sexta");
      break;
      case 6:Serial.print(", Sabado");
    }
    Serial.println();
}

E o resultado foi o esperado (omiti as linhas intermediárias):
data hora do pc/ recebido do arduino

Connected
05/10/2013 13:09:44 Received: Data: 5/10/13 Hora : 13:7:53, Sabado
(...)
05/10/2013 13:09:59 Received: Data: 5/10/13 Hora : 13:8:8, Sabado
Sent: A
05/10/2013 13:10:00 Received: Data: 5/10/13 Hora : 13:10:0, Sabado
05/10/2013 13:10:01 Received: Data: 5/10/13 Hora : 13:10:1, Sabado
05/10/2013 13:10:02 Received: Data: 5/10/13 Hora : 13:10:2, Sabado
(...)
05/10/2013 13:15:25 Received: Data: 5/10/13 Hora : 13:15:25, Sabado
Disconnected
Connected
05/10/2013 13:28:22 Received: Data: 5/10/13 Hora : 13:28:21, Sabado
05/10/2013 13:28:23 Received: Data: 5/10/13 Hora : 13:28:22, Sabado
(...)
05/10/2013 13:29:06 Received: Data: 5/10/13 Hora : 13:29:5, Sabado
05/10/2013 13:29:07 Received: Data: 5/10/13 Hora : 13:29:6, Sabado
05/10/2013 13:29:08 Received: Data: 5/10/13 Hora : 13:29:7, Sabado
Disconnected
Connected
05/10/2013 13:34:03 Received: Data: 5/10/13 Hora : 13:34:3, Sabado
05/10/2013 13:34:04 Received: Data: 5/10/13 Hora : 13:34:4, Sabado
(...)
05/10/2013 13:36:52 Received: Data: 5/10/13 Hora : 13:36:52, Sabado
05/10/2013 13:36:53 Received: Data: 5/10/13 Hora : 13:36:53, Sabado
Disconnected
Connected
05/10/2013 15:43:10 Received: Data: 5/10/13 Hora : 15:43:10, Sabado
05/10/2013 15:43:11 Received: Data: 5/10/13 Hora : 15:43:11, Sabado
05/10/2013 15:43:20 Received: Data: 5/10/13 Hora : 15:43:20, Sabado
05/10/2013 15:43:21 Received: Data: 5/10/13 Hora : 15:43:21, Sabado
Disconnected

Não imagino o que mais podemos fazer.