【发布时间】:2016-02-23 08:02:34
【问题描述】:
可以在外围传感器产生的外部中断上唤醒传感器节点。下面解释 Contiki OS 如何处理外部中断。在ATmega128RFA1 的情况下,外部中断INT0 到INT4 甚至能够从深度睡眠唤醒MCU。
【问题讨论】:
标签: process operating-system interrupt avr-gcc contiki
可以在外围传感器产生的外部中断上唤醒传感器节点。下面解释 Contiki OS 如何处理外部中断。在ATmega128RFA1 的情况下,外部中断INT0 到INT4 甚至能够从深度睡眠唤醒MCU。
【问题讨论】:
标签: process operating-system interrupt avr-gcc contiki
这里有关于 Contiki 中的流程和中断的概述:
https://github.com/contiki-os/contiki/wiki/Processes
http://de.slideshare.net/DingxinXu/contiki-introduction-iifrom-what-to-how
http://senstools.gforge.inria.fr/doku.php?id=os:contiki
contiki 利用 MCU 的 ISR 向量
此示例适用于 ATmega128RFA1。外部中断是 PD0 上的 INT0(引脚 25)
在 ISR 中,唯一的操作是轮询关联的 Contiki 进程。这在内部会向进程发送一个轮询请求。该进程捕获轮询请求,然后执行与外部中断相关的计算。此过程可防止 ISR 中的长期计算。
ISR:
ISR(INT0_vect)
{
process_poll(&extern_interupt_process);
PRINTF("interrupt was triggered on INT0... \n");
}
在 INT0 上启用外部中断:
EIMSK = 0xb00000000; //disable interrupts before changing EICRA
EICRA |= 0xb00000011; //EICRA 0000|0011 rising edge triggers interrupt int0
EIMSK |= 0xb00000001; // enable INT0(数据表第 219 页)
过程:
PROCESS(extern_interupt_process, "external_interrupt_process");
PROCESS_THREAD(extern_interupt_process, ev, data)
{
PROCESS_BEGIN();
while(1) {
PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);
// process data here
}
PROCESS_END();
}
使用 autostart_process() 启动 extern_interrupt_process 或在 contiki-main.c 中手动启动它
如果传感器具有集电极开路输出,则激活内部上拉电阻并设置中断控制寄存器以触发低电平中断(参见:wiring a sensor with open collector output)
DDRD &= 0xb00000000; // PD0 as input
PORTD |= 0xb00000001; // enable internal pull-up on PD0
EIMSK &= 0xb00000000; //disable interrupts before changing EICRA
EICRA &= 0xb00000000; //EICRA 0000|0000 low-level triggers interrupt on int0
EIMSK |= 0xb00000001; // enable INT0` (datasheet p. 219 ff)
【讨论】: