Escritura frecuente en memoria no volátil

10

Estoy diseñando un dispositivo que ajusta automáticamente su posición física a medida que cambia la temperatura. Si el dispositivo se apaga o se desconecta la alimentación, el dispositivo debe recordar su última temperatura y posición. Tengo la capacidad de almacenar estos valores en EEPROM, pero el problema es que la posición y la temperatura podrían estar cambiando muy rápidamente. Si tuviera que escribir la temperatura y la posición en EEPROM después de cada cambio, eso (1) ralentizaría un poco el firmware y (2) probablemente mataría la EEPROM después de un año o dos. Entonces, como lo veo, mis opciones son las siguientes ...

1) use un condensador / batería para mantener el dispositivo encendido por un corto tiempo después de que se pierde la energía para que pueda escribir los valores en EEPROM solo en ese momento. No me gusta esto porque el tablero tiene un poco de hambre de energía y esto requeriría una gran capitalización. Y no tengo un montón de espacio libre. Y no quiero el costo adicional de una batería y un soporte de batería / o una tapa grande.

2) use F-RAM en lugar de EEPROM para poder escribirle billones de veces sin desgastarlo. No me gusta esta opción porque FRAM es bastante más caro que EEPROM y esto es para un producto de producción (no solo uno).

3) Solo escriba la posición y la temperatura cada 5 minutos más o menos. De esa manera, siempre tengo una posición / temperatura bastante reciente registrada, pero no escribo cada segundo, por lo que mi programa no se ralentiza y la EEPROM no morirá tan rápido. Esta parece ser mi mejor opción.

¿Alguien más tiene alguna sugerencia en la que no esté pensando?

PICyourBrain
fuente
55
Sólo una pregunta. Si el dispositivo ajusta automáticamente su posición física, ¿por qué necesita recordar la última temperatura? Cuando vuelva a encender el dispositivo, ¿no actualizará la temperatura y ajustará su posición?
Daniel Grillo
1
Estoy de acuerdo con Daniel ¿Qué pasa si se apaga y la temperatura ambiente cambia drásticamente? Al encenderse, si usó la última temperatura / posición guardada, estaría en el lugar equivocado de todos modos, y el dispositivo terminaría moviéndose independientemente. ¿Hay otro requisito que no figura en su pregunta?
Dave
¿Cuál es la especificación EEPROM? ¿Cuántos ciclos de escritura?
Jason S

Respuestas:

10

Lo que necesita es una técnica llamada nivelación de desgaste . No escribe sus datos cada vez en la misma ubicación en la EEPROM, pero usa algún algoritmo para usar diferentes ubicaciones. He leído sobre algoritmos complejos de nivelación de desgaste, pero no sabría por qué el siguiente método simple no funcionaría.

Agregue a sus datos un contador de 24 bits, de modo que su bloque de datos tenga, por ejemplo, 8 bytes de longitud. Las páginas en un 24AA64 tienen una longitud de 32 bytes, por lo que una EEPROM de 64 kb tiene 256 páginas. De la hoja de datos:

"Cuando se escribe menos de 32 bytes, los datos en el resto de la página se actualizan junto con los bytes de datos que se escriben. Esto obligará a toda la página a soportar un ciclo de escritura, por esta razón se especifica la resistencia por página".

por lo que no tiene sentido usar bloques de datos más pequeños que una página de 32 bytes.

Mira el contador de la primera página. Si es cero, usó el número máximo de ciclos de escritura para esa página, por lo que pasa a la página siguiente y verifica ese contador. Repita hasta encontrar un contador> cero. Esa es la página que estás usando actualmente. Las EEPROM de Microchip tienen una resistencia de 1 millón de ciclos, que puede aumentar a 256 millones con el ejemplo dado de un máximo de 32 bytes por bloque en una EEPROM de 64 kb. Eso debería ser suficiente para durar más que su producto: 40 años si escribe una vez cada 5 segundos (!).

Querrá inicializar su EEPROM en el primer uso. ¿Cómo sabes cuándo es eso? Use la última página para escribir una firma única después de la inicialización. Compruebe en cada encendido si la firma está allí. Si no es así, el dispositivo debe ser inicializado. Puede preestablecer el contador en cada página con 0xF4240 (para 1 millón) o borrar todo a 0xFF y escribir el 0xF4240 cuando use la página por primera vez.
Se necesita inicializar una EEPROM porque a veces se le escribe un cierto patrón en el proceso de producción / prueba.

editar
La nivelación del desgaste debería resolver sus problemas, pero aún quiero comentar sobre la solución del condensador. Usted dice que la placa necesita bastante energía, pero tal vez pueda aislar la potencia del microcontrolador / EEPROM del resto de la placa con un diodo. Por lo tanto, probablemente solo necesitará unos pocos mA cuando la alimentación principal se haya agotado. El 24AA64 escribe una página en menos de 5 ms, luego a 10 mA y una caída de voltaje permitida de 100 mV necesitará

C=ItΔV=10mA5ms100mV=500μF

Fácil con un pequeño supercap.

lectura adicional
hoja de datos 24AA64
EEPROM Endurance Tutorial

stevenvh
fuente
La resistencia de la EEPROM se da por página (al menos para 24AA64 y otras EEPROM que he usado). El 24AA64 especifica una página de 32 bytes, por lo que el recuento debe ser por página y no por bloque.
Saad
@Saad - Correcto. Fijo en mi respuesta.
stevenvh
4

1) Una vez que haya comenzado el proceso de escritura, solo necesita alimentar la MCU / EEPROM y asegurarse de que las líneas de control no tengan fallas; I2C probablemente sea preferible a SPI para esto. Solo necesita unos pocos mA durante unos pocos milisegundos, por lo que no debería ser un gran límite, y podría poner la MCU en suspensión una vez que se inicia la escritura. 3) probablemente pueda aplicar algo de inteligencia, por ejemplo, un retraso: una vez escrito, siempre tiene cierto tiempo antes de que pueda ocurrir otra escritura. O espere hasta que el valor sea estable por un tiempo antes de escribir.
También puede aumentar la resistencia distribuyendo los datos en varias ubicaciones. Microchip tiene algunas herramientas y notas para calcular la resistencia de sus eeproms, lo que puede ser útil.

mikeselectricstuff
fuente
44
Nota de la aplicación Microchip sobre resistencia: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Desde la nota de aplicación, también puede aumentar la resistencia en aproximadamente 2x disminuyendo el voltaje de funcionamiento de 5v a 3.5v.
vandee
1
Si utiliza su primer método, asegúrese de que escribir en la memoria no volátil es la máxima prioridad en su sistema una vez que se inicia, es decir. que las interrupciones no pueden hacer que sus valores cambien a mitad de la escritura o que el micro inicie algún otro procesamiento que lo haga quedarse sin tiempo. Es muy importante que no escriba valores corruptos mientras se apaga. Además, un CRC sobre los valores lo ayudaría a confirmar que no se produjo corrupción, pero tendría que decidir qué hacer si sucediera, como el uso de valores predeterminados.
Martin
3

Sugeriría usar un dispositivo flash orientado a bloques y usar un byte de cada bloque como indicador de modo. Mantenga como invariante que casi todas las banderas de modo serán programadas; solo habrá un bloque donde el indicador de modo no esté programado, pero sí el bloque anterior (ajuste si es necesario) Ese bloque será el que tenga los datos más recientes. Cuando ese bloque se llene, borre el siguiente bloque (tenga en cuenta que el bloque que se está borrando podría contener cualquier combinación de datos durante el ciclo de borrado, y el invariante aún se mantendría), luego, una vez que el borrado haya terminado, programe el indicador de modo en lo que solía Ser el último bloque.

Será necesario proteger el suministro al flash lo suficientemente bien como para garantizar que cualquier intento de programar un byte tenga éxito o falle por completo, pero no importará si se interrumpe un ciclo de borrado dejando un bloque lleno de datos arbitrarios, ya que el próximo intento de escribir una entrada de datos volverá a borrar ese bloque.

Si sus datos son de 16 bits, un chip de 64Kx8 contendrá más de 32,000 entradas. Escribir una entrada por segundo llenaría el chip aproximadamente 2.7 veces. Incluso un chip con una resistencia de "solo" ciclos de borrado de 10K duraría más de 10 años. El uso de un chip más grande, o uno con resistencia de 100K, aumentaría la vida útil proporcionalmente.

Super gato
fuente
2

1) Posiblemente la opción más simple, aunque puede requerir cambios de hardware. He logrado esto antes sin modificaciones de PBC simplemente aumentando las tapas de desacoplamiento e interrumpiendo el oscurecimiento.

2) Como ha señalado, ¡el problema con FRAM es el precio!

3) Dependiendo de la volatilidad de sus datos de temperatura y posición, aumentará la resistencia escribiendo solo si el valor ha cambiado. Es posible que esté muestreando la temperatura una vez por segundo, pero si solo cambia cada 5 minutos, el problema está resuelto.

Tim
fuente
1

Así es como resolví este problema en mi proyecto:

Reserve 1 sector de flash para mantener una máscara de bits de ranuras no utilizadas y una serie de ranuras para el valor.

La máscara de bits que utilicé tenía 16 bytes de longitud, por lo que tenía 128 espacios para poner valores.

La máscara de bits se inicializa en todos los que, en términos flash, es el estado borrado.

Cuando desee escribir un nuevo valor, lea en la máscara de bits y encuentre el primer bit que es uno. Este es el número de ranura donde escribirá el valor. Cambie ese bit a cero para marcarlo como usado y vuelva a escribir la máscara de bits en flash sin antes borrarlo. A continuación, escriba el valor en la ranura después de la máscara de bits también sin borrar el flash.

De esta manera, extiende los ciclos de escritura flash 128 veces escribiendo la nueva máscara de bits con solo un cambio de uno a cero.

Si toda la máscara de bits es 0, borre el sector flash y comience de cero.

Robert
fuente
3
Podría decepcionarte, pero cuando parpadeas un poco, se sobrescribe todo el sector. Su solución hará que el sector de 'máscara de bits' muera muy pronto.
Andrejs Cainikovs
1
Si no borra el flash, no usa uno de los ciclos de borrado de 10K del sector. Si tiene el valor 0x7F y escribe el valor 0x3F, el resultado será 0x3F. Esto mantiene la máscara de bits actualizada, pero no borra el flash. El borrado solo ocurre una vez que toda la máscara de bits es 0.
Robert
Si me equivoco, discutamos. No quiero malas respuestas aquí y realmente no quiero un mal diseño en mi proyecto.
Robert
Creo que Robert tiene razón. En mi microcontrolador, solo puede escribir 4 bytes a la vez, pero los bits necesarios se establecen en cero. La única forma de devolverlos a 1 es dejar en blanco el bloque 1k. Son solo los ciclos de borrado los que llevan el flash ...
Tim
Puede ser diferente para cada tipo de memoria e incluso para el proveedor de memoria. He visto que las EEPROM deben borrar la página y luego volver a escribirla para cada escritura. He visto memoria flash, puedes escribir bits que todavía son 1 sin borrar la página.
mjh2007