You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ATTINY13a中断异常:注释测试宏后INT0中断失效求助

ATtiny13a INT0中断失效问题解决

问题根源

注释BLINK_TEST宏后,main的while(1)循环为空,编译器会将其优化为休眠指令,让ATtiny13a进入低功耗模式。此时INT0中断虽能唤醒MCU,但ISR内的_delay_us依赖CPU循环实现,休眠唤醒后无法正常完成延时,导致第二次按键电平检查误判为弹起,执行led2_off,最终表现为中断“失效”。而开启BLINK_TEST时,testBlink内的_delay_ms让MCU持续活跃,ISR防抖逻辑正常工作。

解决方案

方案1:阻止空循环优化

在空while(1)中添加空操作或短延时,避免MCU休眠:

while (1) {
    __asm__ __volatile__ ("nop"); // 防止编译器优化为休眠指令
    // 也可以用短延时替代:_delay_ms(1);
}

方案2:优化中断防抖逻辑(推荐)

中断服务函数(ISR)应尽量简短,避免在其中使用延时(会阻塞其他中断且低功耗下不可靠)。改为ISR设置标志,主循环处理防抖:

  1. 修改共享变量(添加volatile防止编译器优化):
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED1   PB0
#define LED2   PB1
#define BUTTON PB2
#define DEBOUNCE_TIME (400) // in _delay_us
//#define BLINK_TEST
//#define BUTTON_TEST

volatile uint8_t button_int_flag = 0; // 中断触发标志
volatile uint8_t led2_state = 0;

// 函数声明
void led2_on ();
void led2_off ();
  1. 简化ISR:
ISR(INT0_vect) {
    button_int_flag = 1;
    GIFR |= (1 << INTF0); // 手动清除中断标志(可选,硬件自动清除,但更稳妥)
}
  1. 主循环处理防抖和LED控制:
int main(void) {
    // IO初始化
    DDRB |= (1 << LED1) | (1 << LED2);
    DDRB &= ~(1 << BUTTON);
    PORTB |= (1 << BUTTON); // 开启内部上拉

    // 中断初始化
    MCUCR |= (1 << ISC01); // 下降沿触发INT0
    GIMSK |= (1 << INT0);  // 启用INT0中断
    sei(); // 开启全局中断

    while (1) {
        if (button_int_flag) {
            _delay_us(DEBOUNCE_TIME);
            if (!(PINB & (1 << BUTTON))) {
                led2_state = !led2_state;
                led2_state ? led2_on() : led2_off();
            }
            button_int_flag = 0;
        }
    }
    return 0;
}
  1. 保留原有LED操作函数:
void led2_on () {
    PORTB |= (1 << LED2);
}

void led2_off () {
    PORTB &= ~(1 << LED2);
}

额外注意事项

  • 确认按键硬件连接正确:PB2通过按键接地,内部上拉已开启(代码中PORTB |= (1 << BUTTON)设置正确)。
  • 若使用Pin Change Interrupt,需额外开启GIMSK |= (1 << PCIE),否则PCMSK的配置无效,但当前INT0的设置是正确的。

内容的提问来源于stack exchange,提问作者Jimmy_Neutron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:22:46