Ir ao conteúdo
  • Cadastre-se
joseca

Relogio do Matheslps

Recommended Posts

Estive vendo as postagens do matheslps(2010) do relogio com termometro e achei muito interessante.

Acontece que o codigo da varios erros (c ccs)ao compilar.

Segue o codigo:


#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_B1

BYTE sec;
BYTE mim;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;

int8 modo;
int16 adc;
float temperatura;

int8 tempo;

char dia_da_semana[7][8]=
{
"DOMINGO",
"SEGUNDA",
"TERCA",
"QUARTA",
"QUINTA",
"SEXTA",
"sábado",
};

#int_timer1
void trata_tempo()
{
tempo++;

if (tempo == 10)
{
output_toggle (PIN_B7);
tempo=0;
disable_interrupts( INT_TIMER1); //Habilita interrupção timer1
}
set_timer1 (3036);
}

#int_ccp1
void trata_ccp_1()
{
if ((modo == 0) && (tempo ==0))
{
output_toggle (PIN_B7);
enable_interrupts( INT_TIMER1); //Habilita interrupção timer1
set_timer1 (3036);
}
}

#int_ccp2
void trata_ccp_2()
{
modo++;
if (modo == 1)
{
disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
output_high (PIN_b7);
}

if (modo > 7 )
{
modo = 0;
}

if (modo == 0 )
{
enable_interrupts( INT_TIMER1); //Habilita interrupção timer1
}
}

void main()
{
output_high (PIN_B7);
setup_ccp1(CCP_CAPTURE_RE);
setup_ccp2(CCP_CAPTURE_RE);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1

enable_interrupts( INT_TIMER1); //Habilita interrupção timer1
enable_interrupts (int_ccp1);
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;

while(1)
{
switch (modo)
{
case 1:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
hrs++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
hrs--;
}

if (hrs == 24 )
{
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);
mim++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
mim--;
}

if (mim == 60 )
{
mim = 0;
}

if (mim == 255 )
{
mim = 59;
}

printf(lcd_putc,"\fAjustar Minutos:\n%u",mim);
delay_ms (100);
break;
}

case 3:
{
if (input(BOTAO_INCREMENTO))
{
delay_ms (75);
sec++;
}

if (input(BOTAO_DECREMENTO))
{
delay_ms (75);
sec--;
}

if (sec == 60 )
{
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 == 32 )
{
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 == 13 )
{
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 == 100 )
{
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,mim,sec);

break;
}

default:
{
adc = read_adc(); //Lê canal 0
temperatura = (5.0 * adc * 100) / 1024.0; //Conversão para tensão.


ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,mim,sec);

printf(lcd_putc,"\f%s %02d:\%02d:\%02d\n%02d/\%02d/\%02d %2.0f%cC",dia_da_semana[dow-1],hrs,mim,sec,day,month,yr,temperatura,0xdf);
delay_ms(1000);
}
}
}
}
#include <16F877A.h>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Favor postar a versão do compilador usada e se possível uma foto dos erros de compilação.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matheus,fiz a correçaõ do driver do DS1307 que voce citou para fazer o dowload e coloquei o driver do referido na pasta PICC e deu certo,agora nao deu erro ao compliar.

Achei o projeto muito interessante,vou montar no proteus e depois montar a placa definitiva do circuito impresso.

Li todo o post de vocês e aprendi muito,vamos ver como se comporta no proteus.;);)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matheus,simulei o codigo e te pergunto:

Qual a frequencia do clock do pic?

o ajuste da temperatura pelo lm35 as vezes nao bate com o display

o ajuste de incremento e decremento esta meio critico(difícil de ajustar)

Acho que ja te perguntei isso uma vez e voce me disse que o proteus não tem tanta precisão assim,que é melhor fazer uma montagem real na protoboard.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No código que você postou está assim nas primeiras linhas:

#use delay( clock=4000000)

Ou seja, 4Mhz

Para esse código, tirando alguns bugs do proteus, funciona na simulação.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matheus,o meu relogio esta atrasando,com cristal do rtc de 32.768khz,em relação ao relogio no computador:mad::mad::mad:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí realmente é complicado.

O simulador dá uns bug desse mesmo.

Pode montar na protoboard.

Falou

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

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

×