首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >看门狗重置后ATTiny20卡在重置循环中

看门狗重置后ATTiny20卡在重置循环中
EN

Stack Overflow用户
提问于 2013-07-18 22:09:34
回答 1查看 962关注 0票数 1

我当前正在使用中断来重置ATTiny20。相关代码如下:

代码语言:javascript
复制
int main(void)
{
    ...

    // Set up interrupt for reset button (PCINT5)
    SREG |= 1<<7;           // Enable global interrupts
    GIMSK |= 1<<PCIE0;      // Enable Pin Change Interrupt 0 (enables interrupts on PCINT[7:0]
    PCMSK0 |= 1<<PCINT5;    // Enable PCINT5 (physical pin 8) interrupt
    ...
}

中断处理函数:

代码语言:javascript
复制
ISR(PCINT0_vect)
{
    if (!(BUTTON_1_PORT & 1<<BUTTON_1_PIN))    // Only reset if button is pushed
    {   
        wdt_enable(WDTO_2S);
        while(1){};
    }
}

这非常有效-当按下按钮时,系统冻结2秒,然后重置……很快就会陷入重置循环。谷歌一下就发现了罪魁祸首:在较新的芯片上,看门狗定时器在看门狗复位后保持启用(在其最短延迟设置下)。以下代码旨在解决此问题:

代码语言:javascript
复制
// Disable watchdog on reset
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3")));
void wdt_init(void)
{
    // MCUSR = 0;    // See below for reason for commenting this line
    wdt_disable();
    return;
}

*注释掉了MCUSR = 0,因为ATTiny20上不存在MCUSR。我尝试过用SREG = 0替换它,但是没有用。

即使使用此代码,也会禁用看门狗计时器,但问题仍然存在。设备上闪烁的LED指示程序在重置之前正在运行main()功能的一部分,但是将wdt_disable();放在main()的顶部也没有帮助。

有没有什么重要的东西我错过了re: ATTiny20?我在数据表中遗漏了什么?问题和解决方案看起来如此明显,但我被难住了。我使用的是Atmel Studio 6.1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 22:57:03

代码语言:javascript
复制
// Disable watchdog on reset
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3")));
void wdt_init(void)
{
    // This is the flag that must be cleared on an ATTiny20 before the WDT can be disabled
    /***************/
    /* RSTFLR = 0; */
    /***************?

    wdt_disable();
    return;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17725846

复制
相关文章

相似问题

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