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外接示意图