C语言 ATMega48 - 如何注册外部 PCINT2 中断器



我目前正在尝试为 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...
}

最新更新