Ir ao conteúdo
  • Cadastre-se

Relógio despertador com pic18f4550


Reginaldo99

Posts recomendados

Sou estudante de técnico em Eletrônica e estou fazendo um relógio com pic18f4550, com RTC DS1307 e com memoria 24C32A.

consegui um exemplo na net, que funciona bem. Porém no ajuste do alarme ele só ajusta às horas e minutos e

eu preciso que seja ajustável o alarme em dia, mês, horas e minutos.Quem  puder me ajudar eu agradeço.

Segue o código em Mikroc:

 

//Incluções de arquivos header (Cabeçalho)
/******************************************************************************/
#include "DS1307_I2C_lib.h"
#include "Menu_Lcd_lib.h"
#include "24C32A_I2C_lib.h"

//Definições (Apelidos)
/******************************************************************************/
#define B_mais   Button(&PORTB,4,10,0)
#define B_menos  Button(&PORTB,5,10,0)
#define B_enter  Button(&PORTB,6,10,0)
#define B_voltar Button(&PORTB,7,10,0)

//Variáveis Globais
/******************************************************************************/

bit flag_teste;
char cont_alt = 0;

sbit LCD_RS at RC0_bit;
sbit LCD_EN at RC1_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

//Funções Secundárias
/******************************************************************************/
void InitTimer0();
void Interrupt();

//Função Principal
void main() {     // Função Obrigatória da linguagem C
//Variáveis Locais
  short listaMenu = 0, cont = 0;
  bit flag_mais, flag_menos, flag_enter, flag_voltar;

//Configuração dos TRIS
  ADCON1 = 0x0F;
  CMCON = 0x07;
  TRISA = 0xFF;
  TRISB = 0xFF;
  TRISC = 0XFF;
  TRISD = 0xFF;
  TRISE = 0xFF;

//Inicialização das funções

 Lcd_Init();
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,3,"ALIMENTADOR");
 delay_ms(4000);
 Lcd_Out(2,3,"PET'S   3P");
 delay_ms(2000);
   Lcd_Cmd(_LCD_CLEAR);
 I2C1_Init(100000);
 v_hora = read24C32A(0x00,1);
 v_min = read24C32A(0x00,3);

//Condições iniciais das saídas
   TRISD3_bit = 0;
   RD3_bit = 0;
   TRISD2_bit = 0;
   RD2_bit = 0;
   InitTimer0();

   delay_ms(1000);
   menu_principal(1);
   
     for(;;) //Loop inf.
     {

        if(B_mais && !flag_mais) { //inicio
         flag_mais = 1;
        }//final

        if(!B_mais && flag_mais) { //inicio
        
          if(getMenu() == 0) {
           listaMenu++;
           if(listaMenu > 4) listaMenu = 1;
           menu_principal(listaMenu);
          }
          
          if((getMenu() == 2) && (cont == 1)) {
           char aux_rtc = read_I2C_DS1307_Dia();
           aux_rtc++;
           if(aux_rtc > 31) aux_rtc = 1;
           write_I2C_DS1307_Dia(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Dia");
          }
          
          if((getMenu() == 2) && (cont == 2)) {
           char aux_rtc = read_I2C_DS1307_Mes();
           aux_rtc++;
           if(aux_rtc > 12) aux_rtc = 1;
           write_I2C_DS1307_Mes(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Mes");
          }
          
          if((getMenu() == 2) && (cont == 3)) {
           char aux_rtc = read_I2C_DS1307_Horas();
           aux_rtc++;
           if(aux_rtc > 23) aux_rtc = 0;
           write_I2C_DS1307_Horas(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Hor");
          }
          
          if((getMenu() == 2) && (cont == 4)) {
           char aux_rtc = read_I2C_DS1307_Minutos();
           aux_rtc++;
           if(aux_rtc > 59) aux_rtc = 0;
           write_I2C_DS1307_Minutos(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Min");
          }
          
          if((getMenu() == 2) && (cont == 5)) {
           char aux_rtc = read_I2C_DS1307_DiaDaSemana();
           aux_rtc++;
           if(aux_rtc > 7) aux_rtc = 0;
           write_I2C_DS1307_DiaDaSemana(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Sem");
          }
          
          if((getMenu() == 2) && (cont == 6)){
           Lcd_Out(1,12,"   ");
           cont = 1;
          }
          
          if((getMenu() == 3) && (cont == 1)){
           v_hora++;
           if(v_hora > 23) v_hora = 0;
           setMenu(3);
           Lcd_Out(2,12,"Hor");
          }

        if((getMenu() == 3) && (cont == 2)){
           v_min++;
           if(v_min > 59) v_min = 0;
           setMenu(3);
           Lcd_Out(2,12,"Min");
          }
          if((getMenu() == 3) && (cont == 3)){
           Lcd_Out(2,12,"   ");
           cont = 1;
          }
          
         flag_mais = 0;
        }//final
        
        if(B_menos && !flag_menos) { //inicio
         flag_menos = 1;
        }//final

        if(!B_menos && flag_menos) { //inicio

          if(getMenu() == 0) {
           listaMenu--;
           if(listaMenu < 1) listaMenu = 4;
           menu_principal(listaMenu);
          }
          
          if((getMenu() == 2) && (cont == 1)) {
           char aux_rtc = read_I2C_DS1307_Dia();
           aux_rtc--;
           if(aux_rtc < 1) aux_rtc = 31;
           write_I2C_DS1307_Dia(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Dia");
          }

          if((getMenu() == 2) && (cont == 2)) {
           char aux_rtc = read_I2C_DS1307_Mes();
           aux_rtc--;
           if(aux_rtc < 1) aux_rtc = 12;
           write_I2C_DS1307_Mes(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Mes");
          }

          if((getMenu() == 2) && (cont == 3)) {
           char aux_rtc = read_I2C_DS1307_Horas();
           aux_rtc--;
           if(aux_rtc < 0) aux_rtc = 23;
           write_I2C_DS1307_Horas(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Hor");
          }

          if((getMenu() == 2) && (cont == 4)) {
           char aux_rtc = read_I2C_DS1307_Minutos();
           aux_rtc--;
           if(aux_rtc < 0) aux_rtc = 59;
           write_I2C_DS1307_Minutos(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Min");
          }

          if((getMenu() == 2) && (cont == 5)) {
           char aux_rtc = read_I2C_DS1307_DiaDaSemana();
           aux_rtc--;
           if(aux_rtc < 0) aux_rtc = 7;
           write_I2C_DS1307_DiaDaSemana(aux_rtc);
           setMenu(2);
           Lcd_Out(1,12,"Sem");
          }

          if((getMenu() == 2) && (cont == 6)){
           Lcd_Out(1,12,"   ");
           cont = 1;
          }

          if((getMenu() == 3) && (cont == 1)){
           v_hora--;
           if(v_hora < 0) v_hora = 23;
           setMenu(3);
           Lcd_Out(2,12,"Hor");
          }

          if((getMenu() == 3) && (cont == 2)){
           v_min--;
           if(v_min < 0) v_min = 59;
           setMenu(3);
           Lcd_Out(2,12,"Min");
          }

          if((getMenu() == 3) && (cont == 3)){
           Lcd_Out(2,12,"   ");
           cont = 1;
          }

         flag_menos = 0;
        }//final

        if(B_enter && !flag_enter) { //inicio
         flag_enter = 1;
        }//final

        if(!B_enter && flag_enter) { //inicio

          if(getMenu() == 0) {
           setMenu(listaMenu);
          }
          
          if((getMenu() == 2) || (getMenu() == 3) ) {
           cont++;
          }
          
          if(getMenu() == 4) {
           RD3_bit = !RD3_bit;
           setMenu(4);
          }

         flag_enter = 0;
        }//final

        if(B_voltar && !flag_voltar) { //inicio
         flag_voltar = 1;
        }//final

        if(!B_voltar && flag_voltar) { //inicio
          if(getMenu() == 3) {
           write24C32A(0x00, 1, v_hora);
           write24C32A(0x00, 3, v_min);
          }
          
          if(getMenu() != 0) {
           retMenu();
          }

          if(getMenu() == 0) {
           menu_principal(1);
           listaMenu = 1;
          }

         cont = 0;
         flag_voltar = 0;
        }//final

     if(flag_teste){
        char aux_hora, aux_min;
        aux_hora = read_I2C_DS1307_Horas();
        aux_min = read_I2C_DS1307_Minutos();
        if(getMenu() == 0){
         menu_principal(1);
         listaMenu = 1;
        }
        
        if( (aux_hora == v_hora) && (aux_min == v_min) ){
         RD3_bit = 1;
         delay_ms(100000);
         RD3_bit =0;

         menu_principal(4);
         listaMenu = 4;
        }
        
        flag_teste = 0;
      }//final

      delay_ms(1);
     }//final do Loop
}//Final da main

//Timer0
//Prescaler 1:256; TMR0 Preload = 18661; Actual Interrupt Time : 1

void InitTimer0(){
  T0CON         = 0x87;
  TMR0H         = 0x48;
  TMR0L         = 0xE5;
  GIE_bit = 1;
  TMR0IE_bit = 1;
  IPEN_bit = 0;
}

void Interrupt(){
  if (TMR0IF_bit){
    cont_alt++;

    if(cont_alt > 20){
     RD2_bit = !RD2_bit;
     flag_teste= 1;
     cont_alt = 0;
    }

    TMR0IF_bit = 0;
    TMR0H = 0x48;
    TMR0L = 0xE5;
  }
}

 

Link para o comentário
Compartilhar em outros sites

57 minutos atrás, Bommu Perneta disse:

Olhando por cima estou vendo dia, mês, hora e min... você que fez o código? O que é exibido no lcd? você pode mostrar?

Eu encontrei na net e mexi um pouco.

No lcd aparece dia, mês, hora e minuto, mas para despertar só ajusta hora e minuto. Eu preciso ajustar o alarme também para mês e dia.

lcd.jpg

alarme.jpg

Link para o comentário
Compartilhar em outros sites

Cara, tem como você postar o link original de onde você tirou esse código? Esse código não comentado com 3 bibliotecas(duas estranhas) diferentes não estou conseguindo entender direito aqui.

 

Se eu fosse você iria comentando (ou seja, "//" ou "/*" e "*/") o texto para ver quais as funcionalidades de cada um e entender como é feita a marcação do despertador ou coisa do tipo...

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
18 horas atrás, Reginaldo99 disse:

preciso que seja ajustável o alarme em dia, mês,

Perdão mas não analisei o código todo... Penso que as funções que escrevem no dia e mês são:

18 horas atrás, Reginaldo99 disse:

write_I2C_DS1307_Dia(aux_rtc);

e

18 horas atrás, Reginaldo99 disse:

write_I2C_DS1307_Mes(aux_rtc);

Ajuste, crie variáveis do alarme v_mes, v_dia;

v_mes=read_I2C_DS1307_Mes();

v_dia=read_I2C_DS1307_Dia();

 

Localize onde menciona horas e minutos e acrescente dia e mês. Algo como...
...

if( (aux_hora == v_hora) && (aux_min == v_min) && (aux_mes == v_mes) && (aux_dia == v_dia) ) {

 

Ouvi dizer que este chip de relógio tem memória ram. Especialmente útil pra estas funções de alarme pro caso de ausência temporária de luz.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

9 horas atrás, Isadora Ferraz disse:

Perdão mas não analisei o código todo... Penso que as funções que escrevem no dia e mês são:

e

Ajuste, crie variáveis do alarme v_mes, v_dia;

v_mes=read_I2C_DS1307_Mes();

v_dia=read_I2C_DS1307_Dia();

 

Localize onde menciona horas e minutos e acrescente dia e mês. Algo como...
...

if( (aux_hora == v_hora) && (aux_min == v_min) && (aux_mes == v_mes) && (aux_dia == v_dia) ) {

 

Ouvi dizer que este chip de relógio tem memória ram. Especialmente útil pra estas funções de alarme pro caso de ausência temporária de luz.

 

adicionado 1 minuto depois

Obrigado Isadora Ferraz, ajudou muito!!!

adicionado 3 minutos depois

Obrigado Bommu Perneta, estou comentando depois eu posta pra você verificar.

adicionado 4 minutos depois
1 hora atrás, Bommu Perneta disse:

Obrigado Bommu Perneta, estou comentando depois eu posta pra você verificar.

 

 

Link para o comentário
Compartilhar em outros sites

19 horas atrás, Isadora Ferraz disse:

 

Ouvi dizer que este chip de relógio tem memória ram. Especialmente útil pra estas funções de alarme pro caso de ausência temporária de luz.

 

Esse CI é de primeira geraçao e tem uma precisão baixa, muito dependente do seu cristal “chinês” que varia muito com a temperatura. E tem 56 bytes de Ram.

 

Hoje todos usam o Ds3232, que tem TCO de grande precisão, tem mais de 200 bytes de Ram, e a maneira de usar é práticamente a mesma, embora tenha alguns recursos extras bem interessantes,  e o custo continua sendo baixo !

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...