Go Down

Topic: Problema al leer de la EEPROM (Read 324 times) previous topic - next topic

karlospv94

Apr 25, 2014, 02:08 pm Last Edit: Apr 25, 2014, 02:18 pm by karlospv94 Reason: 1
Estoy intentando almacenar y después leer un valor de 32 bits pero no hay manera de que funcione. Sólo funciona hasta 16, a partir de ahí ya no los guarda bien. Aquí el código:

Code: [Select]
#include "EEPROM.h"

uint32_t valor;
uint32_t addr;

void setup() {
 valor = 0;
 addr = 0;
 Serial.begin(9600);
 delay(25);

Serial.print("Numero: ");
while(!Serial.available()) ;
if(Serial.available())
valor = Serial.parseInt();
Serial.print("Has escrito: ");
Serial.println(valor);
Serial.println();

delay(500);

Serial.println("Guardando valor...");

EEPROMWriteBits(addr, valor);

Serial.println("Valor guardado!");
Serial.println();
Serial.println("------------------------");

delay(2000);
addr = 0;

Serial.println("Recuperando valor...");

valor = EEPROMReadBits(addr);

Serial.println("\nValor recuperado: ");
Serial.println(valor);

}

void loop() {

}


//EEPROM -> 512 bytes de memoria
void EEPROMWriteBits(uint32_t p_address, uint32_t p_value){
 uint8_t primero = ((p_value >> 0) & 0xFF);
 uint8_t segundo = ((p_value >> 8) & 0xFF);
 uint8_t tercero = ((p_value >> 16) & 0xFF);
 uint8_t cuarto = ((p_value >> 24) & 0xFF);

 Serial.print("primero: ");
 Serial.println(primero);
 Serial.print("segundo: ");
 Serial.println(segundo);
 Serial.print("tercero: ");
 Serial.println(tercero);
 Serial.print("cuarto: ");
 Serial.println(cuarto);

 EEPROM.write(p_address, primero);
 EEPROM.write(p_address + 1, segundo);
 EEPROM.write(p_address + 2, tercero);
 EEPROM.write(p_address + 3, cuarto);
}

uint32_t EEPROMReadBits(uint32_t p_address){
 uint8_t primero = EEPROM.read(p_address);
 uint8_t segundo = EEPROM.read(p_address + 1);
 uint8_t tercero = EEPROM.read(p_address + 2);
 uint8_t cuarto = EEPROM.read(p_address + 3);

 Serial.print("primero: ");
 Serial.println(primero);
 Serial.print("segundo: ");
 Serial.println(segundo);
 Serial.print("tercero: ");
 Serial.println(tercero);
 Serial.print("cuarto: ");
 Serial.println(cuarto);

 uint32_t val = ((primero << 0) & 0xFF) +
    ((segundo << 8) & 0xFF00) +
    ((tercero << 16) & 0xFF0000) +
    ((cuarto << 24) & 0xFF000000);

return val;
}


Lo que intento es separar la palabra en 4 partes de 8 bits cada una para almacenar cada parte en un bloque de memoria de la EEPROM y despues leer y juntar cada bloque mediante desplazamientos para retornar el valor.

perrociego

Hola:

Yo le veo dos cosas, pero no se si es ese el error.

1 - valor = Serial.parseInt(); es un Int  (16 bits con signo) , y no uint32_t
2 - en EEPROM.write(address, value) address también es Int  (16 bits con signo) , y no uint32_t.

Respecto al primero porque no probas de sacar la parte de introducir por Serial el numero y directamente lo fijas en el código (algo como valor = 0x12345678 ) para ver que pasa.

Saludos.

karlospv94


Hola:

Yo le veo dos cosas, pero no se si es ese el error.

1 - valor = Serial.parseInt(); es un Int  (16 bits con signo) , y no uint32_t
2 - en EEPROM.write(address, value) address también es Int  (16 bits con signo) , y no uint32_t.

Respecto al primero porque no probas de sacar la parte de introducir por Serial el numero y directamente lo fijas en el código (algo como valor = 0x12345678 ) para ver que pasa.

Saludos.



Ya tengo el por qué.

Era tan simple como que en EEPROMReadBits a "tercero" y "cuarto" les había asignado el tipo uint8_t cuando debían ser uint32_t, sino es imposible desplazar sobre ellos más de 16 bits (totalmente lógico).

Gracias!

karlospv94

#3
Apr 25, 2014, 05:23 pm Last Edit: Apr 25, 2014, 05:33 pm by karlospv94 Reason: 1
Subo el código correcto por si a alguien le interesa.

Code: [Select]
#include "EEPROM.h"

uint32_t valor;
int addr;


void setup() {
valor = 0;
addr = 0;
Serial.begin(9600);
delay(25);

Serial.print("Numero: ");
while(!Serial.available()) ;

if(Serial.available())
valor = Serial.parseInt();

Serial.print("Has escrito: ");
Serial.println(valor);
Serial.println();

delay(500);

Serial.println("Guardando valor...");

EEPROMWriteLong(addr, valor);

Serial.println("Valor guardado!");

Serial.println();
Serial.println("------------------------");

delay(2000);

Serial.println("Recuperando valor...");

valor = EEPROMReadLong(addr);

Serial.println("\nValor recuperado: ");
Serial.println(valor);

}

void loop() {

}


//EEPROM -> 512 bytes de memoria
void EEPROMWriteLong(int p_address, uint32_t p_value){
  uint8_t primero = ((p_value >> 0) & 0xFF);
  uint8_t segundo = ((p_value >> 8) & 0xFF);
  uint8_t tercero = ((p_value >> 16) & 0xFF);
  uint8_t cuarto = ((p_value >> 24) & 0xFF);

  Serial.print("0 - 7 bits (dec): ");
  Serial.println(primero);
  Serial.print("8 - 15 bits (dec): ");
  Serial.println(segundo);
  Serial.print("16 - 23 bits (dec): ");
  Serial.println(tercero);
  Serial.print("24 - 31 bits (dec): ");
  Serial.println(cuarto);

  EEPROM.write(p_address, primero);
  EEPROM.write(p_address + 1, segundo);
  EEPROM.write(p_address + 2, tercero);
  EEPROM.write(p_address + 3, cuarto);
}

uint32_t EEPROMReadLong(uint32_t p_address){
uint8_t primero = EEPROM.read(p_address);
  uint8_t segundo = EEPROM.read(p_address + 1);
  uint32_t tercero = EEPROM.read(p_address + 2);
  uint32_t cuarto = EEPROM.read(p_address + 3);

  Serial.print("0 - 7 bits (dec): ");
  Serial.println(primero);
  Serial.print("8 - 15 bits (dec): ");
  Serial.println(segundo);
  Serial.print("16 - 23 bits (dec): ");
  Serial.println(tercero);
  Serial.print("24 - 31 bits (dec): ");
  Serial.println(cuarto);

  uint32_t val = ((primero << 0) & 0xFF) +
             ((segundo << 8) & 0xFF00) +
             ((tercero << 16) & 0xFF0000) +
             ((cuarto << 24) & 0xFF000000);

return val;
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy