如何启用多个中断 AVR

Posted

技术标签:

【中文标题】如何启用多个中断 AVR【英文标题】:How to enable more than one interrupt AVR 【发布时间】:2013-08-15 17:48:42 【问题描述】:

我正在使用 ATmega88PA 来查找 2 个引脚上的引脚变化。我想使用 PCINT0 和 PCINT2,尽管如果我需要使用不同的引脚,我还有很多其他引脚打开。我一直在搞事情,并且能够让 PCINT0 正常工作,当我试图让 PCINT2 工作时,我的问题就出现了。

如果我以与使 PCINT0 工作相同的方式定义和设置 PCINT2,则不会发生任何事情。我什至在一个新程序中也试过这个,只是为了看看是否有其他东西以某种方式干扰,但这并没有解决任何问题。我什至把 PCINT0 都去掉了,看看能不能让 PCINT2 自己工作,但还是不行。

这是我的 PCINT0 代码

DDRC = 0x20; // PORTC,5 is now output
   sbi(PORTC,5);
   USART_Init(51);
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();

PCICR |= (1 << PCIE0);
PCMSK0 |= (1 << PCINT0);

如果我将所有内容更改为 PCMSK2 和 PCINT2,则触发该引脚时不会发生任何事情。这是 ATmega88PA 数据表的链接Datasheet

【问题讨论】:

你能贴出你试图用来启用 PCINT2 的代码吗? @BeenCoding2Long 我不知道如何处理 PCINT2。这就是我正在尝试的。 PCICR |= (1 【参考方案1】:

我认为这个问题可能很大程度上是由于各种寄存器标志的名称有点混乱。如果您盯着数据表看足够长的时间,您会注意到 PCIE2 和 PCMSK2 不控制 PCINT2。他们实际上控制 PCINT16 到 PCINT23。

PCINT0-PCINT7(包括您想要的 PCINT2)由 PCICR(您已经设置)和 PCMSK0(不是您在上一条评论中提到的 PCMSK2)中的 PCIE0 控制。

因此,要解决您的问题,您只需将最后一行更改为:

PCMSK0 |=(1

免责声明:我还没有机会在真实硬件上对此进行测试。请仔细检查数据表。

希望这会有所帮助。

【讨论】:

以上是关于如何启用多个中断 AVR的主要内容,如果未能解决你的问题,请参考以下文章

AVR单片机教程——定时器中断

AVR_Interrupt

汇编中的 AVR 外部中断触发

在 AVR 中断中保留 sreg

Arduino/AVR:中断串行/I2C 通信是不是安全

AVR - 高速中断驱动的 UART 代码不工作