首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一旦触发,看门狗会连续重置AVR Atmega 1281。

一旦触发,看门狗会连续重置AVR Atmega 1281。
EN

Stack Overflow用户
提问于 2016-06-25 09:42:44
回答 1查看 1.3K关注 0票数 0

我正在使用一个改进的Arduino板: Gizduino X与Atmega 1281单片机芯片在板上.应用程序由Arduino IDE程序员上传到MCU。我尝试使用Atmega 1281的看门狗计时器重置功能,并使用库"wdt.h“。问题是,在看门狗复位后,微电路似乎一直处于复位状态。我知道数据表规范,即必须在安装()之前禁用看门狗,因为它是在重置后自动启用的,因此我的代码中包含了如下内容:

代码语言:javascript
复制
#include <stdint.h>
#include <avr/wdt.h> //Watchdog Timer library
#define RST_PIN 38        //pin for MCU reset indicator

uint8_t mcusr_mirror __attribute__ ((section (".noinit")));
void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3")));
void get_mcusr(void)
{
    mcusr_mirror = MCUSR;
    MCUSR = 0;
    wdt_disable();
}

char ch;
char pn = 0;
bool ledState = false;

#define wdtReset()  wdt_reset(); \
                digitalWrite(RST_PIN, LOW)

#define wdtBegin()  wdt_reset(); \
                wdt_enable(WDTO_500MS); \
                bitSet(WDTCSR, WDIE)
/******************************************/
void setup() {
  wdtBegin();
  Serial.begin(115200);

  // initialize digital pin 13 as an output.

  wdtReset();
  pinMode(13, OUTPUT);
  pinMdoe(RST_PIN, OUTPUT);
}
/******************************************/
// the loop function runs over and over again forever
void loop() {
  if(Serial.available()) {
    ch = Serial.read();
    if(ch == 'R' || ch == 'r') {
      ledState = !ledState;
      digitalWrite(13, ledState);
      while(true);
    }
  }
  if(pn >= 255) pn = 0;
  Serial.println(pn++);
  wdtReset();
}
/******************************************/
ISR(WDT_vect) {
  digitalWrite(RST_PIN, HIGH);
}

代码的目的是隔离看门狗问题,并根据我的意愿调用看门狗重置。当单片机启动时,代码运行良好,但是当我发送一个字符来调用看门狗重置('r‘或'R')时,RST_PIN被设置为高(表示中断被触发),然后在重置后设置为低,但是板上的LED指示器是打开的。一旦进入这种状态,按下复位按钮就不会再重置MCU,直到我从板上移除电源。此外,如果我继续按下复位按钮,LED指示灯在船上似乎有点暗,并开始闪烁时,我意外地触摸了一个ICSP引脚旁边的复位按钮。

我还遵循了从以下链接设置看门狗的说明:http://donalmorrissey.blogspot.com/2011/09/using-watch-dog-on-atmega1281-as-lock.html

我把相同的代码上传到了一个Atmega328单片机上,但是它工作得很好。我认为这个问题存在于较新的芯片上,因为在系统重置之后,仍然使用默认值启用了看门狗。

我是不是遗漏了什么?问题硬件具体吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-02 11:47:07

这是因为您的Arduino引导程序在您的主应用程序之前运行。当引导加载器启动时,仍然启用WDT并将其设置为最小周期16 is。数据表上说:

注意:如果不小心启用了看门狗,例如被失控的指针或崩溃状态,设备将被重置,看门狗定时器将保持启用。如果代码不是为了处理看门狗而设置的,这可能会导致永久的超时重置循环。为了避免这种情况,应用软件应该始终清除初始化例程中的看门狗系统重置标志(WDRF)和WDE控制位,即使该看门狗没有在使用。

您需要修改引导加载程序,以禁用看门狗在重置或忘记看门狗在您的主要应用程序。

UPDATE在引导加载程序中禁用WDT,请尽快执行以下代码:

代码语言:javascript
复制
MCUSR &= ~(1 << WDRF);
wdt_disable();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38027085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档