Ir ao conteúdo
  • Cadastre-se

Problemas com DS1307 + PIC em C


Visitante

Posts recomendados

Segue codigo:

 

 

#include <16f877a.h>
#use delay(clock=20000000)
 
#fuses HS           //Clock > 4Mhz
#fuses NOWDT        //No Watch Dog Timer
#fuses PUT          //Power Up Timer
#fuses NOBROWNOUT   //No brownout reset
#fuses NOLVP        //No low voltage progming, B3(PIC16)or B5(PIC18)used for I/O
#fuses NOPROTECT    //Code not protected from reading
#fuses NOCPD        //No EE protection
 
#include "C:\Users\ivan.aguiar\Desktop\Codigos\Bibliotecas\Flex_lcd_16x4_877.c"
#include "C:\Users\ivan.aguiar\Desktop\Codigos\Bibliotecas\DS1307.c"
#include <stdlib.h>
 
int1 botao_incremento;  //PIN_B0
int1 botao_decremento;  //PIN_B1
int1 botao_enter;       //PIN_B2
 
BYTE sec;
BYTE min;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;
 
int1 data_hora;
 
int1 horas = 0;
int1 minutos = 0;
int1 dia = 0;
int1 mes = 0;
int1 ano = 0;
int1 dia_sem = 0;
 
char dia_da_semana[7][8]=     // Matriz de 7 Linhas e 8 Colunas. Lembrando que toda variavel string no final tem /0, por isso 8 colunas.
{
   "Domingo",
   "Segunda",
   "Terca",
   "Quarta",
   "Quinta",
   "Sexta",
   "sábado",
};
 
 
void main()
 
   {
  
      ds1307_init();
      lcd_init();
        
      data_hora = read_eeprom(0x07);   // Variavel para informar se o RTC ja foi ajustado pela primeira vez
      delay_ms(10);                    
      
           
      while(true)
      {
      
      botao_enter = input(pin_b2);
      if(!botao_enter)
        {
        delay_ms(75);
        data_hora == 0;
        }
                   
      while (data_hora == 0)
          {
            sec = 0; // Não precisa ajustar segundo
            
            horas = 0;
            minutos = 0;
            dia = 0;
            mes = 0;
            ano = 0;
            dia_sem = 0;
                           
            while (horas == 0)
               {
                  printf(lcd_putc,"\fAjustar Hora:\n%u",hrs);
                  delay_ms (100);
                                 
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        hrs++;
                     }
                   
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        if(hrs==0)
                          {
                             hrs=23;
                          }
                          else hrs--;
                    }
                  
                  if (hrs > 23)
                     {
                        hrs = 0;
                     }
                  
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        horas = 1;
                     }
               }         
            
            while (minutos == 0)
               {
                  printf(lcd_putc,"\fAjustar Minutos:\n%u",min);
                  delay_ms (100);
                           
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        min++;
                     }
                   
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        if(min == 0)
                           {
                              min = 59;
                           }
                           else min--;
                     }
            
                  if (min > 59)
                     {
                         min = 0;
                     }
                  
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        minutos = 1;
                     }
               }
            
            while (dia == 0)
               {
                  printf(lcd_putc,"\fAjustar Dia:\n%u",day);
                  delay_ms (100);
                           
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        day++;
                     }
             
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        day--;
                     }
                  
                  if (day > 31)
                     {
                         day = 1;
                     }
                  
                  if (day == 0)
                     {
                        day = 31;
                     }
            
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        dia = 1;
                     }
               }
            
            while (mes == 0)
               {
                  printf(lcd_putc,"\fAjustar Mes:\n%u",month);
                  delay_ms (100);
                                 
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        month++;
                     }
                   
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        month--;
                     }
                  
                  if (month > 12)
                     {
                         month = 1;
                     }
                  
                  if (month == 0)
                     {
                        month = 12;
                     }
                  
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        mes = 1;
                     }
            
               }
            
            while (ano == 0)
               {
                  printf(lcd_putc,"\fAjustar Ano:\n%u",yr);
                  delay_ms (100);
                                 
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        yr++;
                     }
                   
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        if(yr == 0)
                           {
                              yr = 99;
                           }
                           else yr--;
                     }
                  
                  if (yr > 99 )
                     {
                        yr = 0;
                     }
                  
                                    
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        ano = 1;
                     }
               }
            
            while (dia_sem == 0)
               {
                  printf(lcd_putc,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);
                  delay_ms (100);
                                 
                  botao_incremento = input(pin_b0); 
                  if(!botao_incremento)
                     {
                        delay_ms (75);
                        dow++;
                     }
                   
                  botao_decremento = input(pin_b1); 
                  if(!botao_decremento)
                     {
                        delay_ms (75);
                        dow--;
                     }
                  
                  if (dow > 7)
                     {
                         dow = 1;
                     }
                  
                  if (dow == 0)
                     {
                         dow = 7;
                     }
            
                  botao_enter = input(pin_b2); 
                  if(!botao_enter)
                     {
                        delay_ms(75);
                        dia_sem = 1;
                     }
               }
 
            ds1307_set_date_time(day, month, yr, dow, hrs, min, sec);
            data_hora = 1;
            write_eeprom(0x07,data_hora);    // Gravando na EEPROM
            delay_ms(10);
            
          }
    
      if((min == 59) && (sec ==59))// Aviso a cada virada de hora
         {
            output_high(pin_b4);
            delay_ms(500);
            output_low(pin_b4);
         }
 
      ds1307_get_date(day,month,yr,dow);
      ds1307_get_time(hrs,min,sec);
      printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d",dia_da_semana[dow-1],hrs,min,sec,day,month,yr);
      delay_ms(100);
      
      }
}

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Boa noite DavidsonrSouza, estou fazendo tcc em uma automação e estou procurando projetos com RTC e PIC, e conforme descrito em seus comentários, é mais ou menos o que estou buscando, tem como enviar uma cópia do seu código para que possa utilizar, mesmo que tenha que mudar mais alguma linha de programação para se enquadrar ao que necessito, obrigado.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Eli dos Anjos Rodrigues disse:

Boa noite DavidsonrSouza, estou fazendo tcc em uma automação e estou procurando projetos com RTC e PIC, e conforme descrito em seus comentários, é mais ou menos o que estou buscando, tem como enviar uma cópia do seu código para que possa utilizar, mesmo que tenha que mudar mais alguma linha de programação para se enquadrar ao que necessito, obrigado.

Você está fazendo um tcc e quer pegar algo quase pronto para apresentar como seu?

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Provavelmente não. Ele só quer ter noção da coisa e adaptar à sua realidade. Afinal até se propôs ao trabalho 'extenuante' de

10 horas atrás, Nao Sei disse:

mudar mais alguma linha de programação para se enquadrar

 

Me lembro vagamente de ter feito um pic conversar com um ds1302 ou 07 há muitos anos. Se eu achar no meu baú da morte, ser-lhe-ia útil? Quiçá... eu ache.

Link para o comentário
Compartilhar em outros sites

Boa tarde Não Sei, preciso do máximo de ajuda, pois tenho 260 horas de estágio obrigatório, fazer a automação mecânica e eletrônica e ainda escrever a monografia, então o máximo de ajuda que puder obter, sempre será bem vindo, terei que alterar alguma coisa da programação para que se adapte a minha necessidade, e como estou aprendendo programação, obrigado.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Eli dos Anjos Rodrigues disse:

Boa tarde Não Sei, preciso do máximo de ajuda, pois tenho 260 horas de estágio obrigatório, fazer a automação mecânica e eletrônica e ainda escrever a monografia, então o máximo de ajuda que puder obter, sempre será bem vindo, terei que alterar alguma coisa da programação para que se adapte a minha necessidade, e como estou aprendendo programação, obrigado.

Você teve quanto tempo para começar o estagio?o tcc?E programação você deveria aprender no começo do curso.

Mais vai uma dica,digita pic+rtc,há um varios exemplos na internet.

Outra coisa porque você não usa arduino?Vai se bem mais fácil para você copia,pois a mais exemplos.

Link para o comentário
Compartilhar em outros sites

Boa noite Não Sei, somos a primeira turma da faculdade na qual estudo, estamos levando ferro em tudo, já vi vários exemplos e vídeos de pessoas fazendo o timer com pic, ds e lcd, não tivemos laboratórios, aulas práticas muito pouco, o estágio só podemos começar ele agora em Agosto, trabalho em uma empresa em que não tem nada a ver com o assunto, por isso tenho que fazer ele por fora, o tcc estou fazendo com um professor muito gente boa, ele que me falou desse RTC e gostei da ideia, por isso estou buscando informações sobre ele, já compilei outros programas, mas esse pelo que esta escrito me chamou mais a atenção, não quero ele mastigado, estou compilando os códigos conforme vocês vão escrevendo, tentando entender, pois nem programação com lcd nossos professores fizeram, apenas teoria, e desde que vi o micro pela primeira vez, me apaixonei por ele, sobre o arduino, falei com o meu orientador, ele me disse que no pic teremos mais liberdade, nunca tinha ouvido falar desse DS1307, mas quero aprender sobre ele e a comunicação I2C, sobre o Arduino, nunca vi nada sobre ele, mas já tenho o pic18f4520, o lcd, o rtc e já estou montando eles em protoboard, já fiz a programação de algumas linhas e funcionou acionando os motores que vou usar na automação, por isso peço ajuda de quem puder me ajudar, tudo que usar em minha monografia, tenho que citar fontes, e como hoje em dia se encontra muita coisa na net, não quero fazer plagio, pois já fomos orientados sobre isso, obrigado.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Eli dos Anjos Rodrigues disse:

Boa noite Não Sei, somos a primeira turma da faculdade na qual estudo, estamos levando ferro em tudo, já vi vários exemplos e vídeos de pessoas fazendo o timer com pic, ds e lcd, não tivemos laboratórios, aulas práticas muito pouco, o estágio só podemos começar ele agora em Agosto, trabalho em uma empresa em que não tem nada a ver com o assunto, por isso tenho que fazer ele por fora, o tcc estou fazendo com um professor muito gente boa, ele que me falou desse RTC e gostei da ideia, por isso estou buscando informações sobre ele, já compilei outros programas, mas esse pelo que esta escrito me chamou mais a atenção, não quero ele mastigado, estou compilando os códigos conforme vocês vão escrevendo, tentando entender, pois nem programação com lcd nossos professores fizeram, apenas teoria, e desde que vi o micro pela primeira vez, me apaixonei por ele, sobre o arduino, falei com o meu orientador, ele me disse que no pic teremos mais liberdade, nunca tinha ouvido falar desse DS1307, mas quero aprender sobre ele e a comunicação I2C, sobre o Arduino, nunca vi nada sobre ele, mas já tenho o pic18f4520, o lcd, o rtc e já estou montando eles em protoboard, já fiz a programação de algumas linhas e funcionou acionando os motores que vou usar na automação, por isso peço ajuda de quem puder me ajudar, tudo que usar em minha monografia, tenho que citar fontes, e como hoje em dia se encontra muita coisa na net, não quero fazer plagio, pois já fomos orientados sobre isso, obrigado.

Já definiu qual o compilador vai usar?tem algum programa para simulação?

 

Link para o comentário
Compartilhar em outros sites

Bom dia Não Sei, simulando no Proteus 8.5 e comecei a usar o MikroC, que a principio achei mais intuitivo, mas os códigos que colocam na net, em sua maioria são para o CCS ou PIC C, por isso comecei a compilar neles, acho que vou usar mais o último, obrigado.

Link para o comentário
Compartilhar em outros sites

Há um tempo atrás fiz uma biblioteca, ela está em português... O código está até bem comentado e o arquivo contém imagens do esquemático e a simulação no proteus. Talvez te ajude:

https://www.4shared.com/rar/DBP7bjR5ce/DS1307__24C32__EEPROM_.html?

 

Daí vai fazendo as alterações e simulando para alcançar o que você deseja, se a simulação ficar lenta remova o I2C debugger do esquemático. Só uma coisa, o oscilador que veio no módulo que eu comprei é bem ruim e adianta cerca de 20 minutos em três/quatro dias, se você quiser uma coisa mais precisa seria interessante usar o DS3231 ou outro que possua oscilador interno.

 

Biblioteca:

Spoiler

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////                                                                                                                      ////
//// 03/05/2015                                                                                                           ////
////                                                                                                                      ////
////                                                   FUNÇÕES                                                            ////
////                                                                                                                      ////
//// DS1307 I2C SLOW 100KHz                                                                                               ////
////                                                                                                                      ////
//// *inicializar_ds1307() -> inicializa ds1307 com CH desabilitado | modo 24HRs | SQW desabilitado e pino em nível ALTO. ////
//// *ds1307_ajustar_hora(hora, minuto, segundo); -> ajusta o horário                                                     ////
//// *ds1307_ajustar_data(dia da semana, dia do mes, mes, ano); -> ajusta a data                                          ////
//// ds1307_ler_hora(hora, minuto, segundo, erro**); -> lê a hora                                                         ////
//// ds1307_ler_data(dia da semana, dia do mes, mes, ano, erro**) -> lê a data                                            ////
//// *ds1307_sqw_out(OUT, SQWE, frequencia); -> ajusta o registrador 7, pino square wava output                           ////
////                 OUT  -> 0=pino em zero quando sqw desativado|1=pino em 1                                             ////
////                 SQWE -> 0=desabilitado|1=habilitado                                                                  ////
////                 frequencia -> 0=1Hz|1=4,098KHz|2=8,192KHz|3=32,768Khz                                                ////
//// *write_ds1307_sram(endereço, valor); -> escreve na SRAM Endereço de 0x08(8) até  0x3F(63) Static Ram Battery-Backed  ////
//// read_ds1307_sram(endereco, valor lido, error**); -> Lê a SRAM ou algum registrador do DS1307                         ////
////                                                                                                                      ////
//// * A função retornará um valor que pode ser:                                                                          //// 
////                 0=ocorreu tudo OK na comunicação                                                                     ////
////                 1=DS1307 não respondeu                                                                               ////
////                 2=Ocorrreu colisão se estiver sendo usado o modo multimestre                                         ////             
////                                                                                                                      ////
//// ** ERRO será uma variável que poderá conter os valores:                                                              ////
////                 0=ocorreu tudo OK na comunicação                                                                     ////
////                 1=DS1307 não respondeu                                                                               ////
////                 2=Ocorrreu colisão se estiver sendo usado o modo multimestre                                         ////
////                 3=Endereço enviado fora da faixa de endereços (no caso da função write_ds1307_sram)                  ////                                                                                                                                    //
////                                                                                                                      ////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int inicializar_ds1307()
{
   int status=0;
   
   i2c_start();
   status=i2c_write(0xD0);//endereço 1101 000 + write bit 0 # status recebe o ACK -> 0=ACK 1=NOACK (DS1307 não respondeu) 2=Colisão em modo multimestre.
   status|=i2c_write(0x00);//aponta para o registrador 0
   status|=i2c_write(0x00);//zera o bit (7) CH (clock halt) para ds1307 contar normalmente em 1 ele para. Quando ligado pela primeira vez esse bit fica em 1. Os segundos tb são zerados.
   i2c_stop();
   
   delay_us(5);
   
   i2c_start();
   status|=i2c_write(0xD0);
   status|=i2c_write(0x02);
   status|=i2c_write(0x00);//zera o bit 6 do reg. 2 selecionando a operação em 24HRs. A hora é zerada no processo.
   i2c_stop();
   
   delay_us(5);
   i2c_start();
   status|=i2c_write(0xD0);
   status|=i2c_write(0x07);
   status|=i2c_write(0x80);//seta o bit OUT faz com que o pino SOUT fique em 1 e zera (desabilita) o square-wava output. 
   i2c_stop();
   
   return(status);
}

void converter_binario_para_BCD(int &valor1, int &valor2, int &valor3)
{
   int digito1, digito2;//para 38 digito2=3 digito1=8
   
   digito1=valor1%10;
   digito2=(valor1-digito1)/10;
   valor1=(digito2<<4)+digito1;

   digito1=valor2%10;
   digito2=(valor2-digito1)/10;
   valor2=(digito2<<4)+digito1;
   
   digito1=valor3%10;
   digito2=(valor3-digito1)/10;
   valor3=(digito2<<4)+digito1;
}

void converter_BCD_para_binario(int &valor1, int &valor2, int &valor3)
{
   int digito1, digito2;//para 38 digito2=3 digito1=8
   
   digito1=valor1&0x0F;//and bit a bit com os 4 LSB para pegar o digito 1.
   digito2=valor1&0xF0;//and bit a bit com os 4 MSB
   digito2>>=4;//descola 4 bits para a direita para pegar o digito 2.
   valor1=digito2*10+digito1;

   digito1=valor2&0x0F;
   digito2=valor2&0xF0;
   digito2>>=4;
   valor2=digito2*10+digito1;

   digito1=valor3&0x0F;
   digito2=valor3&0xF0;
   digito2>>=4;
   valor3=digito2*10+digito1;
}

int ds1307_ajustar_hora(int hora, int minuto, int segundo)
{
   int status=0;
   
   converter_binario_para_BCD(hora, minuto, segundo);
   
   i2c_start();
   status=i2c_write(0xD0);
   status|=i2c_write(0x00);//começa pelo registrador 0
   status|=i2c_write(segundo);//atualiza o segundo (CH zerado) o DS1307 soma 1 ao ponteiro ficando apontado para minuto
   status|=i2c_write(minuto);//atualiza o minuto o DS1307 soma 1 ao ponteiro ficando apontado para hora
   status|=i2c_write(hora);//atualiza hora com bit 6 (24/12) zerado indicando 24.
   i2c_stop();
   
   return(status);  
}

int ds1307_ajustar_data(int dia_semana, int dia_mes, int mes, int ano)
{
   int status=0;
   
   converter_binario_para_BCD(dia_mes, mes, ano);
   
   i2c_start();
   status=i2c_write(0xD0);
   status|=i2c_write(0x03);//começa pelo registrador 3
   status|=i2c_write(dia_semana);//atualiza o dia da semana 
   status|=i2c_write(dia_mes);//atualiza o dia do mes 
   status|=i2c_write(mes);//atualiza o mês 
   status|=i2c_write(ano);//atualiza o ano
   i2c_stop();
   
   return(status);
}

void ds1307_ler_hora(int &hora, int &minuto, int &segundo, int &erro)
{
   int status=0, buffer[3];
   
   i2c_start();
   status=i2c_write(0xD0);//envia o endereço + 0 para escrita
   status|=i2c_write(0x00);//direciona o ponteiro para o reg. 0 segundo
   
   i2c_start();//repete o start SR
   status|=i2c_write(0xD1);//envia o endereço + 1 dizendo que é uma operação de leitura
   buffer[0]=i2c_read(1);//lê a reg 0 (segundo em BCD) -> ds1307 adiciona 1 ao ponteiro -> pic manda ACK 1 dizendo que fará mais leitura
   buffer[1]=i2c_read(1);//lê a reg 1 (minuto em BCD) -> ds1307 adiciona 1 ao ponteiro -> pic manda ACK 1 dizendo que fará mais leitura
   buffer[2]=i2c_read(0);//lê a reg 2 (hora em BCD) -> ds1307 adiciona 1 ao ponteiro -> pic manda ACK 0 (NO ACK) dizendo que não fará mais leitura
   i2c_stop();//buffer é usado para evitar que interrupções façam uso de um horário não convertido
   
   erro=status;
   
   if(erro==0)//se houve erro não realiza a conversão
   {
      converter_BCD_para_binario(buffer[0], buffer[1], buffer[2]);
      
      hora=buffer[2];
      minuto=buffer[1];
      segundo=buffer[0];
   }
}

void ds1307_ler_data(int &dia_semana, int &dia_mes, int &mes, int &ano, int &erro)
{
   int status=0, buffer[4];
   
   i2c_start();
   status=i2c_write(0xD0);//envia o endereço + 0 para escrita
   status|=i2c_write(0x03);//direciona o ponteiro para o reg. 3 dia da semana
   
   i2c_start();
   status|=i2c_write(0xD1);
   buffer[0]=i2c_read(1);//lê a reg 3 (dia da semana em BCD) 
   buffer[1]=i2c_read(1);//lê a reg 4 (dia do mes em BCD) 
   buffer[2]=i2c_read(1);//lê a reg 5 (mes em BCD)
   buffer[3]=i2c_read(0);//lê a reg 5 (ano em BCD)
   i2c_stop();//buffer é usado para evitar que interrupções façam uso de um horário não convertido
   
   erro=status;
   
   if(erro==0)  
   {
      converter_BCD_para_binario(buffer[1], buffer[2], buffer[3]);
      
      dia_semana=buffer[0];//não precisa converter pois vai de 1 (0000 0000) a 7 (0000 0111)
      dia_mes=buffer[1];
      mes=buffer[2];
      ano=buffer[3];
   }
}

int ds1307_sqw_out(short out,short sqwe, int frequencia)
{
   int status=0, configuração=0;
   
   configuração=((int)out<<7)+((int)sqwe<<4)+frequencia;
   
   i2c_start();
   status=i2c_write(0xD0);
   status|=i2c_write(0x07);
   status|=i2c_write(configuração);//envia a palavra com a configuração do registrador 7
   i2c_stop();
   
   return(status);
}

int write_ds1307_sram(int endereco, int valor)
{
   int status=0;
   
   if((endereco>7)&&(endereco<64))
   {
      i2c_start();
      status=i2c_write(0xD0);
      status|=i2c_write(endereco);
      status|=i2c_write(valor);
      i2c_stop();
      
      return(status);
   }
      else
         return(3);
}

void read_ds1307_sram(int endereco, int &leitura, int &erro)
{
   int status=0;

   if((endereco>=0)&&(endereco<64))
   {
      i2c_start();
      status=i2c_write(0xD0);
      status|=i2c_write(endereco);
      
      i2c_start();
      status|=i2c_write(0xD1);
      leitura=i2c_read(0);
      i2c_stop();
      
      erro=status;
   }
      else   
         erro=3;
}

 

 

Código principal:

#include <16F883.h>
#device adc=8

#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear enabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //NO Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES BORV21                   //Brownout reset at 2.1V 
 
#use delay(clock=8M)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master, Slow, sda=PIN_C4, scl=PIN_C3, FORCE_HW) //Slow=100KHz Fast=400Khz o DS1307 opera em 100KHz por isso Slow
                                                         //Usar FORCE_SW para PICs que não possuam inbuilt I2C
#include <ds1307.c>                                                       
#include <at24c32.c>


void main()
{
   int hor=0, min=0, seg=0, status=0;  
   int dsem=0, dmes=0, m=0, a=0;
   int valor_lido=0;
     
   //printf("\fEscrevendo o valor 56 na posicao 3105 da EEPROM...");
   //escrever_eeprom_exterma(0, 3105, 56);
   //delay_ms(1000);
   //printf("\n\rEscrita finalizada.");
   //delay_ms(1000);
   
   printf("\fLendo o valor amazenado na posicao 3105...");
   ler_eeprom_externa(0, 3105, valor_lido, status);
   delay_ms(1000);
   printf("\n\rValor lido: %u",valor_lido);
   delay_ms(1000);
   
   printf("\n\n\rAperte qualquer tecla para continuar!!!"); 
   getc();

   //inicializar_ds1307();             // retorna variável erro
   //ds1307_ajustar_hora(18,35,0);     // retorna variavel erro
   //ds1307_ajustar_data(6,15,8,15);   // dia da semana de 1 a 7 o usuário define o que os números representam retorna variável erro
   //ds1307_sqw_out(1, 0, 0);          // OUT(0=pino em zero quando sqw desativado|1=pino em 1) SQWE(0=desabilitado|1=habilitado) FREQ(0=1Hz|1=4,098KHz|2=8,192KHz|3=32,768Khz)
   //write_ds1307_sram(9, 36);         // write_ds1307_sram(endereço, valor) endereço de 0x08(8) até  0x3F(63) Static Ram Battery-Backed
   //read_ds1307_sram(9, valor_lido, status); // Endereço na SRAM, valor_lido, status da comunicação    
   
   while(true)
   {
      ds1307_ler_hora(hor, min, seg, status);
      printf("\f%u:%u:%u",hor,min,seg);
      ds1307_ler_data(dsem, dmes, m, a, status);  
      printf("\n\r%u-%u-%u > dia da semana:%u",dmes,m,a,dsem);
      delay_ms(1000);
      output_toggle(PIN_C2);
   }
}

XMvpcYp.png

 

1vpB4Y4.jpg

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...