pic单片机中文资料指令周期问题

第三届可穿戴产品设计技术研讨会
成都·智能医疗创新应用论坛
2015物联网技术与创新应用大会
工业应用中的小批量快速原型制作技术研讨会
PIC单片机的中断总结
来源:本站整理
作者:佚名日 08:15
[导读] PIC单片机的中断总结
与51或者其他系列的单片机相比,PIC单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一
PIC单片机的中断总结
与51或者其他系列的单片机相比,PIC单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。sO100&&&& 先摘引三个对PIC中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。&&&& ---------------&&&& johnfrank:关于pic中断有些不明白的地方&&&& 借用大虾的程序;&&&& ;********************中断服务代码&&&& btfssINTCON,T0IE;判断是否为T0中断&&&& gotoother_int&&&& btfssINTCON,T0IF;it’sthetimeofT0int&&&& gotoother_int&&&& bcfINTCON,T0IF;是T0中断,清除中断标志&&&& movlw0x10;微秒的高位字节加上定时时间256x16分频=0的高位(0x10)&&&& addwfus+1&&&& gotoend_int&&&& other_可添加其他中断服务代码&&&&otherisrcodecanbeadded&&&& ;**********************************&&&& end_恢复现场&&&& =================&&&& 假如又有新的中断正好在这段程序中间产生&&&& btfssINTCON,T0IF&&&& gotoother_int&&&& bcfINTCON,T0IF&&&& 程序岂不是要出错跑飞了&&&& johnfrank:&&&& 谢谢你的关注。&&&& 我讲一下自己的理解,权做回答,不当之处,还请站友们指点。&&&& pic中档单片机系列没有“硬件中断优先级别”(请允许我这样说),含义是指:当内核正在处理当前的中断服务A时,在这个期间里,其他任何中断的产生,只能使其标志位xxIF置1,不能剥夺当前中断服务对CPU的占用权(反应在PC指针不能被新的中断改变指向),必须等到当前中断服务处理A完毕,然后,根据gotoother_int语句的转向,依次判断。若新发生的中断处理代码在中断服务A之后(前、后指代码在ROM中地址顺序,越大越后),则进行新发生的中断处理;若恰好新发生的中断服务代码在刚被处理完毕的中断服务A代码之前,则将不予理会,(即程序指针PC不会在中断处理代码空间中又返回到0004H的入口),等到执行到retfie后返回主程序,然后再次进入中断入口0004H...&&&& 之所以说其无“硬件中断优先级别”是与“软件中断优先级别”对应的,通过中断服务代码对中断标志和IE的检测的先后,可设立优先级。&&&& 当然,准确地说,这是一种顺序,而非级别,呵呵。&&&& 如果了解一下51的中断系统,相信你能更好地理解PIC的中断的级别:&&&& 将会出现你说的情况,当优先级更高的中断来临时,内核将暂时停止当前中断服务,保存当前中断服务的现场,执行优先级更高的中断服务,处理完成后,恢复现场,执行未处理完成的中断服务....,最后,返回主程序。&&&& 小弟讲得有点烦琐,并不形象,可能还有纰漏和谬误之处,请大家指正,相信johnfrank在仔细看书之后,应该可以形成自己的正确看法。&&&& 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单片机相关下载
技术交流、积极发言! 发表评请遵守相关规定。
近几年来,智能手机等便携终端设备受到热捧,全球2G、3G和4G LTE网络频段的呈多样性,促使无线技术走向多样化与技术迭替。...
在标准、成本、技术、消费基础等因素的制约下,被业界炒得火热的智能家居概念却在消费市场碰上了寒流。因此紧抓问题根源,对症下药,寻求突破来促...
创新实用技术专题
Copyright &
.All Rights ReservedMCS51与PIC单片机指令系统比较PIC,MCS,pic
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
MCS51与PIC单片机指令系统比较
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
毕业设计(论文)PIC单片机学习中.pdf27页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:50 &&
你可能关注的文档:
··········
··········
PIC 单片机特殊功能寄存器定义问题
菜鸟向高手赐教,比如像 STATUS,它在 RAM
中的位置不是固定是 02H 吗?为什么还要
在程序中用 EQU 定义:status
我的问题是,假如这条定义取消,CPU
就不知道 STATUS 的地址是 02H
你的假如是对的,但是主要不是 CPU 不知道 STATUS 代表 02H 了(CPU 当然也不知道,
CPU 除了机器语言什么也不知道),而是编译软件不知道 STATUS 代表 02H 了。
“status EQU 02H”就是定义 STATUS 代表 02H
定义了之后 MOVF STATUS,W
就相当于 MOVF 02H,W
EQU 定义之后,上两句话功能是一样的!STATUS 被定义是便于我们人直观理解。
你估计是刚学,刚开始教你定义是为了便于你理解,以后会教你引用编译软件里
的头文件,你就不需要一个一个写了。
PIC 单片机 16F84 的内部硬件资源
上期笔者介绍的 PIC16F84 单片机点亮一只发光二极管的源程序实例是为了说明 PIC 单片机 16F84 具体应
用时的基本格式。
现在我们已经知道要单片机工作,就需用汇编语言编制程序。而对某个 PIC 单片机编程时,还需对选
用的 PIC 单片机内部硬件资源有所了解。这里介绍 PIC16F84 单片机的内部结构,如图 1 所示的框图。由
图 1 看出,其基本组成可分为四个主要部分,即运算器 ALU 和工作寄存器 W;程序存储器;数据存储器
和输入/输出 I/O 口;堆栈存储器和定时器等。现分别介绍如下。
1 e运算器 ALU 及工作寄存器 W
运算器 ALU 是一个通用算术、逻辑运算单元,用它可以对工作寄存器 W 和任何通用寄存器中的两个
数进行算术 如加、减、乘、除等 和逻辑运算 如
正在加载中,请稍后...21ic官方微信
后使用快捷导航没有帐号?
查看: 4201|回复: 15
求教PIC18F中断响应时间过长的问题
&&已结帖(0)
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
大家好,我是PIC初学者,在调试程序时遇到中断时间过长的问题,向大家请教:&br /&&br /&单片机为PIC18F2431,晶振20MHz,系统指令周期0.2us。使用官方的C18编译器和Mplab&V7.31。&br /&程序定义PWM&62.5us高级中断,Timer5&1ms低级中断,ADC低级中断&br /&在调试时,发现程序入中断和出中断的时候,都花费了大量时间——30us以上!&br /&在软件模拟和硬件调试时,都出同这样的问题。&br /&查看编译后生成的汇编代码,发现在入中断和出中断的时候,有一大段代码,花费了大量时间。不知是什么原因,特向大家请教,谢谢!&br /&&br /&1楼贴中断程序,C代码(我自己编写)&br /&2楼贴编译后生成的入中断程序(系统生成)&br /&3楼贴编译后生成的出中断程序(系统生成)
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
专家等级: 结帖率:80%
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
C18 V3.00中断现场保护问题
还是请仔细看C18的使用指南,有中文版的。看其中的“编译器管理的资源”和中断现场保护相关的内容。&br /&C18在V3.00版本前后做了一个很重要的改变,就是在中断现场保护上。&br /&V3.00之前,编译器对很多资源不进行管理,如PROD,.tmpdata段,.mathdata段等,由使用者根据自己的程序需要用save&=&子句来添加中断的现场保护。但是,很多的用户并不清楚中断时那些东西是需要保护的,于是很多用户因为没有保护必要的现场而出现程序的异常。&br /&V3.00之后的版本,走向另一个极端。编译器不管你需不需要,它按最安全的考虑把所有的现场都保护起来,于是就出了楼主的困惑。但是编译器提供了另一个选项,就是nosave&=&子句。用户可以根据自己对程序的判断来选择那些是不需要的现场保护。&br /&顺便说一下,楼主的程序,中断里有函数调用,是否必须的呢?如果是必须的,又如果你的函数有中间计算,有返回值,那这个函数就有可能用到PROD,.tmpdata甚至.mathdata,如果真用到了那编译器的保护措施是必要的。何不考虑在中断里设个标志然后到主程序里查询标志后再调用函数呢?还有,编译器可以设定让中断里调用的函数和中断服务函数共用一个.tmpdata段,这样你就可以放心地用nosave.&br /&总而言之,编译器没有犯错误,它只是很保守,它不可能像你想象的那样智能,它需要你告诉它指导它怎么来编译。&&
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
中断程序C代码
这是我的中断C程序:&br /&&br /&//------------------高级中断程序-------------------&br /&#pragma&code&Vector_High=0x08&br /&void&Vector_High(void)&br /&{&br /&&&_asm&goto&Handler_High&&_endasm&br /&}&br /&#pragma&code&br /&&br /&#pragma&interrupt&Handler_High&br /&void&Handler_High()&br /&{&br /&&br /&//PWM中断&br /&&&if&(PWM_IF==1)&br /&&&{&br /&&&&&PWM_IF=0;&br /&&&&&Interrupt_PWM();&br /&&&}&br /&&br /&}&br /&//------------------高级中断程序-------------------&br /&&br /&&br /&//------------------低级中断程序-------------------&br /&#pragma&code&Vector_Low=0x18&br /&void&Vector_Low(void)&br /&{&br /&&&_asm&goto&Handler_Low&_endasm&br /&}&br /&#pragma&code&br /&&br /&#pragma&interruptlow&Handler_Low&br /&void&Handler_Low()&br /&{&br /&&br /&//Timer5中断&br /&&&if&(Timer5_IF==1)&br /&&&{&br /&&&&&Timer5_IF=0;&br /&&&&&Interrupt_Timer5();&br /&&&}&br /&&&br /&//ADC中断&br /&&&if&(ADC_IF==1)&&&&&&&&&br /&&&{&br /&&&&&ADC_IF=0;&br /&&&&&Interrupt_ADC();&br /&&&}&br /&&br /&}&br /&//------------------低级中断程序-------------------
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
入中断程序,系统生成的,花费了大量CPU时间
369:&&&&&&&&&&&&&&&#pragma&interrupt&Handler_High&br /&370:&&&&&&&&&&&&&&&void&Handler_High()&br /&&&0038&&&&CFDA&&&&&MOVFF&0xfda,&0xfe4&br /&&&003A&&&&FFE4&&&&&NOP&br /&&&003C&&&&CFE2&&&&&MOVFF&0xfe2,&0xfda&br /&&&003E&&&&FFDA&&&&&NOP&br /&&&0040&&&&CFE9&&&&&MOVFF&0xfe9,&0xfe4&br /&&&0042&&&&FFE4&&&&&NOP&br /&&&0044&&&&CFEA&&&&&MOVFF&0xfea,&0xfe4&br /&&&0046&&&&FFE4&&&&&NOP&br /&&&0048&&&&CFF6&&&&&MOVFF&0xff6,&0xfe4&br /&&&004A&&&&FFE4&&&&&NOP&br /&&&004C&&&&CFF7&&&&&MOVFF&0xff7,&0xfe4&br /&&&004E&&&&FFE4&&&&&NOP&br /&&&0050&&&&CFF5&&&&&MOVFF&0xff5,&0xfe4&br /&&&0052&&&&FFE4&&&&&NOP&br /&&&0054&&&&CFF3&&&&&MOVFF&0xff3,&0xfe4&br /&&&0056&&&&FFE4&&&&&NOP&br /&&&0058&&&&CFF4&&&&&MOVFF&0xff4,&0xfe4&br /&&&005A&&&&FFE4&&&&&NOP&br /&&&005C&&&&CFFA&&&&&MOVFF&0xffa,&0xfe4&br /&&&005E&&&&FFE4&&&&&NOP&br /&&&0060&&&&EE00&&&&&LFSR&0,&0x18&br /&&&0062&&&&F018&&&&&NOP&br /&&&0064&&&&0E14&&&&&MOVLW&0x14&br /&&&0066&&&&04E8&&&&&DECF&0xfe8,&W,&ACCESS&br /&&&0068&&&&E303&&&&&BNC&0x70&br /&&&006A&&&&CFEE&&&&&MOVFF&0xfee,&0xfe4&br /&&&006C&&&&FFE4&&&&&NOP&br /&&&006E&&&&D7FB&&&&&BRA&0x66&br /&&&0070&&&&EE00&&&&&LFSR&0,&0&br /&&&0072&&&&F000&&&&&NOP&br /&&&0074&&&&0E18&&&&&MOVLW&0x18&br /&&&0076&&&&04E8&&&&&DECF&0xfe8,&W,&ACCESS&br /&&&0078&&&&E303&&&&&BNC&0x80&br /&&&007A&&&&CFEE&&&&&MOVFF&0xfee,&0xfe4&br /&&&007C&&&&FFE4&&&&&NOP&br /&&&007E&&&&D7FB&&&&&BRA&0x76&br /&&&0080&&&&52E6&&&&&MOVF&0xfe6,&F,&ACCESS
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
出中断程序,系统生成的,花费了大量CPU时间
389:&&&&&&&&&&&&&&&}&br /&&&00A0&&&&52E5&&&&&MOVF&0xfe5,&F,&ACCESS&br /&&&00A2&&&&EE00&&&&&LFSR&0,&0x17&br /&&&00A4&&&&F017&&&&&NOP&br /&&&00A6&&&&0E18&&&&&MOVLW&0x18&br /&&&00A8&&&&04E8&&&&&DECF&0xfe8,&W,&ACCESS&br /&&&00AA&&&&E303&&&&&BNC&0xb2&br /&&&00AC&&&&CFE5&&&&&MOVFF&0xfe5,&0xfed&br /&&&00AE&&&&FFED&&&&&NOP&br /&&&00B0&&&&D7FB&&&&&BRA&0xa8&br /&&&00B2&&&&EE00&&&&&LFSR&0,&0x2b&br /&&&00B4&&&&F02B&&&&&NOP&br /&&&00B6&&&&0E14&&&&&MOVLW&0x14&br /&&&00B8&&&&04E8&&&&&DECF&0xfe8,&W,&ACCESS&br /&&&00BA&&&&E303&&&&&BNC&0xc2&br /&&&00BC&&&&CFE5&&&&&MOVFF&0xfe5,&0xfed&br /&&&00BE&&&&FFED&&&&&NOP&br /&&&00C0&&&&D7FB&&&&&BRA&0xb8&br /&&&00C2&&&&CFE5&&&&&MOVFF&0xfe5,&0xffa&br /&&&00C4&&&&FFFA&&&&&NOP&br /&&&00C6&&&&CFE5&&&&&MOVFF&0xfe5,&0xff4&br /&&&00C8&&&&FFF4&&&&&NOP&br /&&&00CA&&&&CFE5&&&&&MOVFF&0xfe5,&0xff3&br /&&&00CC&&&&FFF3&&&&&NOP&br /&&&00CE&&&&CFE5&&&&&MOVFF&0xfe5,&0xff5&br /&&&00D0&&&&FFF5&&&&&NOP&br /&&&00D2&&&&CFE5&&&&&MOVFF&0xfe5,&0xff7&br /&&&00D4&&&&FFF7&&&&&NOP&br /&&&00D6&&&&CFE5&&&&&MOVFF&0xfe5,&0xff6&br /&&&00D8&&&&FFF6&&&&&NOP&br /&&&00DA&&&&CFE5&&&&&MOVFF&0xfe5,&0xfea&br /&&&00DC&&&&FFEA&&&&&NOP&br /&&&00DE&&&&CFE5&&&&&MOVFF&0xfe5,&0xfe9&br /&&&00E0&&&&FFE9&&&&&NOP&br /&&&00E2&&&&CFE5&&&&&MOVFF&0xfe5,&0xfda&br /&&&00E4&&&&FFDA&&&&&NOP&br /&&&00E6&&&&0011&&&&&RETFIE&0x1
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
PIC18F 中断问题
仅仅是入中断和出中断,就花费了大量的CPU开销,让我的62.5us的PWM中断没法进行。一跳入中断,就花费30us,当执行到“&if&(PWM_IF==1)”这句时,已经差不多到60us时间了,再出中断,一来一回,就是100us以上。这还不考虑执行“Interrupt_Timer5();”的花费呢。&br /&&br /&请问我的问题出在哪?谢谢&br /&
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
专家等级: 结帖率:41%
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
楼主肯定是数错了
楼主肯定是数错了.&br /&请看:&br /&&br /&58:&&&&&&&&&&&&&&&&#pragma&code&high_vector=0x08&br /&59:&&&&&&&&&&&&&&&&void&interrupt_at_high_vector(void)&br /&60:&&&&&&&&&&&&&&&&{&br /&61:&&&&&&&&&&&&&&&&&&_asm&GOTO&high_isr&_endasm&br /&&&0008&&&&EF2F&&&&&GOTO&0x5e/////////////////////开始&br /&&&000A&&&&F000&&&&&NOP&br /&62:&&&&&&&&&&&&&&&&}&br /&&&000C&&&&0012&&&&&RETURN&0&br /&63:&&&&&&&&&&&&&&&&#pragma&code&&br /&64:&&&&&&&&&&&&&&&&&br /&65:&&&&&&&&&&&&&&&&#pragma&interrupt&high_isr&br /&66:&&&&&&&&&&&&&&&&void&high_isr&(void)&br /&&&005E&&&&CFDA&&&&&MOVFF&0xfda,&0xfe4&br /&&&0060&&&&FFE4&&&&&NOP&br /&&&0062&&&&CFE2&&&&&MOVFF&0xfe2,&0xfda&br /&&&0064&&&&FFDA&&&&&NOP&br /&&&0066&&&&CFE9&&&&&MOVFF&0xfe9,&0xfe4&br /&&&0068&&&&FFE4&&&&&NOP&br /&&&006A&&&&CFEA&&&&&MOVFF&0xfea,&0xfe4&br /&&&006C&&&&FFE4&&&&&NOP&br /&&&006E&&&&52E6&&&&&MOVF&0xfe6,&F,&ACCESS&br /&&&0070&&&&CFD9&&&&&MOVFF&0xfd9,&0xfe6&br /&&&0072&&&&FFE6&&&&&NOP&br /&&&0074&&&&CFE1&&&&&MOVFF&0xfe1,&0xfd9&br /&&&0076&&&&FFD9&&&&&NOP&br /&&&0078&&&&0E02&&&&&MOVLW&0x2&br /&&&007A&&&&26E1&&&&&ADDWF&0xfe1,&F,&ACCESS&br /&67:&&&&&&&&&&&&&&&&{&br /&68:&&&&&&&&&&&&&&&&&br /&69:&&&&&&&&&&&&&&&&uint8&&br /&70:&&&&&&&&&&&&&&&&uint8&tempSSPSTAT;&br /&71:&&&&&&&&&&&&&&&&&br /&72:&&&&&&&&&&&&&&&&if(INTCONbits.TMR0IF&==&1)//结束,执行中断代码&br /&&&007C&&&&A4F2&&&&&BTFSS&0xff2,&0x2,&ACCESS&br /&&&007E&&&&D016&&&&&BRA&0xac&br /&&br /&&br /&&br /&&br /&从开始到结束,执行中断代码,共18个指令周期,18×0.2=3.6us&br /&&br /&哪里来楼主说得几十us?????????????????
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
专家等级: 结帖率:41%
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
即使是楼主自己的编译的例子,也仅仅是几个us
即使是楼主自己的编译的例子,也仅仅是几个us,&br /&&br /&楼主大概是把每个指令周期算成1us了吧????????
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
系统成生的汇编程序里有"BRA"命令
汇编代码里有BNC、BRA、DECF指令,来回循环。时间耗在这里了!&br /&比如:&br /&&&0076&&&&04E8&&&&&DECF&0xfe8,&W,&ACCESS&br /&&&0078&&&&E303&&&&&BNC&0x80&br /&&&007A&&&&CFEE&&&&&MOVFF&0xfee,&0xfe4&br /&&&007C&&&&FFE4&&&&&NOP&br /&&&007E&&&&D7FB&&&&&BRA&0x76&br /&&br /&
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
专家等级: 结帖率:80%
主题帖子积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
技术达人, 积分 8379, 距离下一级还需 1621 积分
看看C18使用说明书里的关于“编译器管理的资源”,以及NOSAVE,tempdata,mathdata等关键词。
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
专家等级: 结帖率:41%
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
楼主用的是哪个版本的编译器?
楼主用的是哪个版本的编译器?&br /&&br /&你说的循环代码应该不是进出中断的一部分吧??&br /&应该是你自己的代码吧?????????&br /&&br /&看看我的C18&3.16生成的代码,没有循环的代码的部分&br /&58:&&&&&&&&&&&&&&&&#pragma&code&high_vector=0x08&br /&59:&&&&&&&&&&&&&&&&void&interrupt_at_high_vector(void)&br /&60:&&&&&&&&&&&&&&&&{&br /&61:&&&&&&&&&&&&&&&&&&_asm&GOTO&high_isr&_endasm&br /&&&0008&&&&EF2F&&&&&GOTO&0x5e&br /&&&000A&&&&F000&&&&&NOP&br /&62:&&&&&&&&&&&&&&&&}&br /&&&000C&&&&0012&&&&&RETURN&0&br /&63:&&&&&&&&&&&&&&&&#pragma&code&&br /&64:&&&&&&&&&&&&&&&&&br /&65:&&&&&&&&&&&&&&&&#pragma&interrupt&high_isr&br /&66:&&&&&&&&&&&&&&&&void&high_isr&(void)&br /&&&005E&&&&CFDA&&&&&MOVFF&0xfda,&0xfe4&br /&&&0060&&&&FFE4&&&&&NOP&br /&&&0062&&&&CFE2&&&&&MOVFF&0xfe2,&0xfda&br /&&&0064&&&&FFDA&&&&&NOP&br /&&&0066&&&&CFE9&&&&&MOVFF&0xfe9,&0xfe4&br /&&&0068&&&&FFE4&&&&&NOP&br /&&&006A&&&&CFEA&&&&&MOVFF&0xfea,&0xfe4&br /&&&006C&&&&FFE4&&&&&NOP&br /&&&006E&&&&52E6&&&&&MOVF&0xfe6,&F,&ACCESS&br /&&&0070&&&&CFD9&&&&&MOVFF&0xfd9,&0xfe6&br /&&&0072&&&&FFE6&&&&&NOP&br /&&&0074&&&&CFE1&&&&&MOVFF&0xfe1,&0xfd9&br /&&&0076&&&&FFD9&&&&&NOP&br /&&&0078&&&&0E02&&&&&MOVLW&0x2&br /&&&007A&&&&26E1&&&&&ADDWF&0xfe1,&F,&ACCESS&br /&67:&&&&&&&&&&&&&&&&{&br /&68:&&&&&&&&&&&&&&&&&br /&69:&&&&&&&&&&&&&&&&uint8&&br /&70:&&&&&&&&&&&&&&&&uint8&tempSSPSTAT;&br /&71:&&&&&&&&&&&&&&&&&br /&72:&&&&&&&&&&&&&&&&if(INTCONbits.TMR0IF&==&1)//定时10ms&br /&&&007C&&&&A4F2&&&&&BTFSS&0xff2,&0x2,&ACCESS&br /&&&007E&&&&D011&&&&&BRA&0xa2&br /&73:&&&&&&&&&&&&&&&&{&br /&74:&&&&&&&&&&&&&&&&&br /&75:&&&&&&&&&&&&&&&&bShowLED&=&1;&br /&&&0080&&&&0100&&&&&MOVLB&0&br /&&&0082&&&&0E01&&&&&MOVLW&0x1&br /&&&0084&&&&6F96&&&&&MOVWF&0x96,&BANKED&br /&76:&&&&&&&&&&&&&&&&/*if(bShowLED&!=&1)&br /&77:&&&&&&&&&&&&&&&&{&br /&78:&&&&&&&&&&&&&&&&if(ShowLEDTimer0&&lt&1)&br /&79:&&&&&&&&&&&&&&&&ShowLEDTimer0++;&br /&80:&&&&&&&&&&&&&&&&else&br /&81:&&&&&&&&&&&&&&&&{&br /&82:&&&&&&&&&&&&&&&&ShowLEDTimer0&=&0;&br /&83:&&&&&&&&&&&&&&&&bShowLED&=&1;&br /&84:&&&&&&&&&&&&&&&&}&br /&85:&&&&&&&&&&&&&&&&}*/&br /&86:&&&&&&&&&&&&&&&&&br /&87:&&&&&&&&&&&&&&&&if(bKeyDelay)&br /&&&0086&&&&519B&&&&&MOVF&0x9b,&W,&BANKED&br /&&&0088&&&&E007&&&&&BZ&0x98&br /&88:&&&&&&&&&&&&&&&&{&br /&89:&&&&&&&&&&&&&&&&if(KeyDelayTimer0&&lt&1)&br /&&&008A&&&&0E01&&&&&MOVLW&0x1&br /&&&008C&&&&5D9D&&&&&SUBWF&0x9d,&W,&BANKED&br /&&&008E&&&&E202&&&&&BC&0x94&br /&90:&&&&&&&&&&&&&&&&KeyDelayTimer0++;&br /&&&0090&&&&2B9D&&&&&INCF&0x9d,&F,&BANKED&br /&91:&&&&&&&&&&&&&&&&else&br /&&&0092&&&&D002&&&&&BRA&0x98&br /&92:&&&&&&&&&&&&&&&&{&br /&93:&&&&&&&&&&&&&&&&bKeyDelay&=&0;&br /&&&0094&&&&6B9B&&&&&CLRF&0x9b,&BANKED&br /&94:&&&&&&&&&&&&&&&&KeyDelayTimer0&=&0;&br /&&&0096&&&&6B9D&&&&&CLRF&0x9d,&BANKED&br /&95:&&&&&&&&&&&&&&&&}&br /&96:&&&&&&&&&&&&&&&&}&br /&97:&&&&&&&&&&&&&&&&&br /&98:&&&&&&&&&&&&&&&&TMR0H&=&0xE5;&br /&&&0098&&&&0EE5&&&&&MOVLW&0xe5&br /&&&009A&&&&6ED7&&&&&MOVWF&0xfd7,&ACCESS&br /&99:&&&&&&&&&&&&&&&&TMR0L&=&0x01;&br /&&&009C&&&&0E01&&&&&MOVLW&0x1&br /&&&009E&&&&6ED6&&&&&MOVWF&0xfd6,&ACCESS&br /&100:&&&&&&&&&&&&&&&&br /&101:&&&&&&&&&&&&&&&INTCONbits.TMR0IF&=&0;&br /&&&00A0&&&&94F2&&&&&BCF&0xff2,&0x2,&ACCESS&br /&102:&&&&&&&&&&&&&&&}
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
TO&9楼:&br /&看了一下编译器管理的资源,还是不太明白什么意思。能请你点明一下么?谢谢&br /&我个人理解的是如果没有用“save&命令,它只保护基本现场。&br /&&br /&&br /&TO&10楼:&br /&我用的是C18&V3.0正版编译器。官方下载的V3.16有时间限制,所以没用。
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
专家等级: 结帖率:41%
主题帖子积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
资深工程师, 积分 10366, 距离下一级还需 9634 积分
看来还是你自己的程序部分有循环
看来还是你自己的程序部分有循环
主题帖子积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
学习学习~~~可惜没机会用过18系列
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
专家等级: 结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
问题解决了
问题解决了,谢谢楼上几位朋友!&br /&&br /&我把中断程序中的子程序&Interrupt_PWM()&&&Interrupt_Int012()&删掉,直接把子程序代码复制到中断程序里,就可以了。&br /&&br /&所以,我想这个问题出在函数嵌套上。我之所以在中断里嵌套子函数,是看了另一个C30的中断程序,里面可是子函数套子函数。&br /&另外,我还发现在中断程序里定义局部变量,也会出现类似情况。改为全局变量就没问题了。&br /&&br /&再次谢谢&br /&
主题帖子积分
中级技术员, 积分 2407, 距离下一级还需 -2107 积分
中级技术员, 积分 2407, 距离下一级还需 -2107 积分
主题帖子积分
中级技术员, 积分 2407, 距离下一级还需 -2107 积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 2407, 距离下一级还需 -2107 积分
中级技术员, 积分 2407, 距离下一级还需 -2107 积分
搞一现场保护专用子函数得了。
搞一现场保护专用子函数得了。这样更放心。
精英会员奖章
等级类勋章
涓涓之细流
发帖类勋章
技术高手奖章
人才类勋章
时间类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
技术导师奖章
人才类勋章
时间类勋章}

我要回帖

更多关于 pic单片机编程软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信