0

在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.
4

4 回答 4

2

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

于 2015-10-07T09:42:46.353 回答
0

每个端口有 2 个中断。如果您需要的中断多于 2 个,则可以使用更多端口。您可以将第三个交换机连接到第二个端口并在那里使用 INT0。

于 2016-08-06T11:40:57.133 回答
0

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

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

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

我希望这会有所帮助。

于 2016-08-11T12:59:51.007 回答
0

我不是 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.
于 2015-10-07T09:46:02.047 回答