我目前正在尝试为 ATMega48 仿真器创建一个简单的程序,该程序具有 PCINT2 外部中断器侦听 PORTD 输入并根据其值更改输出。
这是中断器的代码:
unsigned int d; // a variable that has to change based on the input
ISR(PCINT2_vect) {
if (PORTD % 2 == 0) {
if (d <= 8000) {
d += 500;
}
} else {
if (d >= 1000) {
d -= 500;
}
}
}
main(( 函数:
int main(void)
{
DDRD = 0x00; // set PORTC for input
DDRB = 0xFF; // set PORTB for output
PORTB = 0x00; // Initial value is 0
PCMSK0 = 0b00000100;
d = 4000;
sei();
while (1) {
// EnableDisable the LED with an initial delay
if (PIND == 0b00000000) {
PORTB = 0b00100000;
} else {
PORTB = 0b00000000;
}
// Delay for N seconds (determined by interrupt)
delay_stuff(d);
}
return 1;
}
目前,无论任何端口发生什么情况,它都不会调用中断器,我的假设是我没有注册一些神奇的 ATMega 侦听器来调用中断器。那么如何注册中断器,我在这里缺少什么?
根据数据表第 75-76 页,您必须在寄存器中启用引脚更改中断PCICR
并选择在 PCMSK2
中在相应 IO 上启用哪个引脚以进行PCINT2
(PCMSK0
用于PCINT0
,即PINB
(。
int main(void)
{
DDRD = 0x00; // set PORTC for input
DDRB = 0xFF; // set PORTB for output
PORTB = 0x00; // Initial value is 0
PCICR |= _BV(PCIE2); //or, PCICR |= 0x04;
PCMSK2 |= 0xFF; //any changes in PIND will trigger interrupt
d = 4000;
sei();
//other codes...
}