首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Contiki如何处理外部中断?

Contiki如何处理外部中断?
EN

Stack Overflow用户
提问于 2015-11-20 18:12:04
回答 1查看 1.6K关注 0票数 0

在由外围传感器产生的外部中断上唤醒传感器节点是可能的。下面解释Contiki如何处理外部中断。在ATmega128RFA1的情况下,INT0INT4的外部中断甚至可以从深度睡眠中唤醒单片机。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 18:12:04

以下是对contiki中的流程和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

contiki利用单片机的ISR矢量

本例适用于ATmega128RFA1.外部中断是INT0 on PD0 (引脚25)。

在ISR中,惟一的操作是轮询相关的contiki进程。在内部,这将向流程发送轮询请求。该进程捕获轮询请求,然后执行与外部中断关联的计算。这一程序防止了ISR中的长期计算。

ISR :

代码语言:javascript
运行
复制
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页及其后)

过程:

代码语言:javascript
运行
复制
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中手动启动它

如果传感器具有开放收集器输出,激活内部拉出电阻并设置中断控制寄存器以触发低电平中断(请参阅以下代码:用开放式收集器输出连接传感器)

代码语言:javascript
运行
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33833362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档