Relógio DS1307 não funciona com o comando switch

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Relógio DS1307 não funciona com o comando switch

Mensagempor lpagano » 24 Jul 2008 19:32

Pessoal,

Voltando novamente à saga do DS1307, estou fazendo o tal relógio com ele usando o 16F877A no MikroC. Como o barramento I2C utiliza os pinos RC3 e RC4, resolvi fazer uma “gambiarra” no código para obter a seguinte ordem de saída do número em binário:

RC0: bit 0
RC1: bit 1
RC2: bit 2
RC5: bit 3

As declarações dos TRIS foram feitas bit a bit:

TRISC.F0 = 0;
TRISC.F1 = 0;
TRISC.F2 = 0;
TRISC.F5 = 0;

Para se fazer isso construí um código em que eu uso o comando switch para fazer o teste da variável, nesse caso a variável dos minutos. Vejam no exemplo abaixo:

Código: Selecionar todos
switch (minutos) {
Case 0:
   PORTC.F0 = 0;
   PORTC.F1 = 0;
   PORTC.F2 = 0;
   PORTC.F5 = 0;

Case 1:
   PORTC.F0 = 1;
   PORTC.F1 = 0;
   PORTC.F2 = 0;
   PORTC.F5 = 0;


// e por aí vai até o “case 9”


Só que quando compilei o dito cujo (sem erros), a contagem do relógio simplesmente não funciona. Quando eu retiro o comando switch do código, tudo volta a funcionar normalmente.

O I2C está sendo feito pelo hardware interno do PIC.

Alguém poderia dar uma idéia de como arrumar essa meleca???
Desculpe se o tópico está grande, mas é que eu fiquei o dia inteiro apanhando por causa disso e até agora nada.

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

Re: Relógio DS1307 não funciona com o comando switch

Mensagempor andre_luis » 24 Jul 2008 21:03

É preciso que voce dê uma dica do defeito que está acontecendo para que, a partir do sintoma, possamos tirar alguma conclusã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 ze » 28 Jul 2008 15:01

cadê o break?
dica: depois de funcionar faça 1 teste com if: tende a consumir menos memória.
abrçs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor helton » 29 Jul 2008 08:11

Código: Selecionar todos
switch (minutos)
{
  case 0:
    auxdata = 0x00;   
   break; 
  case 1:
   auxdata = 0x01;
  break;
}

 PORTC = auxdata;
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC

Mensagempor ze » 29 Jul 2008 09:57

+infos:

switch (minutos) {
Case 0:
PORTC.F0 = 0;
PORTC.F1 = 0;
PORTC.F2 = 0;
PORTC.F5 = 0;
break;

ou tente direto:
PORTC=((minutos)|(minutos<<2)) | 0b00011000; //preserva os bits 3 e 4 em 1 ou & 0b111001111 em 0.
+-isso.
abrçs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor lpagano » 29 Jul 2008 11:03

Pessoal,

Eu realmente tinha esquecido do break. Vou colocar isso no código e ver no que dá.

Quando eu troquei pelo comando IF, funcionou normalmente no PORTA mas não no PORTC, em que os pinos 3 e 4 desse PORTC são usados para o I2C.

O defeito que acontece é que o DS1307 e o PIC não se comunicam se eu usar os outros pinos do PORTC como uso geral, como é o meu caso, mesmo declarando certinho os TRIS desse PORTC. Dá a impressão que ao ligar a alimentação o sistema trava logo na inicialização.

Detalhe: o DS1307 está sem bateria de backup conectada.

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

Mensagempor Maurício » 29 Jul 2008 17:11

Olá, lpagano.

Ao invés de usar SWITCH, porque vc não indexa uma matriz e faz uma operação lógica no port? Não seria mais prático? E acredito que economizaria memória, tb.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor lpagano » 01 Ago 2008 20:38

Pessoal,

Agora funcionou tudo blz!!! Realmente era o break que faltava.

Brigadão mesmo a todos!!!

Aproveitando a oportunidade, para testar esse DS1307 (está num protoboard) eu liguei na saída do PIC quatro displays de sete segmentos para verificar o funcionamento correto. O que pude perceber é que nos displays havia muito ruído o qual dependia da aproximação da minha mão no circuito do DS1307. Às vezes o ruído era tão intenso que a comunicação I2C parava.

Para se ter uma idéia no Application Note 58 da Maxim tem algumas considerações sobre o cristal que vai nesse integrado e os ruídos que podem causar instabilidades na frequência lida pelo integrado, e no datasheet diz que não são requeridos capacitores ou resistores externos para o bom funcionamento.

Para tentar minimizar esse ruído coloquei um capacitor de 100nF (pode ser cerâmico ou poliéster) entre dos terminais + e - do DS1307 e para minha surpresa o ruído desapareceu por completo e o relógio funcionou perfeitamente. Só é necessário ter dois cuidados:

- não encostar a mão nos terminais do capacitor de 100nF;
- instalar o capacitor de modo que os terminais dele sejam os menores possíveis.

É isso, espero que sirva como dica para quem enfrentou o mesmo problema ou está pensando em usar esse integrado.


Valeu!
Editado pela última vez por lpagano em 01 Ago 2008 21:15, em um total de 1 vez.
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor RobL » 01 Ago 2008 21:14

Note, você diz que funciona no PORTA, mantendo RC3 e RC4 para o I2C, certo.
Quando muda para o PORTC não funciona. Deve haver algo nesta porta que precisa ser setado.
Experimente deixar somente o I2C funcionando e teste de forma diferente seu funcionamento. Quero dizer, não use função em nenhum pino PORTC a não ser RC3 e RC4. Se foi isso que fez usando o PORTA, não precisa testar, o teste já está feito.
Então deve estar saindo algo no seu I2C, uma sujeira qualquer.
Seu programa está mudando a direção de alguma porta C durante a transmissão ou recepção do I2C? Se sim, pode ser R.M.W.
Neste caso deverá identificar esse momento e aguardar o fim da transmissão ou recepção, ou outro artifício. Será que estas portas são mesmo independentes?!!
Não tem que desabilitar nada nessas portas? Se não, seve ser R.M.W.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor lpagano » 01 Ago 2008 21:19

RobL,

Acabei fazendo uma edição no meu último post enquanto você escrevia o seu. Dá uma olhada lá em cima em que eu falo que funcionou colocando o break, coisa que eu tinha me esquecido :oops:

Quanto a sujeira no I2C tinha sim e era causada pela proximidade da minha mão no circuito. Coloquei um capacitor entre os pinos + e - do DS1307 e "limpou" o I2C dos ruídos.

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


Voltar para PIC

Quem está online

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

x