TODOPIC
Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: jeremylf en 21 de Septiembre de 2008, 17:58:49
-
Buenas.
Veran, tengo un problema. Y esq porejemplo para:
(En CCS 4.023)
float VarCCS= 1.4925;
Sus 4 bytes internos son: 127, 63, 10, 62.
Estos bytes yo los envio satisfactoriamente a la PC donde, con Visual C# 2008, tengo que tener una variable de igual valor a la del ccs (VarCCS).
La pregunta entonces seria: ¿Como puedo convertir, mediante estos 4 bytes, el valor que tengo en CCS para tenerlo tambien en C#?
Espero se entiendo lo que necesito y puedan ayudarme.
Un saludo.
-
Haciendo unas pruebas...
VC#:
float VarVC = 1.4925F;
Los valores que obtengo al leerlo asi:
MessageBox.Show((*(((byte*)&DistRecor_DistanciaRecorrida) )).ToString());
MessageBox.Show((*(((byte*)&DistRecor_DistanciaRecorrida) + 1)).ToString());
MessageBox.Show((*(((byte*)&DistRecor_DistanciaRecorrida) + 2)).ToString());
MessageBox.Show((*(((byte*)&DistRecor_DistanciaRecorrida) + 3)).ToString());
Son: 61, 10, 191 y 63. Que son distintos a los del CCS... lo que me lleva a concluir que los formatos al guardar son diferentes (creo que el VC# usa IEEE y CCS el de microchip, no estoy muy enterado de esto).
Entonces habria alguna forma para que el 'float' del VC# se compatibilice con el del CCS o algo ? :?
Gracias.
-
Hola.
Y porque no enviar el string del float mejor? es decir enviar {'1','.','4','9','2','5'} y luego usar la funcion atof().
Lo unico que debes hacer para relacionar un formato con el otro es tener en cuenta el orden de los bytes. El CCS tiene el siguiente orden:
- BYTE 1: exponente con una desviacion de valor 0x7F, es decir, cuando el exponente es 0, el valor es 0x7F, con excepcion del cero que es 0x00
- BYTE 2: Bit de signo + 7bits de la mantisa MSB
- BYTE 3: 8bits de la mantisa
- BYTE 4: 8bits de la mantisa LSB
Saludos
-
Hola.
No envia con strings porq el valor puede ser cual sea, no solo 1.4925.
Por lo otro, creo haber leido que el ccs usa el formato de microchip que es diferente a un tal IEEE, que es el que usa el VC# y por esto no le encuentro relacion a los valores que obtengo en cada byte en los dos compiladores.
O quiza mi forma de dirigirme a ellos sea lo erroneo que hasta al mostrarlos cada uno por un mensaje me este mostrando mal.... sabrias como hacerlo por vc# ?
Gracias por tu respuesta.
Un saludo.
-
Hola.
Cuando me refiero a enviarlo como string, puede ser cualquier valor tambien, hay que pasar el valor del float a string y listo (con la funcion sprintf() ) :mrgreen:.
El formato del float de la IEEE pude trabajarse como single o double, lo que cambia es el numero de bytes, creo que tu lo trabajas single no?
La relacion entre los formatos es la siguiente:
(http://img89.imageshack.us/img89/695/ieeepi1.png)
Hay que tener cuidado es en el bit del signo.
Saludos
-
Entonces al guardarlo (porq lo guardo en una memoria que luego es bolcada a la PC), antes, lo convierto de mchip a IEE para que VC# lo pueda leer igual ??
Gracias por la ayuda.
Un saludo.
-
Hola.
Si, la idea es que si vc# lee los float como IEEE y el valor del float que lees viene de un float tipo microchip, hay que dejarlo en un mismo formato, en este caso el del IEEE.
Lo "unico" que debes hacer es cambiar el bit del signo.
Mira este link: Conversor IEEE 754 (http://www.h-schmidt.net/FloatApplet/IEEE754.html)
Saludos
-
Bueno, ahora lo tengo asi:
write_ext_eeprom_int32(Direcion, (f_PICtoIEEE(DatoFloat)));
Esta bien asi entonces?
Ahora, la forma que escribo cada byte del float desde el VC# esta bien? :?ç
Gracias MLO_.
Un saludo.
-
Hola.
A ver, primero aclaremos bien las cosas :-).
Tu calculas algo en el PC y te da un float, el cual tiene un formato IEEE 754, ese valor tu lo quieres guardar en una memoria externa pero ahora en el formato de microchip cierto?
o: calculas algo en el PIC y el resutado es un float, el cual lo quieres guardar en la memoria, pero en un formato IEEE 754 para despues pasar ese valor por medio del PIC al PC y hacer lo que tengas que hacer en el PC?
Saludos
-
Hola MLO__.
Ya todo funciona. Lo que necesitaba era leer correctamente un valor float (de mchip) desde VC#. Ocea, yo guardaba en una memoria externa un valor float (4 bytes), luego los mandaba a la PC y queria leerlos tal y como eran en el CCS, pero tuve problemas con eso de que CCS usa el formate de mchip q es distinto al que usa VC# que es el IEEE 754.
Pero la salucion, gracias a ti, fue convertir mi valor float de mchip a IEEE ANTES de guardarlo en la memoria externa, cosa que luego al pasar los 4 bytes a la PC les asignara, a cada byte del float del VC#, este valor y automaticamente se conviertiera en lo mismo que guarde. Esto lo hice con la funcion de CCS f_PICtoIEEE.
Y para guardar cada byte use:
void write_ext_eeprom_ieee(int16 Address, int32 Data)
{
/* Se instancia un buffer de igual tamaño del tipo da dato, no me debe importar el tamaño, el compilador lo resolvera en tiempo de compilacion */
int8 Buffer[4];
int8 Index;
/* Copio el Dato al buffer */
memcpy(Buffer, &Data, 4);
/* Salvo en EEPROM */
for (Index = 0; Index < 4; Index ++ )
{
write_ext_eeprom(Address ++, Buffer[Index]);
}
}
Con ayuda de RICHI777 hace un tiempo, solo que modificada para el IEEE.
Bueno, hasta ahora todo va de lujo, cualquier problema lo comento :mrgreen:
Gracias nuevamente hombre :P
Un saludo.
-
Me alegro que ya todo este full!!!! :-/ :-/
Saludos
-
hola... perdon ,,por que en este foro no va mi pregunta ...pero no sabia a donde hacerla.....estoy empezando con el CCS para pic ..uso el PCW
y en mi primer programa ,me da un error que dice asi =
Error 18 "lavatic.txt.c"Line0(0,1):file can not be opened
File: lavatic.txt.c
1 error, 0 warnings
por que no se puede abrir ??? el programa lo edite con el NOTEPAD y despues lo copie a otros editores ..y siempre el mismo error ..tiene q ser un error muy sencillo ,,,pero como es nuevo el compilador para mi ,no lo encuentro ...desde muchas gracias ,,y disculpen las molestias .....
-
Hola.
Es por la extension de archivo ... tienes 2!!! .txt y .c, para que lo abra correctamente debe ser .c unicamente. Cuando vayas a guardar el archivo desde el notepad, debes seleccionar en la parte de tipo de archivo: todos los archivos, y colocar en el nombre la extension.
saludos
-
Hola ... MLO ...agracezco tu pronta respuesta
uno de los errores solucionado ....pero el error18 sigue alli....
Error 18 "lavatic.txt.c"Line0(26,1):file can not be opened
el error 18 sigue estando y apunta a la linea ..26 .. linea 26 = #include <16f877a.h>
yo pienso que no encuentra la libreria de dicho pic ....(mi humilde opinion,,,,jajaja)
fui a OPTIONS y hice los siguientes cambios ...en target =pic16f877a......en INCLUDE FILES = inclui varios de los directorios del compilador ........
las librerias de dicho pic no vienen con el compilador ????..
desde ya muy agradecido .....
-
Hola.
Estas en lo cierto ... no esta el archivo .h del pic.
Podrias postear algo de codigo para ayudarte un poco mas.
Saludos
-
hola MLO_ por suerte lo solucione .....ahora mi problema son las interrupciones en el puertob (en CCS)...tengo 2 mensaje en los foros del C ..si podes echarle una mirada ...y decirme cual es tu opinion ?? ...desde ya muchas gracias ...salu2