本帖最后由 3htech 于 2012-11-10 01:50 编辑
五应用说明
说了半天,还没有中断的事。下面说一下,同学们,注意听哈。
1 while(1)式检测和中断式检测的对比
(1) 在网上也看过一些人发的按键检测,自己以前也写过按键检测,但是无论这些检测程序多么美妙,绝大部分是在while(1)里执行按键检测程序(先管它叫while(1)式吧),这其实有一个很大的隐患。
当MCU负担不重时,while(1)式检测程序也许能好好的工作,这是由于while(1)的平均执行时间(不是最大执行时间)与按键检测程序的最长调用间隔时间相差无几或更小。但当MCU负担很重时,while(1)式反应就会明显变慢,甚至会丢失按键信息;这是由于while(1)的平均执行时间过大所造成的。举个极端例子,while(1)平均执行时间为1000ms,短按时间为300ms,显然按键检测程序会丢失按键信息。
一句话总结while(1)式的按键检测程序:时间不可控,耗时长,易丢失信息。
(2) 下面说一下在定时中断服务函数中进行按键检测(管它叫中断式吧)的优缺点。
首先说缺点:
由于是在中断中执行检测程序,增加的中断执行时间。但由于仅仅是几个【字节变量】的大小判断,所以耗时很短,小白菜曾在自己所用的平台上测试过,不超过50us,对,没错,就是50us不是50ms,而我的中断时间是10ms对其的影响小于5‰。
下面说一下优点。
优点一:中断式检测的调用时间是可预测,是可控的。中断的发生和while(1)的执行可以看成是并行的(老鸟不要拍砖啊),这显然为按键检测程序按我们设定的间隔执行。
优点二:几乎每个系统中都会出现定时中断(这里不用RTOS,因为小白菜不懂RTOS,只会裸了个奔),并且小白菜接触到的系统都是以10ms,20ms左右这样的定时中断。
优点三:一但把按键检测程序放在中断处理函数中执行,那我们就不需要再考虑之了,只需要在需要使用按键值的地方(比如菜单)调用一个获取键值函数就可以了,而获取键值函数也仅仅是把一个变量的值返回。
优点四:巧妙的躲过了抖动区。小白菜的系统中用的10ms中断。如图5.1.1所示。
图5.1.1 抖动区示意图
大家知道单片机IO对高低电平识别是有范围的,如图5.1.1中所示,所以,虽然aa’、dd’段存在抖动,但是这一段的电平仍然在“松开”范围内,同理,bb’、cc’段的电平仍在“闭合”的范围内。实际中肯定有ab段时长大于a’b’段时长。而我们真正要躲避的是a’b’和c’d’段,这才是真正的抖动区,因为其处于单片机不能识别的电平范围。
一般地,抖动区在10ms左右(我是听说的,这个我真没测试过),而我的中断时间是10ms,由图5.1.1可以,正好可以完美地跨过ab段和cd段,同要也跨过了a’b’和c’d’,从而实现了利用中断间隔达到普通延时去抖动的目的。
小白在实验定时间隔时发现,10-20ms的定时时间对按键响应比较好。中断时间过短,会因中断太频繁而降低系统性能;中断时间过长又不能及时地响应短按键。万能的亲们,你们自己试试吧。
本帖最后由 3htech 于 2012-11-10 01:50 编辑
五应用说明
说了半天,还没有中断的事。下面说一下,同学们,注意听哈。
1 while(1)式检测和中断式检测的对比
(1) 在网上也看过一些人发的按键检测,自己以前也写过按键检测,但是无论这些检测程序多么美妙,绝大部分是在while(1)里执行按键检测程序(先管它叫while(1)式吧),这其实有一个很大的隐患。
当MCU负担不重时,while(1)式检测程序也许能好好的工作,这是由于while(1)的平均执行时间(不是最大执行时间)与按键检测程序的最长调用间隔时间相差无几或更小。但当MCU负担很重时,while(1)式反应就会明显变慢,甚至会丢失按键信息;这是由于while(1)的平均执行时间过大所造成的。举个极端例子,while(1)平均执行时间为1000ms,短按时间为300ms,显然按键检测程序会丢失按键信息。
一句话总结while(1)式的按键检测程序:时间不可控,耗时长,易丢失信息。
(2) 下面说一下在定时中断服务函数中进行按键检测(管它叫中断式吧)的优缺点。
首先说缺点:
由于是在中断中执行检测程序,增加的中断执行时间。但由于仅仅是几个【字节变量】的大小判断,所以耗时很短,小白菜曾在自己所用的平台上测试过,不超过50us,对,没错,就是50us不是50ms,而我的中断时间是10ms对其的影响小于5‰。
下面说一下优点。
优点一:中断式检测的调用时间是可预测,是可控的。中断的发生和while(1)的执行可以看成是并行的(老鸟不要拍砖啊),这显然为按键检测程序按我们设定的间隔执行。
优点二:几乎每个系统中都会出现定时中断(这里不用RTOS,因为小白菜不懂RTOS,只会裸了个奔),并且小白菜接触到的系统都是以10ms,20ms左右这样的定时中断。
优点三:一但把按键检测程序放在中断处理函数中执行,那我们就不需要再考虑之了,只需要在需要使用按键值的地方(比如菜单)调用一个获取键值函数就可以了,而获取键值函数也仅仅是把一个变量的值返回。
优点四:巧妙的躲过了抖动区。小白菜的系统中用的10ms中断。如图5.1.1所示。
图5.1.1 抖动区示意图
大家知道单片机IO对高低电平识别是有范围的,如图5.1.1中所示,所以,虽然aa’、dd’段存在抖动,但是这一段的电平仍然在“松开”范围内,同理,bb’、cc’段的电平仍在“闭合”的范围内。实际中肯定有ab段时长大于a’b’段时长。而我们真正要躲避的是a’b’和c’d’段,这才是真正的抖动区,因为其处于单片机不能识别的电平范围。
一般地,抖动区在10ms左右(我是听说的,这个我真没测试过),而我的中断时间是10ms,由图5.1.1可以,正好可以完美地跨过ab段和cd段,同要也跨过了a’b’和c’d’,从而实现了利用中断间隔达到普通延时去抖动的目的。
小白在实验定时间隔时发现,10-20ms的定时时间对按键响应比较好。中断时间过短,会因中断太频繁而降低系统性能;中断时间过长又不能及时地响应短按键。万能的亲们,你们自己试试吧。
举报