Como usted dice, la EEPROM interna tiene una vida útil de 100,000 ciclos de escritura. Esto no es una suposición: una proporción muy significativa de ATmega328 alcanzará este número sin problemas. He probado tres procesadores antes, y todos alcanzaron 150,000 ciclos sin problemas.
Es importante tener en cuenta el modo de falla de EEPROM. La mayoría de los proyectos de "destructor EEPROM" leen / escriben repetidamente hasta que los datos no se escriben en absoluto. Antes de este punto, la EEPROM seguirá dañada. Esto se manifestaría si los datos no se retienen durante un período razonable. No es prudente confiar en nada más que 100,000 ciclos de escritura por este motivo.
EEPROM es diferente a la RAM en un ATmega. Escribir en él no es simple ni rápido, pero está envuelto en una biblioteca amigable de Arduino , ocultando esta complejidad al usuario.
El primer nivel de indirección es la biblioteca EEPROM , que es trivialmente simple], simplemente llamando a otras dos funciones para lectura y escritura. Esto llama eeprom_write_byte, que se encuentra aquí .
Esta función utiliza el ensamblaje en línea, por lo que es posible que no se entienda fácilmente. Sin embargo, hay un comentario que se entiende fácilmente:
Establecer modo de programación: borrar y escribir
Esto sugiere una de las complejidades de lidiar con EEPROM: para escribirle, primero debe borrarlo. Esto significa que si llama a EEPROM.write (), realizará un ciclo de escritura independientemente del valor que esté escribiendo.
Esto significa que escribir repetidamente 0xFF probablemente tendrá el mismo efecto que escribir 0xFF, 0x00,0xFF, 0x00, etc.
Hay formas de evitar esto: puede intentar llamar a EEPROM.read () antes de EEPROM.write () para ver si el valor ya es el mismo, pero esto lleva más tiempo.
Existen otras técnicas para evitar el desgaste excesivo de EEPROM, pero su uso depende de su aplicación.
Una vez realicé un experimento en una EEPROM externa con 1 millón de ciclos nominales máximos. Tomó alrededor de 6 millones de ciclos para corromperse en gran medida, y antes de eso había progresado con cantidades esporádicas de corrupción.
Cuando dice que no cambia el valor, supongo que está escribiendo los mismos datos en una dirección varias veces. Esto casi seguramente estresará la vida, aunque probablemente no estresará las células circundantes.
fuente
http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/
fuente
La solución mágica: si no desea codificar lo que dijo Cybergibbons sobre leer antes de escribir, es la función EEPROM.update (). Hace exactamente eso:
EEPROM.update (dirección, valor);
solo escribirá y enfatizará la memoria si el valor es diferente del que ya está almacenado.
fuente