关键字:PIC单片机 多中断处理技术
引言
PIC系列单片机中断源已经达到14个.可谓相当丰富;但同时也带来了一些难题:在处理多中断时不具备处理“高级优先处理”能力的问题,如此多的中断源在处理时很容易产生中断冲突,如何有效的处理中断到达时的时序,其算法应该如何实现成了首先需要解决的问题。
1 中断处理技术
对于PIC系列单片机,其设计上虽然有很多中断,但是并没有规定中断的优先级。当遇到中断的时候,不做任何判断,而是先把指针指向0004H(中断起始地址),至于接下来如何操作则完全交给用户“软处理”完成。其中断时序图如下:
图1 INT引脚中断时序图
中断现场的保护是中断技术中一个很重要的环节。对于PICl6F87X单片机,在进人中断服务程序期间,只有返回地址,即程序计数器Pc的值被自动压入硬件堆栈;而在中断处理程序中,一般必须像使用WReg、STATUS等寄存器一样,在中断处理程序开始处,就备份这些寄存器的内容,即进行所谓的现场保护。
PICl6F87X子系列单片机具备的中断源多达14种,中断矢量只有1个,并且各个中断源之间也没有优先级别之分,不具备非屏蔽中断。PIC单片机中采用的是硬件堆栈结构,不占用程序存储器空间,也不占用数据存储器空间,同时也无需用户去操作堆栈指针;但同时也就决定了它不具备其他单片机指令系统中的压栈(PUSH)和出栈(POP)指令。实现中断现场保护时,不能用堆栈来实现,而是通过变量的复制备份来实现。一般的实现办法是:先确定要保护的现场,一般包括WReg、STATUS等寄存器的内容,然后在各个页都定义与这些寄存器对应的变量。以备份现场。发生中断时,在中断处理代码开始处先将这些现场寄存器内容复制到备份变量,退出中断处理时再复制回去恢复现场:
2 基于PICl6F87X单片机的频率计设计
随着电子技术的迅速发展,以单片机为控制核心的控制器件,已经全面渗透到测试仪器和计量检定的各个方面。同时,频率计作为一种常用工具,在工程技术和无线电测量、计量等领域的应用十分广泛。设计的频率计主要用来测量脉冲频率。
2.1设计原理
PICl6F87X单片机内部集成有捕捉,比较,脉宽调制PWM(CCP)模块。当CCP工作在捕捉(capture)方式时,可捕捉外部输人脉冲的上升沿或下降沿,并产生相应的中断。
PICl6F87X单片机内部还集成了定时器肘数器模块,采用其中的TMRI作为定时器,该定时器的工作原理是通过TMR1“寄存器对”TMRlH:TMR1L从0000H递增到FFFFH。之后再返回0000H时,会产生高位溢出,并且将会设置溢出中断标志位TMR1IF为1,同时引起CPU中断响应。
在均匀的脉冲序列中,脉冲频率值等于单位时间内发生的脉冲次数。根据这个原理,可以采用PICl6F87X系列单片机内置定时器模块TMRl计时j同时使用CCP模块的捕捉功能,每间隔n(n=1,4,16)个脉冲捕捉一次并产生中断,记录第1个和第(m-1)*n+1个脉冲到来时的定时器计时tl和tm。
用被捕捉的脉冲次数除以第1次和第(m-1)*n+1次脉冲之间间隔的时间即可得到脉冲频率值。因此,脉冲频率值计算公式为:
f=n*(m-1)/(tm-t1)
若需测量更大频率,可以根据需要在待测频率和CPU的CCP口之间接入相应倍数的分频器,每接入一个1/n倍分频器,可测频率范围可扩大n倍(如图2所示)。
图2 CPU外接示意图
2.2 程序设计
(1)主程序
主程序流程图如图3所示。
图3主程序流程图
(2)中断程序
中断程序流程图如图4所示。
图4中断子程序流程图
3 多中断处理注意的问题
1)要处理多路中断问题,中断处理程序的算法大体上可以分为两类:弱中断优先级(使用CALL和RETURN方式)和强中断优先级(使用GOTO方式)。
2)如果同时发生多个中断请求,则中断处理的顺序取决于中断程序中的检查中断源的顺序。
3)若要防止中断请求被丢失,则要注意下面两种情况:如果同一中断源的中断发生间隔时间小于该中断服务的处理时间,则可能出现中断事件被忽略(体现在中断服务的过程中,标志位被连续发生了两次置位),例如:中断事件发生的时间间隔为30ms,中断服务处理加上跳转判断的时间为50ms,则情况将会如下所示:
[中断次数______1][中断次数______2][中断次数_____3][中断次数_____4]
[处理次数______1][处理次数______2][处理次数_____4]
如果在中断处理一开始就清除IF,那么如上图所示,中断事件3、4在处理次数2的过程中发生了两次,那么即使IF清除发生在中断次数3发生之前,也将丢失第三次中断。
另外,即使中断出现的时间间隔大于中断服务的时间间隔,如果清除中断标志位的指令安排在中断服务子程序的尾部,就有可能造成丢失该中断请求(即两次中断标志置位的事件只对应一条清除指令和一次中断处理),也就是如果清除中断标志位的指令安排在中断服务程序的尾部,就有可能丢失响应在处理中断期间该中断源第2次中断请求的机会。
4)为了能够编写好一个简洁的中断程序,应抓住中断的特点是具有实时性,针对实时中断数据采集系统,也就是中断的特点在于数据的采集。因此在中断程序中只应该处理数据采集和标志位的设置,而将数据的处理放在中断之外,由主程序通过循环检测执行数据处理工作,具体做法:先开辟一个“储存缓冲区”,作为采集来的数据的传递媒体,即存储采集数据,等待主程序的处理;中断程序负责数据的采集,并且将采集来的数据值赋给“存储缓冲区”;主程序通过条件循环语句反复检测“存储缓冲区”情况,及时处理采集信息。这样在处理方法既能有效的实现中断的功能,又可以极大的缩减每个中断的时间,提高整个程序的反应速度。
5)对于中断响应和处理时间有严格要求的应用,保护现场的指令安排也应考虑延时问题。
6)在进行查表操作时必须禁止CPU响应中断。以避免中断返回时跳转到不希望的地址上去。
4 结束语
灵活地应用中断,不但可以大量的节省CPU资源,而且能够使程序更加简化.具有更高的实时性和稳定性。经过测试,这种频率计具有测量准确度高、使用方便、稳定可靠的优点,可应用于计量测试领域。同时由于使用软件控制,电路结构简单,使用硬件少,使得成本低廉且携带方便,因此也可广泛应用于工农业生产和居民生活中,具有推广价值。
本文作者创新:频率计是基于PICC高级语言开发平台,采用PICl6F87X单片机,该方案具有原理简单.性能可靠、分辨率高特点,使用该方法测量低频频率时最少可以得到8位有效数字。它采用LCD图形液晶显示,清晰度高,可视范围广,可外接晶体频率源,具有测量速度快、分辨率高的优点。本方案已在单片机课程相关教学中应用。