Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Reginaldo99

Relógio despertador com pic18f4550

Recommended Posts

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;
  }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Editado por Reginaldo99

    Compartilhar este post


    Link para o post
    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...

    Editado por Bommu Perneta
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    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 3

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

     

     

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×