PIC travando com o DS1307

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC travando com o DS1307

Mensagempor lpagano » 15 Dez 2008 09:49

Pessoal,

Já vi vários tópicos aqui discutindo esse assunto mas agora tenho uma coisa mais intrigante sobre isso.
Essa semana estou testando um relógio simples com o DS1307 ligado no PIC 18F4520. Eu configuro ele normalmente e então começa a funcionar legal. Passa-se alguns minutos e o relógio trava. Antes eu achei que seria o DS1307 mas junto com o relógio eu coloquei um led direto no PIC que fica piscando a cada 500ms, só para sinalizar que o PIC está funcionando normalmente. Para a minha surpresa, o PIC é que está travando pois quando o relógio trava esse led que não tem nada em haver com o barramento I2C também para de piscar.

Só mesmo dando um reset no PIC e ele volta a funcionar por alguns minutos, como antes.

Esse relógio ainda está em fase de testes e o PIC está na placa EasyPIC5 da Mikroelektronika, ou seja, os fios entre o PIC e o DS1307 são grandes. Dos terminais dessa placa até o DS1307 tem mais uns 25cm de fio até chegar nesse integrado. Será que essa distância pode estar influenciando esse comportamento?

Já troquei o PIC por outro, inclusive testei usando um da série 16F e mesmo assim deu problema.

Os resistores entre os terminais SDA e SCL, e a alimentação do DS1307 são de 10k.

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor tcpipchip » 15 Dez 2008 11:20

Pode se estes 25cm a causa...
O cristal esta bem proximo do DS1307 ?
Voce esta usando capacitores de desacoplamento ?
Simulou no Proteus ou Similar ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor lpagano » 15 Dez 2008 11:49

tcpipchip,

O cristal está bem "grudado" nos terminais do DS1307, só não está com a carcaça aterrada.

Tem um capacitor cerâmico de 100nF entre os terminais + e - do DS1307

Não simulei em nenhum programa pois como são teóricos, ou seja, não dá para simular interferências externas.

Só para complementar, há um tempo atrás tinha esse circuito num protoboard e acontecia a mesma coisa, travava depois de um tempo.


Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor cmte » 15 Dez 2008 12:09

Eu também tenho uma EasyPic5 e às vezes uso um DS1302 em um protoboard externo, ligado à placa por um cabo que comprei junto com a EasyPic (EasyProto). Esse cabo tem 12 cm, e o DS1302 funciona direitinho, alimentado pela própria EasyPic.

Abs,

Yuri.
cmte
Byte
 
Mensagens: 141
Registrado em: 29 Nov 2006 12:53

Mensagempor RobL » 15 Dez 2008 12:18

Se o que o tcpipchip colocou foi corretamente verificado, pois é fundamental, desabilite o WDT se este estiver ligado.
Entendí que seus 500ms nada tem a ver com o DS1307, ou seja, é uma rotina dentro do pic. Se não for isso as informações a seguir pouco servem:

Tem que verificar se está ocorrendo reset ou preso em loop. Pelo seu escrito deve estar preso em um loop.
Se estiver ressetando, deve ter esquecido algum retorno.
Se estiver preso em um loop, veja se esqueceu de limpar, ou setar algum flag, ou ainda inc ou dec registro, por banqueamento errado, se isso for usado no seu chip.

Elimine rotinas uma de cada vez e teste.

Esses alguns minutos que se passam é sempre o mesmo tempo ou aleatório.
Se for sempre o mesmo tempo é programa se for aleatório, pode não ser. Veja se coincide com algum equipamento que é ligado e desligado na área próximo, lâmpadas fluorescentes inclusive.
Se nada disso fizer sentido para você, então diminua esses 25cm de fio que pode resolver.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor lpagano » 15 Dez 2008 16:30

Seguinte,

O programa que está dando problema foi feito no MikroC versão 8.2.

Fiz um teste aqui e pude concluir que o problema acontece quando o PIC lê a terceira linha do código abaixo:

Código: Selecionar todos
I2C_Start( );                 
I2C_Wr(0xD0);         
I2C_Wr(0);   
I2C_Repeated_Start( );
I2C_Wr(0xD1);
segundos = I2C_Rd(1);
minutos = I2C_Rd(1);     
horas = I2C_Rd(0);
I2C_Stop( );


Como podemos ver essa terceira linha é onde o DS1307 é configurado para fazer a leitura a partir dos segundos. Já tentei mudar para leitura a partir dos minutos e mesmo assim não deu certo.

O que está parecendo é que ele está entrando em algum loop interno da instrução I2C_Wr(0) e não sai mais.

O clock de trabalho do PIC é 1MHz, mas o travamento também acontece em outras frequências.

Também acabei de fazer o aterramento da carcaça do cristal.

O watchdog está desabilitado e não estão ocorrendo resets.

Quando eu digo "alguns minutos" para travar é aleatório, ou seja, não tem um tempo certo.

Já testei ligando o computador, TV, lâmpadas e não acontece nada.


Alguma sugestão????


Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor RobL » 15 Dez 2008 17:00

Mas a frequencia do SCL (clock do I2C) não pode superar 100KHz.
Como você está com fios suspensos e longos, é recomendável testar em um frequencia bem menor, bota para 50KHz no máximo.

Se o pic trava e tiver relação com o não recebimento correto dos dados, a rotina usada deveria ter um timeout para liberar o micro.

Verifique a frequencia do clock do I2C (SCL).

Desligue um fio do I2C e veja se seu micro trava. Se travar o caminho é esse e sua rotina não tem timeout.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor lpagano » 15 Dez 2008 22:16

RobL,

Fiz também a diminuição dos tamanhos dos fios. Agora eles estão com uns 5cm e mesmo assim trava.

Agora tenho uma dúvida: como faço para implementar esse timeout no PIC?

Quanto à frequência do I2C eu achava que funcionava somente em 100kHz. Vou testar em outras frequências como você falou.

Obrigado!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor RobL » 15 Dez 2008 22:24

O timeout nada mais é que uma rotina que fiscaliza o tempo máximo que uma operação pode levar. Se estourar esse tempo, a rotina limpa flags, registros etc, coloca informação de erro, se for o caso, e sai para outras tarefas. Usa-se tentar, através de um contador obter sucesso até n vezes, não conseguindo desabilita a função, ou outras providências.

Mas primeiramente não mexa na sua rotina. Tente ver se há esse problema de hardware, reduzindo a frequencia do clock do I2C (SCL).
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor andre_luis » 16 Dez 2008 07:26

lpagano,

Suponho que voce esteja utilizazndo funções prontas do compilador para acesso ao I2C do DS1307.

Tenta ver se voce encontra outras implementações para confirmar se o problema está no compilador ou não.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lpagano » 16 Dez 2008 10:17

RobL,

Abaixei a frequência para 50kHz e travou do mesmo jeito.



andre_teprom,

Realmente estou usando as bibliotecas prontas do MikroC para fazer o I2C através do módulo I2C interno no PIC. Será que elas têm algum bug??? E se usar a biblioteca para se fazer o I2C via software???
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor eder » 16 Dez 2008 16:09

Boa tarde colegas, estou passando por um problema parecido com o do colega que comentou que estava travando seu relógio. O relógio que montei baseado no ds1307 esta funcionando, mostrando hora e data direitinho porém esta muito lento. Quando o circuito é ligado para contar 1 segundo demora uma eternidade. Já foi trocado o crystal, foi colocado o capacitor entre o + e o - e o aterramento na bateria já que não esta implementada. Algum colega já passou por esse problema de atrasar o relógio.
eder
Bit
 
Mensagens: 5
Registrado em: 24 Dez 2006 07:57

Mensagempor lpagano » 16 Dez 2008 17:01

Pessoal,

Aparentemente resolvi o problema dos travamentos.

O meu código mandava o DS1307 enviar um sinal de 32768 Hz na saída SQW/OUT (na penúltima linha, onde o código é 0x93). Agora eu mudei o programa para mandar 1 Hz (código 0x90) e não deu mais nenhum travamento. Vejam no código abaixo:

Código: Selecionar todos
I2C_Init(50000);              //iniciliza I2C com frequencia de 50KHz
I2C_Start( );                 //inicializa a comunicação I2C
I2C_Wr(0xD0);                 //endereço fixo para a categoria do DS1307
I2C_Wr(0);                    //endereço onde será iniciada a programação
I2C_Wr(0x00);                 //inicializa a contagem dos segundos a partir de xx.
I2C_Wr(0x40);                 //inicializa a contagem dos minutos a partir de 40 minutos.
I2C_Wr(0x15);                 //inicializa a contagem das horas apartir das 15hs (formato 24 horas).
I2C_Wr(0x00);                 //inicializa a contagem dos dias da semana
I2C_Wr(0x00);                 //inicializa a contagem de dias
I2C_Wr(0x00);                 //inicializa a contagem do mês
I2C_Wr(0x93);                 //gera no pino 7 1Hz
I2C_Stop( );


Fiz um teste com ele funcionando por umas 4 horas. Depois deixei somente as linhas que configuravam os segundos, minutos e horas. Também deixei rodando por umas 4 horas e até agora não travou. Tambem vou deixar por mais umas 24 horas funcionando para ter certeza. Agora parece que deu certo.

Só um detalhe: o que pode estar influenciando nesse travamento do PIC? Será que a configuração do DS1307, prevista no datasheet, pode destar dando conflito com o MikroC???

Obrigado a todos pelas dicas e ajuda!!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor andre_luis » 17 Dez 2008 07:21

lpagano,

Não faz sentido, realmente.

Se voçê não estiver usando interrupção nesse pino, procura confirmar se o resistor de pull-up está com o valor correto.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Sergio38br » 17 Dez 2008 07:46

bom dia, Ipagano

Por acaso a saida SQW esta ligada a algum pino do pic, especialmente os que geram interrupção externa???

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x