Autor Tema: Problema con una operacion aparentemente simple  (Leído 1923 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Problema con una operacion aparentemente simple
« en: 25 de Marzo de 2007, 22:11:05 »
esto es una parte del codigo para mover un servo con un potenciometro, pero la operacionno funciona

Código: [Seleccionar]
int ValorADC;

   ValorADC=read_adc();
   Posicion = 31 + (ValorADC * 124 / 256);

La variable "Posicion" es global. Pero de la operacion se obtiene el valor 31, sea cual sea ValorADC. Es como si no leyese el valor de la variable, y por ende el resultado del parentesis sea CERO... durante los 3 meses que estuve en el FP de electronica vi algo de C, y me explicaron algo de punteros... pero no recuerdo mucho... tal vez ese sea el problema de esto, que no estoy utilizando un puntero...
el problema tiene que estar ahi, porque lo simulo con proteus y veo que SI se lee el valor del ADC correcta mente, pero el resultado no es el esperado
que opinais?
gracias
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Problema con una operacion aparentemente simple
« Respuesta #1 en: 25 de Marzo de 2007, 22:17:58 »
Yo voto más por conversión de tipos.

Prueba a hacer casting:

Código: [Seleccionar]
Posicion = 31 + (long)((long)(ValorADC * 124) / 256);
Yo creo que los tiros tienen que ir por ahí, aunque seguramente el long sea demasiado grande, por lo menos int16 si que hará falta.

[Edito:] Soy tan listo que no he hecho la explicación del porque de lo que digo.  :)
He puesto que convierta los resultados a long porque el tipo estándar solo admite 256 valores, y evidentemente si ValorADC es por los menos 2, se desbordará la variable, y por tanto, no va a funcionar bien.
Además, es muy posible que no funcione tampoco por que seguramente al ejecutar, calcula primero 124/256 y eso en int8 (tipo estándar en estos micros) creo que es 0, por eso siempre te da 31.


Un saludo. Au.
« Última modificación: 25 de Marzo de 2007, 22:25:18 por vicent »

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Problema con una operacion aparentemente simple
« Respuesta #2 en: 25 de Marzo de 2007, 22:54:35 »
lo acabo de probar, declare Posicion y ValorADC como int16 y utilice la linea de codigo que tu me dices... y funciona!  :z)
pero si te digo la verdad tampoco entiendo muy bien porque se va a desbordar si el ADC es de 8 bits, y la variable tambien...
ademas, cuando lo simulo la variable coje correctamente el valor del adc.
ah! creo que ya entendi!!! al hacer la operacion ValorADC * 124 es cuando se desborda la variable, no?
pues vaya tonteria... la del programador y la mia
y de que manera puedo conseguir que el serultado de (ValorADC * 124) / 256) sea entero? asi podria trabajar con numeros enteros y Posicion podria ser int y no int16
aun asi, esto ya funciona!
gracias vicent
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con una operacion aparentemente simple
« Respuesta #3 en: 26 de Marzo de 2007, 01:56:25 »
El resultado final será un entero de 8 bits, pero los resultados parciales no caben en 8 bits (ValorADC * 124) y por eso en las operaciones intermedias hay que hacer casting, como bien te indica Vincent.

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Problema con una operacion aparentemente simple
« Respuesta #4 en: 26 de Marzo de 2007, 08:37:36 »
De nada Marttyn, es un placer ayudar en lo que puedo. Te iba a volver a contestar, pero Manolo se me ha adelantado.

Es un gran honor para mi que un maestro como Manolo me dé la razón. Sigo tu web muy a menudo, sin ella, seguramente no habría acabado de entrar en este mundillo de los PICs. Gracias.

Un saludo. Au.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Problema con una operacion aparentemente simple
« Respuesta #5 en: 26 de Marzo de 2007, 21:46:37 »
y ahora me surje una duda.... si hiciera esto:
Posicion = 31 + (ValorADC * (124 / 256));

primero resolveria 124/256 y el resultado lo multiplicaria por ValorADC... de esta manera no se desborda en ningun momento la variable... o si?

porque como dice nocturno el resultado final deberia ser un entero de 8 bits, pero eso no resulta cierto en la practica, ya que tengo que declarar las 2 variables como int16, sino no funciona :z)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado vicent

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 144
    • Web de Vicent
Re: Problema con una operacion aparentemente simple
« Respuesta #6 en: 26 de Marzo de 2007, 21:56:19 »
No se desborda, más que nada porque 124/256 en entero es 0, por ValorADC, seguro que dará 0.

Deberías hacer (int)((int16)(ValorADC*124)/256) para que obtengas el valor correcto, si quieres obtener un entero de 8 bits. Recuerda que declarar una variable como int, es lo mismo que declararla como int8.

Lo que te propongo multiplica ValorADC*124 y lo guarda en una variable "temporal" de 16 bits. Después divide el resultado por 256 y lo guarda en una variable de 8 bits, lo cual ya da el resultado final.

Un saludo. Au.