Tengo un procesador ATmega de 8 bits (de la familia 48/88/168) y encuentro un comportamiento extraño: después de un restablecimiento de la reducción de tensión, a veces (alrededor del 20% -30%) no se inicia después de un corto apagón. Siempre se inicia correctamente después de un apagado más prolongado.
Reduje el problema a la parte del inicio que genera el compilador y tiene la función de limpiar la RAM:
;CLEAR SRAM
LDI R24,LOW(__CLEAR_SRAM_SIZE)
LDI R25,HIGH(__CLEAR_SRAM_SIZE)
LDI R26,LOW(__SRAM_START)
LDI R27,HIGH(__SRAM_START)
__CLEAR_SRAM:
ST X+,R30
SBIW R24,1
BRNE __CLEAR_SRAM
Este segmento de código hace lo siguiente: cuenta hacia abajo la palabra en R24, R25, mientras tanto incrementa el Registro X (R26, R27) y escribe R30 (que es cero) en la ubicación señalada por el Registro X. Esto borra la RAM hasta que R24, R25 llega a cero. Sin embargo, el código está atascado en este bucle. Cuando detengo el programa, se detiene en una de las últimas 3 líneas en el código anterior, con valores aparentemente aleatorios en R24 y R25. Curiosamente, si lo ejecuto paso a paso, disminuye correctamente R24, y cuando llega a cero, establece correctamente R24 en 0xFF y disminuye R25. Cuando configuro ambos en un número muy pequeño, llegan a cero correctamente y el bucle se sale correctamente, pero solo cuando se ejecuta paso a paso. Parece que algo escribe algunos valores en R24 o R25, pero tengo las interrupciones deshabilitadas, e incluso establezco puntos de interrupción en los registros de interrupciones para asegurarme y nunca se activan.
Cuando esta prueba se está ejecutando (atascada en el bucle), la potencia es estable, por lo que no hay un apagón en este bucle.
El watchdog está deshabilitado mientras estamos en este bucle.
¿Alguien tiene alguna idea de qué buscar?