我正在使用ATMEGA128 16AC。所以我想使用看门狗定时器至少在 10 秒后重置 AVR。对于在 10 秒内未按下前键盘键,控制器应重新启动。
我尝试使用 wdt_enable(value); 之类的库函数;也尝试配置 WDTCR reg,但未能获得 10 秒的延迟。
请帮我解决这个问题。
提前致谢。
在 ATmega 128 中使用 16 位定时器配置如下所示。
// Enable overflow interrupt.
TIMSK |= (1 << TOIE1);
// Enable global interrupts.
sei();
// Start timer at Fcpu/1024. Approx 3.33sec for each cycle.(F_CPU = 16MHz External)
TCCR1B |= (1 << CS12) | (1 << CS10);
因此,当您像这样配置计时器时,计时器将每 3.33 秒溢出一次,然后您可以定义此溢出的倍数,例如
#define INPUT_KEY_TIMEOUT 10
只是您需要检查计时器 ISR 中的状态
if(system_timer_count == INPUT_KEY_TIMEOUT) {
//Do something if the following condition met.
}
通过这种方式,您可以创建任何时间延迟,而不会干扰控制器的正常工作。只有当满足上述条件时,控制器才准备好在 ISR 中执行任何操作。
希望这对其他人有帮助。
看门狗定时器取决于两件事(来自数据表):
因此,您使用 WDT 的时间不能超过 1.8 秒。
您可以使用其中一个 16 位定时器(也有预分频器,表 62,第 136 页)来生成中断,该中断调用您必须编写的中断例程。中断例程应该做的是减少一个在启动时在其声明中设置的全局变量,如果该变量达到 0,则跳转到地址 0(与复位后 AVR 开始执行的地址相同)。您可以轻松计算出这些值应该是什么。
如果按下某个键,则重置计时器和全局变量。随着所有这些中断例程修改变量,它需要被声明volatile
。
我对 PIC16 系列有更多经验,但我很确定这将适用于 AVR。