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

标签 c embedded avr atmel atmelstudio

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

我有三个开关,应该生成三个中断。 我已经使用 INT0 为第一个开关编写了中断代码。现在,我可以使用 INT1 编写第二个中断,这将耗尽我的 vector 。 下面是我的 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 中,您必须读出开关所连接的输入的状态,并根据读数确定要做什么。为了检测状态是否改变,请保留端口输入状态的副本,并与新读出的值进行异或(对整个端口执行此操作,而不仅仅是单个引脚)。

关于c - Xmega 只有两个 IO 端口中断(INT0 和 INT1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32988537/

相关文章:

iphone - 通过无线信号在两个设备之间进行实时同步

c - 如何对近似值进行排序?

c - 1 个具有 2 个不同定义的结构(或动态结构)

c - 在一个 _mm_load_si128 上使用两个 _mm_loadl_epi64

c++ - 嵌入式linux PPC32动态内存检查工具?

将 tslib 与 angstrom g++ 一起使用时出现 Qt 编译错误

c - 如果宏未定义,如何闪烁错误?

c - 在嵌入式系统上解析字符串的有效方法是什么?

c - 在C中使用float的Printf

c++ - 在 OSX Yosemite 上的 Emacs 中使用 LLVM 调试器