Ir ao conteúdo

Projeto de relógio com termômetro (lm35) com PIC16F877A


joseca

Posts recomendados

Postado

@MatheusLPS,

Eu quis dizer fazer aquilo sem precisar usar esse sinal de saída !!!!! Talvez corrija esses pulos sem ter de fazer o jumper.

Mas isso que voce falou é exatamente o que eu fiz no Atmega, a cada descida gerava uma int que já lia os dados, setava um flag de dados prontos e saia. O programa principal ficava em loop, sempre esperando esse flag para atualizar o lcd.

Paulo

Postado

Então sua ideia seria ficar em loop lendo o DS1307 e se os segundos mudarem, atualiza o LCD. Hum... a ideia é interessante mesmo e não exige o jumper.

 

Vou esboçar algo e passo ao joseca.

 

Realmente, sem o DS1307 fisicamente aqui terá que ser assim.

 

Falou

Postado

@MatheusLPS,

De qualquer maneira, desde o início do Post, isso de pular não deveria acontecer.. E com as correções feitas, também não deveria...

Eu fiquei pensando na maneira que essa library trata o LCD.

Por exemplo, se tiver um comando para zerar o display, ela vai escrever um monte de caractere " " , para um display de 16 x 2 são no mínimo umas 35 escritas ao LCD.

Uma nova re-escrita serão mais 35 no mínimo.

Usando o modo simples de apenas 4 bits de escrita, sem usar os outros sinais, com certeza está sendo gerado um delay entre elas dentro da library, e se esse delay estiver equivocado, isso pode fazer com que demore muito uma atualização completa no display.


Paulo

Postado

Paulo e Matheus LPS, eu gravei o PIC com as correções que o VTRX indicou e parou de pular a contagem dos segundos e tambem alteria a linha que o Matheus disse e agora esta joia,apenas acho que ele esta adiantando um pouco,uns segundos por dia mas isso como o vtrx disso não vai ficar perfeito com a precisão da hora oficial de brasilia.

Obrigado a todos que de alguma forma contribuiram e deram suas opinioes e sugestoes para aumentar o nosso apredizado

Postado

Fiz algumas modificações no codigo do vtrx,para tocar um bip nas horas cheias e acender o back light

#include <16F877A.h>#device adc=10                   //Habilitar ADC de 10 bits, obrigatório. Pode                                 //ser utilizado de 8 bits também.#FUSES NOWDT                    //No Watch Dog Timer#FUSES XT                          //Clock <=4Mhz#FUSES PUT                      //Power Up Timer#FUSES NOPROTECT                //Code not protected from reading#FUSES NOBROWNOUT               //No brownout reset#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOCPD                    //No EE protection#use delay(clock=4000000)#include <ds1307.c>#include <lcd.c>#define botao_incremento PIN_B0#define botao_decremento PIN_B1BYTE sec;BYTE min;BYTE hrs;BYTE day;BYTE month;BYTE yr;BYTE dow;int8 modo,temp;int16 adc;float temperatura;char dia_da_semana[7][8]={   "DOMINGO",   "SEGUNDA",   "TERCA",   "QUARTA",   "QUINTA",   "SEXTA",   "SABADO",};#int_ccp2void trata_ccp_2(){   modo++;   if (modo > 7 )   {      modo = 0;   }}void main(){        setup_ccp2(CCP_CAPTURE_RE);   enable_interrupts (int_ccp2);   enable_interrupts (global);      setup_adc_ports(AN0);         //Configura canal 0 analógico   setup_adc(ADC_CLOCK_INTERNAL);    //De acordo com relógio interno.      set_adc_channel(0);           //Habilita canal 0   delay_us(20);                 //Espera um pouco, obrigatório!         ds1307_init();   lcd_init();   modo = 0;   temp=0;   while(true)   {      switch (modo)      {         case 1:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               hrs++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               hrs--;            }                        if (hrs > 23 )            {               hrs = 0;            }                        /*if (hrs == 255 )            {               hrs = 23;            }*/                        printf(lcd_putc,"\fAjustar Hora:\n%u",hrs);                        delay_ms (100);            break;         }                  case 2:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               min++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               min--;            }                        if (min > 59 )            {               min = 0;            }                        /*if (min == 255 )            {               min = 59;            }*/                        printf(lcd_putc,"\fAjustar Minutos:\n%u",min);                        delay_ms (100);            break;         }                  case 3:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               sec++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               sec--;            }                        if (sec > 59 )            {               sec = 0;            }                        /*if (sec == 255 )            {               sec = 59;            }*/                        printf(lcd_putc,"\fAjustar Segundos:\n%u",sec);                        delay_ms (100);            break;         }                  case 4:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               day++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               day--;            }                        if (day > 31 )            {               day = 1;            }                        if (day == 0 )            {               day = 31;            }                        printf(lcd_putc,"\fDia do Mes:\n%u",day);                        delay_ms (100);            break;         }                  case 5:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               month++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               month--;            }                        if (month > 12 )            {               month = 1;            }                        if (month == 0 )            {               month = 12;            }                        printf(lcd_putc,"\fAjustar Mes:\n%u",month);                        delay_ms (100);            break;         }                  case 6:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               yr++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               yr--;            }                        if (yr > 99 )            {               yr = 1;            }                        if (yr == 0 )            {               yr = 99;            }                        printf(lcd_putc,"\fAjustar Ano:\n%u",yr);                        delay_ms (100);            break;         }                  case 7:         {                        if (input(BOTAO_INCREMENTO))            {               delay_ms (75);               dow++;            }                        if (input(BOTAO_DECREMENTO))            {               delay_ms (75);               dow--;            }                        if (dow > 7 )            {               dow = 1;            }                        if (dow == 0)            {               dow = 7;            }                        printf(lcd_putc,"\fDia da Semana:\n%s",dia_da_semana[dow-1]);                        delay_ms (100);            ds1307_set_date_time(day,month,yr,dow,hrs,min,sec);            break;         }                  default:                   {         if ((min == 59) && (sec ==59)){                     output_high(pin_b4);            delay_ms(100);            output_low(pin_b4);            delay_ms(100);            output_high(pin_b4);            delay_ms(100);            output_low(pin_b4);                                             }                                                                           {                                   temp++;            if(temp == 10){            adc = read_adc();               //Lê canal 0            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.             temp=0;            }              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 %2.0f%cC",dia_da_semana[dow-1],hrs,min,sec,day,month,yr,temperatura,0xdf);                         // printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d %f",dia_da_semana[dow-1],hrs,min,sec,day,month,yr,temperatura);                          delay_ms(100);                        {            output_high (PIN_B5);            }                       // output_toggle(pin_b2);{       //  delay_ms(100);        // output_toggle(pin_b3);        // delay_ms(500);        // output_toggle(pin_b3);        // delay_ms(500);            }                                              }      }      }   }

Arquivado

Este tópico foi arquivado e está fechado para 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!