我的代码可以毫无问题地处理 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 输出:开关闭合和释放时都会短暂闪烁。
知道什么编码错误吗?
也许您在 INT7 上看到很多很多由于开关弹跳而导致的快速连续中断?仅用于测试,尝试添加 50 毫秒延迟,然后手动清除 ISR 末尾的 INT7 更改标志,看看是否会改变任何内容。