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

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

问题根源分析

  1. 中断向量名错误:AVR的端口A引脚变化中断(PCINT0~PCINT7)共享同一个中断向量PCINT0_vect,不存在单独的PCINT7_vect。你写的ISR(PCINT7_vect)完全不会被触发,因为这个向量在AVR的中断向量表中不存在。
  2. PA4未配置为输出:代码仅初始化了PA2、PA3为输出,但PA4默认是输入模式。即使中断逻辑正常,修改PORTA的PA4位也不会产生任何输出效果。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:52:27