-1

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

我尝试使用 wdt_enable(value); 之类的库函数;也尝试配置 WDTCR reg,但未能获得 10 秒的延迟。

请帮我解决这个问题。

提前致谢。

4

2 回答 2

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 中执行任何操作。

希望这对其他人有帮助。

于 2013-04-19T06:59:59.337 回答
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。

于 2013-02-02T13:54:25.420 回答