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

Avr 如何在atmega128中为10秒延迟配置看门狗定时器,avr,atmega,Avr,Atmega,我正在使用ATMEGA128 16AC。所以我想用看门狗定时器至少在10秒后重置AVR。如果在10秒内未按下ex键盘键,则控制器应重新启动 我尝试使用诸如wdt_enable(value)之类的库函数;也通过配置WDTCR reg,但未能获得10秒的延迟 请帮我解决这个问题 提前感谢。看门狗计时器取决于两件事(数据表中): 看门狗RC振荡器工作模式(第41页表13)。您希望将其设置为可能的最低值,即1MHz(默认值) 看门狗预分频器(第56页表22)。您希望将其设置为可能的最高值,即2048K

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

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

请帮我解决这个问题


提前感谢。

看门狗计时器取决于两件事(数据表中):

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

您可以使用其中一个16位计时器(也有预分频器,表62,第136页)生成中断,该中断调用您必须编写的中断例程。中断例程应该做的是减少在其声明中启动时设置的全局变量,如果该变量达到0,则跳转到地址0(复位后AVR开始执行的相同地址)。您可以轻松计算这些值应该是什么

如果按下某个键,则重置计时器和全局变量。当所有这些中断例程修改变量时,需要将其声明为volatile


我对PIC16系列有更多的经验,但我很确定这将在AVR中起作用。

在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); 
只需检查计时器ISR中的状态即可

  if(system_timer_count == INPUT_KEY_TIMEOUT) {
      //Do something if the following condition met.
  }
通过这种方式,您可以在不干扰控制器正常工作的情况下创建任何时间延迟。只有当上述条件满足时,控制器才准备在ISR中执行任何操作


希望这对其他人有所帮助。

嗨,Oguz Meter,谢谢你的反馈。事实上,我还没有完全同意你的回答。你能用一段代码解释一下吗。或者你可以给出一个提供简短教程的链接。嗨,Oguz Meter,谢谢你的提示。我已经配置了一个16位计时器并生成了所需的时间延迟,即使在同一个计时器ISR中使用看门狗,我也能够重置微控制器。跳到0不是真正的重置。这与其说是一个实际的解决方案,不如说是一个工作范围。需要做的是配置看门狗触发中断而不是重置,在中断回调中增加一个计数器,当达到预定的时间间隔时,将看门狗重新配置为重置模式,但使用最短的可用时间间隔(几毫秒),这将导致正确的重置。此处提供了一些代码:
  if(system_timer_count == INPUT_KEY_TIMEOUT) {
      //Do something if the following condition met.
  }