在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.
答案 0 :(得分:2)
外部中断的想法是你知道发生了什么,但发生了什么。在ISR中,您必须读出开关连接的输入状态,并根据读数确定要做什么。要检测,如果状态确实发生了变化,请保留端口输入状态的副本,并使用新读取的值执行XOR(对整个端口执行此操作,而不仅仅针对单个引脚)。
答案 1 :(得分: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.
答案 2 :(得分:0)
每个端口都有2个中断。如果需要比2更多的中断,可以使用更多端口。您可以将第三个交换机连接到第二个端口并在那里使用INT0。
答案 3 :(得分:0)
如何从代码,循环或定时器中断例程中轮询输入?这样,您可以处理尽可能多的输入信号,因为您具有能够感测信号变化的输入。
限制因素是轮询的频率和轮询软件引入的延迟。
当然我假设你想要观察信号的高/低电平。对于更精细的信号检测(上升,下降,频率变化),ADC的使用是不可避免的。
我希望这会有所帮助。