Estoy tratando de dar un retraso de 0,5 segundos en el pin 13 del arduino usando la interrupción del temporizador Watch Dog, el código cumple y funciona bien, pero el LED parpadea tan rápido que parece que parpadea con un retraso de 50 ms, no con un retraso. de 0,5 segundo. Por favor ayuda. Gracias de antemano.
#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;
}
Si leí la hoja de datos (p. 54-55) correctamente, debe configurar el WDCE
bit WDTCSR
para poder cambiar el prescaler. La configuración predeterminada para los bits del preescalador es 000
de aproximadamente 16 ms de retraso.
Además, si configura ambos WDE
y WDIE
, el perro guardián funciona en "Modo de interrupción y reinicio del sistema", donde el primer tiempo de espera de WD activa la interrupción y el segundo reinicia el dispositivo, a menos que el WDIE
bit se establezca nuevamente después de la interrupción. O si solo desea la interrupción, no el restablecimiento, simplemente déjelo WDE
sin configurar.
Entonces, 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();
Conocido
amigo mayank
DigitalNinja
jimmyb