2015-11-20 139 views
0

有可能喚醒由外圍傳感器產生的外部中斷上的傳感器節點。以下說明了Contiki OS如何處理外部中斷。在ATmega128RFA1的情況下,外部中斷INT0INT4能夠喚醒MCU甚至從深度睡眠Contiki OS如何處理外部中斷?

回答

2

勝過過程的概述,並interupts在半自助旅遊旅行社是在這裏:

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

半自助旅遊旅行社利用MCU的ISR矢量

此示例是用於ATmega128RFA1。 PD0(引腳25)上的外部中斷爲INT0

在ISR中唯一的動作是對輪詢一個關聯的contiki進程。在內部,這向進程發送輪詢請求。該進程捕獲輪詢請求,然後執行與外部中斷相關的計算。該程序可防止ISR中的長期計算。

ISR:

ISR(INT0_vect) 
{    

    process_poll(&extern_interupt_process); 
    PRINTF("interrupt was triggered on INT0... \n"); 

} 

以啓用INT0外部interupts:

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或者如果傳感器具有集電極開路輸出激活內部上拉電阻手動啓動它在半自助旅遊旅行社-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) 

http://en.wikipedia.org/wiki/Open collector

+1

在某些平臺上還需要明確一些狀態寄存器位,以避免執行中斷處理程序後回到睡眠模式。 – kfx