51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向cpu请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。
这个原理很好理解。但应用时需要特别注意的几点:
1)电平触发方式时,中断标志寄存器不锁存中断请求信号。 也就是说,单片机把每个机器周期的s5p2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断 请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被cpu响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因 此当cpu正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同 没发生一样。同样,当cpu在执行不可被中断的指令(如reti)时,产生的电平触发中断如果时间太短,也得不到执行。
2)边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到cpu响应并转向该中断服务程序时,由硬件自动清除。因此当cpu正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。
3)中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被cpu忽略。就如同没有发生一样。
4)选择电平触发还是边沿触发方式应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上说(《keilc51使用技巧及实战》),就有类似的观点。
mcs51单片机系列属于8位单片机,它是intel公司继mcs48系列的成功设计之后,于1980年推出的产品。由于mcs51系列具有很强的片内功能和指令系统,因而使单片机的应用发生了一个飞跃,这个系列的产品也很快成为世界上第二代的标准控制器。51系列单片机有5个中断源,其中有2个是外部输入中断源int0和int1。可由中断控制寄存器tcon的it1(tcon.2)和it0(tcon.1)分别控制外部输入中断1和中断0的中断触发方式。若为0,则外部输入中断控制为电平触发方式;若为1,则控制为边沿触发方式。这里是下降沿触发中断。
1、问题的引出
几 乎国内所有的单片机资料对单片机边沿触发中断的响应时刻方面的定义都是不明确的或者是错误的。例如文献[1]中关于边沿触发中断响应时刻的描述为“对于脉 冲触发方式(即边沿触发方式)要检测两次电平,若前一次为高电平,后一次为低电平,则表示检测到了负跳变的有效中断请求信号”,但实际情况却并非如此。
我们知道,单片机外部输入的中断触发电平是ttl电平。对于ttl电平,ttl逻辑门输出高电平的允许范围为2.4~5v,其标称值
为3.6v;输出低电平的允许范围为0~0.7v,其标称值为0.3v[2],在0.7v与2.4v之间的是非高非低的中间电平。
这 样,在实际应用中,假设单片机外部中断引脚int0输入一路由+5v下降到0v的下降沿信号,单片机在某个时钟周期采样int0引脚得到2.4v的 高电平;而在下一个时钟周期到来进行采样时,由于实际的外部输入中断触发信号由高电平变为低电平往往需要一定的时间,因此,检测到的可能并非真正的低电平 (小于0.7v),而是处于低电平与高电平之间的某一中间电平,即0.7~2.4v的某一电平。对于这种情况,单片机是否会依然置位中断触发标志从而 引发中断呢?关于这一点,国内的绝大部分教材以及单片机生产商提供的器件资料都没有给予准确的定义,但在实际应用中这种情况确实会碰到。
以美国analog公司生产的运算放大器芯片ad708为例,其转换速率(slewrate)为0.3v/μs,在由ad708芯片组成的比较器电路中, 其输出方波的下降沿由2.4v下降到0.7v,所需时间约为:(2.4v-0.7v)/0.3v·μs-1=4.67μs。即需要 约4.67μs的过渡时间,下降沿才真正地由高电平下降为低电平,在实际应用电路中,这个下降时间往往可达10μs以上。对于精密的测量系统,这么 长的不确定时间是无法接受的,因此,有必要对单片机边沿中断触发时刻进行精确的测定。
2、测试波形的设计与分析
为了测定mcs51单片机下降沿触发的实际时刻,使用agilent公司生产的型号为33250a的80mhz函数/任意波形发生器(function/arbitrarywaveformgenerator),产生出如图1所示的周期为20ms的周期波形。
图1周期为20ms的周期波形
将该波形通过单片机的外部中断0输入,可以测出下降沿中断触发的实际时刻,下面对该波形进行具体分析。建立如图2所示的直角坐标。
图2建立的直角坐标设
图2所示波形的周期为t,单片机在电压下降到y=y′时刻触发中断,t1′、t2′、t3′分别为前后周期的中断触发时刻,则有:
将 以上波形由单片机外部中断0输入,选择边沿触发方式,通过中断服务程序测取t1或者t2的值,从而可求出中断发生时刻的电平值y′,即边沿触发中断的实际 时刻。在使用单片机对中断时刻进行测量时,使用两个计数器,均设为方式1(16位计数方式)。其中,第一个计数器用于记录从程序开始执行到第一个下降沿到 来所经历的时间,第二个计数器用来记录程序开始执行到第二个下降沿到来所经历的时间,将两个计数器的计数值相减便可以得到两个下降沿之间的时间间隔。由前 面的分析可知,该时间间隔可能有两种情况:一种是t1时间,即t1′与t2′之间的时间间隔;另一种是t2时间,即t2′与t3′之间的时间间隔。其 中,t1+t2=t,t1时间要小于t2时间。通过测量得到t1或者t2时间,利用式(4)便可求得下降沿触发中断时刻的实际电平。
3、测试流程和相应的单片机程序
该单片机的中断服务程序流程如图3所示。
相应的中断服务程序为:
incr1
mova,r1
cjnea,#01h,sec
clrtr0
mov20h,tl0
mov21h,th0
clrie0
reti
sec:clrtr1
mov22h,tl1
mov23h,th1
clrex1
clrex0
reti
由于程序执行有一定的延时,在中断返回后,还需对两个计数器的输出值进行校正。本实验采用伟福公司生产的h51/l仿真器为单片机测量系统,测得t1值为6.514ms,由式(4)可得:y′=0.729v,即当y′约为0.73v时,单片机下降沿触发中断。