我目前正在使用中断来重置 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;
}
*NBMCUSR = 0
被注释掉,因为 ATTiny20 上不存在 MCUSR。我试过用它替换它,SREG = 0
但无济于事。
即使有这个代码,应该禁用看门狗定时器,问题仍然存在。设备上闪烁的 LED 表明程序main()
在重置之前正在运行部分功能,但放在wdt_disable();
顶部main()
也没有帮助。
我是否缺少一些重要的东西:ATTiny20?我在数据表中遗漏了什么?问题 - 和解决方案 - 看起来很明显,但我很难过。我正在使用 Atmel Studio 6.1。