Autor Tema: [SOLUCIONADO]¿Hay alguna manera de separar una variable float en un array?  (Leído 2939 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
A lo mejor lo que digo es una locura y se puede hacer de otra manera mas sencilla pero esta manera es la que se me ha ocurrido.
Tengo una variable con un dato de un valor numérico en punto flotante y quiero meterla en la EEPROM interna del micro, y como la EEPROM solo acepta datos de 8bits he pensado que la manera de meterla seria separar la variable en números y meterla en un array en la memoria interna y a la hora de recuperar la información juntarla con un aoif.

estoy haciéndolo en CCS
« Última modificación: 14 de Noviembre de 2012, 19:58:53 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Hay alguna manera de separar una variable float en un array?
« Respuesta #1 en: 14 de Noviembre de 2012, 16:06:44 »
CCS ya tiene funciones que permiten hacer esto, incluso hay ejemplos.
Busca y abre la libreria (carpeta Drivers) internal_eeprom.c y leela bien y veras lo que digo...
Incluso para guardar un solo bit hay funciones. :mrgreen: :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Hay alguna manera de separar una variable float en un array?
« Respuesta #2 en: 14 de Noviembre de 2012, 16:10:28 »
El float esta compuesto por 32-bits, los cuales los podes separar en 4 bytes. La cuestión es no perder el orden como para recuperarlo al leerlo, es lo que hace las funciones de CCS, mediante punteros a bytes tomar los 4 por separado.
Para quién no use CCS, puede hacerse de la siguiente manera:

Código: C
  1. float Data;
  2. long Direccion;
  3.  
  4. Direccion=100;
  5. writeEEPROM(Direccion++,*((char *)&Data)));
  6. writeEEPROM(Direccion++,*((char *)&Data+1)));
  7. writeEEPROM(Direccion++,*((char *)&Data+2)));
  8. writeEEPROM(Direccion,*((char *)&Data+3)));
  9.  
  10. Direccion=100;
  11. *((char*)&Data)=readEEPROM(Direccion++);
  12. *((char*)&Data+1)=readEEPROM(Direccion++);
  13. *((char*)&Data+2)=readEEPROM(Direccion++);
  14. *((char*)&Data+3)=readEEPROM(Direccion);


Saludos!
« Última modificación: 14 de Noviembre de 2012, 16:14:17 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ¿Hay alguna manera de separar una variable float en un array?
« Respuesta #3 en: 14 de Noviembre de 2012, 16:28:54 »
Hola.
Podrías hacer:

Código: C
  1. #include <stdint.h>
  2. #define EE_BASE_ADDRESS   0
  3.  
  4. void save_float_var(uint8_t * ptrFloatVar)
  5. {
  6.    uint8_t i;
  7.  
  8.    for(i=0; i< sizeof float; i++){
  9.       write_eeprom(EE_BASE_ADDRESS+i,*ptrFloatVar++);
  10.    }
  11. }
  12.  
  13. void read_float_var(uint8_t * ptrFloatVar)
  14. {
  15.    uint8_t i;
  16.  
  17.    for(i=0; i< sizeof float; i++){
  18.       *ptrFloatVar++ = read_eeprom(EE_BASE_ADDRESS+i);
  19.    }
  20. }
  21.  
  22. void main(void)
  23. {
  24.    float fvar = 3.15;
  25.    save_float_var(&fvar);
  26.    fvar = 0.00;  //forzar a fvar a valer algo distinto del valor guardado(solo para fines de testeo)
  27.    read_float_var(&fvar);
  28.    printf("float number readed is: %1.2f", fvar);
  29. }

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: ¿Hay alguna manera de separar una variable float en un array?
« Respuesta #4 en: 14 de Noviembre de 2012, 19:58:27 »
Pues quiero agradecer a TODOS la ayuda prestada, me han dado ideas para hacer mas cosillas, pero el asunto al que me refiero en este hilo lo he solucionado con el driver internal_eeprom.c cómo me ha recomendado el compañero MGLSOFT  del propio ccs c y es muy muy fácil de utilizar, no conocía este driver y funciona PERFECTO.
Gracias
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Hay alguna manera de separar una variable float en un array?
« Respuesta #5 en: 14 de Noviembre de 2012, 20:45:15 »
Pues quiero agradecer a TODOS la ayuda prestada, me han dado ideas para hacer mas cosillas, pero el asunto al que me refiero en este hilo lo he solucionado con el driver internal_eeprom.c cómo me ha recomendado el compañero MGLSOFT  del propio ccs c y es muy muy fácil de utilizar, no conocía este driver y funciona PERFECTO.
Gracias

Buenísimo! Lo importante es ir aprendiendo en el transcurso, para no ser mediocre. Sino después aparece una duda parecida y otra vez no sabemos resolverlo  :undecided:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: [SOLUCIONADO]¿Hay alguna manera de separar una variable float en un array?
« Respuesta #6 en: 14 de Noviembre de 2012, 22:26:25 »
Asi como dice Suky, hay que aprender de estas situaciones y ENTENDER bien como es la solución.  :mrgreen:
No alcanza con saber usar un driver pre-escrito, sino que lo correcto es entenderlo bien y aprender a hacerle cambios, o tunearlo si es necesario, para conseguir tu objetivo.

Suerte y en la próxima, a leer los driver pre-escritos y lo que es mejor, hacer la búsqueda en el foro antes de colgar tu pregunta, ya que al menos yo ya conteste preguntas parecidas 4 o 5 veces, y mis compañeros, algunas veces mas.

Como expresaste muy bien tu consulta, te contestamos primero, y ahora viene el tirón de orejas. ;-) ;-)
Leete bien las reglas del foro, así no cometes nuevamente estos errores... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything