Problema del temporizador de vigilancia - AVR ATmega324PA

3

Antes estaba usando ATmega32A y ahora estoy migrando a ATmega324PA solo para mejorar la administración de energía. Ahora estoy probando el nuevo controlador en todos los aspectos. Este es un código simple para verificar el temporizador de vigilancia pero sigue reiniciando el controlador.

Código:

int main(void)
{
  uart_init();
  PORTA|=(1<<PORTA1);
  _delay_ms(1500);
  PORTA&=~(1<<PORTA1);
  _delay_ms(2000);
  uart_array("FFFFFFFFFFFFFFFFFF");
  wdt_enable(WDTO_2S);
  _delay_ms(5000);
}

void uart_init()
{
 /*set PinA1 as output for LED*/
 DDRA|=(1<<1);

 /*set PinD3 as output for UART*/
 DDRD|=(1<<3);

 /*set pinD2 as input for UART*/
 DDRD&=~(1<<2);

 /*enabling TX and RX*/
 UCSR1B |=(1<<TXEN1) | (1<<RXEN1);

 /*asynchronous mode selection*/
 UCSR1C&=~(1<<UMSEL11);
 UCSR1C&=~(1<<UMSEL10);

 /*setting data format to 8 bit*/
 UCSR1B &=~(1<<UCSZ12);
 UCSR1C|=(1<<UCSZ11)|(1<<UCSZ10);

 /* setting one bit as stop bit*/
 UCSR1C &=~(1<<USBS1);

 /*Disabling parity*/
 UCSR1C &= ~((1<<UPM11) | (1<<UPM10));

 /* loading 8 LSB to UBRRL*/
 UBRR1L = UBRRL_VALUE;

 /* loading 4 MSB to UBRRH*/
 UBRR1H = UBRRH_VALUE;
}

El código funciona bien por primera vez, pero después de eso, el LED sigue parpadeando.

Nota: el bit de fusible de watchdog (WDTON) está desactivado.

    
pregunta gzix

2 respuestas

4

Sí, eso se debe a que después de que se active el watchdog, tienes que restablecer la bandera correspondiente antes de que comience nuevamente el inicio (hay un registro donde puedes leer, lo que causó el reinicio) y deshabilitar el watchdog para que no se dispare .

Este código solucionará tu problema:

    // This function is called upon a HARDWARE RESET:
void reset(void) __attribute__((naked)) __attribute__((section(".init3")));

/*! Clear SREG_I on hardware reset. */
void reset(void)
{
     cli();
    // Note that for newer devices (any AVR that has the option to also
    // generate WDT interrupts), the watchdog timer remains active even
    // after a system reset (except a power-on condition), using the fastest
    // prescaler value (approximately 15 ms). It is therefore required
    // to turn off the watchdog early during program startup.
    MCUSR = 0; // clear reset flags
    wdt_disable();
}

Esta cosa .init3 es una sección de código especial donde puede colocar el código que se ejecuta antes del inicio principal. Aquí hay un enlace que describe eso, pero no debes preocuparte demasiado por ello. , el código anterior funcionará bien cuando se coloque en el main.c .

    
respondido por el jjstcool
1

Más allá de la anterior función reset() , necesita deshabilitar el watchdog en el cargador de arranque (si se usa, por supuesto). Hay / fue por ejemplo error conocido del cargador de arranque Arduino original que no deshabilitó el perro guardián.

    
respondido por el TMa

Lea otras preguntas en las etiquetas