Página 1 de 2
Convesor A/D x Display

Enviado:
22 Jan 2008 12:55
por Pask
Amigos quero usar o valor convertido pelo conversor A/D de 10 bits do PIC para indicar um valor de tensão em 3 displays de leds usando a expressão abaixo:
valor=read_adc();
x=(valor*5)/1023;
O problema é que, mesmo declarando x como variável do tipo float, a parte fracionária do número é ignorada e somente a sua parte inteira é considerada. Por exemplo: se eu converter o valor de tensão analógica 2,33V para digital (valor=477) e aplicar na expressão acima, o valor final de x será 2 e a parte 0,33 desaparece.
Eu preciso que o valor da conversão seja correto para poder aplicá-lo numa função que vai gerar os dígitos das centenas, dezenas e unidades para cada display.
Amigos, como resolver este problema de cálculo em C?

Enviado:
22 Jan 2008 12:59
por mselbach
Experimente:
x=(valor*5.0)/1023.0;

Enviado:
22 Jan 2008 13:23
por Pask
Por quê? Eu acho que dá na mesma...

Enviado:
22 Jan 2008 13:48
por xultz
Você acha, mas não dá. Eu já fiz declaração até do tipo (float)5 para o compilador fazr o que eu queria. Eu já vi type casting até para zero num código uma vez, e um amigo meu me explicou a razão daquilo...

Enviado:
22 Jan 2008 14:01
por alessandro
Olha, quando faço isso (já tive esse tipo de problema também) faço da seguinte forma:
(quando usava CCS, não sei se é seu caso, tive muitos problemas estranhos nas versões anteriores)
int32 valor;
x float;
valor = read_adc();
x = (valor*5000)/1023;
x = x/1000;
parece besta, mas no meu caso funciona bem.
Alessandro

Enviado:
22 Jan 2008 15:43
por Pask
Olá amigos. Parece que já encontrei a solução. É assim:
int32 x, valor;
valor=read_adc();
x=(valor*500)/1023;
O que estava dando errado é que eu estava declarando a variável "valor" com 16 bits de tamanho. O problema é que, quando você faz a multiplicação por 500, a maior parte dos resultados convertidos ultrapassava a 16 bits e isto estava causando um erro na matemática do compilador. Agora, com as variáveis x e valor declaradas com tamanhos de 32bits, o resultado da fórmula acima é um número XYZ, onde X é a centena; Y é a dezena e Z é a unidade. Por exemplo, se após o cálculo o número resultante for 695, isto, nos displays, será representado como o número 2.95 que corresponderá à uma tensão de 2,95V.
Obrigado e espero que este tópico também possa ser útil para mais alguém.

Enviado:
22 Jan 2008 15:46
por alessandro
É o que fiz no post anteriormente, só que estava usando 3 casas decimais, por isso multipliquei por 5000. No seu caso como usou 2 casas decimais, multiplicou por 500.
Alessandro

Enviado:
23 Jan 2008 07:19
por Pask
Valeu e obrigado a todos mais uma vez!

Enviado:
23 Jan 2008 15:32
por mselbach
Pask escreveu:Por quê? Eu acho que dá na mesma...
Pois é, não dá não
Tem o lance da precedência de tipos. Não sei exatamente como funciona nesse compilador que tu usas, mas é bem comum (na otimização de código) que o compilador ao realizar esse calculo faça da seguinte forma:
x=(valor*5)/1023;
Valor (float) X (int) = resultado (int)
Resultado (int) / 1023 (int) = x (float)
Veja que ali tu perdeu as decimais.
Se tu fizer float x float, o resultado será sempre float, mesma coisa com float / float, etc...

Enviado:
24 Jan 2008 07:15
por luisaoho
Bom Pesssoal,
Aproveitando o assunto sobre A/D, gostaria de saber se alguem tem uma rotina em assemble para um comversor A/D escrever num LCD. Estou tentando fazer um medidor de temperatura com LM335, e não consigo escrever os valores no display, os digitos aparecem somente 3 quadrados.
Desde já agradeço quem possa me ajudar, podem enviar também para meu e-mail
oliveira@lnls.br.
grato.

Enviado:
24 Jan 2008 07:43
por Sergio38br
qual pic e qual controlador tem o display
Sergio

Enviado:
24 Jan 2008 08:11
por luisaoho
Sergio38br escreveu:qual pic e qual controlador tem o display
Sergio
Oi Sergio,
Obrigado por responder, estou usando o 16F877 e o LCD 16x2, se puder me ajudar.
grato,

Enviado:
24 Jan 2008 08:21
por Sergio38br
qual modelo do display, o controlador depende do modelo, geralmente são clones do HD44780, mas nunca se sabe se o mesmo é este.
Sergio

Enviado:
24 Jan 2008 08:44
por Sergio38br
Ói nóis aqui tra vez!!!!
de uma olhada neste link, da pagina do Igor
http://www.eletronica.etc.br/igor/lcd/index.html
ele usa o 877 e um display baseado no hd44780
G.A.
Sergio

Enviado:
24 Jan 2008 09:32
por luisaoho
Sergio38br escreveu:qual modelo do display, o controlador depende do modelo, geralmente são clones do HD44780, mas nunca se sabe se o mesmo é este.
Sergio
Sergio,
O LCD é WC1602D2, o problema está não é escrever no LCD e sim fazer a rotina do A/D funcionar e atualizar o valor no LCD.
grato