极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 迷你强

Arduino入门教程--第十九课--Arduino中断的使用

  [复制链接]
发表于 2013-8-12 17:14:09 | 显示全部楼层
arduino_ykk 发表于 2013-5-19 14:41
为什么第一个实验,小灯在没有按钮触发的情况下会是亮的?好像要有状态变化的信号灯才会变化吧?可是我在 ...


刚开始时,从5V到D2是个完整回路,所以D2的状态是高电平,此状态赋给LED自然是亮的。

如果按下按钮,D2被短接,从5V到GND才是完整回路,此时D2为低电平,则LED就灭了。
回复 支持 反对

使用道具 举报

发表于 2013-8-12 17:21:29 | 显示全部楼层
最开始那段讲中断的文字,到了“进入正题”前面,怎么半截就没了?

干脆帮LZ贴上来吧:

============ 勤劳的分割线 =============

一、中断的基本原理

什么是中断?中断的过程是什么?要搞清楚这个问题,我们先从生活中的一个例子开始:你正在家中看书,突然电话铃响了,你放下书,去接电话,和来电话的人交谈,通完电话,回来继续看你的书,这就是生活中的“中断”现象—就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对我们学习中断会很有帮助:

第一,中断源。什么可引起中断,生活中很多事件都可以引起中断,比如:有人按了门铃、电话铃响了、你的闹钟响了、你烧的水开了……等等诸如此类的事件,我们把可以引起中断的事件称之为中断源。单片机中也有一些可以引起中断的事件(比如:掉电、运算溢出、报警等等)。

第二,中断的嵌套与优先级处理。设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正在等一个很重要的电话,一般是不会去理会门铃的;而反之,如果你正在等一个很重要的客人,则可能就不会去理会电话了;如果两者都不是(既不等电话,也不等人上门),你可能会按你通常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有另一个中断产生的情况。比如你正在接电话,又有人按门铃的情况,或者你正开门与人交谈,又有电话响了的情况。考虑一下,我们一般会怎么办?

第三,中断的响应与处理。当有事件产生,进入中断之前我们必须先记住现在的书看到第几页了,或拿一个书签放在当前页的位置,然后去处理不同的事情(因为处理完了,我们还要回来继续看书),电话铃响我们要到放电话的地方去,门铃响了我们要到门那边去,也就是说不同的中断,我们要在不同的地点处理,而这个地点通常还是固定的。单片机中采用的也是这种方法,每个中断产生后都到一个固定的地址去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。

具体地说,单片机中断响应可以分为以下几个步骤:
1、停止主程序运行。当前指令执行完后立即终止现行程序的运行。
2、保护断点。把程序计数器PC 的当前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序。
3、寻找中断入口。根据不同的中断源所产生的中断,查找不同的入口地址。
4、执行中断处理程序。
5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继续往下执行。

以上工作是由计算机自动完成的,与编程者无关。

二、实现中断的好处

单片机为什么要有中断系统,使用中断有什么好处呢?日常生活中,我们除了看书,肯定还要做很多其他的事情,比如听电话,接待客人,烧水吃饭等等,单片机实行中断也有很多的好处,具体来说:

1、实行分时操作,提高CPU 的效率。只有当服务对象向CPU 发出中断申请时,才去为它服务,这样我们就可以利用中断功能同时为多个对象服务,从而大大提高了CPU 的工作效率。
2、实现实时处理。利用中断技术,各个服务对象可以根据需要随时向CPU 发出中断申请,及时发现和处理中断请求并为之服务,以满足实时控制的要求。
3、进行故障处理。对难以预料的情况或故障,比如掉电,事故等,可以向CPU 发出请求中断,有CPU 作出相应的处理。
回复 支持 反对

使用道具 举报

发表于 2013-8-23 21:55:57 | 显示全部楼层
楼主啊,请问一下如果不要用按钮,直接编程将中断口的电平改变能进入中断不?
回复 支持 反对

使用道具 举报

发表于 2013-10-15 22:58:58 | 显示全部楼层
chaoser 发表于 2013-8-12 17:14
刚开始时,从5V到D2是个完整回路,所以D2的状态是高电平,此状态赋给LED自然是亮的。

如果按下按钮, ...

5V到D2能成为回路,是不是应为D2为低电平,即,arduino的引脚默认都为低电平?
回复 支持 反对

使用道具 举报

发表于 2013-10-16 07:49:17 | 显示全部楼层
谢谢,好文!
回复 支持 反对

使用道具 举报

发表于 2013-10-16 21:37:07 | 显示全部楼层
天天逛极客都有进步啊
回复 支持 反对

使用道具 举报

发表于 2013-12-26 16:53:04 | 显示全部楼层
只是看看,还不太明白 。
回复 支持 反对

使用道具 举报

发表于 2014-1-21 09:12:00 | 显示全部楼层
新月 发表于 2013-12-26 16:53
只是看看,还不太明白 。

其实中断就是调用某个你写好的方法,这个有编程基础的人才明白
回复 支持 反对

使用道具 举报

发表于 2014-3-17 11:03:27 | 显示全部楼层
这个很有用处啊!
回复 支持 反对

使用道具 举报

发表于 2014-3-31 21:44:48 | 显示全部楼层
当年学完了微机原理竟然对中断没感觉。。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-4-3 12:02:06 | 显示全部楼层
有没有串口中断程序?感谢啦
回复 支持 反对

使用道具 举报

发表于 2014-6-22 21:10:07 | 显示全部楼层
01.int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
这句不会理解成第0引脚吗?
01.int pbIn = 2;          // 定义输入信号引脚
有点混乱求解
回复 支持 反对

使用道具 举报

发表于 2014-6-29 15:44:42 | 显示全部楼层
本帖最后由 pumpitup 于 2014-6-29 15:47 编辑

请问是否arduino的中断都是一样的?只有两个?

nnd删不掉,自己回答吧:mega 2560 有6路外部中断。2(中断0),3(中断 1),18(中断 5),19(中断 4),20(中断 3),and 21(中断 2)。触发中断引脚,可设成上升沿、下降沿或同时触发。

感觉计数器就是这样的东东,下降或上升沿触发的。
但是我用的一个机器,每个口都能用作计数器,是不是说明每个口都可作外部中断用的?
回复 支持 反对

使用道具 举报

发表于 2014-6-29 21:08:01 | 显示全部楼层
本帖最后由 b9ss 于 2014-6-29 21:14 编辑

试了下 发现个问题 在中断处理程序里调用noInterrupts是无效的。
调用detachInterrupt却可以。


而且中断可以中断自己正在跑的中断处理程序。并且不会返回被中断的中断处理程序继续执行。
回复 支持 反对

使用道具 举报

发表于 2014-7-1 11:21:40 | 显示全部楼层
b9ss 发表于 2014-6-29 21:08
试了下 发现个问题 在中断处理程序里调用noInterrupts是无效的。
调用detachInterrupt却可以。

我说我一边中断一边串口输出结果,运行着运行着就没有任何反应了,是不是中断自己中断了处理程序,返回不来了?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 22:07 , Processed in 0.049641 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表