Ir ao conteúdo

Projeto voltímetro digital com PIC 16f877 e LCD


vitormetallica

Posts recomendados

Postado
precisa dizer como você montou o lcd ai amigo.

Como assim.

Montei exatamente como está na figura.

Pinos do LCD:

pino 1 no GND;

pino 2 no 5Vcc;

pino4 no RD1;

pino5 no RD2;

pino6 no RD0;

pinos 7, 8, 9 e 10 vazios;

pino 11 no RD4;

pino 12 no RD5;

pino 13 no RD6;

pino 14 no RD7;

Se alguem puder me dar uma ajuda;

Ficaria agradecido.

Tiago

Postado

você esqueceu de colocar um potenciômetro de 10K entre o PINO 3 do LCD e o terra?

Hum.... acredito que esse seja seu erro. você precisa desse potenciometro para ajustar o contraste. Sem ele, não dá p ler nada e você acha q o sistema é falho.

Falou

Postado
você esqueceu de colocar um potenciômetro de 10K entre o PINO 3 do LCD e o terra?

Hum.... acredito que esse seja seu erro. você precisa desse potenciometro para ajustar o contraste. Sem ele, não dá p ler nada e você acha q o sistema é falho.

Falou

Caro Matheus!!!

Então tinha me esquecido de comentar sobre o pino 3, como eu estava sem o Potciometro, o que eu fiz foi o seguinte.:

Coloquei 2 resistores de 1K em serie e liguei o meio no pino 3 (2,5v) e nada aconteceu.

Coloquei dessa vez em serie um de 10K com um de 100R no pino 3 (4,86V) e nada novamente.

E por ultimo coloquei 5Vcc direto e nada. Assim deveria ter o constrate maximo?:confused:

E o chato que no LCD não tenda de escrito para eu procurar direito na net, os mumeros que estão nele já procurei e nada.

Se alguem ainda puder me ajudar agradeço.

Tiago Souza

Postado

Esse LCD q você usa tem backlight? tá ligado?

Outra coisa, coloque um simples comando logo depois do lcd_init(); para acender um led.

Use o output_high (algum_pino) logo depois do lcd_init();

Acontece de o PIC nao conseguir inicializar o lcd e ele, o PIC, fica garrado nessa função. Se o led acender mesmo assim, teremos que pensar mais um pouco...

Falou

Postado
Esse LCD q você usa tem backlight? tá ligado?

Sim está ligando.:)

Outra coisa, coloque um simples comando logo depois do lcd_init(); para acender um led.

Use o output_high (algum_pino) logo depois do lcd_init();

Acontece de o PIC nao conseguir inicializar o lcd e ele, o PIC, fica garrado nessa função. Se o led acender mesmo assim, teremos que pensar mais um pouco...

Falou

Quer que fique assim?


void main()
{

lcd_init();

output_high (pin_c0); // para verificar se gravou

setup_adc_ports(AN0_AN1_AN3); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC

set_adc_channel(0); //Habilitación canal0
delay_us(20);

while (TRUE)
.
.
.

se for vou fazer o teste mais gravar mais a tarde.

valeu

Postado

Isso mesmo. Exatamente isso. Aí você verifica se o pino foi a nivel alto, poe um multimetro, ou um led mesmo com resistor.

Se ele nao foi a nivel alto, o PIC garrou na rotina acima e você terá q conferir as ligações do LCD.

Esse é o típico problema de quem acaba de sair das simulações e parte para a prática, sempre erra uma coisinha. Os simuladores engolem muita coisa q na prática é essencial.

Outra coisa, acredito q já foi dito, mas nao custa relembrar. Confere o valor dos capacitores no cristal que devem ser da ordem de 15 a 33pF cerâmicos. Coloca um capacitor pequeno de uns 10uF eletrolitico no pino de alimentação do PIC. Resolve na maioria dos casos.

OPA..... Voltei uma página e li seu código, passou despercebido antes, mas dessa vez nao! Veja como estão os FUSES:

#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#[B]FUSES XT[/B] //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#[B]use delay(clock=20000000)[/B]

você usa um cristal de 20Mhz e está usando o fuse XT. O Fuse XT é para cristais até 4Mhz. Nesse caso, utilize HS. Acredito que dessa vez resolve.

Falou

Postado

Outra coisa, coloque um simples comando logo depois do lcd_init(); para acender um led.

Use o output_high (algum_pino) logo depois do lcd_init();

Aí você verifica se o pino foi a nivel alto, poe um multimetro, ou um led mesmo com resistor.

Se ele nao foi a nivel alto, o PIC garrou na rotina acima e você terá q conferir as ligações do LCD.

Esse é o típico problema de quem acaba de sair das simulações e parte para a prática, sempre erra uma coisinha. Os simuladores engolem muita coisa q na prática é essencial.

Então não funcionou, não ascendeu o LED;

Dai eu coloquei um ativando a saída co antes do lcd_init() e um ativando depois. Sendo assim ascendia o LED de antes e o LED de depois não estava ascendendo.

Ai coloquei o output_high dentro do WHILE, antes do printf

Outra coisa, acredito que já foi dito, mas nao custa relembrar. Confere o valor dos capacitores no cristal que devem ser da ordem de 15 a 33pF cerâmicos. Coloca um capacitor pequeno de uns 10uF eletrolitico no pino de alimentação do PIC. Resolve na maioria dos casos.

Os Capacitores cerâmicos que estou usando é um de 221(220pF) e um 102 (1000pF).

E o Eletrolítico estava usando um de 47uF, porém tenho em casa os de 10uF.

OPA..... Voltei uma página e li seu código, passou despercebido antes, mas dessa vez nao! Veja como estão os FUSES:

#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#[B]FUSES XT[/B] //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#[B]use delay(clock=20000000)[/B]

você usa um cristal de 20Mhz e está usando o fuse XT. O Fuse XT é para cristais até 4Mhz. Nesse caso, utilize HS. Acredito que dessa vez resolve.

Falou

Então quando eu colocava HS não fazia nada.

E se eu deixava em XT ele funcionava tanto com os valores de 20MHz e 4MHz. Apesar de estar usando o Cristal de 20MHz tenho em casa um de 12MHz.:confused::wacko:

:ahh:Ah sim já ia esquecendo. O LCD funcionou. :aplausos::hehehe::aplausos::jump:

Na verdade o VEE tenho de colocar um valor de tensão Proximo ao GND.

Ou seja: O LCD aumenta o contraste quanto menor for a tensão no vEE, ou seja, se você conectar esse pino3 no GND terá contraste máximo e no VCC terá mínimo.(na verdade nada).

Com pouo mais de 1v ele já some.

Valeu mesmo cara!!!

Obrigadão.

Tiago Souza:eiei::hehehe:

Postado

E o codigo de como ficou por Ultimo:

#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz --> QUANDO MUDO PARA HS NÃO FAZ NADA
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=20000000)

#include <lcd.c>



void init(void)
{
// port directions: 1=input, 0 = output


}
//int k; // não estou usando ainda
int16 q1;
float p, q2;


void main()
{
//output_high (pin_c0);
//output_high (pin_c3); IA SÓ ATE AQUI E ACENDIA O LED

lcd_init();
//output_high (pin_c2); NÃO Z ESSA PARTE
//output_high (pin_c1);

setup_adc_ports(AN0_AN1_AN3); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC

set_adc_channel(0); //Habilitación canal0
delay_us(20);

while (TRUE)
{
q1 = read_adc(); //Lectura canal0

p = (q1 * 5)/1023.0;
q2 = (p * 6) ;
output_high (pin_c3); // --> Para verificar se gravou

printf(lcd_putc,"\fTensao:%2.2f", P);
delay_ms (200);
}
}

Mais uma vez Obrigado Matheus!!!:lol:

Tiago Souza:cool:

Postado

Opa, que bom que funcionou!

Por isso o uso do potenciometro. O contraste é bem sensivel à tensão mesmo.

Outra coisa, está funionando, mas o correto é o FUSE HS para cristais maiores que 4Mhz. Dá uma olhada no datasheet.

Falou

Postado

Olá pessoal tenho que fazer agora a montagem na proto board do circuito do Voltímetro digital com o PIC 16F877 e o LCD para medições até 12V, porém meu professor quer que eu faça a leitura somente de 0 até 5V e, nesse caso, tentei encontrar o valor de R2 pelo método do divisor de tensão resistivo o que não foi possível porque zera a equação. Qual é a solução nesse caso.

Mais uma coisa eu posso realizar a montagem do circuito na protoboard seguindo como referência o circuito feito no Proteus ou tem alguns detalhes que devem ser considerados?Conto com a ajuda de você's. Obrigado.

Postado

Boa noite vitormetallica,

eu montei e postei o circuito completo aqui no CDH na pagina "Postem aqui seus circuitos" na penultima página.

Quanto aos valores dos resistores acredito que, como o PIC suporta até 5 volts, para cada 1 volt de entrada você teria 1 volt na saida, não sendo necessário o divisor resistivo.

Vamos aguardar por mais opnião ok.

JA

Postado

Eu entendi o que você's falaram, tb tinha imaginado que não fosse precisar, porém eu já mudei no código e não tá dando certo, o LCD está mostrando na saída 12V ao invés de 5V. Eu fiz o circuito com um resistor de 5K ligado diretamente na entrada an0 do pic, está errado?

Por gentileza se alguém puder me ajudar.Obrigado

Postado

Galera consegui, o problema ocorreu porque eu achei que estava carregando o programa para o pic com as novas alterações quando na verdade estava enviando o código para 12V!

Postado

Eu posso comprar qualquer valor de potenciômetro 5K, 10K, etc ou vai depender do valor do resistor que estou utilizando, porque no circuito no Proteus to usando resistor de 5K e Potenciômetro de 5K tb. Estou pensando em comprar um potenciômetro deslizante para simular a entrada de tensão variável e um LCD 16X2 com back fundo verde e letra preta!

Aguardo por gentileza a ajuda dos colegas do fórum!valeu

Postado

Tanto faz ser 5k ou 10k. Prefiro usar de 10K o potenciômetro.

Sobre o LCD, compre um que tenha back light azul, é bem mais bonito. Ele tem a letra branca. Olha só um projeto que fiz:

2ykIy.jpg

Ou então compre um que escreve vermelho, tem no mercado livre. Bonito também.

Falou

Postado

Maneiro seu projeto MateusLPS parabéns! Agora quanto a alimentação dos componentes, eu devo utilizar um trafo e regulador de tensão ci 7508 ou posso comprar uma bateria de 9V e utilizá-la com o regulador para rebaixamento de tensão, já que vou trabalhar apenas com 5Vcc? Estou buscando esclarecer essas dúvidas porque agora tenho que montar esse circuito na protoboard!Obrigado desde já.

Postado

Não não.

Se você vai trabalhar com 5V, você precisa utilizar o 7805 e não o 7808.

Sim, para baixar para 5V, você pode usar uma bateria de 9V.

Caso não queira utilziar um trafo, pode pegar uma fonte de computador dessas bem baratas e utilzar a saída de +5V.

Falou

Postado

Qual o melhor site para comprar componentes eletrônicos? Estou querendo comprar no site Solda fria, esse é o melhor? Porque lá não tem o PIC que preciso, não tem potenciômetro deslizante! Se souberem de outro site melhor por favor me indiquem porque estou querendo comprar tudo num único site, que seja, é claro mais barato, para pagar um único frete! valeu

Postado

Bom dia Senhores

Estou com mais 2 duvidas:.

1- Como escrevo na segunda linha do LCD;

2- E tambem como utilizo os outros canais de leitua analogica?

coloquei:

set_adc_channel(0);

set_adc_channel(1);

set_adc_channel(3);

Beleza esta fazendo a leitura, porérm como utilizar? pois o: read_adc(); somente lê o ultimo que coloquei ou seja o (3).

Segue o código:

#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz --> QUANDO MUDO PARA HS NÃO FAZ NADA
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=20000000)

#include <lcd.c>



void init(void)
{
// port directions: 1=input, 0 = output


}
//int k; // não estou usando ainda
int16 q1;
float p, q2;


void main()
{
lcd_init();


setup_adc_ports(AN0_AN1_AN3); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC

set_adc_channel(0); //Habilitación canal0
delay_us(20);

while (TRUE)
{
q1 = read_adc(); //Lectura canal0

p = (q1 * 5)/1023.0;
q2 = (p * 6) ;
output_high (pin_c3); // --> Para verificar se gravou

printf(lcd_putc,"\fTensao:%2.2f", P);
delay_ms (200);
}
}

Desde já agradeço;

Obrigado

Tiago Souza

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!