Autor Tema: Escribir variables int32 en eeprom externa  (Leído 8314 veces)

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

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Escribir variables int32 en eeprom externa
« Respuesta #15 en: 27 de Agosto de 2008, 00:29:31 »
Hola. Firepic la libreria q intente usar para leer/escribir float es la external_eeprom.c del CCS 4.023, siendo estas las funciones:

Código: [Seleccionar]
// Purpose:    Write a floating point number to external eeprom
// Inputs:     1) An eeprom address. Four eeprom locations will be used.
//             2) The floating point number to write to external eeprom
// Outputs:    None
void write_float_ext_eeprom(EEPROM_ADDRESS address, float data)
{
   int8 i;

   for(i = 0; i < 4; ++i)
   {
     write_ext_eeprom(address + i, *(&data + i));
   }
}

Código: [Seleccionar]
// Purpose:    Read a floating point number from external eeprom
// Inputs:     An eeprom address
// Outputs:    The floating point number read from the external eeprom
float read_float_ext_eeprom(EEPROM_ADDRESS address)
{
   int8 i;
   float data;

   for(i = 0; i < 4; ++i)
   {
     *(&data + i) = read_ext_eeprom(address + i);
   }

   return data;
}

Habiendo un error (creo) en el compilador porque revisando con el MPLAB SIM cuando hago esto: (&data + i), ocea que si le sumo por ejemplo + 1 a la direcion de "data", el compilador lo que hace es sumarle 4 bytes mas porque asi lo entendiera y creo que eso hacia que me devolviera variables erroneas, cosa mal porque tiene que seguir leyendo en los otros 3 bytes del valor flotante.

Bueno, ahora uso lo que propuso RICHI777 que va de maravilla. No conocia esa funcion memcpy que al parecer hace lo mismo pero de manera correcta, gracias.
Cuanto tenga mas tiempo probare a mas detalle si el problema es con el compilador u otra cosa.

Gracias a todos.
Un saludo.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Escribir variables int32 en eeprom externa
« Respuesta #16 en: 27 de Agosto de 2008, 12:23:22 »
Hola, dependiendo del compilador utilizado la función que detalla jeremylf adolece de 2 problemas:

Problema 1
Código: [Seleccionar]
for(i = 0; i < 4; ++i)
De esta manera se asume que siempre un float ocupara 4 bytes, y esto puede no ser siempre verdad, si por alguna razon se cambia el tamaño de la representación del float deberiamos tener que modificar la función.
De la sgte manera me independizo del tamaño
Código: [Seleccionar]
for(i = 0; i < sizeof( float ); ++i)

Problema2

Código: [Seleccionar]
write_ext_eeprom(address + i, *(&data + i));

Según la aritmetica de punteros cuando se opera se utiliza el tamaño del mismo salvo que exista cast especifico, por eso cuando &data + 1 el puntero pasa a tener +4, porque un float ocupa 4 bytes, lo mismo pasaria si haria (&data ++ ).
La correcta escritura de esta operación seria esta:

Código: [Seleccionar]
write_ext_eeprom(address + i, *((( int8 * )&data ) + i));

De esta manera el puntero intermedio es tratado como un int8 y solo es incrementado en unidades de a uno.

Saludos !

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Escribir variables int32 en eeprom externa
« Respuesta #17 en: 27 de Agosto de 2008, 18:54:35 »
Por lo primero, no creo que cambien el formato para los float, que utiliza tb microchip, aunq lei q habia un tal IEE... pero igual creo que ocupaba 4 bytes  :mrgreen:

Por lo otro... habra que darles un jalon de orejas a los de CCS entonces xD!

Muchas gracias RICHI777 por la aclaracion.
Salu2.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Escribir variables int32 en eeprom externa
« Respuesta #18 en: 27 de Agosto de 2008, 19:56:21 »
El formato para los float en CCS siempre es el mismo, y ocupa 32bits, o sea 4 bytes. Jeremy está en lo correcto.
Y pues debe ser un error de ese compilador. Yo uso el 4.057, y está tal cual lo coloca Richi. Debieron haberlo corregido con esa versión.
Como te digo, a mi me funcionó de maravilla.  :lol:
Saludos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Escribir variables int32 en eeprom externa
« Respuesta #19 en: 27 de Agosto de 2008, 23:40:04 »
Hola, con respecto al primer punto en si es una sugerencia mas que un error, es mas prolijo escribirlo de la forma que denote. Igual gracias por las aclaraciones

Saludos !

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Escribir variables int32 en eeprom externa
« Respuesta #20 en: 03 de Septiembre de 2008, 09:58:57 »
Hola, dependiendo del compilador utilizado la función que detalla jeremylf adolece de 2 problemas:
...

Código: [Seleccionar]
for(i = 0; i < sizeof( float ); ++i)

Código: [Seleccionar]
write_ext_eeprom(address + i, *((( int8 * )&data ) + i));

De esta manera el puntero intermedio es tratado como un int8 y solo es incrementado en unidades de a uno.
Saludos !

Muy bien, Richi777. Me encanta tu planteamiento/propuesta. Es elegante, canónico y clarificador, válido para distintos C´s y tipos de variables. Me gusta.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania