搜索
bottom↓
回复: 19

MCU休眠外部IO唤醒你们是怎么消抖的?

[复制链接]

出0入0汤圆

发表于 2017-6-18 21:32:46 | 显示全部楼层 |阅读模式
假如设备是完全的休眠,不是定时唤醒的,
外部的机械式开关触发中断你们是如何软件消抖的?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-6-18 21:53:04 | 显示全部楼层
按键并联个0.1uf的电容

出0入21汤圆

发表于 2017-6-18 22:01:47 | 显示全部楼层
首先要知道正常唤醒的电平需要多少时间

出0入0汤圆

 楼主| 发表于 2017-6-18 23:49:52 来自手机 | 显示全部楼层
lcw_swust 发表于 2017-6-18 21:53
按键并联个0.1uf的电容

在只用软件的情况下……

出0入0汤圆

 楼主| 发表于 2017-6-18 23:50:28 来自手机 | 显示全部楼层
superAFE 发表于 2017-6-18 21:46
当中断管脚电平产生变化时(即被唤醒了),执行一个毫秒级别的循环,在这个循环内部不停的检测该管脚,如果 ...

我想了好久,好像就延时好做点

出0入0汤圆

 楼主| 发表于 2017-6-18 23:51:56 来自手机 | 显示全部楼层
qd118118 发表于 2017-6-18 22:01
首先要知道正常唤醒的电平需要多少时间

假设是20ms呢?你会怎么做

出0入0汤圆

发表于 2017-6-19 01:45:22 | 显示全部楼层
Ray______ 发表于 2017-6-18 23:51
假设是20ms呢?你会怎么做

2楼不是已经说了怎么做了?醒来就判断到底是抖动还是确实按下按键

出90入0汤圆

发表于 2017-6-19 07:15:35 | 显示全部楼层
醒来后,
判断是不是真的IO口中断,
可间隔10ms判断5~10次。

出0入0汤圆

发表于 2017-6-19 08:47:37 | 显示全部楼层
这就是按键IO的消抖问题,其实休不休眠都是一样处理的,休眠只是判断完之后继续回去睡觉而已

出0入0汤圆

发表于 2017-6-19 10:39:08 | 显示全部楼层
这跟休眠/唤醒没关系,按键处理是按键处理,休眠/唤醒是休眠/唤醒。一旦醒来,按键检测是不是真的按了按键,如果是就处理事件,如果不是就继续让它睡觉。
另:如果经常有这种假按键唤醒它,避免耗电太多,就并个电容。

出0入21汤圆

发表于 2017-6-19 11:54:48 | 显示全部楼层
yoursnemo 发表于 2017-6-19 10:39
这跟休眠/唤醒没关系,按键处理是按键处理,休眠/唤醒是休眠/唤醒。一旦醒来,按键检测是不是真的按了按键 ...

说的在理

出0入0汤圆

发表于 2017-6-19 12:15:25 | 显示全部楼层
如果按键没被按下,请问怎么自我产生抖动,楼主这问题明显想得复杂了,需要保证的仅仅是,单片机在每次唤醒后的工作时间要大于按键触发后的抖动时间即可

出0入0汤圆

 楼主| 发表于 2017-6-19 21:43:46 | 显示全部楼层
yoursnemo 发表于 2017-6-19 10:39
这跟休眠/唤醒没关系,按键处理是按键处理,休眠/唤醒是休眠/唤醒。一旦醒来,按键检测是不是真的按了按键 ...

所言极是,应该把按键跟触发分离开。触发只管唤醒,按键决定是否处理、休眠

出0入0汤圆

发表于 2017-6-21 08:44:33 | 显示全部楼层
JoshuaAstray 发表于 2017-6-19 12:15
如果按键没被按下,请问怎么自我产生抖动,楼主这问题明显想得复杂了,需要保证的仅仅是,单片机在每次唤醒 ...

现场干扰

出0入0汤圆

发表于 2020-3-14 14:49:54 | 显示全部楼层
这里有一个临界风险,请问怎么处理保险点?

比如
1.io中断唤醒mcu,挂起标志busy=1,
2.定时器开始处理去抖
3.若干定时后得到结果:key_state, 同时busy=0
4.主程序判断busy==0 && key_pin==1 && sys_mode=0后进入睡眠(分别为:按钮处理是否结束,按钮脚是否=1,系统模式=关闭)
5.out=0; wdt=0; key_pin_int_en....stop;

在第4之后和进入stop指令之间往往还有其他少许几条指令,即便无任何额外指令,那也是>=1个指令周期,
如果这时候io引发中断,中断返回将无任何限制条件直接进入sotp状态(带着错误的状态进入睡眠)

这本质和判断+睡眠是多条指令的非原子操作一个道理,大家如何处理的,欢迎探讨。

出0入0汤圆

发表于 2020-3-14 14:55:27 | 显示全部楼层
本帖最后由 Oliver 于 2020-3-14 15:02 编辑

主程序一般写法:

if((busy==0) && (key_pin==1) && (sys_mode==OFF_MODE))
{
     OUT_DIS;//关闭输出
     WDT_CLR;
     WDT_DIS;//关闭wdt
     KEY_INT_EN;//打开端口中断
     
     STOP;
     NOP;NOP;NOP;
     
     KEY_INT_DIS;
     WDT_EN;
     WDT_CLR;
}

在这里的临界风险虽然很少但针对性测试还是能发现,
主要是一些外围IC给出的唤醒信号不像按钮一样很多抖动。
如整形处理后的光控信号,充放电IC给出的状态信号等。

按钮的抖动恰巧能再次触发唤醒,避免了错误死睡。

出0入0汤圆

发表于 2020-3-14 15:01:40 | 显示全部楼层
只能硬件消抖了,我以为不消抖也影响不大。误触发后会接着睡觉。不怕。

出0入0汤圆

发表于 2020-3-14 15:03:32 | 显示全部楼层
夏日么么茶 发表于 2020-3-14 15:01
只能硬件消抖了,我以为不消抖也影响不大。误触发后会接着睡觉。不怕。

刚说的不全面,已经更新了一下内容。

出0入0汤圆

发表于 2020-3-14 15:08:24 | 显示全部楼层
夏日么么茶 发表于 2020-3-14 15:01
只能硬件消抖了,我以为不消抖也影响不大。误触发后会接着睡觉。不怕。

我的应用中经常遇到低功耗,唤醒+模式变化,给过来的信号就是理想的脉冲,

处理不好就偶尔会丢失事件直接睡觉,用户体验就不好了。


如前面所说恰巧这那么1-2条指令出脉冲来,顺序执行机制的mcu好像没什么太好办法,

目前是定时唤醒,好处是错误一次不怕,过一会定时后唤醒后马上处理,缺点是功耗多一些

出0入0汤圆

 楼主| 发表于 2020-3-15 01:58:37 | 显示全部楼层
Oliver 发表于 2020-3-14 15:08
我的应用中经常遇到低功耗,唤醒+模式变化,给过来的信号就是理想的脉冲,

处理不好就偶尔会丢失事件直 ...

定时唤醒还是蛮好处理的,机制就跟定时消抖类似。
很久以前的项目了,某种场合为了降低功耗关掉了RTC,只允许外部中断触发。
后续用了粗暴的用死等的方法...因为只有IO中断会唤醒,并没有多任务的情况
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 15:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表