Arduino Uno 上的"pin change"中断在哪里?



我最近一直在玩Arduino(特别是"迷失在太空中的30天")。装备)。我正在使用编码器模块。我成功地将编码器引脚的两个通道连接到2和3,并且能够生成中断来跟踪编码器,因为引脚2和3相应地映射到中断0和1(并根据digitalPinToInterrupt()调用)。使用相同的调用,其他引脚映射到-1。我正试图找出如何为不是2或3的引脚做引脚更改中断,因为应该有其他专门用于引脚更改的中断,而不是"外部中断",但我无法找到适合我的样本。我需要帮助配置" change;中断2或3以外的其他输入引脚。

事实证明,Pin Change中断不是在核心库中处理的,所以您必须在较低的级别处理它们,正如@Piglet提到的可能是一种可能性。我在网上找到了这个例子,它操纵适当的寄存器,并将其留给用户为所使用的引脚添加适当的ISR(每个引脚银行有一个单独的中断)。

这是我需要使用的部分,例如,引脚6和7:

#define ENC_CLK  6
#define ENC_DT   7
RotaryEncoder encoder = RotaryEncoder(ENC_DT, ENC_CLK, RotaryEncoder::LatchMode::FOUR3);
void pciSetup(byte pin)
{
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
ISR (PCINT2_vect) // handle pin change interrupt for D0 to D7 here
{
encoder.tick();
}  
void setup() {
//...
pinMode(ENC_CLK, INPUT_PULLUP);
pinMode(ENC_DT, INPUT_PULLUP);
// enable interrupt for pin...
pciSetup(ENC_CLK);
pciSetup(ENC_DT);
//...
}

相关内容

  • 没有找到相关文章

最新更新