Ir ao conteúdo
  • Cadastre-se

Relogio do Matheslps


joseca

Posts recomendados

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>

Link para o comentário
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.;);)

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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