看门狗复位后,ATTiny20卡在复位环路中

时间:2013-07-18 14:09:34

标签: c embedded avr

我目前正在使用中断来重置ATTiny20。以下是相关代码:

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
    ...
}

中断处理功能:

ISR(PCINT0_vect)
{
    if (!(BUTTON_1_PORT & 1<<BUTTON_1_PIN))    // Only reset if button is pushed
    {   
        wdt_enable(WDTO_2S);
        while(1){};
    }
}

这很有效 - 当按下按钮时,系统会冻结2秒然后重置...并立即卡在重置循环中。一些谷歌搜索发现了罪魁祸首:在更新的芯片上,看门狗定时器在看门狗复位后保持启用状态(在最短的延迟设置下)。以下代码旨在解决此问题:

// 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;
}

* N.B。 MCUSR = 0已被注释掉,因为ATTiny20上不存在MCUSR。我尝试用SREG = 0替换它,但无济于事。

即使使用此代码(应该禁用监视程序计时器),问题仍然存在。设备上的指示灯闪烁表示程序在重置之前正在通过main()功能的一部分运行,但将wdt_disable();放在main()的顶部并没有帮助。

是否有一些我不知道的重要内容:ATTiny20?我在数据表中遗漏了什么?问题 - 和解决方案 - 似乎很明显,但我很难过。我正在使用Atmel Studio 6.1。

1 个答案:

答案 0 :(得分:1)

// 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;
}