TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Carafa en 08 de Marzo de 2004, 06:18:00

Título: Problemas con floats
Publicado por: Carafa en 08 de Marzo de 2004, 06:18:00
Hola. El asunto es el siguiente: tengo un proyecto por el que recibo unas señales de consigna por el puerto serie y estas deben activar ambos módulos PWM del uc. Las consignas las recibo en formato caracter (0 a 255) y para saber realmente la consigna a aplicar (escalada entre 0 y 5 voltios) le aplico:

unsigned char value;    //valor recibido por el puerto serie
float v;                          //valor de consigna
long dc;                        //ciclo de trabajo PWM

v = (5/255) * value;

después activo PWM (setup_pwm, timer2...) y calculo dc:

dc = (long)(v * 4000000 / 5 * frec_pwm);

y le paso dc al pwm.

Sin embargo el pwm no se activa y después de varios intentos de prueba y error he llegado a la conclusión de que el problema está en la linea:

v = (5/255) * value;

porque no debe hacer una conversión correcta entre value (tipo char) y v (tipo float). Pero no sé como solucionarlo. ¿Alguna idea?

Gracias.

Título: RE: Problemas con floats
Publicado por: fopy en 08 de Marzo de 2004, 08:23:00
a mi me parece que tendrias que probar:

void linkfloats(void)
{
 float *pun,a;
pun=&a;
a=*pun;
}

luego en tu codigo

v=(float)((5/255)*value);

espero q te sirva!!
Título: RE: Problemas con floats
Publicado por: pacalaconcurso en 08 de Marzo de 2004, 08:29:00
fijate que value no es de tipo foat y creo quie la conversion no se realiza de forma explicita, prueba

v = (5/255) * (float)value

y define value como int8.
saludos

Título: RE: Problemas con floats
Publicado por: Carafa en 10 de Marzo de 2004, 13:23:00
Gracias a ambos por las respuestas. He probado ambas soluciones pero continuaba sin funcionarme así que he decidio acabar con el perro y así acabar con la rabia: fuera floats. Me he apañado con ints dando un pequeño rodeo y todo solucionado.

Salu2!
Título: RE: Problemas con floats
Publicado por: Xa2 en 02 de Abril de 2004, 04:51:00
Carafa; te voy a pedir un favor, me podrias mandar el programa en C completo de lo que quieres hacer, me vendria muy bien; lo podrias poner en el foro, o mandarmelo a mi email:
pottoloa@hotmail.com

si no es mucha molestia por favor, me ayudarias bastante!!
Gracias por adelantado hagas lo que hagas!!
Saludos a todos!!
Título: RE: Problemas con floats
Publicado por: achamber2k3 en 29 de Agosto de 2004, 16:09:00
Se que es un poco tarde para la respuesta pero aqui va algo por si le sirve de ayuda a alguien luego

v = (5/255) * value

debes decir explicitamente q la operacion es entre floats. No me preguntes porque pero asi funciona a la perfeccion:

v = (5.0/255.0) * value

Lo he probado al llevar los valores de int16 de mi CAD a voltios.
Título: RE: Problemas con floats
Publicado por: cucaracha en 29 de Agosto de 2004, 16:39:00
Y también tarde, pero algo más:
recuerden
-el signo / para división entera.
-el signo % para el resto de la división.

Si pones 1/2 devuelve la parte entera, osea cero.
Si pones 1%2 devuelve el resto, osea 5.
En tu caso 5/255 devuelve cero. Por lo que v siempre valdrá cero.

Aunque es curioso eso que comentas. Si lo que pones son números flotantes resulta bien. No lo he probado, pero es curioso...
Supongo que si indicas la coma en el número toma ya el signo / normalmente.

También hay que indicar lo que comenta pacala, ya que por ejemplo si ponemos v=255*value, la cosa no funciona, aunque v se un long (value es un int). Hay que indicar momentaneamente que trate a value como un long en este caso, así (long)value. Es un ejemplo para que lo entienda el que le pueda sacar uso.

Saludos!!
Título: RE: Problemas con floats
Publicado por: achamber2k3 en 29 de Agosto de 2004, 18:15:00
Si, esto de los diferentes usos del / es por lo que los programadores llaman sobrecarga de operadores, si los operadores son enteros regresara enteros si son float regresara float. por tanto como coloca pacala v = (5/255) * (float)value  pues sigue siendo 0 (5/255) por un float. Diferente si colocamos 5.0/255 o 5/255.0. Dale que ya hemos descubierto porque ocurre!!!
Título: RE: Problemas con floats
Publicado por: achamber2k3 en 29 de Agosto de 2004, 18:17:00
Sorry por el lapsus es polimorfismo de funciones en vez de sobre carga de operadores... Bueno bueno es domingo... cualquier cosa puedo decir un dia tan aburrido como hoy...!!