Ir ao conteúdo
  • Cadastre-se

Relogio com ds1307, termometro com lm35, display lcd, e pic 16f877a


janascimento

Posts recomendados

Boa noite a todos.

Seguinte, já acompanho este site a algum tempo. Devo confessar que a eletrônica me fascina, procuro na medida do possível responder algumas dúvidas referente a eletrônica e um tanto a eletricidade.

Mais vamos ao caso.

Procurei na net e também aqui no CDH um projeto que contemple:

Um display LCD 16X2,

Um Pic 16F877A,

Um sensor LM35

Um DS 1307.

Objetivo:

Fazer um relógio com o DS 1307 (Real time clock), e um termômetro com o LM35 mostrado tudo num so display.

Tenho alguns exemplos (inclusive devo ao meus amigos Jorge e ao Matheus), mais estão "separados", ou seja, são circuitos separados.

Acredito que não deva ser tão complicado assim (ah desculpe-me mais não programo), então fica um pouco difícil para mim ter que "juntar partes de programas",

Gostaria de tirar a ideia do papel e colocar em prática.

Fico no aguardo de vossas contribuições

Obrigado

José Antonio

Link para o comentário
Compartilhar em outros sites

Tá na mão colega!!!!

Agora que o período da faculdade acabou vou pode entrar mais no fórum!!!!!!!!!!

Circuito:

temp_lm35_1307.jpg

Código:

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

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

int8 modo;
int16 adc;
float temperatura;

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

#int_ccp2
void 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;

while(1)
{
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:
{


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,min,sec);

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(1000);
}
}
}
}

Falou

Link para o comentário
Compartilhar em outros sites

Obrigado Matheus, farei os teste (Proto e Proteus), depois te digo o resultado.

Agora quanto ao resistor de 10K no MCLR (1) e a tensão de referência de 1,5V no Vref+ (5) serão necessários ? É que em esquema que possuo eles estão presentes.

Mais uma vez, valeu pela ajuda.

abraços

JA

Link para o comentário
Compartilhar em outros sites

Matheus

Brincadeirinha, viu? Eu vi logo que era erro de digitação.

Mas o que eu quero fuçar é colocar: na rotina de acerto do relógio, mais duas informações: início de evento e final de evento, considerando apenas hora e minuto.

Se o horário real estiver dentro desse range, um pino será colocado em nivel alto.

Ainda, no caso de a temperatura chegar a determinado valor ou abaixo, colocar um pino no nivel alto. (isso eu já fiz)

O meu maior problema é com relação à comparação de horário: Se eu desejar que esse pino fique em nível alto das 6 à meia-noite.

Se hora >= 18 && hora <=00 ...

Isso não funciona (é óbvio), no mínimo teria que ser 24, mas aí o relógio será 00.

Entendeu a confusão?

Link para o comentário
Compartilhar em outros sites

compilado com sucesso ze, so mandar brasa


#include <16F877A.h>

#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 min;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;

int8 modo;
int16 adc;
float temperatura;

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

#int_ccp2
void 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;

while(1)
{
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:
{

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,min,sec);

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(1000);

}
}
}
}

Link para o comentário
Compartilhar em outros sites

janascimento e demais.

O que está faltando é o driver ds1307.c.

A minha versão do PIC também não a possui.

Você pode pegá-lo daqui: http://www.ccsinfo.com/forum/viewtopic.php?t=23255

copie-o e cole no bloco de notas, então salve na pasta drivers do PICC com o nome ds1307.c.

Link para o comentário
Compartilhar em outros sites

Estranho.

Acabei de compilar aqui e deu certo.

Vou postar o driver que tenho aqui para ver se muda algo:


////////////////////////////////////////////////////////////////////////////////
/// DS1307.C ///
/// Driver for Real Time Clock ///
/// ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
/// used when PIC loses power and DS1307 run from 3V BAT ///
/// - Disable squarewave output ///
/// ///
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec) Set the date/time ///
/// ///
/// ds1307_get_date(day,mth,year,dow) Get the date ///
/// ///
/// ds1307_get_time(hr,min,sec) Get the time ///
/// ///
////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
#use i2c(sda=PIN_C4, scl=PIN_C3, stream=I2C_HW)

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
BYTE seconds = 0;

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;

delay_us(3);

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x10); // Disable squarewave output pin
i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;

i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x10); // REG 7 - Disable squarewave output pin
i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read() & 0x3f);
i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;

temp = binary_value;
retval = 0;

while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}

return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;

temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;

// Now return: (Tens * 8) + (Tens * 2) + Ones

return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

Existe uma pequena diferença, pelo que vi.

Testa esse.

Abraços

Link para o comentário
Compartilhar em outros sites

Vamos lá.

José, para o seu caso, apenas copiando a BIBLIOTECA já mencionada no link já postado, colando no bloco de notas e salvando como DS1307.C, como foi dito. Depois diso só mandar compilar... Mas se toda forma, você pode baixar o projeto todo aqui:

DS1307_LM35_LCD_relogio

O projeto está compilável. Coloquei o DS1307.C na pasta do código principal.

Rick_DF, para os eu caso podemos resolver da seguinte forma:

if ((hora >= 18) && (hora <= 23) && (min <=59))

Resolve, né?

Falou

Link para o comentário
Compartilhar em outros sites

Matheus, por gentileza disponibilize a pasta no 4shared, pois está apareçendo a seguinte mensagem:

"O link para o arquivo que você solicitou não é válido"

Copiei o driver que o Rick passou e consegui compilar.

Quando simulei no Proteus, ocorreram dois erros, não sei se é devido ao simulador ou mesmo um erro no pgr.

Seguinte, quando acertei a data e retornei a tela principal, ex. hj é terça, ele retornou para sábado.

Outra coisa que percebi, a data também após o acerto ela aparece com na figura abaixo.

O relógio tem hora 45, uhuhuhuhuhuh,.

Bom como te disse pode ser q no proto não aconteça isto, de qq forma está ai o ocorrido.

post-756642-13884959884639_thumb.jpg

post-756642-13884959884961_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Boa noite Matheus, Jorge e Rick_DF.

Amigos, por enquanto montado no proto-board em teste.

Vai ficar lá um dia ligado até começar a pensar na PCI para ele.

Show de bola Matheus.

Ainda não vou pedir o encerramento do tópico por observar o comportamento do conjunto Ok.

Abraços e qq novidade escrevo.

Valeu

José Antonio

Link para o comentário
Compartilhar em outros sites

Matheus o meu por enquanto está funcional.

Retirei a alimentação da fonte e depois retornei após uns minutos e o DS comportou-se bem.

Só uma coisa q acho que não tá legal, não sei sua opinião.

Na segunda linha após a data, a temperatura aparece com 2 casas decimais.

Tratando de um temometro para simples conferencia da temperatura ambiente, o que acha de mudarmos para este formato ?

13/07/11 23ºC

Fico no aguardo de sua opinião

Link para o comentário
Compartilhar em outros sites

você tem total razão.

Me esqueci de colocar a formatação correta da temperatura.

Sendo um float, ela está assim na penúltima linha do código:

%f

Se você colocar:

%2.0f

O PIC vai reservar duas casas antes da vírgula e vai eliminar depois da vírgula! Simples, não?

Seguinte, uma dica legal para quem ainda nao sabe imprimir o símbolo de graus celcius (º):

apenas ponha na linah que deseja imprimir assim:

printf(lcd_putc," %c",0xdf);

Dessa forma, no LCd aparece isso:

º

De toda forma, a penúltima linha do código fica assim corrigida:

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

Falou

Link para o comentário
Compartilhar em outros sites

Senhores, montei ontem na protoboard e não é que não funcionava?

Olha ali, revisa as ligações, tudo perfeito.

Tira o 1307, funciona. Coloca novamente, não funciona...

Não é que o animal aqui esqueceu de colocar os resistores de pull-up do ds1307?

Agora tudo nos trinks.

Bom agora chegou a hora de modificar para chegar ao que eu quero.

Dúvidas:

Matheus, setando um timer da PIC, contando os estouros para chegar a + ou - 10 segundos, o programa principal para?

Sei que se usar o delay ele congelará durante esses 10 segundos.

O motivo é que não quero que o back light do LCD fique sempre aceso, daí a minha intenção de, ao acionar qualquer um dos botões, o mesmo permaneça aceso por 10s, apagando ao final.

Parece besta, mas me preocupo com o consumo, e como vai ficar ligado indefinidamente, no final acabará compensando.

A outra dúvida é: escrevendo um dado na eeprom (write_eeprom(1)) esse dado permanecerá mesmo após uma queda de energia?

Abraços

Link para o comentário
Compartilhar em outros sites

você pode sim utilizar o TIMER1 para gerar ser tempo de 10 segundos sem problemas. Seu caso de desligar o backlight é facilmente contornável. Apenas utilize um pequeno trasistor para chavear a fonte q alimenta o backlight. I utilize um pino do PIC para chavear o transistor.

No caso da eepron, você está correto. Mas o ideal nesse caso nosso, é deixar com q o DS1307 armazene esses dados com a bateria q ele possui....

Falou

Falou

Link para o comentário
Compartilhar em outros sites

Boa noite Matheus,

Desculpem estar retornando somente agora, esta semana foi bem agitada.

Matheus mudei o código e imprimi novamente no display.

100% funcional.

Fiquei interessado nesta parte onde você primi qq tecla (utilizando o TIMER 1 do pic), e chaveando com um transistor a fonte para o display (backlight) com um delay de 10s.

Com certeza terá de alterar algo no código.

Estava já pensando em inserir um outro push com um 555 somente para fazer esta função.

Se puder alterar fico grato,

De momento já estou satisfeito com o apresentado.

Obrigado.

José Antonio

Link para o comentário
Compartilhar em outros sites

Ok, vou alterar aqui.

Rapidin eu faço.

EDIT:

Feito:

Fiz uma modificação no código que acredito que tenha ficado muito bom.

Como vocês que montaram, peço que testem p ver s enão passou nada despercebido no código.

O legal que você não precisam configurar a hora novamente se o DS1307 estiver na bateria!!!!

Só gravar o PIC novamente e adicionar uma coisinha que não sei se vocês vão gostar. Um botão a mais.

Ficou assim o cirucito:

ds1307_com_backlight.jpg

Acredito que o BC549 seja suficiente para a maioria do LCDs. Ele suporta 100mA. Se acharem pouco, apenas alterem para um maiorzinho.

Funciona assim o novo código:

Quando vocês ligarem o PIC, ele vai para a rotina que mostra a hora normal. De padrão ele já vai contar o tempo e vai desligar o backlight no tempo q vocês configurarem na interrupção. Deixei 5 segundos.

Para alterar, apenas procure pela linha:

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

Onde tem o 10, modifique para o tempo que quiserem mas levem em consideração multiplicar o tempo por 2! Nesse caso aí está com 5 segundos, então tem 10 no código. Se quiserem 10 segundos, troquem para 20! Simples.

Então assim que ligarem o pic, 5 segundos ele desliga o backlight.

Se vocês apertarem o botao que está no C2, ele liga o backlight e desliga depois do tempo.

Enquanto vocês estiverem configurando o DS1307, acertando a hora e data, ele nao apaga!

Qualquer bug que tenha passado, me avisem q ajeito!

Código:


#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 min;
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 > 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:
{
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,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);
delay_ms(1000);
}
}
}
}
#include <16F877A.h>

Falou

Link para o comentário
Compartilhar em outros sites

"Ultimas notícias, direto do laboratório do JA".

Matheus, o circuito está em funcionamento, o timmer do back light está funcionando e o relógio 100%.

Notei que:

Ao acionar o push para o back, a temperatura no display fica oscilando (ex. 23º atual, ao acionar 25º, 27º, 25º). Ao término do tempo do timmer a temperatura volta aos 23º.

Que será que pode ter ocorrido ?

Outra coisa:

- Nos ajustes, ex. dia 27. se quiser dia 2 tenho de retroceder, se avançar chegar no dia 31 e pára.

Isto ocorre para todo o ajuste.

Bom qq outra ocorrência posto aqui, mais está ficando 100%.

Este projeto ficará 1000%

JA

Link para o comentário
Compartilhar em outros sites

jOSÉ,

Esse problema da temperatura ocorria antes?

Seguinte, acredito q você deixou o LM35 perto do LCD ou do 7805.

Eles esquentam um pouquinho, deve ser por isso q a sua temperatura varia quando o backlight acende.

Até porq estamos no inverno e 23º é mais "real". Isso depende da sua região também.

Sobre os números travarem, modifiquei aqui, teste mais uma vez por favor.

Código:


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

Falou

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