Fala galera,

Estou com um problema na leitura de um LDR, estou montando esse circuito para uma palestra que vou ministrar e por algum motivo que não consigo ver não consigo a leitura decente do ldr.

O lm35 e o lcd está tudo certo, funciona perfeitamente a leitura.

O erro acredito eu que esteja aqui:

void luz()
{
       int luz,claridade; 
       limpa_lcd();
       set_adc_channel(1); // Seleciona canal de 0
       delay_ms(100);
       luz = read_adc();
        luz/=10;
        envia_byte_lcd(0,0x81); // Desloca o cursor do LCD
        printf(escreve_lcd,"Claridade"); // Exibe nome da empresa
        envia_byte_lcd(0,0xc6); // Desloca o cursor para a segunda linha do LCD
        printf(escreve_lcd,"%d",luz); // Exibe temperatura

}

Vou postar o código, pq não consigo ver aonde está o erro:

#include <16f877a.h> // Informa o PIC
#device adc=10 // Configura conversor AD
#fuses XT,NOWDT,PROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000) // Define cristal de 4MHz
#include <will_lcd.c>

void temperatura()
{

int16 valor,temp; // Para guardar temperatura
limpa_lcd();
set_adc_channel(1); // Seleciona canal de 0
delay_ms(50); // Tempo para estabilizar leitura analógica
valor=read_adc(); // Guarda valor lido em valor
if(valor) valor+=1;
temp = valor*4 + (valor * 113)/128;
temp=temp/10;
envia_byte_lcd(0,0x81); // Desloca o cursor do LCD
printf(escreve_lcd,"Will - Testes"); // Exibe nome da empresa
envia_byte_lcd(0,0xc6); // Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"%3li",temp); // Exibe temperatura
escreve_lcd(0b00000000); // Escreve o caractere ° no display LCD
printf(escreve_lcd,"C"); // Exibe caractere C

}

void luz()
{
int luz,claridade;
limpa_lcd();
set_adc_channel(1); // Seleciona canal de 0
delay_ms(100);
luz = read_adc();
luz/=10;
envia_byte_lcd(0,0x81); // Desloca o cursor do LCD
printf(escreve_lcd,"Claridade"); // Exibe nome da empresa
envia_byte_lcd(0,0xc6); // Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"%d",luz); // Exibe temperatura

}


void main(void)
{

int bot =0;
setup_adc_ports(ra0_analog); // Define pino a0 como entrada analógica
setup_adc(adc_clock_internal); // Usa clock interno

// Reseta portas
portb = 0;
// Configura os tris
set_tris_a(0b00000001); // Configuração da direção dos pinos de I/O
set_tris_b(0b00000000);
inicializa_lcd(); // Inicializa display LCD
cria_cgram(); // Cria caractere

while(1)
{

delay_ms(100);
bot=input(pin_d0);

if (bot==1)
{
luz();
}

else
{
temperatura();
}

} // Fim do loop infito
}

Exibições: 886

Anexos

Respostas a este tópico

Willian, boa tarde.

Na verdade precisariamos de mais detalhes, como por exemplo, que tipo de erro está dando ou o que está acontecendo exatamente.

Mas eu dei uma olhada e acho que pode ser o que está ocasionando o erro.

Primeiro: na void temperatura, vc tem o seguinte: set_adc_channel(1), selecionando o canal do AD. Porém, na void luz vc tem a mesma configuração da porta set_adc_channel(1).

Tente mudar as portas para a leitura separada dos dados.

Além disso, na void main, você está setando apenas ra0 como entrada analogica. Precisa setar outra porta também. (setup_adc_ports(ra0_analog); // Define pino a0 como entrada analógica).

Acho que é isso. Espero ter pelo menos dado uma luz ai pra vc.

Abraços

Marcelo,

blz cara?

Então sobre o porta set_adc_channel(1) foi erro meu mesmo, estava testando a porta e acabei colando o codigo de teste não o errado.

Mas está separado o canal o lm35 no canal 1 e o ldr canal 0.


Que estou achando estranho é o quando tento definir a a1 como analógica dá erro só a a0 está funcionando.

Olá Willian, não conheço muito , mas parece que o problema está no setup_adc_ports, se estiver usando 2 portas (RA0 e RA1), o Vref+ é a porta RA3 e não VDD (conforme datasheet).

Como sou aprendiz, desculpe se falei bobagem. A propósito poderia postar a sua biblioteca "will_lcd.c"?

Abs,

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço