我正在使用 ATMEGA128 16AC 。所以我想使用看门狗定时器在10秒后至少重置AVR。对于ex键盘按键未在10秒内按下,控制器应重新启动。
我尝试使用像wdt_enable(value)这样的库函数;并且通过配置WDTCR reg,但未能延迟10秒。
请帮我解决这个问题。
先谢谢。
答案 0 :(得分:1)
看门狗定时器取决于两件事(来自数据表):
因此,您不能将WDT用于超过1.8秒的任何时间。
您可以使用其中一个16位定时器(也有预分频器,表62,第136页)来生成中断,该中断调用您必须编写的中断例程。中断例程应该做的是减少在其声明中启动时设置的全局变量,如果此变量达到0,则跳转到地址0(复位后AVR开始执行的地址)。您可以轻松计算这些值应该是什么。
如果按下某个键,则重置计时器和全局变量。所有这些中断例程修改变量,都需要声明volatile
。
我对PIC16系列有更多经验,但我很确定这可以用作AVR。
答案 1 :(得分:1)
在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中做任何事情。
希望这有助于其他人。