Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

11/06/2014 #1


Problema con EEPROM en proteus
Hola a todos quisiera saber como usar la memoria eeprom en proteus con un arduino uno R3, estoy intentando grabar datos con la funcion EEPROM.write(direccion,valor); pero no he podido, voy al menu del proteus: debug>>AVR>>EEPROM MEMORY y veo que no ha grabado nada, o nose como es que graba. Tengo el siguiente codigo:

Código:
#include <EEPROM.h>

int addr = 20, a=2600;
int ex;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  EEPROM.write(addr,a);
  ex=EEPROM.read(addr);
  Serial.print(ex);
  delay(1000);  
}
y sale lo que esta en la imagen eeprom que adjunte, me esta imprimiendo un 40 y el numero que guarde fue 2600, tambien quisiera saber como guardar la memoria eeprom en un archivo y como usarla posteriormente tambien en el proteus.
11/06/2014 #2
Moderador

Avatar de D@rkbytes

No sé de Arduino, pero lo que te está pasando es normal.
En una EEPROM solo puedes escribir 8 bits (1 Byte), o sea que no puedes escribir un número superior a 255.
Lo que estás viendo es el LSB de 2600 = 0x28 y no se está escribiendo el MSB que es 0x0A
Lo que necesitas es separar esa cantidad que pertenece a una variable de 16 bits en dos partes.
Debes obtener el LSB y el MSB y luego grabar esos datos en dos direcciones de la memoria.
Para hacerlo sencillo, puedes crear las funciones que se encarguen de hacer la separación, la escritura y la lectura.

Suerte.
12/06/2014 #3


Hola, yo soy novato en esto de arduino y de la electronica, lo que no te entiendo es porque el 40 es el bit menos significativo de 2600, que tiene que ver con el numero, que pena la ignorancia man, pero es que soy un poco novato en esto.
D@rkbytes dijo: Ver Mensaje
No sé de Arduino, pero lo que te está pasando es normal.
En una EEPROM solo puedes escribir 8 bits (1 Byte), o sea que no puedes escribir un número superior a 255.
Lo que estás viendo es el LSB de 2600 = 0x28 y no se está escribiendo el MSB que es 0x0A
Lo que necesitas es separar esa cantidad que pertenece a una variable de 16 bits en dos partes.
Debes obtener el LSB y el MSB y luego grabar esos datos en dos direcciones de la memoria.
Para hacerlo sencillo, puedes crear las funciones que se encarguen de hacer la separación, la escritura y la lectura.

Suerte.
12/06/2014 #4

Avatar de chclau

40 es el BYTE menos significativo

2600 = 256 * 10 + 40

te recomiendo, antes de largarte a programar, leer sobre representacion de numeros en binario

Saludos
12/06/2014 #5
Moderador

Avatar de D@rkbytes

shikamarucb dijo: Ver Mensaje
Hola, yo soy novato en esto de arduino y de la electrónica, lo que no te entiendo es porque el 40 es el bit menos significativo de 2600, ¿qué tiene que ver con el número?, que pena la ignorancia man, pero es que soy un poco novato en esto.
OK. Como menciona chclau, necesitas estudiar sobre representación numérica.
Sin embargo, no es complicado comprender el porqué el número 40 es el byte menos significativo de 2600.

Toma una calculadora científica y escribe el número decimal 2600
Ahora conviértelo a hexadecimal = A28
Si lo separamos en dos partes, la parte de la izquierda será el MSB y la parte de la derecha será el LSB.
MSB = 0x0A
LSB = 0x28

La A en decimal es 10 y el 28 hexadecimal en decimal es 40, que es el número que ves por el terminal.

¿Ahora comprendes?

Como en cada locación de memoria solo puedes escribir un byte, nada más se escribió el LSB de A28 (28).

En la lectura visual de la EEPROM no vas a ver números en decimal, verás el valor escrito pero en hexadecimal.
Si escribes el decimal 10, en la lectura de la EEPROM verás el hexadecimal 0A.

En proteus se puede cambiar el formato de visualización, pero el hexadecimal es el más común.
12/06/2014 #6


Ya pude separar los numeros en bytes asi:
Código:
int num=2600;
byte a,b;

a=num; //Guardo los 8 bits menos significativos en la variable tipo byte a
b=num>>8; //Desplazo 8 bits y los dejo como menos significativos y los guardo en la variable b
a=00101000=40=0x28;
b=00001010=10=0x0A;

Ahora mi pregunta es como yo podria volver a unir los numeros, como concatenarlos para que me vuelva a dar 2600.
D@rkbytes dijo: Ver Mensaje
OK. Como menciona chclau, necesitas estudiar sobre representación numérica.
Sin embargo, no es complicado comprender el porqué el número 40 es el byte menos significativo de 2600.

Toma una calculadora científica y escribe el número decimal 2600
Ahora conviértelo a hexadecimal = A28
Si lo separamos en dos partes, la parte de la izquierda será el MSB y la parte de la derecha será el LSB.
MSB = 0x0A
LSB = 0x28

La A en decimal es 10 y el 28 hexadecimal en decimal es 40, que es el número que ves por el terminal.

¿Ahora comprendes?

Como en cada locación de memoria solo puedes escribir un byte, nada más se escribió el LSB de A28 (28).

En la lectura visual de la EEPROM no vas a ver números en decimal, verás el valor escrito pero en hexadecimal.
Si escribes el decimal 10, en la lectura de la EEPROM verás el hexadecimal 0A.

En proteus se puede cambiar el formato de visualización, pero el hexadecimal es el más común.
12/06/2014 #7
Moderador

Avatar de D@rkbytes

shikamarucb dijo: Ver Mensaje
Ahora mi pregunta es; ¿cómo yo podría volver a unir los números, cómo concatenarlos para que me vuelva a dar 2600?
Mira por aquí: Rutinas de escritura y lectura de 16 bits en EEPROM
Son rutinas para PIC en C, y posiblemente las puedas migrar al lenguaje que usa Arduino.

Suerte.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.