Xmega只有两个IO口中断(INT0和INT1)

Only two IO port interrupts for Xmega (INT0 and INT1)

在avr Xmega设备中,只有两个IO口中断向量INT0和INT1。

我有三个应该产生三个中断的开关。 我已经使用 INT0 为第一个开关编写了中断代码。现在,我可以使用 INT1 编写第二个中断,这将耗尽我的向量。 下面是我的 INT0 ISR 代码:

ISR (PORTD_INT0_vect){
PORTD.INTFLAGS = 0x01; // clear INT0IF flag.

PORTD_OUT = PORTD_OUT | (1<<4); // led on.

}

我可以重新定义此 ISR 以启用第二个开关的中断吗?

我在main函数中设置的寄存器如下:

PORTD.INT0MASK = 0x04; // PD2 is the source of interrupt for INT0.
PORTD.INTCTRL = 0x03; // Disable INT1, enable INT0 and place it a high-priority level.
PORTD.PIN2CTRL = 0x03; // configure PD2 pin to interrupt on the low level of signal.
PMIC.CTRL = 0x07;    // enable high,medium, and low level interrupts.
sei();         // enable interrupt globally.

外部中断的想法是让您知道 发生了什么,而不是什么 发生了。在您的 ISR 中,您必须读出开关所连接的输入状态,并根据读数确定要做什么。要检测状态是否发生改变,请保留端口输入状态的副本并使用新读出的值进行异或(对整个端口执行此操作,而不仅仅是单个引脚)。

我不是 XMEGA 专家,但我可以建议,例如使用 PD1 作为中断引脚:

PORTD.INT0MASK = 0x04; // PD2 is the source of interrupt for INT0.
PORTD.INT1MASK = 0x02; // PD1 is the source of interrupt for INT1.
PORTD.INTCTRL = 0x0F; // Enable INT1, enable INT0 and place them a high-priority level.
PORTD.PIN2CTRL = 0x03; // configure PD2 pin to interrupt on the low level of signal.PORTD.PIN1CTRL = 0x03; // configure PD1 pin to interrupt on the low level of signal.

每个端口有2个中断。如果你需要比 2 个更多的中断,你可以使用更多的端口。你可以将第三个开关连接到第二个端口并在那里使用 INT0。

如何从您的代码、循环或定时器中断例程中轮询输入?通过这种方式,您可以处理与能够感知信号变化的输入一样多的输入信号。

限制因素是轮询频率和轮询软件引入的延迟。

当然,我假设您想观察 high/low 信号水平。对于更精细的信号感测(上升、下降、频率变化),ADC 的使用是不可避免的。

希望对您有所帮助。