为什么 Attiny84 上的 PCINTX 中断不起作用

问题描述 投票:0回答:1

我的代码可以毫无问题地处理 INT0 上的信号。 PA2 和 PA3 上的输出引脚已启用。 现在我想使用 PA7 进行 PCINT 但没有成功。 我遵循问题“在 AVR 中处理多个 PCINT 的最佳方式”的代码。

volatile uint8_t portahistory = 0xFF;     // default is high because the pull-up
DDRA |= (1<<PA2); // LED
PORTA |= (1<<PA2); 
DDRA |= (1<<PA3); // LED
PORTA |= (1<<PA3);

初始化PCINT:

void pcint7_init(void)
{
   DDRA &= ~(1<<PA7); // PA7 input
   PORTA |= (1<<PA7); // HI
   
   GIMSK |= (1<<PCIE0);    // General Interrupt Mask Register enable for pin 0:7
   PCMSK0 |= (1<<PCINT7);  // Pin Change Mask Register  for PA7
}

PA7 的 ISR:

ISR(PCINT7_vect) 
{
  uint8_t changedbits;
   
   changedbits = PINA ^ portahistory;
   portahistory = PINA;
   
   if(changedbits & (1 << PA7))
   {
      PORTA ^= (1<<PA4); // PA4 output for LED
   }
}

通过将 PA7 切换至接地来完成中断。

使用开关对 PA4 上的 LED 没有影响,但会影响 PA2,3 上的 LED 输出:开关闭合和释放时都会短暂闪烁。

知道什么编码错误吗?

external interrupt attiny
1个回答
0
投票

也许您在 INT7 上看到很多很多由于开关弹跳而导致的快速连续中断?仅用于测试,尝试添加 50 毫秒延迟,然后手动清除 ISR 末尾的 INT7 更改标志,看看是否会改变任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.