PIC单片机的中断讨论

发布者:翅膀小鹰最新更新时间:2016-09-01 来源: eefocus关键字:PIC单片机  中断讨论 手机看文章 扫描二维码
随时随地手机看文章
******************** 中断服务代码 
    btfss    INTCON,T0IE      ; 判断是否为 T0中断 
    goto    other_int 
    btfss    INTCON,T0IF      ; it ’s the time of T0 int 
    goto    other_int 
    bcf    INTCON,T0IF      ; 是T0中断,清除中断标 志 
    movlw    0x10          ; 微秒的高位字节加上定时时间 256x16分频=4096=0x1000的高位 (0x10) 
    addwf    us+1 
    goto    end_int           
other_int              ; 可 添加其他中断服务代码 
    nop              ; other isr code can be added 
;********************************** 
end_int                  ; 恢复现场 

================= 
假如又有新 的中断正好在这段程序中间产生 
btfss    INTCON,T0IF          
goto    other_int 
bcf    INTCON,T0IF      
程序岂不是要出错跑飞了 



john frank:

谢谢你 的关注。 

我讲一下自己的理解,权做回答,不当之处,还请站友们指点。 


    pic中档单片机系列没有“硬 件中断优先级别”(请允许我这样说),含义是指:当内核正在处理当前的中断服务A时,在这个期间里,其他任何中断的产生,只能使其标志位xxIF置1,不 能剥夺当前中断服务对CPU的占用权(反应在PC指针不能被新的中断改变指向),必须等到当前中断服务处理A完毕,然后,根据 goto other_int语句的转向,依次判断。若新发生的中断处理代码在中断服务A之后(前、后指代码在ROM中地址顺序,越大越后),则进行新发 生的中断处理;若恰好新发生的中断服务代码在刚被处理完毕的中断服务A代码之前,则将不予理会,(即程序指针PC不会在中断处理代码空间中又返回到 0004H的入口),等到执行到retfie 后返回主程序,然后再次进入中断入口0004H... 

   之所以说其无“硬件中断优先 级别”是与“软件中断优先级别”对应的,通过中断服务代码对中断标志和IE的检测的先后,可设立优先级。 

   当然,准确地说,这是一 种顺序,而非级别,呵呵。 

   如果了解一下51的中断系统,相信你能更好地理解PIC的中断的级别: 
将会出现你说的情况, 当优先级更高的中断来临时,内核将暂时停止当前中断服务,保存当前中断服务的现场,执行优先级更高的中断服务,处理完成后,恢复现场,执行未处理完成的中 断服务....,最后,返回主程序。 

    
   小弟讲得有点烦琐,并不形象,可能还有纰漏和谬误之处,请大家指正,相信 john frank在仔细看书之后,应该可以形成自己的正确看法。 


zdtdl :小弟说两句~~  

简单地说,当系统响应一个中断时,GIE位将被自动清零以禁止其他的中断,在执行中断返回指令RETFIE后系统再自动置GIE位1开 放中断。只要不在中断程序中对GIE置1,就不会产生反复进入中断的现象,靠查询方式决定响应谁。PIC也有中断嵌套,可以形成多级嵌套,甚至自身嵌套, 不过嵌套的级数绝对不能超过硬件堆栈的深度。 

------------------------- 

   PIC中档 单片机的中断总结正文 


一、中断活动的过程 

  对于PIC单片机来说,一次中断的过程大致有下列阶段: 

为 了使得说明形象和直观,本文采用一些诙谐的语句来比喻说明: 
中断请求---------比喻成申请买经济适用房的请求 
中断标志 -------一份申请书 
本中断使能xxIE-----本单位领导 
PEIE-------------户口办公室主任 
GIE-------------- 银行的管理信贷的科长 

  1. 中断请求:房子太少,儿子要结婚了,得买房了,可资源和财力有限,不能卖商品房, 只好按特殊情况处 理,写一份申请书(中断标志位IF置1); 

  2. 本单位领导xxIE看了之后, 如果给你盖了一个戳:(即该中断使能位 IE=1),那么恭喜你,这份申请书可以提交到更高一级的部门;如果没盖(xxIE=0),那么对不起,先放我这里吧,等我们研究研究好后再说。如果你不 开心,要拿回申请书撕掉,呵呵,那么IF=0;你的购房请求之梦破灭; 

  3. xxIE领导将根据户口,将这些请求书给分类,一类是 外地迁来的户口,提交给户口办公室PEIE主任审查,PEIE主任如果给你盖了个戳(PEIE=1),那么,他将会把申请书提交给银行的GIE科长批准, 否则就是放在这里再研究研究或者你要回来撕毁;一类是本地户口,可直接提交给银行的GIE科长批准,然后你将申请书带到GIE科长的办公室。 

  4. GIE 科长盖了章之后(GIE=1),然后,你就可以拿着申请书去找房地产商要房子了(此时PC指针=0004H),因为GIE科长有很多事情要做,所以他每盖 了一次戳之后(注意是一次不是一个,因为也许有多个中断同时发生,也就是说有其他地方的人来请GIE盖戳),就在办公室门外挂了个牌子:请勿打扰。他自己 则休息去了,直到接到RETFIE的电话或者有人打他的手机。 

  5. 房地产商准备给房子了,不过你最好得先把各项手续给填好,叫 5w押金,另外协议阿,合同阿,都得自己搞定,这叫“保护现场”。 

  6. 房地产商开始上班了,于是挨个查“申请书”是谁提交的,以 便给你安排你预定的房子。这个叫“中断查询”。 

  7. 查到是你的后,然后打电话让你过来,带你去看房子,把钥匙给你。这个交“中断 处理”。 

  8. 钥匙交给你之后,房子你是到手了,不过这份申请书就失效了,房地产商将该申请书销毁。这个叫“清除中断标志”。 

  9. 好 啦,现在你可以去房地产商自己去要回以前交的押金,身份证啊等等。这个叫“恢复现场”。 

  10. 最后,房地产商办完了,让 RETFIE小姐打个电话给GIE科长(执行RETFIE指令),GIE科长才起来,把“请勿打扰”的牌子取下,让其他的带着申请书的人进来。当然,如果 你的事情还没搞定,GIE科长的关系户打了他的手机(你在办事时-处理中断时,若有GIE被置1),他也会开门取下“请勿打扰”的牌子,让关系户进来,给 他盖好章。这下就对不起了,人家有关系,所以你的事情要马上停下来,先等关系户办完他的事情之后,再给你办你的事情。这个叫“中断嵌套”,要注意GIE科 长有8个关系户(硬件堆栈的深度为8级)哦。 


二、需要注意的问题: 


1. 中 断现场的保护(可以参考以前的帖子,在xieyubing版主的指点下,有恰当的例子); 

2. 初次上电复位、电源跌落复位和其他情况 下的复位,均使得全局中断位GIE和其他中断使能位xxIE=0; 

3. 中断标志位的状态与该中断源是否被屏蔽无关,与全局中断使能位 GIE也无关。 
4. 当开放某一中断源时,该中断源就是通过中断标志向CPU申请中断的,无论什么原因,只要标志位IF置1(可以用软件强行置 1),均会产生中断请求。 

5. 当中断标志位为1,如果该中断被屏蔽或者被禁止了,只要不清除标志位,那么该中断请求会被潜伏下来,一 旦屏蔽解除,立即产生中断响应。反之,如果在屏蔽/禁止条件解除之前清除了该标志位,那么则无中断请求。 

6. 当CPU响应任一中断 时,全局中断使能位GIE会自动清零;当中断返回时,它有自动置1。如果在中断处理期间,用软件将已经清零的GIE位又重新置位,这个时候若再出现中断请 求,就可以形成了中断嵌套。即:在处理某一中断期间又响应了其他中断请求,就形成了中断嵌套,此时,前一中断处理过程会被暂停而进入新的中断处理,当新中 断处理完毕后,才会继续处理前一个被搁置的中断。此方式可以形成多级嵌套,但不能超过硬件堆栈的深度8级,以免造成堆栈溢出而不能正常返回。 

7. 如 果同时发生多个中断请求,则中断处理的顺序取决于中断程序中的检查中断源的顺序。 

8. 若要防止中断请求被丢失:则要注意下面两种情 况:如果同一中断源的中断发生间隔时间大于该中断服务的处理时间,则可能出现中断事件被忽略(体现在中断服务的过程中,标志位被连续发生来两次置位),例 如:中断事件发生的时间间隔为30ms,中断服务处理加上跳转判断的时间为50ms,则情况将会如下所示: 

   [中断次数 ----------1][中断次数----------2][中断次数----------3][中断次数----------4] 
   [处 理次数------------------------1][处理次数------------------------2][处理次数 ------------------------4] 
如果在中断处理一开始就清除IF,那么如上图所示,中断事件3、4 在处理次数2的过程 中发生来两次,那么即使IF清除发生在中断次数3发生之前,也将丢失第三次中断。 


另外,即使中断出现的时间间隔大于中断服务的 时间间隔,如果清除中断标志位的指令安排在中断服务子程序的尾部,就有可能造成丢失该中断请求(即两次中断标志置位的事件只对应一条清除指令和一次中断处 理。 

9. 在进行查表操作时必须禁止CPU响应中断,以避免中断返回时跳转到不希望的地址上去。 

三、 一个疑惑 


一个疑问:一些书上提到:如果对寄存器INTCON进行“读-改-写”操作的时候,要事先将GIE 清0,再对INTCON进行操作,然后将GIE恢复为1 
即BCF INTCON,GIE 
  BSF INTCON,XX 
  BSF INTCON,GIE 
所提到的理由是:当CPU正在执行一条对INTCON寄存器进行“读-改-写”操作的指令时,如果恰好发生了中断请求,则中断服务程序会被执行 两次。这是因为当中断请求发生后INTCON寄存器的GIE寄存器会被硬件自动清零(屏蔽所有中断),并且程序转入中断例程入口(0004h)。当GIE 被清零后,这时如果CPU正在执行一条对INTCON“读-改-写”的指令时,则GIE位还会被写会操作重新置1,这样就会造成CPU两次进入中断服务程 序。 


该段解释晦涩难懂,根据中断发生过程的时序(PICmicro中档单片机系列参考手册的第8-2页):在第n个指令周期 里,CPU检测到IF标志位为1,则在n+1个周期内将自动使得GIE=0,该周期内既不取指也不执行指令,然后在n+2个指令周期里,0004h指针装 入PC指针,该周期也不运行其他指令,只完成0004H->(PC)的取指过程,第n+3个指令周期里,CPU执行0004h地址的指令码,并同时 取0005h的指令码。 

显然,作者提到的“当GIE被清零后,这时如果CPU正在执行一条对INTCON“读-改-写”的指令时,则 GIE位还会被写会操作重新置1,这样就会造成CPU两次进入中断服务程序。”的解释存在下面的问题:GIE被硬件自动清零时的那个周期,是一个空运行周 期,CPU并不执行指令,下一个周期也是空运行周期,不过是完成将0004h地址中的代码取指操作。然后就开始了0004h地址的代码的执行操作和 0005h地址代码的取指过程。那么GIE在被硬件自动清零后要想置会1,只有两种方法:RETFIE指令使GIE自动置1;通过软件指令对GIE人为置 1。显然,如果对GIE人为置1的指令执行在对该标志位清零前,那么会出现前文所述的中断嵌套(设该中断为A),如果没有其他中断发生且执行顺序先于中断 A且对中断A的标志清零的话,那么中断A的嵌套是一个死循环。就不是执行两次的问题了----因为同一个中断嵌套时,GIE在自动清零被软件置一永远都发 生在清除IF之前,那么IF一直得不到清除,而GIE又几乎一直都是1。 


作者所说的情况似乎是这样的:读改写INTCON指令 按如下过程分解:读INTCON的时候,GIE先是为1的,此时发生了中断,GIE被硬件清零,开始执行中断服务程序,然后再IF标志没有清除之前,执行 INTCON的其他位的修改和写回操作,也将中断发生前的GIE读为1的信息写回GIE,这样,CPU被迫发生了第二次中断。显然,这样是将 BSF  INTCON, XX指令分解得支离破碎---本来一个指令周期可以完成的指令被跨了多个指令周期;而且一个指令周期的指令被CPU在不同地址 处分解执行读改写过程。

如果不是这样的话,那么作者的解释就自相矛盾:“当CPU正在执行一条对INTCON寄存器的‘读-改-写’操 作的指令时,如果恰好发生了中断请求  ”与“当GIE被清零后,这是如果CPU正在执行一条对INTCON‘读-改-写’的指令时”相互矛盾。 

总 之,我对这里的理解存在一些疑惑,请斑竹及各位前辈指点。
关键字:PIC单片机  中断讨论 引用地址:PIC单片机的中断讨论

上一篇:PIC单片机 C编程技巧
下一篇:Proteus-PIC-虚拟串口----串口调试仿真

推荐阅读最新更新时间:2024-03-16 15:07

PIC单片机之EUSART串行通信接口
PIC 单片机的EUSART是一种串行通信接口,我们可以利用他让不同设备之间传输数据,我们来讲讲我们最常用的串行异步接收和发送。 管脚 串行异步接收和发送。如果只要两个引脚,一个是接收RX 一个是发送TX。 数据格式 我们先来讲讲TX是如何发送出数据的,数据格式具体是什么样的。 如果我们要向其他设备发送个大写字母A。将是什么样的呢。 A 这个字母对应的ASCII码是65,对应的八位二进制数则是 01000100。TX就将对应的二进制码发送出去。 发送时用高电平来代表1,用低电平代表0. 那不发送数据的时候管脚就一直为高电平。 启动位和停止位 怎么区分现在是在发送数据还是在常态呢?所以在每
[单片机]
<font color='red'>PIC单片机</font>之EUSART串行通信接口
PIC单片机驱动LED数码管显示程序
;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1、2、3、4、5、6、7、8******* ;****http://www.51hei.com 单片机学习网经典程序已测试,led数码管共阴和共阳不同请修改码值转换表部分 LIST P=18F458 INCLUDE "P18F458.INC" ;所用的寄存器 XIANR EQU 0X20 ORG 0X00 GOTO MAIN ORG 0X30 ;****************以下为码值转换表******************** CONVERT ADDWF PCL,1 RETLW 0XC0 ;0,显示段码与具体的硬件连接有关 RETLW 0XF9
[单片机]
PIC单片机的第一个例程
今天白天在网上找软件找了好久,在官网下了MPLAB,和PICC还要注册比较麻烦。 今天用的软件Protues仿真的。 第一个程序点亮一盏灯,电路很简单。下面贴出程序。 #include pic.h //包含头文件 int main(void) { TRISB=0x00;//PortB方向寄存器,PortB为输出 while(1) { RB0=0; //PortB.0输出0,点亮LED } } 这里要注意,MPLAB中,项目的目录不能有中文,不然会出错的。刚开始上当了的。
[单片机]
PIC单片机-RS232串口通信
编写程序实现以下功能。在计算机上使用串口大师向开发板发每次发送1个字符。开发板每接收到一个数据,则交换该数据的高低4位,再发送回计算机。 端口初始化时使能发送与接收,使用扫描方式接收数据,接收到数据后立即交换高低四位并发送,交换高低四位方式如下: i = ((RCREG & 0xff) 4) | (RCREG 4) 完整程序: /******************************************************************************* * 标 题: 异步串口通讯 * 功能描述: 在计算机上使用串口大师向开发板发每次发送1个字符。 * 开发板每接收到一个数据,则交
[单片机]
PIC单片机与PC机实现串行通信的设计
1.实例目的: 本实例完全建立在计算机软件的基础上,利用PROTEUS软件构建一个单片机系统,利用VB编写一个计算机控制软件和单片机系统串行通信,计算机上的控制软件可以发送一个值在0——999之间的数,在单片机系统上显示出来,单片机系统上也可输入一个相同值域的数并在计算机控制软件上显示出来。本实例主要是为了展示虚拟串行通信的仿真。 2.系统配置 本实例虽然简单,但是要想看到想要的仿真结果,建立虚拟的串口连接是必不可少的。要想仿真串行通信,必须要把单片机系统上的串行口与计算机上的串行口连接,这样他们之间才能传输数据,但由于是仿真,实际没有相连接,所以需要创建一对虚拟串行口并使他们相连,这里我使用的是这个软件Virtual Ser
[单片机]
<font color='red'>PIC单片机</font>与PC机实现串行通信的设计
PIC单片机浮点数格式及其与十进制数之间的转换和程序设计步骤
在我们设计的仪表中采用PIC系列单片机,碰到了浮点数的运算问题,查阅其有关资料发现,其浮点数的格式及其与十进制数之间的转换,与我们常用的MCS-51单片机所提供的三字节、四字节浮点数完全不同,本文将说明其浮点数的格式及其与十进制数之间的转换和程序设计步骤。 1 浮点数的格式 Microchip公司单片机所采用的浮点数格式是IEEE-754标准的变异型。32位浮点数格式为: 其中:×表示一位二进制数0或1;eb为指数的偏差;S为浮点数的符号位,S=0为正数,S=1为负数;小数点“·”在符号位S的右边;BY0BY1BY2为尾数的小数部分。 应特别注意: ⑴浮点数隐含其整数部分为1。 ⑵十进制数0的浮点数表示为00H,00H,00
[单片机]
<font color='red'>PIC单片机</font>浮点数格式及其与十进制数之间的转换和程序设计步骤
PIC单片机访问铁电存储器的程序模块
//此子程序用于PIC系列单片机和铁电存储器FM24C04交换数据 #define bitset(var,bitno) ((var)|=(1 (bitno))) #define bitclr(var,bitno) ((var)&=((1 bitno)^0xff)) //定义铁电的写地址和读地址 //用高256字节,则为A2 A3 //用低256字节,则为A0 A1 #define WriteDeviceAdd 0xa2 //用高256字节 #define ReadDeviceAdd 0xa3 //用高256字节 #define SDA RC3 #define SCL RC2 /**********************
[单片机]
Microchip第60亿颗PIC单片机出货
全球领先的单片机和模拟半导体供应商—— Microchip Technology Inc. 宣布已把其第 60 亿颗 PIC 单片机(型号为 PIC 12F 635-I/P )交付给墨西哥白色家电制造商 Mabe 。这距离 2006 年 11 月 Microchip 第 50 亿颗单片机出货的时间仅相隔短短的一年。 Microchip 总裁兼首席执行官 Steve Sanghi 表示:“第 60 亿颗 PIC 单片机的出货是一项让我们引以为豪的成就,而更令我们欣喜的是能够把这颗单片机交付给墨西哥的客户。这说明 Microchip 多元化的嵌入式控制产品
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved