打印

按键的滤波问题,请教大家

[复制链接]
5641|72
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火山LF|  楼主 | 2016-10-12 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

MSP430的芯片,Port 4.5 口是按键,按一下按键,翻转LED灯 P1.1口,我的做法如下,但是总是会出现按键按了,但是LED不翻转的情况,请问大家,按键滤波用什么方法好?
按键采用外部中断的方式进行翻转LED灯

#pragma vector = PORT4_VECTOR;
__interrupt void PORT4_ISR(void)
{

        wait(100);//*delay 100ms
       
        btn_flag ^= 1;
        if (btn_flag == 0)
        {
                GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
        }

        GPIO_clearInterrupt(GPIO_PORT_P4, GPIO_PIN5);

}



相关帖子

沙发
焊丝滚成球| | 2016-10-12 21:08 | 只看该作者
if(!btn_flag)比较好,能不能看看寄存器里的值。。

使用特权

评论回复
板凳
1203030117| | 2016-10-12 21:28 | 只看该作者
思路: 判断按键是否按下----延迟十几个ms左右----再次判断按键是否按下,如果按下,进行操作,否则,不进行操作; 然后等待按键释放;注意等待按键释放的时候加个超时处理。
   不建议使用中断来处理。另外如果对程序时间有要求的话,用定时器来计时延迟

使用特权

评论回复
地板
dirtwillfly| | 2016-10-12 21:41 | 只看该作者
不要在中断里延时那么久阿。
需要延时的话就用定时器

使用特权

评论回复
5
火山LF|  楼主 | 2016-10-12 22:08 | 只看该作者
dirtwillfly 发表于 2016-10-12 21:41
不要在中断里延时那么久阿。
需要延时的话就用定时器

群主,用不了定时器,因为芯片已经进入低功耗的状态,按键是用来唤醒MCU的,边沿触发

使用特权

评论回复
6
dirtwillfly| | 2016-10-12 22:15 | 只看该作者
火山LF 发表于 2016-10-12 22:08
群主,用不了定时器,因为芯片已经进入低功耗的状态,按键是用来唤醒MCU的,边沿触发 ...

推荐用定时器定时1ms,或者10ms。你的低功耗怎么配置的?一般定时器工作不影响mcu进入低功耗的,只是定时器到时间的时候唤醒一下。
具体根据你的需要来计时。
然后在按键中断里判断延时。

使用特权

评论回复
7
数码小叶| | 2016-10-13 08:43 | 只看该作者
进中断,关中断,翻转,等释放(按需,可要可不要,单纯唤醒直接不要),开中断,不用延时

使用特权

评论回复
8
火山LF|  楼主 | 2016-10-13 09:46 | 只看该作者
dirtwillfly 发表于 2016-10-12 22:15
推荐用定时器定时1ms,或者10ms。你的低功耗怎么配置的?一般定时器工作不影响mcu进入低功耗的,只是定时 ...

因为功能是起码有几个小时或者十几个小时MCU进入低功耗,不做动作的,如果用定时器,时间太短,MCU唤醒的太频繁了,感觉跟没有进入低功耗没什么区别,所以就没有使用定时器

使用特权

评论回复
9
火山LF|  楼主 | 2016-10-13 09:48 | 只看该作者
数码小叶 发表于 2016-10-13 08:43
进中断,关中断,翻转,等释放(按需,可要可不要,单纯唤醒直接不要),开中断,不用延时 ...

小叶子啊,不用延时怎么消抖啊?

使用特权

评论回复
10
皈依| | 2016-10-13 10:33 | 只看该作者
一般都是延时消抖

使用特权

评论回复
11
火山LF|  楼主 | 2016-10-13 10:38 | 只看该作者
本帖最后由 火山LF 于 2016-10-13 10:41 编辑

解决方案:
#pragma vector = PORT4_VECTOR;
__interrupt void PORT4_ISR(void)
{

        wait(30);//*delay 30ms
        if(GPIO_getInputPinValue(GPIO_PORT_P4, GPIO_PIN5) == 0)
        {
                btn_flag ^= 1;

                GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
        }

        GPIO_clearInterrupt(GPIO_PORT_P4, GPIO_PIN5);

}
用示波器观察按键低电平的时长,中断延时必须比按键低电平的时长短,不然进不去判断,延时的时间,通过调整,发现30ms的时候,实现结果较好。下面添加了按键IO的电平判断情况,确保是一次按键行为,这种方法,按上个上百次,实验结果是正确的。

虽然是很简单的问题,但是也要学着验证这些问题

使用特权

评论回复
12
世界心| | 2016-10-13 10:41 | 只看该作者
逻辑问题,你那个异或以及条件判断,如果中断只是在上升沿或者下降沿触发的话,肯定两次中有一次按键不能翻转LED灯。另外,按键检测有很多方法,硬件电路上可以用RS触发器直接消抖,或者经过思密特触发器整型后分成两路,一路延时一路不延时,之后进过异或也行。软件上通常采用主函数查询加延时10ms的方法。也可以通过定时器中断扫描按键,然后设置计数器比较值,当连续检测到阈值规定的数量的事件时翻转LED,没到阈值就出现了其他情况就清零计数器。。。。

使用特权

评论回复
13
dirtwillfly| | 2016-10-13 10:41 | 只看该作者
火山LF 发表于 2016-10-13 09:48
小叶子啊,不用延时怎么消抖啊?

有抖动说明有按键按下,其实抖动不是问题。问题是不应该多次响应。只要能避免多次响应就可以。

使用特权

评论回复
14
四月初七| | 2016-10-13 10:56 | 只看该作者
火山LF 发表于 2016-10-13 09:48
小叶子啊,不用延时怎么消抖啊?

那为什么不能让中断只起唤醒作用,在主程序里延时消抖、翻转呢

使用特权

评论回复
15
火山LF|  楼主 | 2016-10-13 11:01 | 只看该作者
dirtwillfly 发表于 2016-10-13 10:41
有抖动说明有按键按下,其实抖动不是问题。问题是不应该多次响应。只要能避免多次响应就可以。
...

群主正解呀~~~

使用特权

评论回复
16
火山LF|  楼主 | 2016-10-13 11:02 | 只看该作者
世界心 发表于 2016-10-13 10:41
逻辑问题,你那个异或以及条件判断,如果中断只是在上升沿或者下降沿触发的话,肯定两次中有一次按键不能翻 ...

够专业

使用特权

评论回复
17
数码小叶| | 2016-10-13 11:38 | 只看该作者
火山LF 发表于 2016-10-13 09:48
小叶子啊,不用延时怎么消抖啊?

消毛线啊,看了你的其它回复,反正是唤醒,消抖没啥实际意义,纯粹浪费资源。你现在的程序按键按住2s,或者把消抖去了,自己试试

使用特权

评论回复
18
火山LF|  楼主 | 2016-10-13 11:43 | 只看该作者
数码小叶 发表于 2016-10-13 11:38
消毛线啊,看了你的其它回复,反正是唤醒,消抖没啥实际意义,纯粹浪费资源。你现在的程序按键按住2s,或 ...

那个延时你别说没意义,我有把延时给去掉,结果就是按一次按键,响应多次,意思就是进入多次中断,所以延时还是必要的啊

我的按键的确有个长按2S的功能捏,哈哈哈

使用特权

评论回复
19
数码小叶| | 2016-10-13 11:49 | 只看该作者
火山LF 发表于 2016-10-13 11:43
那个延时你别说没意义,我有把延时给去掉,结果就是按一次按键,响应多次,意思就是进入多次中断,所以延 ...

那不还是没实际意义么

使用特权

评论回复
20
火山LF|  楼主 | 2016-10-13 11:52 | 只看该作者
数码小叶 发表于 2016-10-13 11:49
那不还是没实际意义么

很重要啊,按一次按键,防止响应多次呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

816

帖子

16

粉丝