Ir ao conteúdo

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


joseca

Posts recomendados

Postado

@joseca,

 

Tem duas maneiras.... uma , caso sejam pequenos, é compactar eles em um arquivo .zip ou .rar , e quando você estiver escrevendo a resposta, clicar embaixo na parte de baixo da tela onde você está rescrevendo onde está escrito USAR EDITOR COMPLETO, para poder mostrar o editor de texto do fórum com todos os recursos, e vai ver lá embaixo ao final uma opção para enviar arquivos, tem de abrir uma tela do Browser, e navegar em seu micro até o arquvi, e a seguir clicar em UPLOAD. Esperer um pouco e ele vai estar prontinho, quando você salvar o post o arquivo já vai estar disponível para todos.

 

Outra, é criar uma conta nesses sites de compartilhar arquivos, tipo o 4SHARED, assim você envia para lá o arquivo, e para cada arquivo salvo o 4shared indica um link para download. é só pegar esse link do arquivo e colar ele no seu post.

 

Paulo

Postado

Não sei organizar o código C, somente assembly.

 

 Se alguem poder modificar o código aí, faz o seguinte:

 

essa parte de aquisição deve está dentro da interrupção do timer

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

a interrupção está sendo gerada a cada 0,5 segundos, vamos modificar para 0,1 segundos. A aquisição será feita a cada 100ms.

set_timer1 (53036);

Reajustando o tempo de 5 segundos

if (tempo == 50)// 5 segundos

e a atualização do display é:

 

checa se "sec é diferente dos segundos que estão no display,  se for diferente atualiza lcd com novos valores, se não não atualiza lcd. e não precisará de delay ao final da atualização

Postado

Só sei de uma coisa,não consegui temporizar as instruções do LCD e I2C(DS1307) dentro da interrupção em 1 segundo,o compilador desabilita por over time.

Talvez não seja possível atualizar o LCD para ler com exatidão de 1 em 1 segundo,pelo menos no CCS.

Postado

O link tem os dois.

Simular no proteus não é bom,tenta no Hardware mesmo.

Vai aumentando o delay até achar um ponto  mais exato.

Eu acho que ficar perfeito não fica,pois pelo CCS,ler data,ler temperatura e atualizar o LCD demora mais de 1 segundo.

Programei o Timer para exatos 1 segundos e coloquei estas rotinas no Timer e o CCS avisou que iria desabilitar as interrupções.

Postado

@vtrx,

Num dá para apenas ler do ds1307 a cada 1 segundo, e colocar em variáveis, setar um flag de Ready e sair; o programa principal ficaria toda hora lendo esse flag Ready, escreve no display, e reseta esse flag , e volta pro loop ???

Se o CCS tá complicando a escrita, usa os outros dois pinos do display para consultar o status, assim tenho certeza que dá para atualizar duas linhas completas 14 vezes por segundo, porque eu já fiz isso e medí o refresh rate ...

Pode ser que a rotina da library do display esteja colocando um delay muito alto para cada caractere, aí para atualizar as duas linhas pode demorar.... O certo seria fazer da maneira tradicional lendo o status.

Paulo

Postado

@aphawk

Vou deixar para o @MatheusLPS.

Eu fiquei pensando em mais alguma coisa para me distrair e dei uma olhada nos relógios de parede que vendem por aí,e resolvi fazer um

com o 18F2550 + um programa de interface,via USB.

JA encomendei seis display 7seg grandes para hora,minutos e segundos + 9 displays pequenos para dia,mes,ano e temperatura.

Ja tava na hora de usar o DS1307 jogado aqui a mais de 1 ano...

 

 

Num dá para apenas ler do ds1307 a cada 1 segundo, e colocar em variáveis, setar um flag de Ready e sair; o programa principal ficaria toda hora lendo esse flag Ready, escreve no display, e reseta esse flag , e volta pro loop ???

As rotinas postadas,dentro de uma interrupção em 1 segundo,o compilador avisa que vai desativar as interrupções para evitar nova chamada CALL,mesmo usando FASTIO que elimina um TRIS a cada saida ou entrada de pino..

Na simulação ficou um lixo.

 

Rotinas usadas num Timer de 1 segundo;

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

CCS__1_.jpg

Postado

ola  galera  bom dia!

para os mas leigos  tem como vocês  postarem  o código .hex  ja compilado pois  sempre que tento  fazer algo mas  avançado como esse projetinho do  Matheus  da erro  como  se faltasse a biblioteca do rtc   como  se resolve  passo a passo ,   sem querer  tirar o rumo do tópico mas esta dentro do contesto  uma vez que se alguém tentar compilar  não ira conseguir sem antes ter tratado isso a não ser que o ccs ja tenha  este arquivo  embutido  se tiver errado  pode me corrigir

Postado

Pessoal, só hj estou tendo tempo de ver isso.

 

Bom, sobre o tempo de leitura do AD, conversão para temperatura, leitura do DS1307 e escrita no LCD, temos um tempo de 36mS medido com o Proteus. Apenas coloquei um output_high e output_low no início antes do AD e depois da escrita no LCD. Veja que na escrita, tenho um \f (apagar o LCD e escrever). Quando o Proteus para o programa no breakpoint logo depois da escrita, no Proteus, o LCD já está totalmente escrito.

 

Não tenho o DS1307 aqui para medir na prática.

 

Veja:

 

post-543152-0-28983400-1405463049_thumb.

 

e

 

post-543152-0-94061800-1405463052_thumb.

 

Estou tentando usar a ideia do @aphawk, usando o pino 7 do DS1307, mas parece que o proteus não quer simular ele. Estou dando uma olhada nesse momento no datasheet para verificar o valor do resistor de pull-up.

 

Esse projeto é muito simples para dar esse tipo de problema. Não deveria estar acontecendo isso.

 

@joseca

 

Você chegou a deixar ele ligado por exemplo 1 semana e verificou se o horário atrasa ou adianta?

 

EDIT:

 

Entre ler o AD e ler o DS1307, o Proteus mostra um tempo de 6mS. Os outros 30mS são para escrever no LCD.

 

EDIT 2:

 

O pino 7 tem que ser habilitado via software, por isso ele não simula. Vou ver se essa biblioteca que usei tem essa função.

 

EDIT 3:

 

Achei onde ele desabilita o pino 7 logo de cara:

 

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(0x80);     // Disable squarewave output pin   i2c_stop(); }

 

EDIT 4:

 

@joseca

 

Temos um problema. Você já montou a placa. Usando o pino 7 para pegar o tempo, precisamos passar mais um "fio" entre o DS1307 e o PIC. Sobrou algum pino livre onde você possa fazer um jumper?

 

Sei que no código que fiz usei o CCP1 para ligar o back light e o CCP2 para o botão de ajuste da hora.

 

Tem como modificar o código para usar o PINO 7 a cada 1hz ele atualiza o display. Mas como eu disse, terá que fazer um jumper aí. E não poderei usar os CCPs. Terei que fazer por polling mesmo.

 

Falou

 

 

Postado

Matheus LPS,sim deixei mais de 1 semana ligado direto ,mas ele continua pulando em algum momento os segundos.

Quanto a modificar a placa com jamper sem problema,mas eu vou mexer com ela hoje pois ela não estava aqui comigo.e vou fazer aqueles testes que os colegas sugeriram,de mexer no delay final....vamos fazer mais testes

Obrigado!

Postado

VTRX,gravei o Pic com codigo que voce me passou,ele agora não esta mais pulando os segundos e vou deixar ligado essa noitepara ver a precisão e o sincronismo com o horario de Brasilia.

O display esta marcando a temperatura ambiente com virgula e fica instavel as casas decimais

Postado

Instável em qual sentido?

 

No código que o vtrx passou, apenas mude essa linha:

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

Por essa:

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

A única diferença é que ele colocou isso no final: %f. Nesse caso o compiladr decide quando colocar casa decimal ou não.

 

Sugiro isso: %2.0f%cC

 

Assim, você limita em nenhuma casa decimal, separa duas casas antes da vírgula e o %cC é para colocar o símbolo de ºC (0xDF).

 

Falou

Postado

Matheus,instavel depois da virgula,mas vou fazer as modificações que voce me indicou,mas com o codigo do VTRX não liga o back light,eu sei que é aquela parte do codigo

 

void trata_tempo()
{
   tempo++;
   
   if (tempo == 10)// 5 segundos
   {
      output_toggle (PIN_B5);  //inverte o nivel logico de RB5
      tempo=0;
      disable_interrupts( INT_TIMER1);               //Habilita interrupção timer1
   }
   set_timer1 (3036)
 
voce acha que se acrescentar ao codigo vai mudar algo?

 

Postado

Hum... fui dar uma olhada no código agora direito dele.

 

@vtrx

 

Me diz uma coisa, nessa parte:

 

temp++;            if(temp == 10){            adc = read_adc();               //Lê canal 0            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.             temp=0;            }
Postado

@MatheusLPS,esse trecho é para tentar agilizar a atualização do display para ganhar mais 'tempo',assim o tempo da conversão só é feito de 10 em 10 vezes para tentar fazer os segundos não 'pular',mas sem o Hardware,nada é garantido.

Não debuguei o código do LCD,mas provavelmente a tela é 'limpa' a cada atualização e talvez isso não seja necessário.

Postado

@vtrx

 

Vou repostar o que escrevi ali em cima pois o forum tá doido:

 

Hum... fui dar uma olhada no código agora direito dele.

 

@vtrx

 

Me diz uma coisa, nessa parte:

temp++;            if(temp == 10){            adc = read_adc();               //Lê canal 0            temperatura = (5.0 * adc * 100) / 1024.0;         //Conversão para tensão.             temp=0;            }
 
EDIT desnecessário:
 
O fórum ta de sacanagem e comeu metade do que escrevi.. aff, ter que escrever tudo de novo.....
 
Bom, voltando ao assunto:
 
Não entendo o esquema o contador ali chegar até 10.
 
Outra coisa. Algumas partes do código foram comentadas. Exemplo:
 
/*if (sec == 255 )            {               sec = 59;            }*/
 
Quando for configurar o relógio, experimente baixar o valor da variável abaixo de 0 e veja o que acontece. Se continuar comentado, ela vai para 255 e não 59 como no exemplo acima.
 
Sobre o backlight, ele depende do CCP1 que foi desabilitado. E o timer1 também foi. Ele era usado para desligar a luz depois de certo tempo.
 
EDIT 2:
 
Sim, o LCD é apagado a cada vez sim. Costume que tenho. :D
 
Falou
Postado

Não precisa ser 10,lembre-se que se alguém 'soprar' no relógio,a temperatura vai ficar doida se a leitura AD for realizada muitas vezes rapidamente,mas como citei,não tenho o Hardware.

Postado

@vtrx,

E se fizer um loop que fica esperando mudar o segundo do Ds1307, e só nesse caso atualizar o display, e depois ficar aguardando outra mudança ???

Se deixar a temperatura já medida enquanto espera o segundo mudar, ganha-se tempo....

Paulo

Postado

@aphawk

 

Pelo que o datasheet fala, a funcão do pino 7 é exatamente essa. Veja a parte sublinhada:

 

post-543152-0-70453300-1405554600_thumb.

 

Quando tenho uma descida do clock, o relógio é atualizado. Momento ideal de leitura.

 

E sim, podemos deixar a temperatura lida já.

 

@joseca, me diz qual pino você tem disponível no PIC aí para um jumper que vou modificar o código.

 

Falou

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!