TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Kenlly en 22 de Agosto de 2016, 16:36:27

Título: Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: Kenlly en 22 de Agosto de 2016, 16:36:27
Hola a todos,

mi inquietud es la siguiente: yo necesito grabar variables tipo Single (o sea con puntos decimales) en la memoria EEPROM, pero la EEPROM no acepta si no variables tipo byte. Intenté asignando los bytes bajo y alto a variables y sumándolos luego, pero no resulta el mismo valor original de la variable Single.
Alguien sabe que tipo de arreglo se puede hacer para guardar ese tipo de variable en la EEPROM?

Gracias de antemano.
Título: Re:Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: KILLERJC en 22 de Agosto de 2016, 18:07:12
Tal ves te referis a "float" la cual es de 32bits o 24bits segun implementacion y punto flotante.

Lo que podes hacer es crear un puntero a byte y recorrerlo. Suponete que sean 4 bytes, es decir de 32bits.

Código: C
  1. uint8_t * ptr;
  2. float ValorAGuardar;
  3. uint8_t direccion;
  4.  
  5. //Escritura
  6.  
  7. direccion = 0x20;                               // Direccion de la EEPROM a guardar
  8. ptr = &ValorAGuardar;                           //Asigno la el valor del puntero
  9. for(i=0;i<4;i++)
  10. {
  11.         GrabarEEPROM(direccion + i,*ptr);               //Guardo byte a byte
  12.         ptr++;
  13. }
  14.  
  15. //Lectura
  16.  
  17. ptr = &ValorAGuardar;                           //Asigno la el valor del puntero
  18. for(i=0;i<4;i++)
  19. {
  20.         *ptr = LeerEEPROM(direccion + i);       //Guardo byte a byte
  21.         ptr++;
  22. }

La otra es usar "union", en el foro ya se trato el tema creo que varias veces, deberias buscarlo, este seria el mejor caso.

Código: C
  1. union My_float
  2. {
  3.         float   mFloat;
  4.         uint8_t mBytes[4];
  5. }
  6.  
  7. union My_float ValorAGuardar;
  8. uint8_t direccion;
  9.  
  10.  
  11. ValorAGuardar.mFloat = 1.2;                     // le asigno un valor
  12. direccion = 0x20;                               // Direccion de la EEPROM a guardar
  13. for(i=0;i<4;i++)
  14. {
  15.         GrabarEEPROM(direccion + i,ValorAGuardar.mBytes[i]);    //Guardo byte a byte
  16. }
  17.  
  18. //Lectura
  19.  
  20. for(i=0;i<4;i++)
  21. {
  22.         ValorAGuardar.mBytes[i] = LeerEEPROM(direccion + i);    //Guardo byte a byte
  23. }
Título: Re:Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: Kenlly en 22 de Agosto de 2016, 18:54:09
Muchas gracias por tu respuesta, pero se me olvidó mencionar que estoy usando Basic, con el Pic Simulator IDE.
Título: Re:Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: KILLERJC en 22 de Agosto de 2016, 19:10:49
Mil disculpas yo, no vi que estaba en el foro de BASIC!  :D, entonces tendras que esperar a alguien que conosca BASIC.
Título: Re:Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: dogflu66 en 22 de Agosto de 2016, 20:11:15
Esto en teoria tendria que servirte:

'***************************************************************************************************
'Include "_FuncionesPic16F88.bas" **********************************************************
'By COS, 17/07/2016, 06/16, 09/15, 04/15, 12/14, 10/14, 09/14, 07/14, 06/14, 12/13
'PSI v7.41 ***************************************************************************************
'***************************************************************************************************
'***************************************************************************************************
'_Write_Single: Guarda un dato tipo Single (Float) en la EEProm.
   'Call _Write_Single(V_single, Direccion EEProm)
'_Read_Single: Lee un dato tipo Single (Float) de la EEProm.
   'V_single = _Read_Single(Direccion EEProm)
'---------------------------------------------------------------------------------------------------------------
'No retorna valor
'Guarda una variable tipo Single en la EEprom
'_vpaso es la variable tipo Single a guardar en la EEProm
'_direccion es un Word; posición de memoria a guardar en la EEProm
'Call _write_single(_vpaso, _direccion)
Proc _write_single(_vpaso As Single, _direccion As Word)
   Write _direccion, _vpaso.LB
   _direccion = _direccion + 1
   Write _direccion, _vpaso.HB
   _direccion = _direccion + 1
   Write _direccion, _vpaso.3B
   _direccion = _direccion + 1
   Write _direccion, _vpaso.4B
End Proc                                         
'Retorna valor: Single
'Lee un Single de la EEprom
'_read_single = variable tipo Single donde se almacena valor leido en EEProm
'_direccion es un Word; posición de memoria a leer de la EEProm
Function _read_single(_direccion As Word) As Single
   Read _direccion, _read_single.LB
   _direccion = _direccion + 1
   Read _direccion, _read_single.HB
   _direccion = _direccion + 1
   Read _direccion, _read_single.3B
   _direccion = _direccion + 1
   Read _direccion, _read_single.4B
End Function     

Recuerda que una variable tipo Single (Float) ocupa 4Bytes, así que te tienes que desplazar de 4 en 4 posiciones de memoria.
Título: Re:Variables tipo Single en memoria EEPROM Pic Simulator IDE
Publicado por: dogflu66 en 25 de Agosto de 2016, 05:10:07
Con variaciones mínimas puedes hacer que la función de escritura te retorne la próxima dirección donde se puede comenzar a escribir la siguiente variable single.

'Retorna valor tipo Word
'Guarda una variable tipo Single en la EEprom
'_vpaso es la variable tipo Single a guardar en la EEProm
'_direccion es un Word; posición de memoria a guardar en la EEProm
'_write_single es un Word que tendrá la próxima dirección de inicio donde guardar la siguiente variable tipo single.
'Call _write_single(_vpaso, _direccion)
Function _write_single(_vpaso As Single, _direccion As Word) as Word
   Write _direccion, _vpaso.LB
   _direccion = _direccion + 1
   Write _direccion, _vpaso.HB
   _direccion = _direccion + 1
   Write _direccion, _vpaso.3B
   _direccion = _direccion + 1
   Write _direccion, _vpaso.4B
   _write_single = _direccion + 1 'Asigna la próxima dirección de inicio para escribir el siguiente dato tipo Single.
End Function   

Ejemplo:

Dim v_single as Single
Dim n as byte
v_single = 0.99
Call _Write_Single(v_single, 0)

For n = 0 to 9
  v_single = v_single + 0.01
   Call _Write_Single(v_single, _write_single)
Next n
End