¿Qué fuente "externa" puede cambiar un Registro de trabajo de propósito general si no hay interrupciones habilitadas?

2

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?

    
pregunta vsz

1 respuesta

1

"El watchdog está deshabilitado mientras estamos en este bucle". - ¿Así que proporcionaste código que desactiva el perro guardián? Tenga en cuenta que no se desactivará automáticamente con un reinicio normal.

Las citas de la hoja de datos de ATmega1284P por ejemplo:

  

Nota: Si el Watchdog se habilita accidentalmente, por ejemplo, por un   puntero de fuga o condición de apagón, el dispositivo se reiniciará y   El temporizador de vigilancia permanecerá habilitado. Si el código no está configurado para   manejar el Watchdog, esto podría llevar a un bucle eterno de tiempo de espera   restablece.

Luego está el fusible WDTON que obliga a WDT a estar siempre encendido. Es posible que desee comprobar eso.

Ah, y por cierto: habilitaste el detector de apagón de la µC, ¿no es así? - De lo contrario, en una condición de reducción de tensión, cualquier cosa podría pasar al estado interno de la µC.

    
respondido por el JimmyB

Lea otras preguntas en las etiquetas