3138

帖子

0

TA的资源

裸片初长成(初级)

21
 
没玩过STM,也不想钻入读这大堆代码,粗略猜测大概楼主是把按键设置成了外部中断。
若真是这样——建议改成内部定时扫描为好,用计数法去抖。

去抖时间经验上以10~20ms为宜,上了50ms按键会有迟钝感(但大型按键可再设长些),少于5ms怕去抖效果不佳。
此帖出自stm32/stm8论坛
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

22
 
解释下为什么建议不用外部中断。
用外部中断的话无非是两种:①电平中断 或 ②跃变沿中断。

①.若用电平中断
 按下键后即入中断服务,此时为防反复发生中断(抖动),须判断到按键安定释放后才能正常接收下一次按键,程序写得不好的话会憋死别的处理,极大浪费CPU资源。

②.若用跃变沿中断
 每次抖动都是一个跃变沿,自找的麻烦。
此帖出自stm32/stm8论坛

点评

用的下降沿中断,一进中断就已经把中断源屏蔽了,也加了软件延时去抖,还是有问题啊。。。  详情 回复 发表于 2015-4-30 10:41
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

23
 
jianping-sun 发表于 2015-4-29 18:00
本来是想在定时器中断里面查询的。。。但是频繁进中断会不会对正在运行的程序产生影响??

你哥while循环能有多长呀,假如100ms查询一次只是转态而已,很快滴~
此帖出自stm32/stm8论坛

点评

好的。。。我来试试  详情 回复 发表于 2015-4-30 10:41
 
个人签名construction complete!
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

24
 
仙猫 发表于 2015-4-30 08:40
解释下为什么建议不用外部中断。
用外部中断的话无非是两种:①电平中断 或 ②跃变沿中断。

①.若用电平中断
 按下键后即入中断服务,此时为防反复发生中断(抖动),须判断到按键安定释放后才能正常接收下一次按键,程序写得不好的话会憋死别的处理,极大浪费CPU资源。

②.若用跃变沿中断
 每次抖动都是一个跃变沿,自找的麻烦。

用的下降沿中断,一进中断就已经把中断源屏蔽了,也加了软件延时去抖,还是有问题啊。。。
此帖出自stm32/stm8论坛

点评

有可能跃变沿中断会被锁存的,如是这样,光屏蔽还不够,还应在延迟之后清除掉被锁存的中断请求。  详情 回复 发表于 2015-4-30 12:20
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

25
 
zqjqq88 发表于 2015-4-30 09:07
你哥while循环能有多长呀,假如100ms查询一次只是转态而已,很快滴~

好的。。。我来试试
此帖出自stm32/stm8论坛
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

26
 
jianping-sun 发表于 2015-4-29 22:56
额。。。其实是AGC电路要快速调整输出电压,而且需要步进,所以才在中断里面处理的,在主函数里面两个while(1)死循环

只要是人按的,再快也快不到哪里去。你拿个按键试下,你1秒钟能不能按10次?即便能按10次,每次也才100ms。给你建议如下:

1. 系统里面做一个周期定时中断,比如1ms定时一次,用一个变量在定时中断中做加1计数,当成系统时间基准;

2. 在主循环中读取系统时间,看看是否到5ms,没到就执行其他程序,到了就读一次按键;

3. 多次按键值相比较,只有相同的按键值才当成正确的,不同的直接丢弃。



有些人嫌这样麻烦,那你可以直接在中断中读按键值,将定时中断设置成比如5ms或者什么的,每中断一次读一次按键值,多次值相同才当成正确,不同则丢弃。
此帖出自stm32/stm8论坛

点评

嗯。。。我在两次定时器中断里面读键值,如果一样就处理,不一样就不处理,好像有一些效果了。。。。  详情 回复 发表于 2015-4-30 13:46
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

27
 
jianping-sun 发表于 2015-4-30 10:41
用的下降沿中断,一进中断就已经把中断源屏蔽了,也加了软件延时去抖,还是有问题啊。。。

有可能跃变沿中断会被锁存的,如是这样,光屏蔽还不够,还应在延迟之后清除掉被锁存的中断请求。
此帖出自stm32/stm8论坛
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

28
 
Aragorn 发表于 2015-4-30 11:09
只要是人按的,再快也快不到哪里去。你拿个按键试下,你1秒钟能不能按10次?即便能按10次,每次也才100ms。给你建议如下:

1. 系统里面做一个周期定时中断,比如1ms定时一次,用一个变量在定时中断中做加1计数,当成系统时间基准;

2. 在主循环中读取系统时间,看看是否到5ms,没到就执行其他程序,到了就读一次按键;

3. 多次按键值相比较,只有相同的按键值才当成正确的,不同的直接丢弃。



有些人嫌这样麻烦,那你可以直接在中断中读按键值,将定时中断设置成比如5ms或者什么的,每中断一次读一次按键值,多次值相同才当成正确,不同则丢弃。

嗯。。。我在两次定时器中断里面读键值,如果一样就处理,不一样就不处理,好像有一些效果了。。。。
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

29
 
单片机编程中,系统要高效稳定,任何时间第一时间不要去用delay。

这个很简单,定时器10ms的间隔去扫描那个IO的状态,连续十次有效则产生按键(注意定时器中不要处理该事件,只置标志位),不到十次扫描无效状态清0.

我们做的车载电子,基本按键持续100ms认为有效。量产N年了,稳定
此帖出自stm32/stm8论坛

点评

现在还有一个问题啊。。。。用的是定时器50ms中断一次去扫描键值,扫描两次如果键值一样才处理键值,但是中断外的程序有可能正在对信号采样,如果采样的时候进去中断了,采样出的波形就不对了啊,采到信号之后还要做  详情 回复 发表于 2015-5-1 22:41
 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

30
 
按键是用定时器检测的,不是用中断的!
此帖出自stm32/stm8论坛

点评

只是想快速响应,不想太打搅主函数里正在执行的函数  详情 回复 发表于 2015-4-30 18:17
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(中级)

31
 
状态机,可参考马源老师的AVR教材。
此帖出自stm32/stm8论坛

点评

谢啦。。。。现在用的定时器的中断去扫描键值,还可以  详情 回复 发表于 2015-4-30 18:18
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

32
 
BitFu 发表于 2015-4-30 16:20
按键是用定时器检测的,不是用中断的!

只是想快速响应,不想太打搅主函数里正在执行的函数
此帖出自stm32/stm8论坛
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

33
 
honestapple 发表于 2015-4-30 17:08
状态机,可参考马源老师的AVR教材。

谢啦。。。。现在用的定时器的中断去扫描键值,还可以
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

34
 
jianping-sun 发表于 2015-4-29 22:56
主要问题是主函数两个子函数都是死循环

尽量不要用死循环。这样容易使系统卡死。可以设置一个限制。每部分都有最大执行时间,超过,就退出。
此帖出自stm32/stm8论坛

点评

就是两种不同的状态,一种实时显示波形,一种显示对采样信号做FFT的结果,用按键切换。。  详情 回复 发表于 2015-4-30 22:02
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

35
 
ienglgge 发表于 2015-4-30 21:08
尽量不要用死循环。这样容易使系统卡死。可以设置一个限制。每部分都有最大执行时间,超过,就退出。

就是两种不同的状态,一种实时显示波形,一种显示对采样信号做FFT的结果,用按键切换。。
此帖出自stm32/stm8论坛
 
 
 

回复

10

帖子

2

TA的资源

一粒金砂(初级)

36
 
st有边沿跳变中断,按键低电平触发的话,在下降沿启动计数器,上升沿读数值判断按键时间,就可以做长短键,也可以消抖
此帖出自stm32/stm8论坛

点评

谢谢啦。。。我试试  详情 回复 发表于 2015-4-30 22:42
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

37
 
东东6 发表于 2015-4-30 22:34
st有边沿跳变中断,按键低电平触发的话,在下降沿启动计数器,上升沿读数值判断按键时间,就可以做长短键,也可以消抖

谢谢啦。。。我试试
此帖出自stm32/stm8论坛
 
 
 

回复

180

帖子

3

TA的资源

一粒金砂(中级)

38
 
rliushen 发表于 2015-4-30 13:51
单片机编程中,系统要高效稳定,任何时间第一时间不要去用delay。

这个很简单,定时器10ms的间隔去扫描那个IO的状态,连续十次有效则产生按键(注意定时器中不要处理该事件,只置标志位),不到十次扫描无效状态清0.

我们做的车载电子,基本按键持续100ms认为有效。量产N年了,稳定

现在还有一个问题啊。。。。用的是定时器50ms中断一次去扫描键值,扫描两次如果键值一样才处理键值,但是中断外的程序有可能正在对信号采样,如果采样的时候进去中断了,采样出的波形就不对了啊,采到信号之后还要做fft,更加不准了啊
此帖出自stm32/stm8论坛

点评

你理解错了。 如果你用下降沿中断,你软件延时,中断触发依旧是存在的,并不会因为你的延时就不存在中断触发了,就算是用软件去关中断,之前也抖了N次了。 但是既然存在中断按键这种操作,并且必须操作,就有解决  详情 回复 发表于 2016-1-8 21:03
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

39
 
加个电容会有改善,另外消抖时间不要太短,按键质量也不要太差
此帖出自stm32/stm8论坛
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

40
 
jianping-sun 发表于 2015-4-29 18:00
本来是想在定时器中断里面查询的。。。但是频繁进中断会不会对正在运行的程序产生影响??

软件延时消抖还不如定时中断呢
此帖出自stm32/stm8论坛

点评

这个不一定。没有哪种方法不如那种方法的说法,关键是看场合。 比如在实时处理的场合,需要连续采样ADC以及连续输出DAC,并且要计算ADC的值并作相应的显示。 这种方式用定时器中断并不合适,因为中断的时候,  详情 回复 发表于 2016-1-8 19:38
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表