打印

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

[复制链接]
楼主: 火山LF
手机看帖
扫描二维码
随时随地手机跟帖
41
火山LF|  楼主 | 2016-10-14 08:18 | 只看该作者 回帖奖励 |倒序浏览
yyy71cj 发表于 2016-10-13 16:33
在中断里写延时的孩子不是好孩子

为了防止多次响应不知道该怎么优化程序,目前是可以实现功能的,但是不在中断里面写延时,我还没有想到办法实现

使用特权

评论回复
42
pywmiss| | 2016-10-14 08:49 | 只看该作者
火山LF 发表于 2016-10-14 08:12
但是产品的功能是有好几个小时甚至一天都没有工作,需要进入睡眠,2秒醒一次的频率很高,也很耗电,2秒醒 ...

嗯,因为我的产品是需要实时检测温度的..所以要间歇唤醒.
你这个的话..我之前也做过..就直接进入最休眠的...按键中断唤醒...醒来之后就直接进入正常工作状态...其实按键有设置输入上拉不会有什么干扰...正常有中断就是正常的按键程序判断...当然我从来不会用循环延时的方式来判断按键时间的...
就是唤醒后就恢复正常的工作状态...用时间中断积累时间判断按键时间,可以是20ms的低电平时间才算按键按下..这样就绝对是OK的了....如果不是正确的时间就延时1秒继续回到睡眠...睡眠状态下功耗很低...如果有稳压给单片机的话..这里会有几UA,,,我之前做的大概20uA的静耗

使用特权

评论回复
43
datouyuan| | 2016-10-14 09:10 | 只看该作者
火山LF 发表于 2016-10-14 08:14
按键边沿触发唤醒MCU,首先要判断是否是真的一个边沿触发,而不是按键的一个普通抖动而引起的误触发,不 ...

不带节能的方式是怎么写的,带节能的就怎么写.没有任何区别.
常规的的按键处理都具有消抖延时,通过定时扫描,可做到0耗时(占用cpu资源极少).网上有大把的这类代码.可以非常方便的嵌入到系统中.

像你这种方式占用了cpu巨量的时间,是及其不好的.按键模块又是最常用的模块,你以前总写过几个按键模块吧,为什么不能用于这个项目?
我们写的代码,一般是复制粘贴,就是以前写的代码质量高(考虑通用性,资源占用),可以方便的嵌入.


使用特权

评论回复
44
datouyuan| | 2016-10-14 10:08 | 只看该作者
火山LF 发表于 2016-10-14 08:15
首先得要判断第一次进入中断的边沿触发是不是真的触发,而不是按键的一个抖动,加延时是为了确定是真的第 ...

是不是真正触发不要在中断中判断.

请理解我32楼的"mcu满足休眠条件后,休眠."

使用特权

评论回复
45
datouyuan| | 2016-10-14 10:13 | 只看该作者
pywmiss 发表于 2016-10-14 08:49
嗯,因为我的产品是需要实时检测温度的..所以要间歇唤醒.
你这个的话..我之前也做过..就直接进入最休眠的. ...

对,楼主应该象你这么做,按键和mcu的电流可以做到小于0.1uA.

见我32楼的帖子.

使用特权

评论回复
46
pywmiss| | 2016-10-14 10:39 | 只看该作者
datouyuan 发表于 2016-10-14 10:13
对,楼主应该象你这么做,按键和mcu的电流可以做到小于0.1uA.

见我32楼的帖子. ...

请问你做的产品整机休眠时的静耗有多少??
我上次的整机是20UA左右..其中有一个稳压IC..HT7133

使用特权

评论回复
47
火山LF|  楼主 | 2016-10-14 10:39 | 只看该作者
pywmiss 发表于 2016-10-14 08:49
嗯,因为我的产品是需要实时检测温度的..所以要间歇唤醒.
你这个的话..我之前也做过..就直接进入最休眠的. ...

你的意思是说,中断不放延时,只要有触发就中断唤醒MCU,然后在主程序中判断是否按键是真的按下(按键的低电平时间达到20ms以上才判断是按键按下了),之后才做动作,如果不是,就延时1s继续回到睡眠。这样的理解对吗?

有点明白了

使用特权

评论回复
48
datouyuan| | 2016-10-14 10:51 | 只看该作者
火山LF 发表于 2016-10-14 10:39
你的意思是说,中断不放延时,只要有触发就中断唤醒MCU,然后在主程序中判断是否按键是真的按下(按键的 ...

延时1s时间可能太长了.

mcu处理完所有事件,就可以休眠了.

使用特权

评论回复
49
火山LF|  楼主 | 2016-10-14 10:57 | 只看该作者
datouyuan 发表于 2016-10-14 10:51
延时1s时间可能太长了.

mcu处理完所有事件,就可以休眠了.

嗯嗯嗯,明白~~~谢谢

使用特权

评论回复
50
datouyuan| | 2016-10-14 10:59 | 只看该作者
pywmiss 发表于 2016-10-14 10:39
请问你做的产品整机休眠时的静耗有多少??
我上次的整机是20UA左右..其中有一个稳压IC..HT7133
...

HT7133顶多耗电0.1uA.
我做过一个项目,有触摸按键,带olcd显示,带TTL串口,有2个LDO,整机待机时耗电11uA.

触摸按键模块部分待机有11uA多,其它部分耗电小于1uA.

使用特权

评论回复
51
pywmiss| | 2016-10-14 11:19 | 只看该作者
火山LF 发表于 2016-10-14 10:39
你的意思是说,中断不放延时,只要有触发就中断唤醒MCU,然后在主程序中判断是否按键是真的按下(按键的 ...

有个前提....这里的所有时间都不是循环延时的方法获取的...而是使用定时中断...积累...然后设置一个标志...
比如我常常做一个2ms的时间标志....这个标志是使用定时器中断积累的...比如定时中断设置成0.1ms,每次进入累加一下...当累加到20次就得到一个2ms标志....然后...在中断外面再做个时间程序...这个时间程序里你可以积累10ms
100ms....1S....就是你想要什么时间就做什么时候的标志...
然后这些时间标志再做轮询处理其他按键程序,显示程序.外部动作驱动...等...非常灵活.
这个方法一直在用....
除了轮询...也可以结合状态机的方法===可以去搜索"轮询"  "状态机"....其实写程序最重要的就是这个..我认为

使用特权

评论回复
52
pywmiss| | 2016-10-14 11:20 | 只看该作者
datouyuan 发表于 2016-10-14 10:59
HT7133顶多耗电0.1uA.
我做过一个项目,有触摸按键,带olcd显示,带TTL串口,有2个LDO,整机待机时耗电11uA.

呵呵..比我的还小..这么多东西...看来还有改进的地方...
你的外围东西..都有单独控制电源断电吧?

使用特权

评论回复
53
datouyuan| | 2016-10-14 11:34 | 只看该作者
pywmiss 发表于 2016-10-14 11:20
呵呵..比我的还小..这么多东西...看来还有改进的地方...
你的外围东西..都有单独控制电源断电吧? ...

OLED供电需要控制,其它部分供电直接连MCU的电源.

mcu的IO口要精心配制,输出口不要采用准双向,应采用推挽.输入口尽量采用开漏.

使用特权

评论回复
54
pywmiss| | 2016-10-14 11:37 | 只看该作者
可能是因为我的矩阵键盘需要中断检测..设置了输入上拉会消耗点电流

使用特权

评论回复
55
火山LF|  楼主 | 2016-10-14 11:42 | 只看该作者
pywmiss 发表于 2016-10-14 11:19
有个前提....这里的所有时间都不是循环延时的方法获取的...而是使用定时中断...积累...然后设置一个标志. ...

明白,我的其他定时中断也是按照你的方法来做的,在定时中断里面设置一个变量一直加,在定时中断外面的函数判断是否大于一个20,然后就做相应的动作,这样的方法标志位会设置很多,但胜在灵活,状态机我还没接触过,恩恩,学习学习,感谢指教

谢谢呐

使用特权

评论回复
56
datouyuan| | 2016-10-14 11:57 | 只看该作者
pywmiss 发表于 2016-10-14 11:19
有个前提....这里的所有时间都不是循环延时的方法获取的...而是使用定时中断...积累...然后设置一个标志. ...

和我的做法类似.

我定时器直接设置为2mS左右.小于1mS的延时还是采用软延时.

按键消抖时间,按键压下时间,等各种时间都是通过这个2mS计数结合状态机的方法处理的.

使用特权

评论回复
57
pywmiss| | 2016-10-14 12:06 | 只看该作者
datouyuan 发表于 2016-10-14 11:57
和我的做法类似.

我定时器直接设置为2mS左右.小于1mS的延时还是采用软延时.

呵呵...我当时跟师傅学的8位单片机...汇编的...就是这种方法...现在继续使用...挺好的..

使用特权

评论回复
58
1203030117| | 2016-10-14 14:57 | 只看该作者
本帖最后由 1203030117 于 2016-10-14 15:23 编辑
火山LF 发表于 2016-10-14 08:15
首先得要判断第一次进入中断的边沿触发是不是真的触发,而不是按键的一个抖动,加延时是为了确定是真的第 ...

谔谔,在进入中断函数的那一刻就已经唤醒mcu了,,我认为直接在中断里延迟消抖判断是没有关系的,,直接在中断里完成判读,没问题,,
本来这个时候就不需要外面的程序运行,在中断里完成一系列动作一点问题没有,,延迟多久都没影响,,
还有,,路过的各位大大,,大家说不要在中断里延迟有什么根据不,,这点我没想通,哪位dada解惑一下

使用特权

评论回复
59
火山LF|  楼主 | 2016-10-14 16:07 | 只看该作者
1203030117 发表于 2016-10-14 14:57
谔谔,在进入中断函数的那一刻就已经唤醒mcu了,,我认为直接在中断里延迟消抖判断是没有关系的,,直接在 ...

最后一个问题,建议你另外开帖子,询问各位大大,在这里问,大大可能看不见

使用特权

评论回复
60
1203030117| | 2016-10-14 16:20 | 只看该作者
火山LF 发表于 2016-10-14 16:07
最后一个问题,建议你另外开帖子,询问各位大大,在这里问,大大可能看不见 ...

不要,,这种事得结合实际情况来,,,只要对整体程序没影响,,中断里延迟多久都没问题的,,看实际需求。。

使用特权

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

本版积分规则