EEPROM

La EEPROM es una memoria no volátil que dispone el microcontrolador de Arduino que nos permite guardar datos para poder recuperar en caso de pérdida de alimentación de nuestro dispositivo.

La gran desventaja que tiene la EEPROM es que tiene un número limitado de escrituras, por lo que debemos calcular cuántas veces se va a escribir en ella para calcular su vida útil con nuestro programa. Además la velocidad de lectura y escritura en inferior que en la SRAM y Flash.

Más información en: http://en.wikipedia.org/wiki/EEPROM

Las celdas de memoria de una EEPROM están constituidas por un transistor MOS, que tiene una compuerta flotante (estructura SAMOS), su estado normal está cortado y la salida proporciona un 1 lógico.

Aunque una EEPROM puede ser leída un número ilimitado de veces, sólo puede ser borrada y reprogramada entre 100.000 y un millón de veces.

Estos dispositivos suelen comunicarse mediante protocolos como I²C, SPI y Microwire. En otras ocasiones, se integra dentro de chips como microcontroladores y DSPs para lograr una mayor rapidez.

La memoria flash es una forma avanzada de EEPROM.

La librería EEPROM nos permite leer y escribir bytes de la EEPROM de Arduino. La EEPROM en cada MCU tiene un tamaño diferente, en nuestro caso con el Arduino UNO es de 1024 bytes. Esta librería solo me permite leer y escribir a nivel de byte, por lo que si quiero guardar variables cuyo tamaño sea mayor de 1 byte, deberemos hacer operaciones.

Librería – http://arduino.cc/en/Reference/EEPROM

Método read() – http://arduino.cc/en/Reference/EEPROMRead

Método write() – http://arduino.cc/en/Reference/EEPROMWrite

Una EEPROM tarda unos 3,3 ms en completar una escritura y para Arduino se ha especificado una vida de 100000 ciclos de escritura/borrado.

Para grabar estructuras de datos en la EEPROM de una forma muy sencilla. http://playground.arduino.cc/Code/EEPROMWriteAnything

Ver que AVR Libc dispone de métodos de la librería <avr/eeprom.h> para manejar la EEPROM: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__eeprom.html

La librería EEPROMex es una extensión de la librería EEPROM que amplía sus funcionalidades:

El acceso entre la EEPROM y la CPU se hace mediante los registros:

  • EEPROM Address Registers: EEARH y EEARL
  • EEPROM Data Register: EEDR
  • EEPROM Control Register: EECR

Más información en la página 36 del http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf

Cosas a tener en cuenta con la EEPROM: https://engineerzero.wordpress.com/2013/07/11/five-things-to-remember-pun-about-arduino-eeprom/

  • Los datos deben guardarse en formato byte para ser usados
  • EEPROM puede los datos de configuración de usuario
  • Dañar la EEPROM no es un problema grave
  • Dañar la EEPROM puede ser un problema si no se tiene cuidado
  • Dañar la EEPROM no es el fin del mundo

Comprobación de EEPROM no corrompida: https://www.arduino.cc/en/Tutorial/EEPROMCrc

Calculo CRC http://www.lammertbies.nl/comm/info/crc-calculation.html

Ejercicios EEPROM

Volcado EEPROM

Si estamos depurando un proyecto de Arduino usando EEPROM, es posible que queramos ver la EEPROM para entender lo que está pasando.

Si tenemos un programador ISP como el USBtinyISP de Adafruit, siempre se puede utilizar avrdude para volcar la EEPROM a un archivo. Por ejemplo, el siguiente código crea un archivo denominado e2data.ee con contenido de EEPROM.

$ avrdude -p m328p -c usbtiny -P usb -U eeprom:r:e2data.ee:r

Otra opción es usar un sketch que nos saque por el puerto serie el contenido de la EEPROM como los que hay en https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio35-EEPROM

Ejercicio EEPROM

Ejercicio35-EEPROM: Hacer un ejemplo en el que se guarde y luego se lea configuraciones de la EEPROM.

Ejemplo: http://playground.arduino.cc/Code/EEPROMLoadAndSaveSettings

Struct: http://www.cplusplus.com/doc/tutorial/structures/

Poner un LED con su resistencia en los pines 10 y 12 correspondientes a la configuración (setting) e[4] y e[5]. Estos leds se encenderán al inicar el sketch porque son los que están configurados en el programa y los graba la primera vez en la EEPROM. Son los valores de setting de a y b.

Cuando pongo a masa el pin 4 (e[0]), cambio a LOW los setting y guardo la configuración de la EEPROM, de forma que cuando reinicie los leds aparecen apagados al estar esa configuración guardada y la CONFIG_VERSION conicide con la del sketch “ls1”. Al iniciar aunque el programa tiene que están encendidos, los apaga porque lee de la EEPROM el valor guardado al inicio.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio35-EEPROM

EEPROM Externa

Ejemplo: Cómo proteger un arduino que queremos comercializar y que no se pueda replicar el programa en otros microcontroladores Atmel.

Un ejemplo es usar una EEPROM externa usado como “mochila” donde guardamos un número único. Este mismo módulo lo podríamos usar como contador o con otras funcionalidades.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s