Ir ao conteúdo

Posts recomendados

Postado

preciso programar um relogio em tempo real com alarme so que nao sei como devo encaixar a programaçao do alarme alguém ai pode me ajudar?

LEMBRANDO QUE o ALARME DEVE SER ACIONADO QUANDO PULSAR B3.ESTOU ULTILIZANDO também O DISPLAY DE LCD 16X2
segue abaixo meu codigo:

#include <p18f4520.h>     //bibiblioteca do PIC18f4550
       
#include <stdio.h>        //bibilioteca  de entradas e saídas
#include <delays.h>          //Adiciona a bibilioteca de funcões do delay 
#include <adc.h>          //Adiciona a bibilioteca de funções para o conversor A/D
#include <timers.h>       //Adiciona a bibilioteca de funções do timer 
#include "lcd_lib.h"        // lib.lcd

#pragma config OSC = HS      //Oscilador e cristal 20Mhz
#pragma config PWRT = ON     //Power Up Time Enable 
#pragma config BORV = 1         //tensão do BOR é 4,33v
#pragma config WDT = OFF     //Desabilita o Watchdog Timer
#pragma config PBADEN = OFF  //RB0:RB4 I/O Digital
#pragma config LVP = OFF     //ICSP. Low power programming Digital
#pragma config LPT1OSC = ON  //programado pra operar no modo Low-power

#define B1 PORTBbits.RB0
#define B2 PORTCbits.RC0
#define B3 PORTAbits.RA4

char lcd[17];
unsigned  char conta_100ms =0 , segundo ,minuto ,hora ;
void ISR_alta_prioridade(void); //Protótipo da função de interrupção
#pragma code int_alta=0x08      //Vetor de interrupção de alta prioridade 
void int_alta(void)
{
    _asm goto ISR_alta_prioridade _endasm  //Desvia o programa para a função ISR_alta_prioridade

#pragma code 
#pragma interrupt ISR_alta_prioridade
void ISR_alta_prioridade(void)
{
    WriteTimer1(40535);
    if(PIR1bits.TMR1IF){
      conta_100ms++;
      PIR1bits.TMR1IF = 0;
    }
    if(conta_100ms == 10){
      segundo++;
      conta_100ms = 0;
    }          
          
    
    if(segundo==60)
    {
        minuto++;
        segundo = 0;
     if(minuto==60)
    {
        hora++;
        minuto =0;
    if(hora==24)
        hora=0;
    }
    }
}
void main (void)
{
    TRISA = 0x00;
    TRISB = 0x01;
    TRISC = 0x00;
    TRISD = 0x00;
    TRISE = 0x00;
    ADCON1 = 0x0F;
    OpenTimer1(TIMER_INT_OFF
                 &T1_8BIT_RW
                 &T1_SOURCE_INT
                 &T1_OSC1EN_ON
                 &T1_SYNC_EXT_OFF
                 &T1_PS_1_1);
     PORTD = 0x00;
     PORTE = 0x00;
     Delay10KTCYx(100);
     
     PIR1bits.TMR1IF = 0;
     IPR1bits.TMR1IP = 1;
     PIE1bits.TMR1IE = 1;
     InitLCD();
  while(1){
    ComandoLCD (0x81);                 //posiciona o cursor linha 1 coluna
    sprintf(lcd,"REAL TIME CLOCK");      //Envia a msg para o vetor
    putsLCD(lcd);                 // posiciona o cursor linha 2 coluna 4
    ComandoLCD(0xC3);
    sprintf(lcd,"%02d:%02d:%02d",hora,minuto,segundo);    //Envia a mensagem para o vetor
    putsLCD(lcd);
    RCONbits.IPEN = 1;
    INTCONbits.GIEH = 1;
    INTCONbits.GIEL = 1;
    TMR1H = 0x80;
    TMR1L = 0x00; 
        }
        Delay10KTCYx(100);
}
 

Postado

Amigo, qual RTC você vai usar? Pra te ser sincero, os que existem no mercado são umas belas porcarias em se tratando de precisão, eu te aconselharia usar o DS3231, é o mais preciso que já vi, sem contar os recursos de correção que ele possui.

 

Caso você não vá usar um RTC e o relógio for implementado via programação, já te adianto que uma precisão razoável será difícil de ser conseguida, a não ser que você use uma frequência externa para servir de base ou então programe tudo em Assembler. Ainda assim insisto no RTC.

 

Outra coisa, o seu alarme, vai despertar por dias da semana ou será somente por horário mesmo?

Postado
10 horas atrás, ViniciusKruz disse:

Amigo, qual RTC você vai usar? Pra te ser sincero, os que existem no mercado são umas belas porcarias em se tratando de precisão, eu te aconselharia usar o DS3231, é o mais preciso que já vi, sem contar os recursos de correção que ele possui.

 

Caso você não vá usar um RTC e o relógio for implementado via programação, já te adianto que uma precisão razoável será difícil de ser conseguida, a não ser que você use uma frequência externa para servir de base ou então programe tudo em Assembler. Ainda assim insisto no RTC.

 

Outra coisa, o seu alarme, vai despertar por dias da semana ou será somente por horário mesmo?

 

adicionado 1 minuto depois

O alarme despertará  por hora mesmo e vou ter fazer via programação  em c

 

 

Postado

@Victor 222222 Ok, entendi. Seu código que foi postado já é um relógio por programação, você precisa agora implementar o alarme né. Como esse relógio seu não tem menu de programação nem das horas, você vai precisar implementar isto, caso contrário não vai ter como acertar o alarme nem as horas. Vai querer fazer esta parte também?

 

Se não for implementar os menus, é só criar as variáveis do alarme:

 

int minutoAlarme;

int horaAlarme;

 

Depois compara dentro do main():

 

while(1){
  minutoAlarme=0;
  horaAlarme=12;//alarme programado para as 12:00
  if((minuto>=minutoAlarme) && (minuto<= minutoAlarme+1) && (hora==horaAlarme)){//aqui só vai entrar e permanecer em disparo por 1 minuto
  	//dispara o alarme por um minuto
  }
}

 

Para disparar o alarme pressionando uma tecla, seria também dentro do while(1):

while(1){
  minutoAlarme=0;
  horaAlarme=12;//alarme programado para as 12:00	
  if((minuto>=minutoAlarme) && (minuto<= minutoAlarme+1) && (hora==horaAlarme)){//aqui só vai entrar e permanecer em disparo por 1 minuto
  	//dispara o alarme por um minuto
  }
  
  if(botão pressionado){
    //dispara o alarme
  }
    
}

Basicamente acho que a lógica seria esta, mas como eu disse, se você for implementar as telas de menu, aí já serão outros quinhentos.

 

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!