TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nitro en 31 de Diciembre de 2013, 23:26:06
-
Hola. Desde hace un tiempo he estado intentando hacer este proyecto que deberia mostrar la temperatura a traves un par de display de 7 segmentos.
Estoy usando como sensor un lm35 y un pic 16f877.
He simulado el codigo en proteus y siempre me da cero.
Aqui va el codigo:
#include <16f877a.h>
#device adc=10
#fuses xt, nowdt
#use delay (clock=4M)
void main ()
{
int16 q;
float p;
int decena, unidad;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
FOR (;;)
{
set_adc_channel(0);
delay_us(20);
q=read_adc();
p=((q*5)/1024)*100;
decena=p/10; //separo p en unidad y decena
unidad=p-(decena*10);
}
}
El problema es que en la simulacion en proteus "p" no me devuelve nada y obiamnete decena y unidad me dan cero. Aparentemente el problema esta en la division, pero no entiendo ya que p esta como float.
Ayuda please.......
-
Hola.
Es probable que necesites hacer un casting para convertir los tipos.
Saludos.
-
Buenos días,
No queda claro como lo tienes conectado, una imagen ayuda. No necesitas variables float para mostrar el resultado en dos 7 segmentos, con char ya vas bien, tampoco veo ninguna instrucción en tu código que mande el resultado a los puertos donde tienes los siete segmentos. Algo como PORTB = 16*decena+unidad;
Saludos :-/
-
Hola. Es verdad falta la parte que muestra la temperatura en los display (eso ya lo tengo resuelto).
Sucede que lo estaba haciendo por parte y lo iba simulando en proteus:
1º leo el convertidor a/d
2º convieto el valor del a/d a temperatura en ºC
3º Separo la unidad y la decena para luego enviar a los display.
El problema surge que cuando convierto el valor del a/d a tempertura y lo separo en unidad y decena, estas me dan cero.
Para mi el problema esta en la formula "p=((q*5)/1024)*100", ya que cuando lo simulo paso a paso en proteus dicha formula no me devuelve nada y es por ello que unidad y decena me dan cero.
Adjunto imagen de la simulacion:
-
como con variables de 2 bytes(int16) puedes trabajar bien el lm35,prueba asi... declara la variable float p por int16 y crea tambien la variable decima... asi tendras las decimas de grado....
q=read_adc();
p=q*5;
p/=1,024;
decima=p %10;
unidad=p %100 /10;
decena=p %1000 /100;
-
Hola.
Es probable que necesites hacer un casting para convertir los tipos.
Saludos.
Concuerdo con Bruno
tus variables son de diferentes tipos y tal vez ese sea el problema intenta con esto:
p=(((float)q*5)/1024)*100;
-
Hola amigos. He logrado hacer funcionar el proyecto.
Gracias a los que me ayudaron.
-
como sugerencia el adc de 10 bit el valor maximo que devuelve es 1023 nunca 1024, no varia tanto el resultado pero hay que tener en cuenta.
En mi caso yo pongo el ref+ a 1.023v asi no le multiplico nada solo hago promedio, solo va a sensar max 102.3 grados celcius pero es de sobra para la mayoria de aplicaciones :D