Go Down

Topic: Valor hexadecimal en eeprom (Read 1 time) previous topic - next topic

PascuaL

Pues eso,¿cómo guardo un valor hexadecimal en la eeprom?
Gracias !
Ejemplo :EA15857A

fm

   

PascuaL

¿Te refieres a separar los datos en un String?

fm

No, byte a byte: 0xEA, 0x15, 0x85, 0x7A
   

PascuaL

Vale, no se muy bien por donde vas. Cuando he usado la eeprom, he guardado valores binarios. Nunca he guardado valores hexadecimales.

Byte a byte.. Se pero no se por donde vas.

Gracias por tu ayuda fm.

fm

Los valores siempre son bienarios, da igual dónde los almacenes. La única diferenica es como los recuperas o interpretas.

Por ejemplo:
Code: [Select]

EEPROM.write ( 0, 0xFF );
EEPROM.write ( 1, 255 );

Serial.println ( EEPROM.read (0));
Serial.println ( EEPROM.read (1));

Te va a imprimir:

255
255


y si

Code: [Select]

Serial.print ( EEPROM.read (0), HEX);
Serial.print ( EEPROM.read (1), HEX);

Te va a imprimir:

FF
FF


Por lo tanto en tu ejemplo:
Code: [Select]

EEPROM.write ( 0, 0xEA );
EEPROM.write ( 1, 0x15 );
EEPROM.write ( 2, 0x85 );
EEPROM.write ( 3, 0x7A );

for ( int i = 0; i < 4; i++ )
   Serial.print ( EEPROM.read (0));

Te va a imprimir:
EA15857A
   

PascuaL

Muy buena explicación. Muchas gracias fm, queda entendido.
Queda una cosilla..el valor hexadecimal viene de un mando IR. Lo suyo es que pulses el botón y Arduino lo memorice, para después hacer determinadas cosas.

Hay que memorizar esos valores en 4 bytes, ahora, ¿como "parto" el valor hexadecimal para poder guardarlo, byte a byte, en la eeprom?

Gracias de nuevo fm. Siempre quedo contento de tu ayuda.

fm

Supongo que lo leeras byte a byte o en un entero de 32bits.

Si me pones la forma que tienes de leer los valores o la variable de donde los has sacado te puedo poner un pequeño fragmento de código que los almacene y recupere. Supongo que estarás llamando a una función que lee los pulsos que vienen de un receptor y estás llamando a una función.

¿a qué función estás llamando para sacar esos valores?

No creo que el mando lo mande en texto.
   

PascuaL

Jo tio. Tienes razón..es el código el que lo transforma en HEX.(torpe coño)

Code: [Select]

#include <WProgram.h>
#include <NECIRrcv.h>
#define IR 8

NECIRrcv ir(IR) ;

void setup()
{
Serial.begin(9600) ;
Serial.println("Recepción IR") ;
ir.begin() ;
}

void loop()
{
unsigned long ircodigo ;

while (ir.available()) {
ircodigo = ir.read() ;
Serial.print("El código es: 0x") ;
Serial.println(ircodigo,HEX) ;
}
}



fm

OK, pues el código que tienes que escribir es algo de este estilo:

Code: [Select]

#define EEPROM_POS 0

unsigned long ircodigo;
char *eePos;     // esto es lo que vamos a usar para ir escribiendo en memoria

...

// Una vez hayas leido el código que te viene por el infrarojo, vamos a suponer que ya tienes
// el código en la variable ircodigo
eePos = &ircodigo;

for ( int i = 0; i < sizeof(unsigned long); i++ )
{
   EEPROM.write ( EEPROM_POS + i, *eePos);
   eePos++;
}

// En este punto ya tienes en las primeras 4 posiciones de la EEPROM el codigo IR
// Para leerlo de las primeras 4 posiciones
ircodigo = 0; // no hace falta, pero es para que veas que el valor se lee de la EEPROM

eePos = &ircodigo;

for ( int i = 0; i < sizeof(unsigned long); i++ )
{
   *eePos = EEPROM.read ( EEPROM_POS + i );
   eePos++;
}

// si imprimes el ircodigo, voila ya tienes el valor que has leido por el IR


Si quieres almacenar mas codigos, tendras que trabajar la posicion donde escribes en ella, es decir sustituir EEPROM_POS por algo que te diga donde escribir.

Con este uso de un puntero, podras ademas escribir lo que quieras en EEPROM, incluyendo una estructura que uses en tu programa como configuracion persistente.
   

PascuaL

Entonces,si en la posición donde tengo que escribir en la eeprom pongo 1,¿los demás bytes se guardan en 2,3 y 4? (según tu código claro)

Gracias de nuevo fm.

fm

Si, si pones 1 en EEPROM_POS, según mi código escribirá en la posición 1, 2, 3 y 4.
   

PascuaL

Y una última cosa,  ¿todo ésto en hexadecimal?

fm

Para la posición en la EEPROM usa numeros en base 10.

Como comentaba, todo se almacena en binario en cualquier micro controlador, es lo único que entienden. El resto es una mera interpretación de la información.

Lo que hace el cacho de código que te he puesto es simplemente, el "unsigned long" lo escribe en la EEPROM de byte en byte. Por otro lado, lee de 4 posiciones de la EEPROM, es decir 4 bytes y reconstruye el número original. Este número si en vez de imprimirlo en HEX lo imprimes en decimal vas a tener el mismo número pero en base 10.

Digamos que el "unsigned long", es un número de 32bits, es decir 4 bytes.
   

PascuaL

Ya si que todo es binario está claro jeje. Era por tanto cambio y demás. Gracias fm de nuevo.
Gracias!!!!! ;)

Go Up