如何在atmega128中配置看门狗定时器10秒延迟

时间:2013-02-02 13:06:17

标签: avr atmega

我正在使用 ATMEGA128 16AC 。所以我想使用看门狗定时器在10秒后至少重置AVR。对于ex键盘按键未在10秒内按下,控制器应重新启动。

我尝试使用像wdt_enable(value)这样的库函数;并且通过配置WDTCR reg,但未能延迟10秒。

请帮我解决这个问题。

先谢谢。

2 个答案:

答案 0 :(得分:1)

看门狗定时器取决于两件事(来自数据表):

  • 看门狗RC振荡器工作模式(表13,第41页)。您希望将其设置为可能的最低值,即1MHz(默认值)。
  • 看门狗预分频器(表22,第56页)。您希望将其设置为最高可能值,即2,048K,并且最大超时为1.8秒(如果您的Vcc为5V)。

因此,您不能将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中做任何事情。

希望这有助于其他人。