Go Down

Topic: Arduino RTC DS1307 (Read 12369 times) previous topic - next topic

Mortis

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

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).

vasr

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):
http://www.adafruit.com/products/264
Esta dentro das especificações.
Não consigo perceber porque com Arduino funciona corretamente e sem acontece este problema.

fabio_h

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

vasr

Este é o código,criei uma biblioteca.
Code: [Select]
#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();
}

vasr

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

vasr

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.

Lago

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

vasr

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

Mortis

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.
Code: [Select]

//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
Code: [Select]

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.

vasr

Estou a utilizar a própria alimentação do Arduino e não tenho mais nada ligado para além do RTC.
A unica coisa que troquei até agora foram os fios.
Aqui esta o extrato de uma falha;
Code: [Select]
Data: 5/10/13 Hora : 21:2:36, Sabado
Data: 5/10/13 Hora : 21:2:37, Sabado
Data: 5/10/13 Hora : 21:2:38, Sabado
Data: 5/10/13 Hora : 21:2:39, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:41, Sabado


vasr

Não tera haver com o Ground?
Vejam este tópico:
http://lusorobotica.com/index.php?topic=681.90

bubulindo

Tu é que tens o problema e o hardware montado em casa... porque não experimentas?

A única coisa que te posso dizer é que pode ter a ver com o Ground... mas tu és a única pessoa, neste momento, que pode testar.
This... is a hobby.

Mortis

Mas o que causaria a interferência com o ground? Algum componente no circuito do arduino?

Fiz testes usando o atemega328 na protoboard + FTDI + RTC, sendo alimentados por 5v pela USB do notebook e 3v por uma bateria ML1220, deixei mais horas em standby, desconectei e conectei a USB em intervalos de tempo e não percebi nenhuma alteração.

fabio_h


Estou a utilizar a própria alimentação do Arduino e não tenho mais nada ligado para além do RTC.
A unica coisa que troquei até agora foram os fios.
Aqui esta o extrato de uma falha;
Code: [Select]
Data: 5/10/13 Hora : 21:2:36, Sabado
Data: 5/10/13 Hora : 21:2:37, Sabado
Data: 5/10/13 Hora : 21:2:38, Sabado
Data: 5/10/13 Hora : 21:2:39, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:41, Sabado




O erro que apresenta é esse? duas linhas com o mesmo segundo?
Dependendo do codigo, o arduino pode fazer duas requisições dentro do mesmo segundo, dando a impressão que o relogio não andou... para tirar a duvida coloque um led no clock out do RTC e acompanhe os tics...
Qual a procedência do chip e do cristal?

Mortis



Estou a utilizar a própria alimentação do Arduino e não tenho mais nada ligado para além do RTC.
A unica coisa que troquei até agora foram os fios.
Aqui esta o extrato de uma falha;
Code: [Select]
Data: 5/10/13 Hora : 21:2:36, Sabado
Data: 5/10/13 Hora : 21:2:37, Sabado
Data: 5/10/13 Hora : 21:2:38, Sabado
Data: 5/10/13 Hora : 21:2:39, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:40, Sabado
Data: 5/10/13 Hora : 21:2:41, Sabado




O erro que apresenta é esse? duas linhas com o mesmo segundo?
Dependendo do codigo, o arduino pode fazer duas requisições dentro do mesmo segundo, dando a impressão que o relogio não andou... para tirar a duvida coloque um led no clock out do RTC e acompanhe os tics...
Qual a procedência do chip e do cristal?



Se ele usou o código que postei a serial só é disparada a cada 1000 millis

Go Up