Pages: [1] 2   Go Down
Author Topic: Valor hexadecimal en eeprom  (Read 1447 times)
0 Members and 1 Guest are viewing this topic.
Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Como 4 bytes.
Logged

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Te refieres a separar los datos en un String?
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Por ejemplo:
Code:
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:
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:
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
Logged

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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) ;
}
}

Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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.
Logged

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 40
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

   

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ya si que todo es binario está claro jeje. Era por tanto cambio y demás. Gracias fm de nuevo.
Gracias!!!!! smiley-wink
Logged

Pages: [1] 2   Go Up
Jump to: