Problemas RTC via I2C

Boa tarde,

Implementei um hardware de RTC utilizando o CI DS1307, e conectei-o com um Arduino Leonardo via I2C.

Usando a RTCLib.h, criada por Jee Labs, o ajuste do relógio e obtenção de dados é perfeita, entretanto, tenho o intuito de criar uma biblioteca própria para um uso específico que tenho, e aí que entra o problema.

Tentando fazer escritas e leituras no RTC com funções da biblioteca Wire.h, nao obtenho os resultados esperados.

Tentei pegar códigos de vários sites que fazem esse acesso ao RTC diretamente via Wire.h e nenhum deles funcionou… Alguem poderia me ajudar? Postarei abaixo o código que nao funcionou:

#include <Wire.h>

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

//escrevendo os valores seg 0 min 2 hora 3 dia 1…
Wire.beginTransmission(0x68);

Wire.write(0);
Wire.write(0b00001000);
Wire.write(0b00001000);
Wire.write(0b00001000);
Wire.write(0b00000001);
Wire.write(0b00000001);
Wire.write(0b00000001);
Wire.write(0b00000001);
Wire.write(0b10000000);

Wire.endTransmission();
}

char ss, mm, hh, a, b, c, d;

void loop(){

//começamos leitura
Wire.beginTransmission(0x68);
//escolho 1 reg
Wire.write(0);

Wire.endTransmission();

Wire.requestFrom(0x68,7);

ss = Wire.read();
mm = Wire.read();
hh = Wire.read();
a = Wire.read();
b = Wire.read();
c = Wire.read();
d = Wire.read();

Serial.println(ss);
Serial.println(mm);
Serial.println(hh);
Serial.println(a);
Serial.println(b);
Serial.println(c);
Serial.println(d);
Serial.println("");
delay(3000);
}

Obrigado!

boa tarde colega,

Comprei um RTC e possuo um MEGA, porém não consigo fazer-lo funcionar, utilizei esta mesma biblioteca que você e conectei os cabos como encontrado na internet, porta digital 4 e 5 e analogica do sinal na 2 além do positivo e negativo, você poderia me ajudar?

Cara, acredito que voce está ligando seu RTC nas portas erradas...

O protocolo I2C requer dois barramentos de dados, o SCL e o SDA. Se seu RTC é baseado no DS1307 voce deve ter 5 terminais no seu shield: Vcc, Gnd, SDA, SCL e SQRW. Vcc e Gnd voce liga nos terminais 5v e Gnd do seu arduino. SDA voce conecta porta comunication 20 (está escrito SDA antes da porta), e SCL na porta comunication 21 (está escrito SCL na porta) do mega (As portas responsáveis pelo protocolo I2C no mega sao diferentes das do Leonardo, Uno...). O terminal SQRT é apenas uma saída que se configurada no CI, te fornece uma onda quadrada de frequencia ajustável (alguns valores específicos).

Espero que tenha ajudado... teste e veja se obtem o mesmo problema que o meu!

Isto mesmo colega, esta porta q se configura o sqrt, configuro na programação no sketch? Vou procurar entao. O meu possui saídas de um lado e do outro tmb possui saídas. Se quiser digita waiman rtc. Ja soldei de um lado e do outro varias vezes e n funcionou em casa vou olhar isto q vc me falou. Obrigado e um grande abraço. Se nao for muito e vc entender, tenho um tópico q abri sobre meu LCD, ele depois de um trmpo sai dos eixos e começa a imprimir coisas estranhas ai só resertando.

confirmei o meu possui o VCC, GND, SDA,SCL e DS, achei os pinos graças a você no arduino, esta sim escrito SDA e SCL lá, porém o DS eu não achei na programação nada. como nesta figura eu coloquei no meu arduino o ds e nada http://img.alibaba.com/img/pb/212/394/517/517394212_408.jpg

Não tenho muito tempo para me debruçar sobre o código, mas noto que não estás a ler os valores em BCD... O RTC devolve os valores em BCD e é provavelmente por isso que não vês os valores como pretendes. Experimenta abrir a biblioteca que tens para o RTC e lá dentro deve haver uma função para essa conversão. ;)

Bubulindo,

Em primeira instância, eu nao estava preocupado em receber o valor correto dos registradores, quer dizer, eu estava preocupado em receber um valor qualquer em char que eu fosse na tabela ASCII e decodificasse por mim mesmo, só para ver se funcionava. Entrentando, mesmo com os delays, e com o relógio aparentemente habilitado (pelomenos é o que eu escrevo no registrador adequado), eu sempre obtenho o mesmo valor para todas as variáveis, o que nao deveria acontecer, já que o relogio deveria estar contando. Eu sempre obtenho o equivalente a 0b11111111, nao importa quais registradores eu leia.

Ja tentei inicializar o relógio com a RTClib.h e só tentar ler os valores com meu código, porém o resultado é sempre o mesmo.

lmeireles43,

Primeiramente, voce configura a sqrw escrevendo no registrador 0x07 do CI DS1307. Se voce baixar o datasheet, poderá ver certinho quais sao os campos que o compõe, e tudo mais (lembrando que o pino sqrt só fornece saída). Esse é parte do meu problema, no qual nao obtenho sucesso tentando ler e escrever no meu RTC. Pelo que vi no esquema que voce postou, vc contém 2 chips DS1307 na mesma placa de circuito impresso, e para mim, isso só pode significar que sao 2 RTCs, independentes ou nao. Num procura rápida, nao achei referencia ao pino DS uma busca rápida pela internet, mas tenho certeza que ele nao faz parte da pinagem do CI. Levando a hipótese de 2 CIs como válida, esse pino pode ser um simples seletor de qual CI voce está acessando, sendo um ativo baixo e um alto (NAO ESQUEÇA QUE SÃO SÓ SUPOSIÇOES!!).

Quanto ao LCD, nao sei muito sobre eles. Porque nao tenta comprar um novo e testá-lo? Pode ser problema no hardware do que voce tem. Certamente nao pagará mais do que 20 reais em um novo na internet!

Vou observar, mas creio que nao estou ligando o pino ds no local correto

Se dissesses a que te referias com resultados esperados, eu não assumiria que eram horas erradas. ;)

A biblioteca rtclib não funciona?

Entao... acabei de descobrir que a biblioteca nao está funcionando também...

Antes, eu acreditava que ela funcionava, mas fui dar uma olhada afundo nela e descobri que Jee Labs a implemente com 3 classes, e apenas uma delas usa o DS1307. Usando a classe do DS1307, os resultados sao sempre os mesmos e me retornam lixo. Estava crente que funcinava pois em outra classe, o RTC funcinava. Entretanto, essa classe utilizava-se da funçao millis, e nao o RTC.

Estou desconfiado de problemas de Hardware desse CI... o que acham?

o endereço está correcto?

tens de colocar o endereço no chip para ele funcionar. Ou seja, definir o endereço nos pinos A0, 1 e 2 do DS1307. Ou então, se isso já estiver definido, meter a morada correcta no código.

desculpe minha ignorancia mas eu não faço ideia do que estou fazendo... apenas baixei uma biblioteca e um sketch feito e rodei para testar.... procurei nos codigos e não achei onde configurar as saídas

pessoal consegui fazer o rtc funcionar, o problema estava na pilha que veio junto com ele de 3.6v, ligando no 3.3v do arduino no lugar da pilha ele funciona..... comprei uma pilha de 3v e também não funcionou... que pilha voces utilizam?

Pilha?

Não estás a alimentar o RTC com 5V?

pessoal consegui fazer o rtc funcionar, o problema estava na pilha que veio junto com ele de 3.6v, ligando no 3.3v do arduino no lugar da pilha ele funciona..... comprei uma pilha de 3v e também não funcionou... que pilha voces utilizam?

Presumo que ele se esteja a referir a pilha que vem instalada no RTC para assim suster a data e hora e manter o circuito a correr, como um relogio normal

No meu RTC uso a de 3V (CR2032) que vem la quando o comprei, nunca a troquei ...

Dando uma vista de olhos rápida no manual:

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.

Mais à frente:

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

No resto do manual só fazem referência a Vbat a 3V, que faz algum sentido para o limite de funcionamento do mesmo. Suponho que se a pilha não estiver boa, apareçam umas tensões manhosas no pino de Vbat e isso confunda o chip... porque senão, não faz sentido o chip não funcionar quando se liga o VCC. Importas-te de medir quanto tens no VCC?

O meu problema eu resolvi: num blog que eu estava lendo, o autor errou ao informar a pinagem de I2C para o Leonardo... por isso nao funcionava... de resto, estava tudo ok...

Lmeirelles, A bateria realmente tem que estar aterrada, se nao vc nao fornece a tensao correta para o CI. A minha bateria é nominal de 3V e real de 3.3/3.4V... nao acredito que a tensao da sua bateria seja o problema!

pessoal o problema está nos relés, estou ligando uma luminaria led com um driver que seria um reator eletronico, e isto causa pane em todo o sistema.... o lcd começa a imprimir coisas estranhas, o RTC começa a trabalahr com numeros estranhos... apenas a luminaria acontece isto, utilizando outros aparelhos, como o aquecedor não acontece nada.... teria que utilizar algum tipo de diodo? o que dvo fazer? meu relé é do tipo que funciona quando não recebe sinal