¿Cuándo debo escribir en EEPROM?

1

Construí un proyecto simple usando un arduino para controlar un potenciómetro digital I2C controlado por un control remoto a través de un Detector de IR. El propósito es poder controlar la señal de entrada de un amplificador de audio usando un control remoto. Funciona bien, pero en el punto en el que configuré el volumen de encendido en modo predeterminado a -49dB.

Pero pensé en usar la EEPROM interna para mantener el volumen entre los ciclos de energía. Pero mi pregunta es ¿cuándo debo escribir a la EEPROM? Porque no tengo una señal de apagado y no quiero escribir con cada pulsación de tecla, porque alguien puede cambiar mucho el volumen en un día.

¿Debería establecer una variable de contador y observar cambios como cada 30 segundos aproximadamente y escribir en la EEPROM?

El valor que quiero almacenar es un uint8_t.

Soy muy nuevo en el campo, así que estoy buscando algún truco inteligente.

    
pregunta Vitim.us

3 respuestas

4

La hoja de datos de ATmega328, en la sección "8.4 Memoria de datos EEPROM" dice La EEPROM tiene una duración de al menos 100.000 ciclos de escritura / borrado

Por lo tanto, una estrategia razonable debería estar bien.

  1. Espere por lo menos 30 segundos después del último cambio, antes considerando una escritura. Cuando hago futz con el volumen, es para silenciar la publicidad. También a menudo aumento el volumen para escuchar algo específico, tal vez una pista favorita, y luego reestablezco el volumen muy cerca de donde empecé. Si no ha implementado un silencio, podría valer la pena hacerlo. Ese es un caso común para mí y podría ser un caso común para usted. Es posible que reduzca significativamente la cantidad de actualizaciones de volumen ignorando el silencio y dejando el volumen guardado sin cambios.
  2. No escriba si el valor es solo un par de% diferente. Es poco probable que sus oídos noten la diferencia.

Si el número de escrituras / días sigue siendo un problema, detecte el "apagado" y cambie la estrategia para ahorrar solo cuando se elimine la alimentación.

El chip necesitará varios milisegundos para asegurarse de que puede hacer la escritura EEPROM. Los mejores datos que he encontrado sobre el tiempo de escritura de EEPROM son "Tabla 28-18, Retardo de espera típico antes de escribir la siguiente ubicación de Flash o EEPROM" dice que el retraso es "3.6ms".

Por lo tanto, la fuente de alimentación local de ATmega necesitará mantener un voltaje de operación por más tiempo para asegurar que la EEPROM esté correctamente escrita. Eso podría ser un poco incómodo de hacer en un Arduino. IIRC, la capacitancia de la fuente de alimentación dentro de la fuente de alimentación es de aproximadamente 100uF, lo cual es marginal, y probablemente muy poco para estar seguro de la escritura, especialmente si se están conduciendo cargas significativas al mismo tiempo.

    
respondido por el gbulmer
1

Suponiendo que no necesita todos esos bytes de EEPROM para cualquier otra cosa, también puede adoptar un enfoque sistemático para nivelar el desgaste en lugar de tratar de reducir el desgaste en una sola ubicación EEPROM.

Vea, por ejemplo, esta nota de aplicación AVR que utiliza dos buffers circulares. Si desea proteger los oídos, es posible que también desee almacenar una suma de comprobación o CRC para protegerse contra datos dañados.

    
respondido por el Spehro Pefhany
0

Piensa en la experiencia de usuario que deseas crear. Si enciendes el equipo de música el lunes por la mañana temprano y aún está configurado a "11" de la fiesta del sábado, vas a tener un mal momento.

Considere hacer que el "restaurar volumen al último valor guardado" sea algo que el usuario decida. Uno o dos botones adicionales en su control remoto podrían manejar las tareas de "guardar la configuración del volumen actual" y "usar el volumen guardado". Luego haga que el sistema alcance una configuración (baja) predeterminada en el encendido.

Creo que esta es la forma más eficiente de maximizar la vida de la EEPROM.

Por lo tanto, guarde la configuración del volumen y restáurelo, solo cuando el usuario lo solicite .

    
respondido por el hoosierEE

Lea otras preguntas en las etiquetas