打印

用中断处理或者是定时扫描按键的方法,如何确保不丢键?

[复制链接]
楼主: nelsonfung
手机看帖
扫描二维码
随时随地手机跟帖
21
huzi2099| | 2013-10-16 15:45 | 只看该作者 回帖奖励 |倒序浏览
nelsonfung 发表于 2013-10-16 15:30
防抖可以不用空占系统资源,把防抖的这段时间用来处理其他的任务就好了。主程序处理的再好都会出现丢键的 ...

如果是机械按键按下去到抬起来至少会有几百毫秒的沿宽,
百毫秒这个数量级的你都会丢失?猜想不是任务太多,是你的程序很不合理...
以前写的一点东西,希望21ic不要介意链接.
http://bbs.**/thread-369803-1-1.html

使用特权

评论回复
22
huzi2099| | 2013-10-16 15:50 | 只看该作者
nelsonfung 发表于 2013-10-16 15:39
大量高优先级的任务(优先级低于按键扫描中断或定时扫描的中断)打断主程序,当回过来的时候扫描到新按键, ...

猜你程序有太多的while 了,
中断响应要尽量的短,做完必须的内容就尽快结束,其余的通过标记转到主循环里做.

使用特权

评论回复
23
airwill| | 2013-10-16 15:51 | 只看该作者
链表 是可行的. 不过你得开辟数据堆空间来存链表, 处理复杂, 需要空间大了很多倍.
不大合适用在单片机系统里面, 还不如开个大点的 FIFO 呢.

使用特权

评论回复
评分
参与人数 2威望 +6 收起 理由
nelsonfung + 3 赞一个!很受用
feilusia + 3 受教了,顶一个
24
nelsonfung|  楼主 | 2013-10-16 16:06 | 只看该作者
huzi2099 发表于 2013-10-16 15:50
猜你程序有太多的while 了,
中断响应要尽量的短,做完必须的内容就尽快结束,其余的通过标记转到主循环里做 ...

no,当你任务比较多的时候或者说顺序执行主while周期时间比较长,这个时候一样会丢键啊

使用特权

评论回复
25
huzi2099| | 2013-10-16 16:19 | 只看该作者
nelsonfung 发表于 2013-10-16 16:06
no,当你任务比较多的时候或者说顺序执行主while周期时间比较长,这个时候一样会丢键啊 ...

不要只会copy demo,程序能运行了需要花点心思优化一下的.

使用特权

评论回复
26
huzi2099| | 2013-10-16 16:23 | 只看该作者
nelsonfung 发表于 2013-10-16 16:06
no,当你任务比较多的时候或者说顺序执行主while周期时间比较长,这个时候一样会丢键啊 ...

做个假设按键脉宽50毫秒,两次按键间最小时间500ms,意味着你有50毫秒做响应,另外有500ms时间做处理,这个都不能实现我看不要玩了.

使用特权

评论回复
27
feilusia| | 2013-10-16 16:23 | 只看该作者
huzi2099 发表于 2013-10-16 15:30
一样需要消抖的.
丢失按键是你的主程序不合理,按键的实时性不要求很高.

看完了你的**眼睛有点痛
我不太明白为什么边沿触发需要消抖,一直按着也不会再进中断造成误读,能说一说原因么?
我之前做的一个项目按键是用芯片HD7279,请问下是不是7279内部有消抖的功能,这样可以节省CPU消抖时间?

使用特权

评论回复
28
nelsonfung|  楼主 | 2013-10-16 16:29 | 只看该作者
huzi2099 发表于 2013-10-16 15:45
如果是机械按键按下去到抬起来至少会有几百毫秒的沿宽,
百毫秒这个数量级的你都会丢失?猜想不是任务太多, ...

首先还是非常感谢你认真的回答,其次咱还是回到主题。我现在依旧还是不能认同你说是主程序安排不合理的这种说法。
因为主程序顺序执行周期是很有可能超过2次按键扫描的最小间隔的,然而你不可能说在主程序中不断的去加按键处理程序。那么等到轮到按键处理的时候依旧会出现丢键的情况。相比你的这个说法我还是更倾向于认同会丢键,@ariwill 加FIFO缓存的这种做法。

使用特权

评论回复
29
huzi2099| | 2013-10-16 16:31 | 只看该作者
feilusia 发表于 2013-10-16 16:23
看完了你的**眼睛有点痛
我不太明白为什么边沿触发需要消抖,一直按着也不会再进中断造成误读 ...

7279是专门的芯片,可以不消抖中断后读取按键.但是专门芯片功能会有限制.比如你想在7279上作复合按键就无解了.

一直按着不会有边沿自然就没有中断了.

使用特权

评论回复
30
nelsonfung|  楼主 | 2013-10-16 16:34 | 只看该作者
huzi2099 发表于 2013-10-16 16:23
做个假设按键脉宽50毫秒,两次按键间最小时间500ms,意味着你有50毫秒做响应,另外有500ms时间做处理,这个都 ...

500ms处理不过来正常的很,我大概评估了一下 一块12864的液晶(串行) 40M时钟 keil 里面软仿下来都需要40+ms,处理的任务稍多一点500+响应不过来很正常,当然借助os的话又另说

使用特权

评论回复
31
nelsonfung|  楼主 | 2013-10-16 16:36 | 只看该作者
huzi2099 发表于 2013-10-16 16:31
7279是专门的芯片,可以不消抖中断后读取按键.但是专门芯片功能会有限制.比如你想在7279上作复合按键就无 ...

用定时扫描的方法比如说5ms扫描一次,按键扫描程序在几十个us左右,连续扫描8次也就有40ms的防抖动时间 足以

使用特权

评论回复
32
nelsonfung|  楼主 | 2013-10-16 16:42 | 只看该作者
nelsonfung 发表于 2013-10-16 16:34
500ms处理不过来正常的很,我大概评估了一下 一块12864的液晶(串行) 40M时钟 keil 里面软仿下来都需要4 ...

当然 我说的这个也很极端,因为大多数时间是在500ms内能处理过来的,但你也不能排除这种长时间不能轮训的情况

使用特权

评论回复
33
feilusia| | 2013-10-16 16:46 | 只看该作者
huzi2099 发表于 2013-10-16 16:31
7279是专门的芯片,可以不消抖中断后读取按键.但是专门芯片功能会有限制.比如你想在7279上作复合按键就无 ...

7279的我明白了,谢谢你。
我明白低电平触发必须要消抖,但是边沿触发只是一瞬间的事情,如何也可以消抖100ms呢?

使用特权

评论回复
34
jjjkkk00| | 2013-10-16 16:54 | 只看该作者
中断里只负责扫描当前瞬间的状态,通过更新状态链,然后在程序中分析状态的变化?

使用特权

评论回复
35
huzi2099| | 2013-10-16 17:28 | 只看该作者
nelsonfung 发表于 2013-10-16 16:36
用定时扫描的方法比如说5ms扫描一次,按键扫描程序在几十个us左右,连续扫描8次也就有40ms的防抖动时间  ...

12864串行可以用硬件驱动开销就小了,扫描函数定时器触发,扫描一次即返回状态存入全局量,大循环检查全局量决定如何处理.

你的程序需要优化....

还是那句不要只会copy demo

使用特权

评论回复
36
huzi2099| | 2013-10-16 17:29 | 只看该作者
feilusia 发表于 2013-10-16 16:46
7279的我明白了,谢谢你。
我明白低电平触发必须要消抖,但是边沿触发只是一瞬间的事情,如何也可以消抖1 ...

扫描计数修改状态实现消抖

使用特权

评论回复
37
nelsonfung|  楼主 | 2013-10-16 17:35 | 只看该作者
huzi2099 发表于 2013-10-16 17:28
12864串行可以用硬件驱动开销就小了,扫描函数定时器触发,扫描一次即返回状态存入全局量,大循环检查全局量 ...

12864 只是从缓存区中读出来然后全屏刷新而已,我测出来的时间只是说这个刷新函数全部执行需要的时间而已。你说用什么硬件驱动开销就小了? 还有,我真心不是只知道copy的主,不然也不会和大家讨论这些问题了。我的做法和你说的这个是一样的,只是说你不能保齐大循环能够每次都能在按键更新前把按键响应掉,而出现丢键的情况

使用特权

评论回复
38
huzi2099| | 2013-10-16 17:47 | 只看该作者
nelsonfung 发表于 2013-10-16 17:35
12864 只是从缓存区中读出来然后全屏刷新而已,我测出来的时间只是说这个刷新函数全部执行需要的时间而已 ...

必须得响应到...
试试串口+中断刷12864吧,dma更好.

使用特权

评论回复
39
nelsonfung|  楼主 | 2013-10-16 18:04 | 只看该作者
huzi2099 发表于 2013-10-16 17:47
必须得响应到...
试试串口+中断刷12864吧,dma更好.

中断耍屏 是不是太消耗资源了~~这样1s也刷不了几次的屏 我是觉得真会出现丢键,

使用特权

评论回复
40
huzi2099| | 2013-10-16 18:06 | 只看该作者
我q
476995086

使用特权

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

本版积分规则