liufanidn 发表于 2007-6-7 11:54:39

如果按键采用外部中断INT0的方式,还需要延时去抖吗?

请教各位大侠,如果按键采用外部中断INT0的方式,还需要延时去抖吗?先谢谢大家了!

machao 发表于 2007-6-7 23:17:00

你自己认为呢?需要给出理由,不需要也给出理由。

laoki8888 发表于 2007-6-8 09:13:18

需要,如果不去抖,有可能会触发多次中断

liufanidn 发表于 2007-6-8 14:21:29

我个人认为,还是需要去抖的,因为不论按键采取那种方式,总会出现干扰,只是不同的电路采取不同的形式罢了。马老师,不知我这么理解是否正确,请指点迷津。我目前采取的是硬件去抖,在INT0和电源的一端接了10K的上拉电阻,和地一端接了104电容,不知这种方式是否可行。

jemmy 发表于 2007-6-11 01:59:59

去抖是必要的。

machao 发表于 2007-6-11 18:08:09

3楼:目前采取的是硬件去抖,在INT0和电源的一端接了10K的上拉电阻,和地一端接了104电容,不知这种方式是否可行。

=======================================================



上拉电阻可以省掉,使用内部上拉。104电容对抗高频噪声有用,但对按键消抖效果不好,因为机械抖动频率不高。



现在一般不使用硬件消抖,成本高,而采用软件消抖,看程序员的工夫。



按键接口没有必要采用INT0的中断。在我的讲义中是有个按键使用INT0的例子,但主要是为了简单演示INT0的应用。



关于按键接口和处理,在我的讲义中用专门的章节进行了详细介绍,请参考。

liufanidn 发表于 2007-6-12 08:57:29

马潮老师的讲义在哪里?谢谢大家!!!

machao 发表于 2007-6-12 11:58:35

远在天边,近在眼前:)

liufanidn 发表于 2007-6-13 22:38:22

马老师,您就别为难我了,快告诉学生吧!

machao 发表于 2007-6-14 01:51:25

本专栏中置顶的帖子里写的明明白白的,一共3个帖子,包含11章内容提供下载。



我一点也没为难你,检查你自己本身的原因吧。



饭就在旁边,伸手就可以自己吃了,可是还要张着嘴等着喂,永远也长不大。



说的重了,抱歉。不过这也不是仅仅批评你一个,对那些指望找到个程序就能用的都有效。

liufanidn 发表于 2007-6-14 17:38:46

马老师说的对,都怪学生不仔细。

wlmysx1 发表于 2012-1-7 15:55:47

现在在我也这个困惑。用中断来进行检查按键,再加个消拌就过了中断时间,下次的中断又来了。

55646184@qq.com 发表于 2012-6-1 17:15:39

马老师诲人不倦,可亲可佩

wu_qi0613 发表于 2012-6-15 13:57:55

学习学习再学习!

mcujack 发表于 2012-6-15 14:01:28

看了马老师讲的状态机,自己也试验了,感觉不错

ShawnLinson 发表于 2012-6-15 22:27:29

一般那个啥也要抖三抖的,介个嘛就更加需要啦
不过一般都是来软的,来硬的太耗精力了。。。。

lijg8421 发表于 2012-6-15 22:52:05

感觉外部中断的按键去抖处理比定时扫描处理难度要大!大家可以讨论下比较好的外部中断按键的去抖处理方法.

machao 发表于 2012-6-30 01:57:57

lijg8421 发表于 2012-6-15 22:52 static/image/common/back.gif
感觉外部中断的按键去抖处理比定时扫描处理难度要大!大家可以讨论下比较好的外部中断按键的去抖处理方法. ...

一次短促按键的整个过程最少也需要200ms-300ms,在这个期间你能抓住就可以,不是非常紧急的事件。因此使用外部中断的方法处理按键不是一个好的方法。如果这个按键要实现短按、长按、连发等多功能,外部中断处理就更加麻烦。

消抖是必要的,软件消抖理论上10-20ms扫描2次确定。排除使用教科书上的低效率坑人的软件延时方法(目前90%教课书上都是软件延时,甚至32位的教材上也是这样,害人不浅,误人子弟!),按键消抖肯定要使用一个硬件T/C资源。因此没有必要再使用外部中断资源。20ms定时扫描按键,使用状态机的方法是最好的方法(见我编写教材)

lijg8421 发表于 2012-7-1 10:12:10

谢谢马老师回复,大部分项目的确使用的timer+状态机实现key_up,key_down,key_press功能更容易,只是见一些低功耗设计系统,需要按键外部中断唤醒,就会涉及外部中断的按键去抖,单击,连击等功能,一直没有比较好的实现方式!

gxhchhkd 发表于 2012-7-1 18:01:02

马老师一语中的,精辟~

machao 发表于 2012-7-1 21:32:01

本帖最后由 machao 于 2012-7-1 21:33 编辑

lijg8421 发表于 2012-7-1 10:12 static/image/common/back.gif
谢谢马老师回复,大部分项目的确使用的timer+状态机实现key_up,key_down,key_press功能更容易,只是见一些 ...

这个取决对系统的理解,好的单片机设计者不是死板教条的,而是在充分的理解基本的功能后灵活的整合应用。
假定系统只有一个按键,该键在系统正常情况下作为系统设置使用,有短按和长按两种方式(需要消抖)。而当系统进入休眠后,该键用于唤醒,长按2秒后唤醒(唤醒只看是否按下2秒,其他操作无效)。

由于按键在不同的工作状态,用途不同,所以可以使用两种不同的按键扫描处理方式。

实现方法:现在的外部中断I/O口同时也可以作为通用I/O使用,那么在正常工作状态下,禁止INT中断,采用timer+状态机方式扫描处理按键。
当系统进入休眠前,禁止T/C中断,允许INT中断,然后进入休眠状态。

按键INT服务:
按键按下->进入INT服务->禁止INT中断->使用一个软件计数延时2秒(此处使用软件延时,不会影响系统的效率,因为此时系统并没有真正进入正常工作状态)->2秒后读按键I/O,确认按键是否继续按下,并设定一个标志位,中断返回。

INT中断返回后,应该执行进入休眠的语句的下句语句(唤醒后续处理部分):

查看标志位,按键是否长按2秒;a/ 如果是,禁止INT中断,系统转入正常工作状态,开启T/C中断,采用timer+状态机方式扫描处理按键;b/ 如果不是,允许INT中断,系统继续进入休眠状态。

lijg8421 发表于 2012-7-5 16:46:58

谢谢马老师如此耐心详细的回复,定会仔细阅读学习!

liuyongliuyong 发表于 2014-2-12 20:06:55

machao 发表于 2012-6-30 01:57
一次短促按键的整个过程最少也需要200ms-300ms,在这个期间你能抓住就可以,不是非常紧急的事件。因此使 ...

马老师,你多次提到不建议用外部中断来处理按键,可是当需要睡眠模式等低功耗的情况下,就需要用按键来唤醒CPU,这时就不可避免的要用到外部中断,那这时不消抖的话会造成误触发。这时外部中断用来唤醒的按键还能用定时器定时扫描么?

machao 发表于 2014-3-23 16:43:16

liuyongliuyong 发表于 2014-2-12 20:06
马老师,你多次提到不建议用外部中断来处理按键,可是当需要睡眠模式等低功耗的情况下,就需要用按键来唤 ...

任何事物都要仔细分析系统应用情况,采用合理的方法作适当处理的。
机械按键总是要进行消抖处理的,传统教科书给的方法通常是采用软件延时20ms进行消抖,这个方法不能说不对,但在实际应用中会出现许多问题。
当系统处在正常工作状态下,按键采用20ms软件延时消抖,首先是MCU的效率大大打了折扣。想一下,现在STM32的系统时钟高达100M,20ms能作多少事情,就在这里白白浪费了(其它的问题自己分析吧,一般人体会不到的)。

但是系统进入睡眠模式后,MCU基本什么事情都不做的,此时就可以采用软件延时消抖了,不用考虑MCU效率问题。

假定一个按键接在INT0的引脚上,当系统正常工作时,该按键作其它输入功能用,而当系统处于休眠状态,该按键用于唤醒的话,可以这样处理:

1/系统正常工作时,关闭INT0中断,采用定时扫描该按键,检测按键输入信号。

2/当系统进入休眠状态时的处理:

   L1:清INT0中断标志;
         允许INT0中断;
         唤醒标志清零;
         进入休眠状态;
         
            判断唤醒标志;
            为0 转L1
            禁止int0中断;
            真正唤醒后执行语句;

3/INT0中断服务(唤醒中断)处理:
   休眠状态下,一旦按下按键,进入INT0中断(其实MCU此时已经唤醒,但不表示系统要真正被唤醒)

   禁止INT0中断;
   清零INT0中断标志;
   软件延时500ms,(当然,延时时间在50ms-1000ms内都可以,根据需要,此时系统不是真正唤醒,还不会作其它的事情,不影响MCU的效率)
   判断INT0引脚电平是否还是低电平;
   如果不是低电平,中断返回;
   如果是低电平,置唤醒标志为1,中断返回

4/ INT0中断返回后执行进入休眠状态的下一条指令,即判断唤醒标志
   当唤醒标志为0的话,说明按键抖动干扰,返回L1,继续进入休眠。
   当唤醒标志为1的话,说明是真正的唤醒,执行后续指令,系统真正唤醒。此时INT0中断禁止,系统正常定时扫描按键。

最后建议,如果使用按键唤醒的话,最好使用用低电平中断方式的引脚,边沿方式的中断需要仔细考虑会不会产生中断嵌套的可能行(需要仔细看MCU的手册)

=========================
这个也算MCU特种兵训练的一个设计参考吧。      
页: [1]
查看完整版本: 如果按键采用外部中断INT0的方式,还需要延时去抖吗?