ATMega2560 PCINT中断

时间:2015-10-10 15:07:20

标签: avr atmega atmel

我是Atmel的新手,所以问题可能很简单。

我有以下情况: 我有一个ATMega2560,想要在Pins PK0-PK7上获得中断。我对从低到高的PIN变化感兴趣。 (我已将一个光电管连接到每个PIN) 我已经读过每次触发PCINT [0-2]的中断(引脚为高电平且引脚为低电平),所以我定义了一个数组来忽略PIN DOWN中断。

所以我有以下代码:

注意:我不明白,为什么我需要将DDRC设置为输入而不是DDRK?

#define HIGH 1
#define LOW 0

volatile uint8_t portbhistory = 0xFF;
uint8_t pinState[8];
void initSystem()
{
    int i;
    for(i = 0; i < sizeof(pinState) / sizeof(*pinState); i++)
    {
        pinState[8] = 0;
    }   
    DDRB = 0xff; // set Port B as output
    DDRC = 0; // WHY DDRC ?? PCINT == PK0-7, so DDRK ? // all Pins input
    PORTC = 0xff; // same question ... // turn on pullup for every pin  
    PCICR |= _BV(PCIE2); // enable interrupt for PCIE2
    PCMSK2 = 0xff; // Interrupt at all pins
    sei(); // turn on interrupts
}

int main(void)
{
    initSystem();
    while(1)
    {
    }
}
ISR(PCINT2_vect)
{
    int i;
    uint8_t changedbits;

    changedbits = PINC ^ portbhistory;
    portbhistory = PINC;
/*  
    if(pinState[changedbits] == HIGH)
    {
        pinState[changedbits] = LOW;
        return;
    } else
    {
        pinState[changedbits] = HIGH;
    }
*/
    setDebugLED(1);
    _delay_ms(30);
    setDebugLED(0);
}

如果我将5V连接到其中一个PINS(PK0-7),LED会立即闪烁。但是,如果我断开5V,LED需要大约2秒才能再次闪烁。在这个时候,我连接5V的一个引脚如果我再次连接5 V,则不会让LED再次闪烁。

此时其他港口工作。

所以你可以说,所有引脚的PIN HIGH中断工作正常并立即被触发但是PIN LOW中断需要一些时间(~2秒)。此时端口被“禁用”或者某些东西。

任何人都可以帮助我吗?

修改 只是一些错误的编辑...

编辑2 所以,我完全忘了在这里发布我的解决方案。对不起!

解决方案是:我的外部电路将PIN拉至接地或5V。

谢谢!

0 个答案:

没有答案