ATtiny84的PCINTX中断无法正常工作,请求代码问题排查
AVR PCINT中断异常排查问题
我的代码在INT0信号下运行正常,PA2和PA3引脚已配置为输出。现在尝试将PA7用于PCINT中断但未成功,参考了多PCINT处理的代码实现。操作PA7接GND的开关时,PA4的LED无反应,但PA2、PA3的LED会在开关通断时短暂闪烁。
初始化代码
volatile uint8_t portahistory = 0xFF; // 默认高电平,因为启用上拉电阻 DDRA |= (1<<PA2); // PA2配置为输出(接LED) PORTA |= (1<<PA2); DDRA |= (1<<PA3); // PA3配置为输出(接LED) PORTA |= (1<<PA3);
PCINT初始化函数
void pcint7_init(void) { DDRA &= ~(1<<PA7); // PA7配置为输入 PORTA |= (1<<PA7); // 启用上拉电阻,默认高电平 GIMSK |= (1<<PCIE0); // 启用端口A的引脚变化中断(PCINT0~PCINT7) PCMSK0 |= (1<<PCINT7); // 使能PA7对应的PCINT7中断 }
PCINT中断服务函数
ISR(PCINT7_vect) { uint8_t changedbits; changedbits = PINA ^ portahistory; portahistory = PINA; if(changedbits & (1 << PA7)) { PORTA ^= (1<<PA4); // PA4输出翻转(控制LED) } }
问题根源分析
- 中断向量名错误:AVR的端口A引脚变化中断(PCINT0~PCINT7)共享同一个中断向量
PCINT0_vect,不存在单独的PCINT7_vect。你写的ISR(PCINT7_vect)完全不会被触发,因为这个向量在AVR的中断向量表中不存在。 - PA4未配置为输出:代码仅初始化了PA2、PA3为输出,但PA4默认是输入模式。即使中断逻辑正常,修改PORTA的PA4位也不会产生任何输出效果。
- PA2/PA3闪烁的原因:开关通断时的毛刺或电源波动,通过电路耦合干扰了PA2、PA3的输出状态,和PCINT中断无关。
修正方案
1. 修正中断向量名
将中断服务函数的向量改为PCINT0_vect:
ISR(PCINT0_vect) { uint8_t changedbits; changedbits = PINA ^ portahistory; portahistory = PINA; if(changedbits & (1 << PA7)) { PORTA ^= (1<<PA4); // PA4输出翻转(控制LED) } }
2. 配置PA4为输出
在初始化代码中添加PA4的输出配置:
volatile uint8_t portahistory = 0xFF; // 默认高电平,因为启用上拉电阻 DDRA |= (1<<PA2); // PA2配置为输出(接LED) PORTA |= (1<<PA2); DDRA |= (1<<PA3); // PA3配置为输出(接LED) PORTA |= (1<<PA3); DDRA |= (1<<PA4); // PA4配置为输出(接LED) // 可选:设置PA4初始电平 // PORTA |= (1<<PA4); // 初始高电平 // PORTA &= ~(1<<PA4); // 初始低电平
内容的提问来源于stack exchange,提问作者heimi
相关产品推荐
相关产品推荐

