Atmega328P Watch Dog Timer - Retraso en el problema

2

Estoy intentando dar una demora de 0.5 segundos en 13 pines del arduino usando la interrupción del temporizador de Watch Dog, el código cumple y funciona bien, pero el led está parpadeando tan rápidamente que parece que está parpadeando con una demora de 50 ms. Con un retraso de 0,5 segundos. Por favor ayuda. Gracias por adelantado.

#define F_CPU 16000000UL
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/wdt.h>

int main(void)
{
  cli();
  wdt_reset();

  WDTCSR |=(1<<WDP2) | (1<<WDP0);

  WDTCSR |= (1<<WDIE);
  WDTCSR |= (1<<WDE);

  sei();

  DDRB |= 0b00100000;

  PORTB |= 0b00000000;

  while(1)
  {

  }
}

ISR(WDT_vect) {

 PORTB ^= 0b00100000;

}
    
pregunta Mayank Pal

1 respuesta

2

Si leo el datasheet (p.54-55) correctamente, debe configurar el bit WDCE en WDTCSR para poder cambiar el prescaler. La configuración predeterminada para los bits de preescala es 000 o un retraso de aproximadamente 16 ms.

Además, si configura tanto WDE como WDIE , el mecanismo de vigilancia funciona en "Modo de interrupción y reinicio del sistema", donde el primer tiempo de espera de WD activa la interrupción, y un segundo reinicia el dispositivo, a menos que el WDIE bit se establece de nuevo después de la interrupción. O si solo desea la interrupción, no el restablecimiento, simplemente deje WDE sin establecer.

Parafraseando el código de ejemplo, creo que querrás algo como esto:

cli();
WDTCSR |= (1<<WDCE);  /* enable change */
WDTCSR = (1<<WDIE) | (1<<WDP2) | (1<<WDP0);  /* enable interrupt and set prescaler */
sei();
    
respondido por el ilkkachu

Lea otras preguntas en las etiquetas