单片机中断系统问题

下降沿与低电平中断的问题|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
这么一段程序:void INT0Fun() interrupt 0&&{EA =0;Delay(40);open++;EA =1;} 为什么用一个下降沿触发中断,程序会响应两次呢?(open的值增大了2) 而用低电平触发,却只正确地响应一次。
赞助商链接
想知道外部中断源是来自哪里?程序里外部要把总中断关了再开呢?
赞助商链接
外部中断源接了一个反相器,再接开关,接正电源主程序段:do {&&&&if (open!=0)&&&&&&&&&&&&&&&&&&&&{&&&&J2=0;&&&&Delay(100);&&&&J3=1;&&&&Delay(30);&&&&&&&&&&&&J3=0;&&&&J4=1;&&&&Delay(30);&&&&&&&&&&&&J4=0;&&&&J5=1;&&&&Delay(30);&&&&&&&&&&&&J5=0;&&&&J6=1;&&&&Delay(30);&&&&&&&&&&&&J6=0;&&&&Delay(60);&&&&open--;&&&&if (open&0) open=0;&&&&if (open&5) open=5;&&&&&&&&&&&&&&&&&& }}while(1);
最好在退出的时候做一个按键测试,让按键弹开再退出,同时做一次清中断信号(IE?=0)。这样可避免重复中断。
总中断关了做什么呢?
这是个好办法,谢谢
就是为了不重复中断
楼主也是个老鸟了.应该知道单片机应该是死的,所以还是自己某些问题没有想到.经过楼主的说明我认为是你的输入中断信号有毛刺,你经过了反相器但是没有消抖,单片机的执行速度是很快的.你的下降沿一到单片机就立马进入了中断.同时中断标志也被清除了.你的程序开始了延时消抖,但是这没用,因为中断标志已经被清除,所以信号中的毛刺(在延时中的时候)的下降沿会重新建立中断申请,但是有同级中断在执行,所以申请标志一直存在.但不会被执行.同样不会被清除(低电平中断的话标志会被自动清除的,所以电平方式不会重复执行)直到你的中断执行完毕退出,发现还是有一个中断申请,所以单片机又重新进入中断再执行一遍.楼主应该在中断中消抖的时候把毛刺产生的中断申请清除.void INT0Fun() interrupt 0&&{//EA =0;Delay(40);IE0=0;&&&&&&//加上这句你再试下吧.手动清除中断请求标志open++;//EA =1;}
有空试试,我很业余的。很多讲51的C语言教程对中断都说得少。
查看完整版本: [--
Powered by
Gzip enabled本帖子已过去太久远了,不再提供回复功能。&80C51中断系统的结构
& & & &80C51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。
& & &1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
& & &2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
中断允许控制
&&&&&&& CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
?&&&& EX0(IE.0),外部中断0允许位;
?&&&& ET0(IE.1),定时/计数器T0中断允许位;
?&&&& EX1(IE.2),外部中断0允许位;
?&&&& ET1(IE.3),定时/计数器T1中断允许位;
?&&&& ES(IE.4),串行口中断允许位;
?&&&& EA (IE.7), CPU中断允许(总允许)位。
& & 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
中断应用的具体例子:
void main()
EA &= 1; & & & &//开总中断
EX0 = 1; & & & //外部中断0允许位
IT0 = 0; & & & & //0为低电平触发, 1下降沿触发。单片机复位后默认该寄存器为0,故设置为 低电平 & & & & & & & & & & & & & & & & & 触发时此句可省略
& & & &......................
& & &while(1)
void & int0() & interrupt &0
..........
& & & 中断需要做的事情
低电平中断,出现跳回主函数执行的问题:
& &&&&& 当INT0设置为低电平触发时,并且该引脚一直保持低电平,则在置于低电平的时候,响应中断,点亮LED等,执行完中断服务程序后,系统返回while循环,执行响应中断前的任务,因为是电平触发,又一次进入中断、中断服务程序、返回,重复这个顺序。这种中断叫做咬尾中断,中断来临压栈、中断服务程序执行完出栈返回主循环,连续两个中断处理之间有时间间隔,这个间隔时间主程序在运行,因为主程序每次只执行很短的时间,所以你看到的现象就是缓慢变化。
& & & 也就是说,每次中断执行完毕,返回主函数会执行主函数中的一条以上指令,然后再次相应中断,进入中断,执行中断服务函数,返回,如此重复执行。主函数中的每条命令会,一次执行下去,只是执行速度会慢了很多。
外部中断边沿触发和电平触发的区别:&
下降沿触发:当从高至低电平转变时,触发产生;低电平保持多久都只产生一次。所以,边沿触发适合与以负脉冲形式输入的外部中断请求。&
低电平触发:那么在低电平时间内中断一直有效;因此如果在电平没有恢复之前中断程序就已经执行完成从而退出,那么会在退出后又再次进入中断;但只要中断没有退出是不会重复触发的。所以,电平触发方式适合于外部中断以低电平输入而且中断服务能清除外部中断源的情况(实际中通常采用这样的做法:在中断退出前关闭中断,等后面恰当时机再打开)。
参考资料:
/link?url=_L5NyIk3R2OdrkUxY2mqD5Cv2saS97Ra5UmHzi3es0MS_R69W-DVR769g74qo1X5zKMy0ljpKQKWBGZ95CF0pq&qq-pf-to=pcqq.group
/link?url=1Hqh3Fb_6NUkIzaGA82C-nNSQIUVaImiq_VvphdV07IRchbA9KY3ubd6VCOwDOl1v8_xqwE-bK3tyJ2ubnGMROw_dG0qKz8MpFbhaKiiODW&qq-pf-to=pcqq.group
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号21ic官方微信 -->
ARM单片机三种中断返回情况的分析与解决
是大多数新手选择的入门切入点,但由于知识的不足,在设计过程中新手们经常会遇到这样或那样的问题,ARM异常中断返回就是这样一种令人头疼的问题。在ARM的使用问题中异常中断返回是新手们较为苦恼的问题,本文就将对ARM异常中断的集中情况进行总结,并给出了一些解决方法。
在正式介绍之前,要为大家补充一些较为重要的基础知识。首先R15(PC)总是指向&正在取指&的指令,而不是指向&正在执行&的指令或正在&译码&
的指令。一般来说,人们习惯性约定将&正在执行的指令作为参考点&,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;而ADS中的pc,是为了调试看着方便而修改过的,它指向的是正在执行的指令,即&真正pc-8&!
SWI和未定义指令异常中断的返回
指令地址:
A PC-8当前指令为SWI或未定义指令,此时发生中断.PC的值还没有更新。
A+4 PC-4中断时处理器将PC-4保存到LR。;r!
返回时,从发生中断的指令A(PC-8)的下一条指令A+4(PC-4)处开始执行,所以直接把LR的值赋给PC就行了,具体指令为MOV
PC,LR(PC=A+4=LR)。
白话解释:对于SWI和未定义指令发生异常时pc没有更新,根据ARM的三级流水线原理,pc没有更新,仍然等于(A+8);lr = pc &
4(这时处理器决定的,无法更改!)即A+4。
由于这类异常返回后应执行下一条指令(A+4),所以返回时,pc=lr即可。
IRQ 和FIQ异常中断处理的返回指令地址对应于PC A,PC-8执行此指令完成后(!)查询IRQ及FIQ,如果有中断请求则产生中断。
A+8 PC ;lr!
(此时PC的值已经更新,指向A+12.将当前PC-4,即A+8)。
保存到LR.返回时,要接着执行A+4(LR-4)处的指令,所以返回指令为:
SUBS PC,LR,#4(PC=A+4=LR-4)
白话解释:对于普中断和快中断异常,中断必须在一条指令执行完以后被检测到,如正在执行指令甲时发生了中断,不等指令甲执行完是不会处理该中断的,发生异常时pc已经更新(A+12);
lr=pc& 4(这时处理器决定的,无法更改!)即A+8返回后,应执行被中断而没有执行的指令(上面的A+4),所以返回时,pc= lr-4。
指令预取中止异常中断处理的返回
指令地址:
A PC-8 执行本指令时发生中断,A+4 PC-4处理器将A+4(PC-4)保存到:
LR. ;lr!A+8 PC
返回时,发生指令预取中止的指令A(PC-8)处重新执行,所以返回指令为SUBS PC,LR,#4(PC=A=LR-4)。
白话解释:对于预取指令中止异常发生预取指令异常时,是在执行时发生的异常,pc未更新,即pc=A+8;lr=pc &
4(这时处理器决定的,无法更改!)即A+4。
由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-4。
数据访问中止异常中断处理的返回
指令地址:
A PC-8 本指令访问有问题的数据,产生中断时,PC的值已经更新。
A+4 PC-4 中断发生时PC=A+12,处理器将A+8(PC-4)保存到LR.。
A+8 PC ;lr!
返回时,要返回到A处继续执行,所以指令为SUBS PC,LR,#8.(PC=A=LR-8)
白话解释:对于数据访问中止异常时,是在执行时访问数据错误。
导致的异常,pc已经更新,即pc=A+12。
lr=pc&4(这时处理器决定的,无法更改!)即A+8。
由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc=lr-8。
引起PC更新的原因一种是数据中止,还有就是中断了。
中断必须是在一条指令执行完毕后才能被检测到,所以它中断的只是还未执行的那条。指令(pc-8),所以pc=lr & 4;
与中断相同,SWI和未定义指令异常也是返回到下一条指令(pc-4),只是他们在执行时,PC的值并没有更新,所以pc= lr。
预取指令中止异常,也没有发生pc更新,但它还得重新执行发生异常的那条指令,所以pc=lr&4。
数据访问中止异常,发生了pc更新,并且它也需要重新执行发生异常的那条指令,所以pc=lr&8。
通过以上的介绍,可以看到造成单片机中断返回的原因非常多,每种方法的应对方案都不尽相同。在ARM芯片调试过程中遇到中断返回问题的朋友不妨仔细阅读本文,相信会从中找到问题的解决方法。也可收藏本文以备不时之需,在遇到错误的时候进行查阅。
运动品牌 Under Armour 不但在 CES 上展出了智能运动鞋,同时还推起了旗下首款睡衣。
......关键字:
就在本月初,ARM控股宣布称将与阿里巴巴集团在数据中心业务方面展开合作,母公司软银也是后者的最大股东。据悉阿里巴巴将在自家数据中心的服务器上大量采用ARM设计的低功耗处理器,并逐步替代Intel产品。......关键字:
Oculus表示,开发者只需通过两个软件就可以在网页上开发出简单的虚拟现实体验。一个是基于网页开发工具React的新软件,另一个是Oculus专为虚拟现实打造的全新浏览器
。Oculus宣称帮助用户打造这些体验的方法就是通过......关键字:
基于ARM+FPGA的高速同步数据采集方案,主要包括以下几个部分:ARM控制器、存储电路、FPGA逻辑控制电路、A/D转换电路、FIFO缓存、电源电路、接口电路等。......关键字: 北京时间10月26日消息,ARM公司与许多企业建立了合作关系,2015年,这些合作伙伴出货的产品数量超过150亿,芯片销售额达到了500亿美元。今年9月,软银以310亿美元收购ARM,CEO孙正义成为ARM的新主人。最近,ARM召开开......关键字:
今天,CentOS系统开发人员Fabian Arrotin非常高兴的宣布为ARM(armhfp)硬件架构发布CentOS Linux 7(1611)镜像。该GNU/Linux发行版本深受单板计算机和嵌入式设备的喜爱,支持树莓派3、树莓派2、......关键字:
近日,高通对外正式宣布称,自家是目前唯一一家与ARM达成协议,获得推出可运行 Windows系统芯片的授权许可。不过,ARM高管近日澄清称,ARM并没有阻止授权芯片厂商开发可运行x86系统的芯片,而且法律上也没有限制。......关键字:
Click-ARM one平板电脑的另一个CK模块提供16 GB存储空间,而10.1英寸显示屏也支持替换,在三个CK模块插槽顶部,带有四个小的PCIe连接器,可用于工业标准组件,如无线......关键字:
我 要 评 论
大家都爱看
&2018年年中,也就是6月份的时候,5G的第一个全球通用标准有望对外发布,主要是支持人与人的网络,而到了2019年的6月份,支撑物与物连接的标准也会对外公布。&rdqu…
虽然现在各大厂商都会为手机及手提电脑提供各种信息安全措施,比如要输入密码登入及远距锁机等,但由于资料始终仍储存在机内,一旦遗失了就十分麻烦。有鉴于此,最近有中…
不久前 Sony 才发布了一款比米粒还小的微型感光元件,近日则进一步发布拍摄帧率可达 1,000fps 的超高速 CMOS 感光元件,可见近期 Sony 在感光元件的研发上已不局限于传统的画质、感光度等需求,…
根据国际半导体产业协会(SEMI)之Silicon Manufacturers Group
(SMG)最新公布年终硅晶圆产业分析报告显示,2016年全球硅晶圆出货总面积较2015年增加3%,且总营收略微成长1…
该研究小组研发的是一款频率在290GHz到315GHz的发射器,能够实现105Gbps的通信速度。…
业界早知道
02-20欧洲议会想为机器人立法,却拒绝纳税02-20百度的人工智能上线了,但是总有点差强人意02-20我们有世界第一的计算机,真的能做出世界第一的应用吗02-20机器人的发展,导致工厂用人呈下降趋势02-20首个国家级智能化协同制造实验室成立02-20存储模式多,哪个更靠谱?
精读涨姿势
03-2309-0806-0802-1706-0806-30首先介绍一下51的寄存器组:通过设置PSW寄存器的第3位和第4位可以任意切换寄存器组。在进入中断前,切换寄存器组,可以方便的保护原寄存器组的数据不被中断里的语句破坏,很方便。RS1RS0 字节地址000组寄存器00H~07H011组寄存器08H~0FH102组寄存器10H~17H113组寄存器18H~1FHRS1=PSW.4RS0=PSW.3常见错误有三种:1、为中断函数指定了第0组寄存器C程序:voidint0()interrupt0using0编译后的汇编如下:PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWMOVPSW,#0x00。。。。。。因为main()函数使用的就是第0组寄存器,中断程序会改变寄存器组的数据。主程序运行时,随时都有可能产生中断,等中断返回主程序时,寄存器R0-R7的值已经被改变了。这是非常严重的错误。而且故障时有时无,错误也是莫明其妙。2、中断优先级不同,寄存器组号相同C程序:voidint0()interrupt0using1//低优先级中断voidT0()interrupt1using1//高优先级中断因为高优先级的中断可以打断正在执行的低级中断,转向持行高级中断。这就是所谓的中断的中断。与第1种错语一样,高级中断的程序,会改变低级中断正在使用的寄存器。3、不写using。严格的说,这样写不能算是错误。但这是相当不好的习惯。C程序:voidint0()interrupt0编译后的汇编如下:PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWMOV PSW,#0x00PUSH0x00PUSH0x01PUSH0x02PUSH0x03PUSH0x04PUSH0x05PUSH0x06PUSH0x07。。。。。。没用using指定寄存器组,编译器就默认分配了第0组寄存器,然后又用8条语句把第0组的R0-R7保存到栈中,退出中断时还需要8个弹栈。这样“笨拙”的写法,占用了程序空间32个字节、占有堆栈8个字节。也许高级版本的编译器会改进吧,搞单片机的还是规矩些好。经验总结:1、写中断程序一定要用using语句指定寄存器组。第1、2、3组都可以,不能是0.2、51单片机的中断有两个优先级。一个中断不会打断另一个相同优先级的中断。这样相同级别中断可以使用同一个组。比如:低优先级的中断函数都用using1,高优先级的中断都用using2。这样不会冲突。下面是一个正常的例子:C程序:voidint0()interrupt0using1编译后的汇编如下:PUSHACCPUSHBPUSHDPHPUSHDPLPUSHPSWMOV PSW,#0x08。。。。。。就是这么简单。虽然这点事儿对老鸟不算什么问题,但新手朋友犯此错误的可不少。我遇到的就不下15个了。今天我写这个贴子,也是为所有新手提个醒。到处救火不如防患于未燃。畅学电子(changxuedianzi)
 文章为作者独立观点,不代表大不六文章网立场
changxuedianzi谢谢关注畅学电子网,让我们一起开启知识的大门吧!热门文章最新文章changxuedianzi谢谢关注畅学电子网,让我们一起开启知识的大门吧!&&&&违法和不良信息举报电话:183-
举报邮箱:Copyright(C)2017 大不六文章网

我要回帖

更多关于 单片机定时器中断 的文章

 

随机推荐