读书频道 > 网站 > 网页设计 > Arduino开发实战指南:AVR篇
3.8.2 attachInterrupt(interrupt,function,mode)
12-09-18    奋斗的小年轻
收藏    我要投稿   

本文所属图书 > Arduino开发实战指南:AVR篇

Arduino是一个注重实际动手操作的产品,所以本书以实际应用为纽带将各个章节联系起来。本书首先介绍Arduino的一些基础知识,接着针对具体应用介绍了一些扩展板以及Arduino扩展库,最后应用之前的内容完成了具有视...立即去当当网订购

attachInterrupt函数用于设置外部中断,函数有3个参数:interrupt、function和mode,分别表示中断源、中断处理函数、触发模式。参数中断源可选值0或1,在Arduino中一般对应2号和3号数字引脚;参数中断处理函数用来指定中断的处理函数,参数值为函数的指针,触发模式有4种类型:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)。

下面的例子是通过外部引脚触发中断函数。然后控制13号引脚的LED的闪烁。

int pin = 13;
volatile int state = LOW;
void setup()
{
     pinMode(pin, OUTPUT);
     attachInterrupt(0, blink, CHANGE); //中断源:1
       //中断处理函数:blink()
       //触发模式:CHANGE(变化时触发)
}

void loop()
{
     digitalWrite(pin, state);
}

//中断处理函数
void blink()
{
     state = !state;
}

在使用attachInterrupt函数时要注意以下几点:

在中断函数中delay函数不能使用。
使用millis函数始终返回进入中断前的值。
读取串口数据的话,可能会丢失。
中断函数中使用的变量需要定义为volatile型。

attachInterrupt函数的函数原型可在文件WInterrupts.c中找到,如下所示:

void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)
{
      if(interruptNum < EXTERNAL_NUM_INTERRUPTS)
      {
                  intFunc[interruptNum] = userFunc;
   
                  switch (interruptNum)
                  {
                            case 0:
                                     EICRA = (EICRA & ~((1 << ISC00)
                                              |(1 << ISC01)))|(mode << ISC00);
                                     EIMSK |= (1 << INT0);
                                     break;
                            case 1:
                                     EICRA = (EICRA & ~((1 << ISC10)
                                              |(1 << ISC11)))|(mode << ISC10);
                                     EIMSK |= (1 << INT1);
                                     break;
                  }
      }
}

另外,还有detachInterrupt函数用于取消中断,参数interrupt表示所要取消的中断源,函数的定义如下:

void detachInterrupt(uint8_t interruptNum)
{
      if(interruptNum < EXTERNAL_NUM_INTERRUPTS)
      {
                  switch (interruptNum)
                  {
                            case 0:
                                    EIMSK &= ~(1 << INT0);
                                    break;
                            case 1:
                                    EIMSK &= ~(1 << INT1);
                                    break;
                  }
                  intFunc[interruptNum] = 0;
      }
}

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站