RTC DS1307 e 24C04

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

RTC DS1307 e 24C04

Mensagempor gilliard » 29 Ago 2009 21:11

:D Galera, to apanhando do Proteus, rrssss :D

É o seguinte, eu criei um simples programinha no MikroC de um relógio. Na minha placa de experiência, ele funciona normalmente, mais no esquema do Proteus, não esta funcionando, aonde eu errei ?!?!? Não estou loxalizando !!!1

Segue codigo:

Código: Selecionar todos
unsigned short horas,minuto,segundo;
unsigned short dia, mes, ano, dia_semana;
unsigned short var1, var2;
char *texto;

// Rotina de conversão de dados para BCD
void BCD(unsigned short lin, unsigned short col,unsigned short var) {
  var1= (var >> 4) + 0x30;     //converte o primeiro nibble em BCD e após em string
  LCD_custom_Chr(lin,col,var1);//escreve caractere no LCD
  var2= (var & 0x0F) + 0x30;   //converte o segundo nibble em BCD e após isso, em string
  LCD_custom_Chr_Cp(var2);     //escreve caractere no LCD
}

void leitura_rtc() {     //rotina de leitura do DS1307
   I2C_Start();          //inicializa comunicação i2c
   I2C_Wr(0xD0);         //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
   I2C_Wr(0);            //end onde começa a programação do relógio, end dos segundos.
   I2C_Repeated_Start(); //Issue I2C signal repeated start
   I2C_Wr(0xD1);         //end fixo para DS1307: 1101000X, onde x=1 é para leitura
   segundo= I2C_Rd(1);   //lê o primeiro byte(segundos),informa que continua lendo
   minuto= I2C_Rd(1);    //lê o segundo byte(minutos)
   horas= I2C_Rd(1);     //lê o terceiro byte(horas)
   dia_semana= I2C_Rd(1);
   dia= I2C_Rd(1);
   mes= I2C_Rd(1);
   ano= I2C_Rd(0);       //lê o sétimo byte(ano),encerra as leituras de dados
   I2C_Stop();           //finaliza comunicação I2C
}

void grava_rtc(){
   I2C_Init(100000);//iniciliza I2C com frequencia de 100KHz
   I2C_Start();     //inicializa a comunicação I2c
   I2C_Wr(0xD0);    //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
   I2C_Wr(0);       //end onde começa a programação do relógio, end dos segundos.
   I2C_Wr(0x04);    //inicializa com 04 segundos.
   I2C_Wr(0x12);    //inicializa com 12 minutos.
   I2C_Wr(0x09);    //inicializa com 09:00hs (formato 24 horas).
   I2C_Wr(0x03);    //inicializa com terça
   I2C_Wr(0x17);    //inicializa com dia 17
   I2C_Wr(0x04);    //inicializa com mês 04
   I2C_Wr(0x07);    //inicializa com ano 07
   I2C_Stop();      //finaliza comunicação I2C
}

void encontra_dia_semana() {
   switch (dia_semana) {
      case 01: texto= "DOMINGO"; break;  //caso dias_semana = 01 então..
      case 02: texto= "SEGUNDA"; break;  //caso dias_semana = 02 então..
      case 03: texto= "TERCA"; break;    //caso dias_semana = 03 então..
      case 04: texto= "QUARTA"; break;   //caso dias_semana = 04 então..
      case 05: texto= "QUINTA"; break;   //caso dias_semana = 05 então..
      case 06: texto= "SEXTA"; break;    //caso dias_semana = 06 então..
      default: texto= "SABADO";          //se não for nenhum desses então...
   }
}

void display_lcd() {
   lcd_custom_cmd(lcd_clear); //apaga lcd
   Lcd_Custom_Out(1,1,"(Hora)");
   BCD(1,7,horas);            //conversão da variável horas para BCD
   LCD_custom_Chr_Cp(':');    //escreve no display LCD
   BCD(1,10,minuto);          //conversão da variável minuto para BCD
   LCD_custom_Chr_Cp(':');    //escreve no display LCD
   BCD(1,13,segundo);         //conversão da variável segundo para BCD
   Lcd_Custom_Out(2,1,"(Data)");
   BCD(2,7,dia);              //conversão da variável dia para BCD
   LCD_custom_Chr_Cp('/');    //escreve no display LCD
   BCD(2,10,mes);             //conversão da variável mes para BCD
   LCD_custom_Chr_Cp('/');    //escreve no display LCD
   BCD(2,13,ano);             //conversão da variável ano para BCD
   encontra_dia_semana();
   Lcd_Custom_out(3,1,texto); //mostra dia da semana
}

void main(){
   trisd= 0;         //define portd como saida
   adcon1= 0x06;     //torna todos os pinos AD como i/o de uso geral
   Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1);//config LCD no modo 4 bits
   Lcd_custom_Cmd(Lcd_CLEAR);                     //apaga display
   Lcd_custom_Cmd(Lcd_CURSOR_OFF);                //desliga cursor
   grava_rtc();
   while(1){
     display_lcd();  //escreve no display lcd o valor
     leitura_rtc();  //efetua leitura de segundo, minuto e horas do DS1307
     delay_ms(200);  //delay de 200 milisegundos
   }
}


Esquema do Proteus:

Imagem

Esquema da Minha Placa de experiência:

Imagem

Toda ajuda será bem vinda !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Sergio38br » 29 Ago 2009 23:16

Cade os resistores de Pull-up?? Ja começaram a bagunçar a interface eletrica.. coloque dois resistores de 4k7 ou 6k8 do VCC para o scl e o sda..

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

Mensagempor _blackmore_ » 29 Ago 2009 23:50

sem contar que SDA e SCL estão em curto ... se a biblioteca do LCd é para usar em modo de 4 bits não precisa ligar todos os terminais do LCD D0 a D3 no PIC ... tu deve indicar no PIC qual é o arquivo q vai usar para que possa simular (.hex ou .cof) ...
e outra coisa viu ... se na placa de experiência funciona ... não precisa ficar quebrando a cachola com o proteus ... agora se fosse o contrário é caso dar atenção mesmo.

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor gilliard » 30 Ago 2009 09:41

Fala Galera !!!!

Obrigado pela força pessoal. Então:

Eu estou utilizando modo 8 bits no LCD, eu estou indicando o arquivo .hex para simular normalmente. Vou testar os resistores de pull-up, ok Dai posto o resultado aqui.

Eu quero fazer funcionar no Proteus, para eu entender como funciona o esquema elétrico, entendeu ?!?!?

Desde já, muito obrigado.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 30 Ago 2009 10:15

:D Ae Galera, deu certo aqui !!!! :D

Eu apenas acrescentei os resistores 6K8 de pull-up no VCC, conforme a sugestão do nosso amigo Sergio38br, e deu certo !!!!

Segue o esquema corrigido:

Imagem

Valew pela força e colaboração de todos !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor EvandroPic » 30 Ago 2009 10:39

gilliard escreveu::D Ae Galera, deu certo aqui !!!! :D

Eu apenas acrescentei os resistores 6K8 de pull-up no VCC, conforme a sugestão do nosso amigo Sergio38br, e deu certo !!!!

Segue o esquema corrigido:

Valew pela força e colaboração de todos !!!!


Não foi apenas os resistores...
Você retirou o curto que o Blackmore havia dito... sem essa correção não adiantaria em nada ter colocado os tais resistores de Pull-up.
EvandroPic
Byte
 
Mensagens: 120
Registrado em: 28 Out 2008 15:28

Mensagempor EvandroPic » 30 Ago 2009 10:44

gilliard escreveu::D Ae Galera, deu certo aqui !!!! :D

Eu apenas acrescentei os resistores 6K8 de pull-up no VCC, conforme a sugestão do nosso amigo Sergio38br, e deu certo !!!!

Valew pela força e colaboração de todos !!!!


Não foram apenas os resistores colocados...
Você retirou o curto que o Blackmore havia dito... sem essa correção não adiantaria em nada ter colocado os tais resistores de Pull-up.
EvandroPic
Byte
 
Mensagens: 120
Registrado em: 28 Out 2008 15:28

Mensagempor _blackmore_ » 30 Ago 2009 12:15

gilliard

Código: Selecionar todos
Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1);//config LCD no modo 4 bits


tem certeza que está em modo 8 bits?
experimenta apenas retirar as ligações dos 4 primeiros bytes para ver se realmente está em modo de 8 bits ...

abrax!
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor verd » 31 Ago 2009 09:31

Olá Gilliard estou iniciando em c e com ma duvida em relãção ao programa de data e hora, no caso de implementar data e hora em um projeto, e meu hardware fique desligado como faço para atualizar a data e hora via hardware??
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor gilliard » 31 Ago 2009 09:48

Então verd.

No caso, o DS1307 será alimentado por uma bateria de 3 volts, que entrara em ação assim que ele detectar que você desligou o circuito, é como se fosse a placa mãe de seu computador, repare que nela, possue uma bateria de 3 volts, ela é responsável por segurar a configuração da data e hora, quando seu computador estiver desligado. é da mesma forma que funciona o DS 1307.

Qualquer duvida, estamos ae.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor verd » 31 Ago 2009 09:54

Valeu Gilliard!
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor Alesandro F Zagui » 31 Ago 2009 16:54

Uma dica Verd

Caso alimente o circuito com 5 volts, você deve colocar um resistor e um diodo em serie para alimentar o DS1307 e a bateria.
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor verd » 02 Set 2009 14:02

Valeu Alesandro! da pra pegar a mesma alimentação do 7805!
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15


Voltar para PIC

Quem está online

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

x