Ir ao conteúdo
  • Cadastre-se

Projeto voltímetro digital com PIC 16f877 e LCD


vitormetallica

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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:

Link para o comentário
Compartilhar em outros sites

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:

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

Vitor, eu compro com um cara no mercado livre.

Só mandar um e-mail p ele pedindo um orçamento, mesmo q ele não tenha anunciado as peças, ele sempre me arruma tudo.

E o preço dele é muito bom.

O email do vendedor é: worldpic(arroba)worldpic.com.br

E os produtos que ele tem anunciados são: http://lista.mercadolivre.com.br/_CustId_84481243

Falou

Link para o comentário
Compartilhar em outros sites

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

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!