求教:如何在arduino库函数中文版包含中断服务程序

发表于: 17:52:10 |
分类:Processing与Arduino的互动艺术
大家都知道Google公司2011年推出了命名为 &ADK&的开发工具,可以与Arduino硬件进行有线联机,但是Arduino硬件必须具备ADK功能,一般用的型号为Arduino Mega ADK,价格较贵。能否用一种经济的方法让安卓智能设备与任意一种Arduino控制板联机呢?这篇文章就介绍一种利用OTG线来使两者联机的方法。
前段时间我们团队成员做了这样的实验,实验任务是:安卓手机APP界面上方布置一个弧形仪表盘显示电机的实时转速,图1所示可见当前电机转速为67rp
发表于: 13:38:20 |
分类:Processing与Arduino的互动艺术
Processing是一种具有革命前瞻性的新兴计算机语言,它的概念是在电子艺术的环境下介绍程序语言,并将电子艺术的概念介绍给程序设计师。谁会去学或是去用Processing呢?大致上是对科学与艺术之间的跨领域表现有兴趣的人。艺术与代码对每个现代人都是时尚而着迷的东西,特别是颇具新思想的青年学生,但原先或许只是作为看客去了解它,而不是近距离去触摸它,而有了Processing语言,就有了亲身实践的手段。为了追求美感,而去熟练编程能力,同时在敲击程序的过程中,去构造优美的画面。现在主要介绍的是:Andriod
发表于: 12:30:31 |
分类:Processing与Arduino的互动艺术
图1 前几天,试通了在安卓手机上运行Processing程序,今天趁热打铁,挖掘下安卓手机的加速度传感器,让它与Processing画布中的物体互动。
手机中加速度传感器的X、Y、Z的加速度值通过Processing专门函数反馈出的值如下图。图2当手机水平放置时,X和Y轴值接近0,Z轴值接近10。如果纵向手持手机,如图所示,顺时针旋转90度,则X轴值为-10,逆时针旋转90度,则X轴值为10。如果横向手持手机,如图1所示,顺时针旋转90度,则Y轴值为10,逆时针旋转90度,则X轴值为-10。现在我特意做
发表于: 16:29:19 |
分类:Processing与Arduino的互动艺术
很多Processing互动媒体爱好者总是在PC电脑里演示他们的作品,应该很少有人把作品搬到安卓手机的屏幕上演示,主要原因是Processing程序如何在安卓手机上运行的方法,中文资料很少或者没有,外文倒是有,但说的也不全。所以这里我们公布下,也方便大家表达自己的创意。第一步: 安装JDK JDK(Java Development Kit)是整个Java的核心,包括一系列Java开发的东西 。jdk-8u25-windows-i586.exe下载:/s/1gdKjM
发表于: 16:32:06 |
分类:Processing与Arduino的互动艺术
&& & 最近做了一个Processing的小例子,练练手了。体察下鼠标动作如何与Processing画面各图形互动。& &&画面中,一条直线上方一个圆球向左或向右移动,按下直线下方的&Left_Reset&按钮,圆球回到左边初始位置,这时如果按下&Start&按钮,圆球向右移动,直至从画面消失。按下直线下方的&Right_Reset&按钮,圆球回到右边初始位置,这时如果按下&Start&按钮,圆球向左移动。并且,当用鼠标拖动圆球边沿时,圆球会随之放大或缩小。& &&我还发现了一个网站,它把Processing函数参考手册翻译成了中文,这真是创客精神的体现,分享和互助。网址:http://hiprocessing.net/& & 把下面程序复制到Processing 2.2.1编程环境,试试。& &&Processing 2.2.1下载:https://www.processing.org/d
发表于: 15:40:41 |
分类:Processing与Arduino的互动艺术
&& &&&&2013年的元旦刚刚才过,新年的第一篇文章发出,以纪念过去的三年博客写作生涯。自己选择的创客之路,得失没啥可说的,只有抱着淡定之心,继续详细记录我的作品制作过程,写给自己,也分享给大家。& &这篇文章介绍MMA7361三轴加速度传感器的原理及应用。为了体验下这个传感器反馈物体运动姿态的功效,我设计了一个互动任务,任务为:根据MMA7361加速度传感器绕坐标轴的倾斜角度,实时作用于Processing虚拟环境下的幻彩立方,使其旋转三维空间角度,让由Arduino采样的加速度传感器与幻彩立方产生互动效应。&全屏播放视频,请点击网址:/player.php/sid/XNDkxMzY1ODM2/v.swf。& &&& &MMA7361三轴加速度传感器&是基于加速度的基本原理去实现工作的,加速度是个空间矢量,一方面,要准确了解物体的运动状态,必须测得其三个坐标轴上的分量;另一方面,在预先不知道物体运动方向的场合下
发表于: 20:46:24 |
分类:Processing与Arduino的互动艺术
&& &这篇文章介绍的传感器是一款基于弹簧摆动原理设计的震动传感器,震动势能传到弹簧末端引起共振,左右摆动碰触到金属外壁形成通路。由于导通时间和弹簧的刚性有关,所以该震动传感器的输出带宽很窄,建议使用外部中断功能来读取震动触发。& & 这个Processing与Arduino互动作品视频说明:当用震动传感器敲击桌面时,产生触发信号,引发Ardunio控制器的外部中断,自动执行中断服务子程序,把传感器的震动触发信息上传Processing上位机程序,于是其画布里的泡泡弹起,跳跃,撞击,好一派欢快景象,过一会,由于泡泡重力作用下,泡泡平静下来,落在矩形框的底部。如果您再次用震动传感器敲击桌面,位于矩形框的底部的泡泡们又开始弹起,跳跃,重复上述过程。视频:& & 实验用的Arduino设备可从淘宝找到,/。我的上一篇有关震动传感器的博客文章地址:/zhang700309/blog/11-11/d3b.html。& &
发表于: 15:11:38 |
分类:Processing与Arduino的互动艺术
&& &谈到Processing与Arduino互动,上下位机的串口通讯是一个重要问题,这篇文章也重点强调串口通讯话题,以前的几篇关于Processing与Arduino互动的文章,上位机每次接受Arduino控制器传来的数据只有一个字节,而这篇文章由于所用到的DFrobot公司出品的URM37 V3.2超声波传感器的应用特点所致,Arduino一次传来的数据是6个,而且要在6个字节找到表示超声波测距值那个字节。&& & 这篇文章的串口通讯的编程思想与我上篇关于超声波测距的文章是一样,《动手制作超声波测距仪》网址:/zhang700309/blog/11-11/cf6.html,文章里有这个超声波传感器的说明书供下载。《动手制作超声波测距仪》文章里介绍的上位机软件是Labview,所制作的人际交互界面是虚拟仪器面板,而这篇文章的上位机软件是数位艺术软件Processing,它可以与人际物理世界互动,通过Arduino装置,让人的各种物理感官与电脑屏幕的数
发表于: 16:23:06 |
分类:Processing与Arduino的互动艺术
&&&基于热释电效应的人体热释运动传感器,能检测到人体或动物身上发出的红外线,配合菲涅尔透镜能是传感器探测范围更远更广。与Arduino专用传感器扩展板结合使用,可以非常容易地实现与人体或动物相关的互动效果。& &当红外热释电运动传感器的附近有人在移动,这个小装置就会即刻触发,输出高电平,就算人离开了,高电平也依旧持续一段时间才会改变会低电平,而这个持续的时间长短可以由传感器模块上的那个黄色可变电阻调整,时间长短约为0.3至18秒。然后如果检测到没人再移动,这个传感器又会回到&休眠&状态,传感器维持低电平。这个传感器购买地址:&/item.htm?spm=-1mJ7Y.h-1MYgS*&id=&& & 实验现象是:手在传感器附近移动,传感器被触发,Processing画布上的灯点亮,人偶从画布左端开始移动,到画布右端消失,然后,画布黑屏,直到传感器又被移动物体触发,再重复上述过程。&点击视频网址,看全
发表于: 10:39:47 |
分类:Processing与Arduino的互动艺术
&& &光敏电阻传感器可以用来对环境光线的强度进行检测,与Arduino专用传感器扩展板结合使用,可以制作与光线强度相关的互动作品。& & Processing画布里的莫奈油画接受Arduino控制器的光敏电阻所检测光线越强,油画越明亮,反之,则越暗淡。请看视频:点击网址看大屏幕视频:/player.php/sid/XMzM0OTc2NDgw/v.swf& &光敏电阻的Arduino教程:&/blog/user_.shtml& & 光敏电阻购买网址:&/item.htm?spm=-1mJ7Y.h-1MYgS*&id=&,这个网址展现的是&基于环保型光敏二极管的光线传感器,与普通光敏电阻用法一样。& & 视频中出现的油画是法国画家,印象
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号您所在的位置: &
Arduino函数速查中文版
Arduino函数速查中文版
宋楠/韩广义
清华大学出版社
《Arduino开发从零开始学:学电子的都玩这个》附录Arduino函数速查中文版,本附录中特意给出一个速查手册,希望能帮到读者。本节为大家介绍Arduino函数速查中文版。
附录& Arduino函数速查中文版
Arduino函数可以帮助我们方便地调用主板提供的一些既有功能,由于Arduino函数的中文资料很少,我们在这个附录中特意给出一个速查手册,希望能帮到读者。
1.millis()
这是一个不断更新时间值的函数。它返回Arduino板从开始运行到现在的时间,单位是毫秒(1秒=1000毫秒)。这个时间不会停止,但计时溢出时(大概需要50天时间),会归零从新开始计时。
函数原型:
unsigned&long&millis&(void)&
参数:无。
函数返回值为unsigned long型,如果用int型保存时间将得到错误结果。
2.micros()
这是一个不断更新时间值的函数。它返回Arduino板从开始运行到现在的时间,单位是微秒。mills()函数返回以毫秒表示的时间,而micros()函数返回以微秒表示的时间。micros()在计时溢出后同样会归零从新开始计时。mills()函数会在程序运行50天后溢出,而micros()函数在程序运行70分钟后溢出。
函数原型:
unsigned&long&&micros(void)&
参数:无。
1毫秒=1000微秒,1秒=1000000微秒。
3.delay(ms)
这是一个延时函数,表示延长多少时间(毫秒),没有返回值。
函数原型:
void&delay&(unsigned&long&ms)&
参数:ms表示延迟的毫秒数。
4.delayMicroseconds(us)
这是一个延时函数,表示延长多少时间(微秒),没有返回值。如果延时有几千微秒的话,建议用delay()函数。
函数原型:
void&delayMicroseconds&(unsigned&int&us)&
参数:延长的微秒数,目前参数最大支持16383微妙(不过以后的版本中可能会变化)。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
作为开源硬件的代表之一,Arduino包含一套硬件和软件的交互制作
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 3人学习过讲师: 75人学习过讲师: 94人学习过
本书根据最新的微信5.3版撰写,紧跟微信公众平台的最
本书第1版上市以来,受到读者的广泛好评,但是由于这
本书是Linux运维领域畅销的、公认的经典著作《高性能L
本书并不是关于Web服务的又一本开发手册,抑或是开发技术的宝典之类的读物。本书的作者来自于IBM软件开发中心的SOA技术中心,作
51CTO旗下网站Arduino Due是如何进入串口中断的呢? - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 1989|回复: 8
Arduino Due是如何进入串口中断的呢?
ST金币2075
在线时间640 小时
主题帖子精华
今天在移植Arduino的时候,一直不明白Due是如何进入串口中断的。Due是在串口中断中接收字符,并将其存储。有下面的代码:
void USARTClass::IrqHandler( void )
&&uint32_t status = _pUsart-&US_CSR;
&&// Did we receive data ?
&&if ((status & US_CSR_RXRDY) == US_CSR_RXRDY)
& & _rx_buffer-&store_char( _pUsart-&US_RHR ) ;
&&// Acknowledge errors
&&if ((status & US_CSR_OVRE) == US_CSR_OVRE ||
& & & & & & & && &(status & US_CSR_FRAME) == US_CSR_FRAME)
& & & & // TODO: error reporting outside ISR
& & _pUsart-&US_CR |= US_CR_RSTSTA;
这个代码到时不难,能看懂,但是不知道这个中断是如何进入的。
希望了解的能够给点提示。
ST金币2075
在线时间640 小时
主题帖子精华
哈哈哈,问题应经找到:
// IT handlers
void USART0_Handler(void)
&&Serial1.IrqHandler();
void USART1_Handler(void)
&&Serial2.IrqHandler();
void USART3_Handler(void)
&&Serial3.IrqHandler();
但是不明白的是,在启动代码中,写的那些中断处理函数,能不能调用C++的函数呢?
在线时间168 小时
主题帖子精华
高级会员, 积分 867, 距离下一级还需 133 积分
高级会员, 积分 867, 距离下一级还需 133 积分
噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件,并重命名为xxx.cpp,让编译器用C++的方式进行编译,从而include C++& && && && &的头文件不会报错。
(2)加 extern &C& 功能,告诉编译器不对根据形参类型重新命令函数名,使之与C函数名一致。
extern &C&{
& &// IT handlers
& & void USART0_Handler(void)
& &&&Serial1.IrqHandler();
& &void USART1_Handler(void)
& && &Serial2.IrqHandler();
& & void USART3_Handler(void)
& && &Serial3.IrqHandler();
ST金币1527
在线时间429 小时
主题帖子精华
STM32中断向量在START.S中可以查到,在工程中搜索对应的中断函数就可以查到代码了。
ST金币2075
在线时间640 小时
主题帖子精华
噗。。你这自问自答解决的还蛮快的。。哈。。。
可以c调c++,得注意两点:
(1)中断函数单独做成xxx.c文件 ...
不明白的地方就在这里,之前都是C++调用C,这次是C调用C++,感觉有点奇葩。在汇编的启动文件中,那些函数是C的还是C++的呢?我觉得是C的。。。
在线时间209 小时
主题帖子精华
金牌会员, 积分 1315, 距离下一级还需 1685 积分
金牌会员, 积分 1315, 距离下一级还需 1685 积分
#include &mbed.h&
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Serial pc(USBTX, USBRX);
void callback() {
& & // Note: you need to actually read from the serial to clear the RX interrupt
& & printf(&%c\n&, pc.getc());
& & led2 = !led2;
int main() {
& & pc.attach(&callback);
& & while (1) {
& && &&&led1 = !led1;
& && &&&wait(0.5);
看这个例子,这是一个串口中断的,主函数使能中断& &pc.attach(&callback);& &
callback就是中断服务函数,这是直接调用mbed API操作。 pc.getc()可以直接截取接收到的内容十分方便,建议去看看mbed 的库函数!
ST金币1674
在线时间465 小时
主题帖子精华
论坛元老, 积分 4398, 距离下一级还需 9995601 积分
论坛元老, 积分 4398, 距离下一级还需 9995601 积分
STM32可以用C语言,C++是C的超级,肯定可以用,兼容性等待你去探索了
在线时间31 小时
主题帖子精华
中级会员, 积分 355, 距离下一级还需 145 积分
中级会员, 积分 355, 距离下一级还需 145 积分
启动代码是汇编的
例如Default_Handler PROC
& && && && && & EXPORT&&WWDG_IRQHandler& && && && && & [WEAK] //这一句就是连接到了外部你编写的函数名了
ST金币2075
在线时间640 小时
主题帖子精华
启动代码是汇编的
例如Default_Handler PROC
这个外部函数是C语言的还是C++得呢?
站长推荐 /1
STM32粉丝狂欢节还剩最后一个月,最高单人可得5块开发板!11月中奖名单即将公布,请收到开发板的朋友好好学习!好好利用!
Tel: 3-8064
备案号: 苏ICP备号-2
Powered by中断的概念:
& & &什么是中断?通过生活中一个简单的例子来说明。当你正在家中看书时,突然电话铃响了,你停止看书,去接电话,和来电话的人进行交谈,通话结束后回来继续从刚才停止的位置看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。程序中的中断是指在主程序执行过程中被中断,执行中断服务程序,待中断服务程序执行完之后继续接着执行主程序。
中断的分类:
& & &Arduino中的中断可以分为两类:外部中断和定时中断。
外部中断: 一般是指由外设发出的中断请求,即中断源在外部如:键盘中断、打印机中断等。外部中断需要外部中断源发出中断请求才能发中断。
定时中断:主程序在运行的过程中过一段时间就进行一次中断服务程序,不需要中断源的中断请求触发,而是自动进行。
& & &我们可以根据实际情况的不同来确定使用什么样的中断。
中断的函数:
一、首先介绍关中断和开中断即Interrupt()和noInterrupt()函数,用法如下
可以被中断的代码
Interrupt()
不可以被中断的代码
noInterrupt()
可以被中断的代码
二、外部中断
1. attachInterrupt(interrupt, function, mode)
&&&&&1)interrupt:中断号,UNO只能使用 0或1 ,即代表D2 与D3口。
& & &2)function:调用中断函数,中断发生时调用的函数。
& & &3)mode:中断触发模式。
& & & UNO R3 支持四种中断触发模式:
& & & LOW & & & & &当针脚输入为低时,触发中断
& & & CHANGE&&&& 当针脚输入发生改变时,触发中断
& & & RISING & & & 当针脚输入由低变高时,触发中断
& & & FALLING&&&& 当针脚输入由高变低时,触发中断
1:中断服务程序不能够有参数和返回值。即void &FunctionName(void){........}
2:在中断函数中delay()函数将不再起作用
3:在中断函数中millis()函数的值将不会增加
4:得到的串行数据将会丢失
5:需要在中断函数内部更改的值需要声明为volatile类型
下面就给出一个官方实例:
int pin = 13; & & & & & & & & & & & & & & & & & //LED灯的引脚
volatile int state = LOW; & & & & & & & & &//设置LED灯状态
void setup()
& pinMode(pin, OUTPUT);
& attachInterrupt(0, blink, CHANGE);& //设置触发类型为CHANGE,中断号0,即数字2口
void loop()
& digitalWrite(pin, state); & & & & & & & & &//对观察灯写入状态值
void blink() & & & & & & & & & & & & & & & & & & &//触发函数
& state = ! & & & & & & & & & & & & & & & //将状态变量求反
2.detachInterrupt(interrupt)
当我们需要取消中断时,我们有下面的命令。
detachInterrupt(interrupt)
interrupt 是中断号。执行此语句后,系统不会对中断有反应,即上例中,系统不会再对灯状态进行改变。
三、定时中断
& & &Arduino已经为我们写好了定时中断的库函数了,我们可以直接直接使用,这对于对底层了解较少的同学来说真是一个好消息。常用的库有FlexiTimer2.h和MsTimer2.h,这两个库的用法是大同小异的。下面对其中的几个常用的函数进行详细的介绍。这两个库你可以很轻松的从网上下载。
1.void set(unsigned long ms, void (*f)())
& & &这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(*f)()表示被调用中断服务程序,只写函数名字就可以了。
2.void start()
& & &开启定时中断
3.void stop()
& & &关闭定时中断
注意:以上三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域,如:MsTimer2::start();可以通过下面这个例子来详细的了解一下定时中断。
#include &MsTimer2.h& & & & & & & & & & &//定时器库的 头文件
void flash() & & & & & & & & & & & & & & & & & & & //中断处理函数,改变灯的状态
{&&&&&&&&&&&&&&&&&&&&&&&
& static boolean output = HIGH;
& digitalWrite(13, output);
& output = !
void setup()
& pinMode(13, OUTPUT);
& MsTimer2::set(500, flash); & & & & & & & // 中断设置函数,每 500ms 进入一次中断
& MsTimer2::start(); & & & & & & & & & & & & & //开始计时
void loop(){}
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:67次
排名:千里之外arduino(10)
一、中断(Interrupt)的基本概念
中断(Interrupt)是计算机的一个重要概念,现代计算机普遍采用中断技术。
什么是中断呢?
CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务). &待CPU将事件B处理完毕后, 再回到原来被中断的地方继续执行程序(中断返回),这一过程称为中断
打个比方:假如你正在读书,这时电话响了。你放下手中的书,去接电话。接完电话后,再继续回来读书,并从原来读的地方继续往下读。
当中断发生时,程序执行流程图示如下:
计算机为什么要采用中断?
为了说明这个问题,再举一例子。假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间。计算机也是一样,例如键盘输入,如果不采用中断技术,CPU将不断扫描键盘有否输入,经常处于等待状态,效率极低。而采用了中断方式,CPU可以进行其它的工作,只键盘有按键并发出中断请求时,才予以响应,暂时中断当前工作转去执行读取键盘按键,读完成后又返回执行原来的程序。这样就大大地提高了计算机系统的效率。
中断的种类和优先级
先看一个PC上的中断(如下图,在我的电脑属性-设备管理器-查看-依连接顺序排列资源,再展开中断请求)
可见,中断0是系统时钟,中断1是键盘,中断4是COM1 ...
中断号越低的优先级越高。
所谓优先级,就是当两个或多个中断请求同时发生时,CPU先响应优先级最高的中断
Arduino Nano 使用ATMega328芯片,支持几种中断: RESET中断、外部中断、时钟中断
RESET中断,就是当RESET管脚接低电平,则中止当前程序,重启CPU
时钟中断,是指设定CPU内部定时器后,当到达指定时间,将产生中断请求。常用于定时。
外部中断,就是当CPU的外部中断管脚电平变动时,将产生中断请求。 常用于键盘输入、串口通信等。
有两个管脚(D2, D3脚)支持外部中断。使用中断前,需先设置CPU为中断Enable状态。
二、Arduino的定时器中断
使用定时器中断前,必须先安装MsTimer2库,并在程序中引用头文件 MsTimer2.h中。使用例程如下:
#include &MsTimer2.h&
//定时器库的头文件
int tick = 0; //计数值
//中断服务程序
void onTimer()
Serial.print(&timer &);
Serial.println(tick++);
void setup()
Serial.begin(9600); //初始化串口
MsTimer2::set(1000, onTimer); //设置中断,每1000ms进入一次中断服务程序 onTimer()
MsTimer2::start(); //开始计时
void loop()
程序运行效果:&
每隔1000毫秒,产生一次时钟中断,并进入中断服务程序 onTimer(), 向串口打印一串文字。
在Arduino IDE中打开串口监视窗口,可见打印的文字
如果编译过程出现错误“error: 'MsTimer2' has not been declared”,多半是因为MsTimers库未安装。
MsTimer2库的安装方法:
1, 新建一个目录名为 MsTimer2, &在&/PaulStoffregen/MsTimer2 下载全部文件, 存入目录中。
2, 在Arduino IDE中,点菜单“Sketch -- Import Liberary -- Add Liberary”,选择MsTimer2目录后,点确定
三、Arduino的外部中断
我们把一个按键开关,接在数字管脚上,触发外部中断事件。
不是所有数字管脚都支持外部中断,对于Arduino NANO, &D2, D3两个脚支持外部中断。
1, 准备元器件和器材
& & &按键开关 &一个
& & &面包板一块
& & &1K 电阻一个
& & & 杜邦线若干
2 电路原理图
图中: &开关接在5V与GND之间,串接一个电阻R作为限流电阻。D2接到开关上。
当开关闭合, D2的电平为0V(低电平), &当中断有效时,将触发外部中断。
3,用面包板接线
把开关,&电阻插入面包板, 按上述电路原理图,用杜邦线接好线
4, 在Arduino IDE中写个Arduino程序
int pinInterrupt = 2; //接中断信号的脚
void onChange()
if ( digitalRead(pinInterrupt) == LOW )
Serial.println(&Key Down&);
Serial.println(&Key UP&);
void setup()
Serial.begin(9600); //打开串口
pinMode( pinInterrupt, INPUT);//设置管脚为输入
//Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化
attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, CHANGE);
void loop()
// 模拟长时间运行的进程或复杂的任务。
for (int i = 0; i & 100; i++)
// 什么都不做,等待10毫秒
delay(10);
运行效果:&在Arduino IDE中打开串口监视窗口,可见打印的文字
当按键按下,进入中断服务程序,打印 &&Key Down&
当按键抬起,进入中断服务程序,打印 &&Key Up&
上述程序如果在Arduino 1.0版本编译时,出现错误“NOT_AN_INTERRUPT' was not declared”,则在程序最开始处加一句
#define NOT_AN_INTERRUPT -1
附:attachInterrupt()函数的语法介绍
attachInterrupt( digitalPinToInterrupt(pin) , function, mode)
digitalPinToInterrupt(pin) :取得引脚pin的中断号&
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数称为中断服务程序。&
mode:定义何时发生中断以下四个contstants预定有效值:
LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断.
一、中断(Interrupt)的基本概念
中断(Interrupt)是计算机的一个重要概念,现代计算机普遍采用中断技术。
什么是中断呢?
CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务). &待CPU将事件B处理完毕后, 再回到原来被中断的地方继续执行程序(中断返回),这一过程称为中断
打个比方:假如你正在读书,这时电话响了。你放下手中的书,去接电话。接完电话后,再继续回来读书,并从原来读的地方继续往下读。
当中断发生时,程序执行流程图示如下:
计算机为什么要采用中断?
为了说明这个问题,再举一例子。假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间。计算机也是一样,例如键盘输入,如果不采用中断技术,CPU将不断扫描键盘有否输入,经常处于等待状态,效率极低。而采用了中断方式,CPU可以进行其它的工作,只键盘有按键并发出中断请求时,才予以响应,暂时中断当前工作转去执行读取键盘按键,读完成后又返回执行原来的程序。这样就大大地提高了计算机系统的效率。
中断的种类和优先级
先看一个PC上的中断(如下图,在我的电脑属性-设备管理器-查看-依连接顺序排列资源,再展开中断请求)
可见,中断0是系统时钟,中断1是键盘,中断4是COM1 ...
中断号越低的优先级越高。
所谓优先级,就是当两个或多个中断请求同时发生时,CPU先响应优先级最高的中断
Arduino Nano 使用ATMega328芯片,支持几种中断: RESET中断、外部中断、时钟中断
RESET中断,就是当RESET管脚接低电平,则中止当前程序,重启CPU
时钟中断,是指设定CPU内部定时器后,当到达指定时间,将产生中断请求。常用于定时。
外部中断,就是当CPU的外部中断管脚电平变动时,将产生中断请求。 常用于键盘输入、串口通信等。
有两个管脚(D2, D3脚)支持外部中断。使用中断前,需先设置CPU为中断Enable状态。
二、Arduino的定时器中断
使用定时器中断前,必须先安装MsTimer2库,并在程序中引用头文件 MsTimer2.h中。使用例程如下:
#include &MsTimer2.h&
//定时器库的头文件
int tick = 0; //计数值
//中断服务程序
void onTimer()
Serial.print(&timer &);
Serial.println(tick++);
void setup()
Serial.begin(9600); //初始化串口
MsTimer2::set(1000, onTimer); //设置中断,每1000ms进入一次中断服务程序 onTimer()
MsTimer2::start(); //开始计时
void loop()
程序运行效果:&
每隔1000毫秒,产生一次时钟中断,并进入中断服务程序 onTimer(), 向串口打印一串文字。
在Arduino IDE中打开串口监视窗口,可见打印的文字
如果编译过程出现错误“error: 'MsTimer2' has not been declared”,多半是因为MsTimers库未安装。
MsTimer2库的安装方法:
1, 新建一个目录名为 MsTimer2, &在&/PaulStoffregen/MsTimer2 下载全部文件, 存入目录中。
2, 在Arduino IDE中,点菜单“Sketch -- Import Liberary -- Add Liberary”,选择MsTimer2目录后,点确定
三、Arduino的外部中断
我们把一个按键开关,接在数字管脚上,触发外部中断事件。
不是所有数字管脚都支持外部中断,对于Arduino NANO, &D2, D3两个脚支持外部中断。
1, 准备元器件和器材
& & &按键开关 &一个
& & &面包板一块
& & &1K 电阻一个
& & & 杜邦线若干
2 电路原理图
图中: &开关接在5V与GND之间,串接一个电阻R作为限流电阻。D2接到开关上。
当开关闭合, D2的电平为0V(低电平), &当中断有效时,将触发外部中断。
3,用面包板接线
把开关,&电阻插入面包板, 按上述电路原理图,用杜邦线接好线
4, 在Arduino IDE中写个Arduino程序
int pinInterrupt = 2; //接中断信号的脚
void onChange()
if ( digitalRead(pinInterrupt) == LOW )
Serial.println(&Key Down&);
Serial.println(&Key UP&);
void setup()
Serial.begin(9600); //打开串口
pinMode( pinInterrupt, INPUT);//设置管脚为输入
//Enable中断管脚, 中断服务程序为onChange(), 监视引脚变化
attachInterrupt( digitalPinToInterrupt(pinInterrupt), onChange, CHANGE);
void loop()
// 模拟长时间运行的进程或复杂的任务。
for (int i = 0; i & 100; i++)
// 什么都不做,等待10毫秒
delay(10);
运行效果:&在Arduino IDE中打开串口监视窗口,可见打印的文字
当按键按下,进入中断服务程序,打印 &&Key Down&
当按键抬起,进入中断服务程序,打印 &&Key Up&
上述程序如果在Arduino 1.0版本编译时,出现错误“NOT_AN_INTERRUPT' was not declared”,则在程序最开始处加一句
#define NOT_AN_INTERRUPT -1
附:attachInterrupt()函数的语法介绍
attachInterrupt( digitalPinToInterrupt(pin) , function, mode)
digitalPinToInterrupt(pin) :取得引脚pin的中断号&
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数称为中断服务程序。&
mode:定义何时发生中断以下四个contstants预定有效值:
LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:286196次
积分:3506
积分:3506
排名:第7355名
原创:62篇
评论:90条
(1)(17)(1)(6)(2)(1)(3)(2)(5)(19)(3)(2)

我要回帖

更多关于 arduino库函数 的文章

 

随机推荐