Ir ao conteúdo
  • Cadastre-se

Projeto voltímetro digital com PIC 16f877 e LCD


vitormetallica

Posts recomendados

Respondendo para escrever na segunda linha do LCD utilizado o prinft, só você usar o comando \n:

printf(lcd_putc,"\n")

ou

printf(lcd_putc,"linha1\nlinha2")

De acordo com ali em cima, o \n faz com que a string linha2 vá para a linha de baixo.

Para ler mais de um canal analógivo é simples. Você usa o read_adc(), mas armazena em variáveis diferentes. Veja:

setup_adc_ports(AN0_to_AN3);         //Configura canal 0 analógico
setup_adc(ADC_CLOCK_DIV_4); //De acordo com relógio interno.
while(true);
{
set_adc_channel(0); //Habilita canal 0
delay_us(20); //Espera um pouco, obrigatório!
q = read_adc(); //Lê canal 0
p = 5.0 * q / 1024; //Conversão para tensão.
temp1=(p*100);

set_adc_channel(1); //Habilita canal 0
delay_us(20); //Espera um pouco, obrigatório!
q = read_adc(); //Lê canal 0
p = 5.0 * q / 1024; //Conversão para tensão.
temp2=(p*100);

set_adc_channel(2); //Habilita canal 0
delay_us(20); //Espera um pouco, obrigatório!
q = read_adc(); //Lê canal 0
p = 5.0 * q / 1024; //Conversão para tensão.
temp3=(p*100);

set_adc_channel(3); //Habilita canal 0
delay_us(20); //Espera um pouco, obrigatório!
q = read_adc(); //Lê canal 0
p = 5.0 * q / 1024; //Conversão para tensão.
temp4=(p*100);
}

Falou

Link para o comentário
Compartilhar em outros sites

Ok, esse comando é para formatação do número que vamos imprimir. Nesse exemplo estou dizendo a o valor da variável q2 será um float, número com vírgula, nesse caso é essa parte: %f.

O 2.2 eu digo para o compilador para separar duas casas antes da vírgula e duas depois da virgula. Só isso. Se fosse 2.0, seria duas casas antes da virgula e nehuma depois da virgula.

Falou

Link para o comentário
Compartilhar em outros sites

Olá pessoal, estou tentando desenvolver no Proteus o circuito do voltímetro que realmente montarei na protoboard. O Circuito consiste em: usar uma fonte CA de 110V ligada a um trafo de 12V, este estará ligado a uma ponte retificadora para realizar a conversão de CA p/ CC, em seguida utilizamos um ci 7805 para fazer o rebaixamento da tensão de 12 para 5Vcc, e a partir daqui ligar isso ao mesmo circuito feito para o voltímetro de 5Vcc. Não estou conseguindo fazer, gostaria de saber como ficaria este circuito, já que o meu não está funcionando. valeu galera conto com a ajuda dos colegas do fórum. Obrigado.

Link para o comentário
Compartilhar em outros sites

Brigadão mais uma vez MateusLPS!!

Em relação ao LCD, eu preciso soldar só fios para os pinos 4,5,6,11,12,13 e 14, que foram os pinos utilizados no circuito feito no Proteus, ou precisarei soldar fio em mais algum pino?

Eu não preciso soldar fios para os pinos 1,2 e 3? Desde já agradeço quem me ajudar.valeu

Link para o comentário
Compartilhar em outros sites

Precisa do pino 1 ao 6 e do 11 ao 14.

1: Alimentação, o terra ou negativo.

2: Alimentação Positiva, +5V

3: Contraste. Coloque um potenciometro de 10K ai. Um dos pinos do pot vai em +5V e o do meio vai nesse pino. O 3º pino você aterra.

4, 5, 6, 11, 12, 13 e 14: Dados. Vão no PIC.

Falou

Link para o comentário
Compartilhar em outros sites

Ficaria algo do tipo:

lUSvj.png

Falou

Como eu faço para colocar aquelas setinhas azuis para cima, uma depois depois da ponte BR1(+) e a outra depois do regulador de tensão U1(V0)? As curvas desses 2 sinais serão mostradas no gráfico, mas como tenho que configurar o gráfico?

Mais uma coisa, eu posso utilizar o mesmo código que usei no Proteus para o circuito do voltímetro para fazer o funcionar o circuito na protoboard né?

Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

Matheus achei um projeto de um voltímetro com amperímetro, mas não compreendi o seu funcionamento vou postar aqui o circuito, pois acho que você tem mais experiência no assunto.

gostaria de saber se este circuito funciona e o que posso fazer para utiliza-lo

post-868242-13884959421146_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Olá pessoal efetuei a montagem do circuito do voltímetro digital com PIC 16F877A e LCD, porém o este não ligou,ou seja, não consegui mostrar o valor de tensão lida na saída. Gostaria de saber se posso usar o mesmo código que usei no Proteus no circuito da protoboard, tendo em vista que tal código usado não possui declarado os pinos que estou usando do LCD. O problema está relacionado ao código? Mas esse código está sem erro e funciona perfeitamente no Proteus. Desde já agradeço a contribuição dos colegas.valeu

Link para o comentário
Compartilhar em outros sites

Vitor, quando você a gente sai da simulação e monta o circuito, tudo muda.

O proteus engole muita coisa.

Primeiro me conte qual cristal está utilizando no PIC, qual os capacitores que você colocou em paralelo ao cristal. Alimentou o PIC corretamente?

Ligou os pinos do LCD corretamente?

Podem ser várias coisas.

Poste aqui como está o circuito montado e se possível uma foto bem nítida para que eu posssa ver.

E coloque também o código utilizado.

Falou

Link para o comentário
Compartilhar em outros sites

MateusLPS estou usando o cristal de 4MHz com dois capacitores de 18pF ligados em paralelo. A alimentação do PIC eu liguei um fio do pino 11(Vdd) no 5Vcc e desse mesmo pino liguei no pino 32, e fiz o mesmo no pino 12(Vss), liguei um fio dele no terra e com outro fio liguei ele no pino 31. Está correto a alimentação?

Na ligação do LCD coloquei pino no terra, pino 2 no 5Vcc e pino 3 coloquei o potenciômetro do jeito que você já havia falado comigo. Mas me disseram que posso ligar o pino 3 direto no terra é verdade? Mas não fiz isso.

Quanto a foto do circuito infelizmente hoje nem final de semana poderei postar, porque o projeto encontra-se no laboratório da faculdade onde estudo e só poderei ter acesso ao mesmo semana que vem!

O código está aí, se puder me ajudar ficarei muito grato. Obrigado valeu.

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

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //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

#use delay(clock=4000000)

#include <lcd.c>

int16 q1; //variável inteira de 16 bits: 0 a 65535//
float p; //variável para valores com vírgula//

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

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

Só pra reforçar pois acho que não deixei bem esclarecido a questão de como alimentei o PIC: eu liguei um fio do pino 11(Vdd) no 5Vcc e depois interliguei um fio do pino 11 no pino 32;

depois liguei um outro fio do pino 12(Vss) no terra e em seguida interliguei outro fio do pino 12 no pino 31. valeu

Link para o comentário
Compartilhar em outros sites

Certo, parece estar tudo correto. você só precisa confirmar pelo datasheet do seu LCD se a pinagem dele não está ao contrário. Outra coisa e ligar o back light se ele tiver ou não se enxerga nada.

Outra coisa que você esqueceu de comentar é a ligação do LCD no PIC. Verifique a pinagem se está correta, os pinos 4,5, 6, 11, 12, 13 e 14 do LCD.

Outra coisa, é você colocar um pequeno capacitor de uns 10uF na alimentação do PIC. Bem perto dele. Fique atento à polaridade do capacitor.

Sobre o potenciometro você pode ligar no terra, mas o contraste fica ruim e você dependendo do LCD não enxerga nada.

Não se esqueça de colocar um resistor de 10K entre o pino 1 do PIC e o +5V. Esse é o pino de reset.

Para verificar se o PIC está pelo menos rodando o código e tentar encontar o erro, adicione um LED com resistor em algum pino do PIC e mande o PIC colocar esse pino em nível alto logo depois do início do LCD. Assim:

#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();
[B]output_high (pin_b0);[/B] // --> coleque um led nesse pino

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;


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

Veja que para ligar o back light do LCD, você deve colocar corrente suficiente para acender o led do back light. Essa corrente você encontra no datasheet. Mas para teste rápido pode colocar +5V no pino 15 e aterrar o 16.

Acho q é isso.

Falou

Link para o comentário
Compartilhar em outros sites

Vitor, já havia comentado,

Como nosso amigo Matheus mesmo falou,

No Proteus ele engole muita coisa, a cada montagem minha faço meus esquemas no Visio da Microsoft.

Aqui mesmo em eletrônica, postem aqui seus circuitos na página 22 penúltimo post tem lá o meu esquema, vê se serve.

Mesmo assim vou repetir o esquema.

PS.: MatheusLPS estou inserindo outra imagem.

Valeu.

post-756642-13884959422528_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Beleza, mas quanto ao LCD o que estou usando tem backlight azul e letra branca, então para ligar o back light dele, terei que colocar corrente suficiente para acendê-lo. Mas se eu colocar +5V no pino 15 e aterrar o 16 ele funcionará do jeito que quero ou só funcionará se eu colocar exclusivamente a corrente especificada em seu datasheet? Obrigado, valeu

Link para o comentário
Compartilhar em outros sites

É que o led do back light funciona com uns 400mA se não me engano. Veja no datasheet do lcd. Lá tem essa informação.

Aí você coloca um diodo limitador. Ou então apenas coloque um diodo em série como pino 15 e a alimentação para dar uma pequena queda de tenão.

+5V direto não vai queimar o led mas diminui a vida útil dele.

Falou

Link para o comentário
Compartilhar em outros sites

OK. Em relação a solda do LCD, eu devo soldar os fios com os mesmos presos em cada buraco do pino, ou posso apenas enrolar o fio sem colocar a solda?

Estou perguntando isso porque eu soldei colocando o fio apenas sobre cada buraco do pino, ou seja, sem enrolar o fio no buraco e depois colocar a solda! Desse jeito posso não ter contato do fio com a placa do LCD?

Existe alguma maneira de prender os fios e ter contato na placa de LCD sem usar solda? Se alguém souber de algo agradeço. Obrigado e valeu.

Link para o comentário
Compartilhar em outros sites

Quando comprei meu 1º LCD pensei em apenas enrolar fio. SE você conseguir enrolar ele bem, até q fuciona. Mas fica muito gabiarrado e dá muito mau contato. Aconselho você enrolar ele e colocar solda para ficar bem preso.

Mas tem uma forma melhor e mais profissional. Compre uma dessas barras de pinos:

UICIb.gif

É mais fácil de soldar que fios e você pode simplesmente plugar o LCD depois. Custa apenas R$0,70 centavos: Barra de Pinos 1x40 vias 15mm 180 graus

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!