您的位置 首页 开关

PIC中档单片机的中止总结

与51或者其他系列的单片机相比,PIC 单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。 先摘引三个对PIC中断理解的回帖,然

与51或许其他系列的单片机比较,PIC 单片机的中止机制有其特别之处,针对咱们一些初学者存在的一些问题和疑问,我在此做一个个人总结,不妥的当地,请站友们纠正。 先摘引三个对PIC中止了解的回帖,然后我再对中止活动的进程、应该留意的事项、及一个疑问进行较具体的总结和解说。 ————— john frank :关于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 ; 微秒的高位字节加上守时时刻 256×16分频=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 程序岂不是要犯错跑飞了 [b]john frank: [/b] 谢谢你的重视。 我讲一下自己的了解,权做答复,不妥之处,还请站友们点拨。 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级)哦。 [b]二、需求留意的问题: [/b] 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被逼产生了第2次中止。明显,这样是将BSF INTCON, XX指令分化得四分五裂—原本一个指令周期能够完结的指令被跨了多个指令周期;并且一个指令周期的指令被CPU在不同地址处分化履行读改写进程。 假如不是这样的话,那么作者的解说就自相对立:“当CPU正在履行一条对INTCON寄存器的‘读-改-写’操作的指令时,假如刚好产生了中止恳求 ”与“当GIE被清零后,这是假如CPU正在履行一条对INTCON‘读-改-写’的指令时”彼此对立。 总归,我对这儿的了解存在一些疑问,请斑竹及各位长辈点拨。 * – 本贴最终修正时刻:2004-12-28 17:21:09 修正者:碧波长天

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/292038.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部