我是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。
谢谢!