Estoy diseñando un circuito basado en ATTINY que está diseñado para funcionar sin supervisión durante largos períodos de tiempo con una batería muy pequeña. El dispositivo pasa casi todo su tiempo en el sueño profundo, y solo se despierta brevemente en respuesta a una rara interrupción por cambio de pin.
Estoy programando a la defensiva para garantizar que el programa siempre regrese a un estado conocido, incluso en el caso de cambios de bits espontáneos en casi cualquier registro (aunque no puedo obtener una lectura en cómo es probable que estos sean ).
Hay un caso en el que no puedo descubrir cómo mitigar: un giro de un bit a un registro de control de interrupción que ocurre mientras duerme.
Los bits relevantes parecen ser ...
PCMSKn - Máscara de activación de cambio de pin. Debe tener un 1 para que el pin correspondiente genere una interrupción.
PCIEn - Activación de interrupción de cambio de pin. Debe tener un 1 para que cualquiera de los pin habilitados genere una interrupción.
GIE. Habilitación de interrupción global. Debe tener un 1 para que ocurra cualquier interrupción.
Si cualquiera de estos bits se pone a 0 cuando estoy dormido, el siguiente cambio de pin aparentemente no despertará al procesador y estoy muerto en el agua sin posibilidad de recuperación.
Una forma de lidiar con esto sería configurar un WatchDog de nivel de seguridad 2 para reiniciar periódicamente el procesador mientras estoy durmiendo, y escribir 1 en todos los bits de control de interrupción en cada reinicio. Esto funcionaría muy bien en teoría y parecería ser a prueba de balas, excepto en la práctica, al habilitar WatchDog aumenta el consumo de energía durante el sueño en varios órdenes de magnitud (desde ~ 0.01uA a ~ 5uA @ 3V @ 25C) y, por lo tanto, reduciría la vida útil proyectada de mi dispositivo desde décadas a months .
¿Cuáles son algunas estrategias de eficiencia de energía para enfrentar este problema de manera robusta?