{"id":1218,"date":"2020-01-29T12:32:06","date_gmt":"2020-01-29T12:32:06","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=1218"},"modified":"2020-11-02T00:57:01","modified_gmt":"2020-11-02T00:57:01","slug":"uso-de-la-eeprom-de-arduino","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/uso-de-la-eeprom-de-arduino\/","title":{"rendered":"Uso de la EEPROM de Arduino"},"content":{"rendered":"

La memoria EEPROM<\/strong> (del ingl\u00e9s Electrically Erasable Programmable Read-Only Memory = ROM programable y borrable el\u00e9ctricamente) es una memoria no vol\u00e1til<\/strong>. Esto significa que los datos que almacena no se pierden al desaparecer la alimentaci\u00f3n de un dispositivo.<\/p>\n

La EEPROM<\/strong> fue pensada para mantener aquellos datos que deseamos resguardar luego de apagar y reiniciar un microcontrolador, y disponer de ellos al retomar la operaci\u00f3n.<\/p>\n

\"\"<\/a><\/p>\n

El ATmega328P<\/strong> \u2014el microcontrolador del Arduino UNO<\/strong>, el Nano<\/strong> y otros de la l\u00ednea Arduino\u2014 tiene una capacidad de 1.024 bytes<\/strong> (1 Kb) de memoria EEPROM<\/strong>. La hoja de datos nos indica que la EEPROM del ATmega328P acepta hasta 100.000 ciclos de lectura\/escritura. Parece mucho, pero el solo hecho de tener una cantidad de ciclos de escritura acotada ya nos indica que su funci\u00f3n no es en nada similar a una RAM. Es para guardar datos, y no en forma moment\u00e1nea y veloz, sino de manera durable. No ponga nunca operaciones con la EEPROM<\/strong> dentro de la funci\u00f3n loop()<\/strong>, ya que, dada la velocidad de trabajo del microcontrolador, llegar\u00e1 r\u00e1pidamente al l\u00edmite de 100.000.<\/p>\n

Tengamos tambi\u00e9n en cuenta otro dato importante: una operaci\u00f3n de escritura en la EEPROM<\/strong> requiere 3,3 ms<\/strong> para completarse frente a la velocidad miles de veces superior de la RAM<\/strong>, capaz de operar a 20 MHz<\/strong>.<\/p>\n

Para acceder a la memoria EEPROM<\/strong> debemos usar la librer\u00eda EEPROM disponible de manera est\u00e1ndar desde el IDE<\/strong> de Arduino. La biblioteca \u2014o librer\u00eda\u2014 se llama EEPROM.h<\/strong>, y se debe incluir al inicio del programa.<\/p>\n

Funciones en la biblioteca EEPROM:<\/strong><\/p>\n

FUNCI\u00d3N<\/strong> EEPROM.read()<\/strong><\/font><\/p>\n

Lee un byte de la posici\u00f3n de memoria que indica su par\u00e1metro. De f\u00e1brica, todas las posiciones de memoria tienen escrito el valor 255 (0xFF).<\/p>\n

Sintaxis:<\/strong><\/p>\n

      EEPROM.read(direccion)<\/font><\/strong><\/p>\n

Par\u00e1metros:<\/strong><\/p>\n

direccion<\/font>: la posici\u00f3n de memoria (de 0 a 1023 = 1024).<\/p>\n

Ejemplo con EEPROM.read()<\/font>, leer toda la EEPROM y mostrarla en Monitor Serie<\/h3>\n
#include <EEPROM.h>\r\n\r\nbyte dato;\r\n \r\n void setup(){\r\n  Serial.begin(9600); \/\/ inicializar puerto serie\r\n  for (int direccion=0;direccion<1024;direccion++)\r\n  {\r\n    for(int columna=0;columna<10;columna++)\r\n    { \r\n      \/\/ escribe hileras de 10 valores por l\u00ednea\r\n      \/\/ lee la posici\u00f3n EEPROM indicada por 'direccion'\r\n      dato = EEPROM.read(direccion);\r\n      Serial.print(direccion); \/\/ muestra la direccion del valor\r\n      Serial.print(\" =\"); \/\/ separador\r\n      Serial.print(\"\\t\"); \/\/ tabulacion\r\n      Serial.print(dato); \/\/ muestra el valor en direccion\r\n      Serial.print(\"\\t\"); \/\/ tabulacion\r\n      direccion++; \/\/ incrementa direccion\r\n      if(direccion==1024) break; \/\/ solo muestra hasta la direccion 1023\r\n    }\r\n    Serial.println(); \/\/ salto a la sig l\u00ednea\r\n    direccion--; \/\/ decrementa direccion para la siguiente linea\r\n  }\r\n}\r\n\r\nvoid loop(){ \/* no hay lazo - solo se ejecuta en setup() *\/ }\r\n<\/pre>\n

FUNCI\u00d3N<\/strong> EEPROM.write()<\/strong><\/font><\/p>\n

Esta funci\u00f3n escribe un byte en la posici\u00f3n indicada de la EEPROM. Tiene dos par\u00e1metros: el primero es la direcci\u00f3n de memoria (de 0 a 1023) donde se escribir\u00e1 el byte; el segundo es el valor que se va a escribir en la EEPROM, que debe ser un valor entero entre 0 y 255. La funci\u00f3n no retorna ning\u00fan valor.<\/p>\n

Sintaxis:<\/strong><\/p>\n

      EEPROM.write(direccion,valor)<\/font><\/strong><\/p>\n

Par\u00e1metros:<\/strong><\/p>\n

direccion<\/font>: direcci\u00f3n en la memoria (de 0 a 1023)
\nvalor<\/font>: el valor a escribir en la memoria<\/p>\n

Ejemplo: Escribir valores en un sector de la memoria<\/h3>\n
#include <EEPROM.h> \/\/ incluye la librer\u00eda para el manejo de la memoria EEPROM\r\n\r\nvoid setup(){\r\nfor (int i = 0; i < 255; i++) \/\/ se ejecuta 255 veces. El lazo\r\n  EEPROM.write(i, i);  \/\/ escribe en la direcci\u00f3n de memoria i el valor de i\r\n}\r\nvoid loop(){}<\/pre>\n

FUNCI\u00d3N<\/strong> EEPROM.update()<\/strong><\/font><\/p>\n

Escribe un byte en la EEPROM. El valor es escrito solo si es diferente al valor que esta previamente almacenado en esa posici\u00f3n de memoria.<\/p>\n

Sintaxis:<\/strong><\/p>\n

      EEPROM.update(direccion,valor)<\/font><\/strong><\/p>\n

Par\u00e1metros:<\/strong><\/p>\n

direccion<\/font>: la direcci\u00f3n de la memoria (0 a 1023)
\nvalor<\/font>: el valor a escribir en la memoria
\n


\n