如何启用多个中断AVR

时间:2013-08-15 17:48:42

标签: c interrupt avr atmel

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

如果我定义和设置PCINT2的方式与让PCINT0工作的方式相同,没有任何反应。我甚至在一个新的程序中试过这个,只是为了看看是否有其他东西在某种程度上干扰但是没有解决任何问题。我甚至一起摆脱了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

数据表的链接

1 个答案:

答案 0 :(得分:0)

我认为这个问题可能主要是由于各种寄存器标志的名称略显混乱。如果你长时间盯着数据表,你会发现PCIE2和PCMSK2不能控制PCINT2。它们实际上控制PCINT16到PCINT23。

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

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

PCMSK0 | =(1 <&lt;

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

希望这有帮助。