Hay alguna directiva para indicar que una estructura o valores se van a almacenar en la eeprom, para recuperarlas despues? y no tenes que llenarlas por codigo una vez iniciado el sistema?
necesito tener como parametros predefinidos.
No me suena que exista tal directiva, aunque igual me equivoco. Creo que la única opción es ejecutar un programa previo en el arduino para almacenar los datos en la eeprom, y después poner el programa que hace uso de ellos (los datos eeprom no deberían perderse al cargar un nuevo programa).
O bien, si tu programa tiene alguna sección para configurar y guardar esos datos, en la primera ejecución establecer los datos correctos. Se me ocurre que en el setup tu programa cargue los datos de la eeprom, y si son aberrantes (porque no se habían grabado aún) establezca y grabe unos datos por defecto.
si existe la directiva solo que no sabia como se llamaba.
int reboot_counter_ee EEMEM = 0;
int config_ee[15] EEMEM = "testing ...";
lo que de buenas a primeras no compila el ide arduino, pero hay varios hilos que explican como, sigo investigando
¡¡Anonadado me hallo!!
Nunca te acostarás sin saber una cosa más.
Voy a echar un vistazo también, porque es muy interesante.
¡Gracias!
si es muy util para ahorrar codigo, y rutinas innecesarias para almacenar un valor que vas a usar en algun momento pero no sabes cuando.
Hola. Soy nuevo en esto de Arduino y con este post he visto algo la luz.
al final ¿SE puede entonces almacenar valores en EEPROM en la compilacion?
Gracias
Hola.
Pues es algo que merecería la pena comprobar.
Por lo que leí, en el IDE no lo permitía. Es cuestión de probarlo, a ver si en las últimas versiones sí funciona.
Ahora mismo no tengo el arduino a mano, pero he escrito al vuelo este código:
uint8_t config_ee[10][10] EEMEM = {
"aaaaaa",
"bbbbbb",
"cccccc",
"dddddd",
"eeeeee",
"ffffff",
"gggggg",
"hhhhhh",
"iiiiii",
"jjjjjj"
};
char buffer[10];
void setup()
{
Serial.begin(9600);
for (int i=0; i<15; i++){
eeprom_read_block(buffer, config_ee[i], 10);
Serial.print(i);
Serial.print(F("=====>"));
Serial.println(buffer);
}
}
void loop() // run over and over again
{
}
Compila bien, y crea un archivo .eep (que es el que debería subir a la eeprom) que parece correcto. Lo que no puedo comprobar es si el IDE lo carga. De ser así, la salida debería ser
1=====>aaaaaa
2=====>bbbbbb
etcétera.
Si me acuerdo mañana lo probaré.
Prueba con proteus?
Probé con proteus, surbyte, pero no hablamos de un problema de arduino en sí, sino del bootloader, que es el que se debería encargar de cargar los datos previos a la eeprom. Sí que existe en proteus una opción para cargar datos a la eeprom, a partir de un archivo bin (que no sé con qué se generará) pero esto no aporta nada a nuestro problema.
Como dije antes, con el ejemplo que puse se genera un archivo.eep que debiera ser lo que se debería subir a la eeprom durante el proceso de programación. Lamentablemente, probado en mi arduino, no parece que se suba el archivo de eeprom.
He leído alguna cosilla, aunque al tener dominio justito de inglés no he sido de momento capaz de concretar si el problema puede estar en que el ide lo debiera subir directamente, pero no esté bien soportado por versiones antiguas del bootloader, o sencillamente que el ide no lo haga y que haya que subirlo manualmente con avrdude.
Si alguien sabe más, por favor, que nos lo exponga por aquí.
Yo por mi parte intentaré buscar un poco más.
Bueno. Pues por fin he comprobado que sí es posible subir los datos del archivo .eep generado, al menos de forma manual en windows.
Como dije anteriormente, si utilizamos la directiva EEMEM (de forma análoga a como se usaría PROGMEM), al compilar se genera, además del archivo HEX, que subiremos normalmente al arduino, otro archivo con el nombre del sketch y extensión .eep, que es el que debemos subir a la memoria.
Pues bien; si activamos en las preferencias la opción mostrar información detallada durante la subida, veremos la línea de comando que ejecuta la subida del archivo.hex, que será algo así como:
"ruta/avrdude.exe" [opciones varias] -Uflash:w:"ruta/archivo.hex":i
Copiamos toda la línea, incluídas comillas (necesarias para ruta con nombres largos).
Abrimos una ventana de comandos (ejecutar->cmd) y vamos a la ruta donde está instalado nuestro IDE (en mi caso fue necesario así, supongo que porque no instalé el IDE a partir de ejecutable, sino desde zip).
Pegamos en la línea de comandos el que hemos copiado anteriormente, y sustituimos Uflash por Ueeprom, y archivo.hex por archivo.eep.
Pulsamos intro, y si suena la flauta debería subir nuestros datos de eeprom, sin tocar nada de flash. En mi caso tampoco el subir nuevo archivo a flash ha trastocado datos de eeprom.
Creo que se tocando algún archivo de configuración se podría hacer que el propio ide haga las dos subidas, pero de momento no he llegado a ello.
¡¡¡ EUREKA !!!
Tras una mañana de seguirle el rastro al compilador, ya conseguí que el IDE lo haga solito. 8) 8) 8) Henchido me hallo de satisfacción.
Los pasos a continuación.
- Hacemos copia de seguridad, y posteriormente editamos con worpad el archivo [directorio arduino]/hardware/arduino/avr/platform.txt
- Bajamos hasta la sección AVR Uploader/Programers tools
- Vamos al final de la línea que comienza con tools.avrdude.upload.pattern
[/i]Agregamos un espacio y "-Ueeprom:w:{build.path}/{build.project_name}.eep:i" - Guardamos el archivo e iniciamos nuestro IDE (Sublime text también lo toma)
Podemos hacer la prueba con el ejemplo que ponía anteriormente:
uint8_t config_ee[10][10] EEMEM = {
"aaaaaa",
"bbbbbb",
"cccccc",
"dddddd",
"eeeeee",
"ffffff",
"gggggg",
"hhhhhh",
"iiiiii",
"jjjjjj"
};
char buffer[10];
void setup()
{
Serial.begin(9600);
for (int i=0; i<10; i++){
eeprom_read_block(buffer, config_ee[i], 10);
Serial.print(i);
Serial.print(F("=====>"));
Serial.println(buffer);
}
}
void loop() // run over and over again
{
}
Y vemos por serial que la salida ya es la esperada.
Si lo crees oportuno, maxid, tal vez podemos ponerle el solucionado al hilo, aunque haya sido "repescado" año y medio después
Gracias!!
Probaremos a ver que tal....
Gracias Noter, Realmente me has dado clases.
Y no respondi porque nunca supe de la respuesta con los malos cambios del foro.
Ahora lo dejo como favorito
noter:
¡¡¡ EUREKA !!!
Tras una mañana de seguirle el rastro al compilador, ya conseguí que el IDE lo haga solito. 8) 8) 8) Henchido me hallo de satisfacción.![]()
![]()
Los pasos a continuación.
- Hacemos copia de seguridad, y posteriormente editamos con worpad el archivo [directorio arduino]/hardware/arduino/avr/platform.txt
- Bajamos hasta la sección AVR Uploader/Programers tools
- Vamos al final de la línea que comienza con tools.avrdude.upload.pattern
[/i]Agregamos un espacio y "-Ueeprom:w:{build.path}/{build.project_name}.eep:i"- Guardamos el archivo e iniciamos nuestro IDE (Sublime text también lo toma)
Podemos hacer la prueba con el ejemplo que ponía anteriormente:
uint8_t config_ee[10][10] EEMEM = {
"aaaaaa",
"bbbbbb",
"cccccc",
"dddddd",
"eeeeee",
"ffffff",
"gggggg",
"hhhhhh",
"iiiiii",
"jjjjjj"
};
char buffer[10];
void setup()
{
Serial.begin(9600);
for (int i=0; i<10; i++){
eeprom_read_block(buffer, config_ee[i], 10);
Serial.print(i);
Serial.print(F("=====>"));
Serial.println(buffer);
}
}
void loop() // run over and over again
{
}
Y vemos por serial que la salida ya es la esperada. Si lo crees oportuno, maxid, tal vez podemos ponerle el solucionado al hilo, aunque haya sido "repescado" año y medio después ;)
sabes si funciona con el usbasp para grabarlo por iscp?
Pues no lo he probado, porque no tengo programador icsp; pero si tú o alguien lo tiene y lo prueba, que sepa que existe obligación moral de exponer aquí sus resultados.
Me da este error en la version 1.6.4 y no hace nada
avrdude: 100 bytes of eeprom written
avrdude: verifying eeprom memory against C:\Users\Maxi\Documents\Arduino\tmp/pruebaeeprom.cpp.eep:
avrdude: load data eeprom data from input file C:\Users\Maxi\Documents\Arduino\tmp/pruebaeeprom.cpp.eep:
avrdude: input file C:\Users\Maxi\Documents\Arduino\tmp/pruebaeeprom.cpp.eep contains 100 bytes
avrdude: reading on-chip eeprom data:
Reading | ################################################## | 100% 0.21s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0x18 != 0x61
avrdude: verification error; content mismatch
avrdude done. Thank you.
No se que pasará pero falla al verificarlo y no funciona depues el programa.
Edito: Si sube con USBASP. y bien sin errores. Se ve que tengo algun progblema con el serial.
Avanzo entonces.