Arduino IDE下ATTiny85引脚2接地触发中断失效问题求助
问题解决方案
核心错误点
attachInterrupt()第一个参数要求传入中断编号,而非物理引脚编号。你使用的ATTiny85仅有的外部中断INT0对应物理引脚2,因此该参数应填0,或使用digitalPinToInterrupt(interruptPin)宏自动转换,避免硬编码错误。- 中断服务函数(ISR)中修改的全局变量
lastState未添加volatile修饰符,编译器会误认为该变量不会在主程序流程外被修改,进行过度优化后会导致ISR中对变量的修改无法生效。
修复后代码
#include "Arduino.h" #define interruptPin 2 const int led = 3; volatile bool lastState = 0; // 新增volatile修饰符 void setup() { pinMode(interruptPin, INPUT_PULLUP); // 改用digitalPinToInterrupt宏转换得到正确的中断编号 attachInterrupt(digitalPinToInterrupt(interruptPin), pulseIsr, CHANGE); pinMode(led, OUTPUT); } void loop() { } void pulseIsr() { if (!lastState) { digitalWrite(led, HIGH); lastState = 1; } else { digitalWrite(led, LOW); lastState = 0; } }
额外排查建议
- 若修改代码后仍未生效,可检查接线是否存在虚接,确认引脚2接地时能稳定拉低电平,避免接触不良导致中断无法触发。
- 如果使用机械按键接地,建议在按键两端并联100nF左右的滤波电容消抖,或调整代码逻辑:中断仅标记触发事件,将LED翻转逻辑放到主循环中执行,避免抖动导致多次触发中断。
内容的提问来源于stack exchange,提问作者Black Solis
相关产品推荐
相关产品推荐

