Autor Tema: Mandar valores "float" desde un PC a un micro  (Leído 1480 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 222
Mandar valores "float" desde un PC a un micro
« en: 16 de Julio de 2018, 08:10:27 »
Saludos al grupo!

No se si ya se ha tratado este tema en concreto, pero si se ha hecho no he sido capaz de localizar el hilo, por lo que pido disculpas de antemano.

Mi problema es el siguiente: Desde un PC he conectado un dispositivo con un PIC mediante un puerto serie. La comunicación funciona perfectamente y consigo transmitir datos sin problemas, tanto en un sentido como en el otro.

Pero cuando transmito valores con decimales, el PC transmite cuatro bytes que el micro recibe, pero el float que interpreta no tiene nada que ver. Sospecho que el formato de los floats es diferente.

Un ejemplo real:
El PC transmite el decimal 0.3035707 mediante cuatro bytes: 0x9E, 0x6D, 0x9B y 0x3E. El micro los recibe pero para él el valor float correspondiente es 3.98637414e+09 que no se parece en nada.
Para el micro el valor 0.3035707 sería la secuencia 0x7D, 0x1B, 0x6D y 0x9E. Coinciden los dos primeros con los dos últimos invirtiendo el orden pero no veo nada más. El compilador que utilizo en el micro es el CCS y en el PC Visual Basic 6.

¿Se le ocurre a alguien alguna solución?

¡Gracias por anticipado!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mandar valores "float" desde un PC a un micro
« Respuesta #1 en: 16 de Julio de 2018, 09:48:33 »
PC transmite: 0x9E, 0x6D, 0x9B y 0x3E

Es correcto.... Invertido el orden:

0x3E, 0x9B, 0x6D, 0x9E

Esto es IEEE 754, el problema es que CCS utiliza el mismo formato que Microchip. Cito al manual de CCS:

Citar
CCS uses the same format Microchip uses in the 14000 calibration constants

Cambiando el lugar del bit de signo:

Código: [Seleccionar]
IEEE754 32-bit   sxxxxxxx.yxxxxxxx.xxxxxxxx.xxxxxxxx
MIcrochip 32-bit xxxxxxxx.sxxxxxxx.xxxxxxxx.xxxxxxxx

Siendo la "y" en el IEEE754 el ultimo bit del exponente. Se cambia el formato por que es mas simple de operar teniendo el exponente en un solo registro. Para que se entienda el formato, cambiaron el lugar del signo del primer byte al segundo, corriendo obviamente todo.
La forma de solucionar esto es mover el bit de signo hacia el primer byte. Sigamos con el ejemplo:

0x3E, 0x9B, 0x6D, 0x9E

00111110.10011011.01101101.10011110  (Recalco el bit de signo)

01111101.00011011.01101101.10011110
0x7D1B6D9E

Suponiendo que sean seguidos y tengas:

Código: C
  1. float numDecimal = (float)0x7D1B6D9E;
  2. int1 temp;
  3.  
  4. temp = bit_test(numDecimal,31);   //guardo el signo
  5. rotate_left(&numDecimal,2);          //roto a la izquierda el exponente y el primer byte.
  6. rotate_right(&numDecimal+1,1);    //roto a la derecha el 2do byte.
  7. if (temp)
  8. {
  9.   bit_set(&numDecimal+1,7);         // En caso de haber estado en 1 el bit de signo lo seteo.
  10. }


Mas info sobre el formato de Microchip:

http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf
« Última modificación: 16 de Julio de 2018, 09:51:34 por KILLERJC »

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 222
Re:Mandar valores "float" desde un PC a un micro
« Respuesta #2 en: 16 de Julio de 2018, 11:28:52 »
¡ Muchas gracias por la respuesta!

Ahora ya me encaja todo. Con la pista del IEEE 754 ya veo claramente cómo solucionar el problema.

Muchas gracias de nuevo!


 

anything