找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机中断函数执行太快,导致按键扫描功能失效?

查看数: 4333 | 评论数: 14 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-8-10 21:13

正文摘要:

我自己编写了一个用按键选择DA输出不同波形的函数。按键0按下,显示三角波;按键1按下,显示锯齿波;除了1、2以外的按键按下,显示正弦波。按键值可以在数码管中显示。  使用硬件:吴鉴鹰开发板  &nb ...

回复

ID:161164 发表于 2021-8-11 16:39
npn 发表于 2021-8-11 13:34
P17上电瞬间高电平,建议将电平反过来。

不用理会上电那一瞬间,因为中断是不断执行的
ID:959891 发表于 2021-8-11 16:22
本帖已经找到原因所在,中断函数的执行时间是2ms。我把定时器的时间定为1ms的时候,那么程序会一直进入中断;我修改为3ms,就解决了问题,可以验证是因为中断函数占用的时间太长导致的。非常感谢各位的帮助。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:959891 发表于 2021-8-11 13:48
npn 发表于 2021-8-11 12:35
这个需要用逻辑分析仪捕捉一下

非常感谢,已经解决了问题。
ID:959891 发表于 2021-8-11 13:48
lkc8210 发表于 2021-8-11 11:43
最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17 ...

谢谢,我已经按照您的方法测试,中断执行时间是2ms。我把定时器的时间定为3ms的时候,就解决了问题,可以验证是因为中断函数占用的时间太长导致的。非常感谢。
ID:57657 发表于 2021-8-11 13:34
lkc8210 发表于 2021-8-11 11:43
最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17 ...

P17上电瞬间高电平,建议将电平反过来。
ID:57657 发表于 2021-8-11 12:35
yermsir 发表于 2021-8-11 10:42
不好意思,中断函数的处理时间怎么来确认呢?

这个需要用逻辑分析仪捕捉一下
ID:161164 发表于 2021-8-11 11:43
yermsir 发表于 2021-8-11 10:56
谢谢您的回复,您能否指教以下如何确认中断函数的处理时间?单是从Keil编译器自带的sec指标来看,进入中 ...

最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17脚的高电平时间
ID:959891 发表于 2021-8-11 10:56
Jiang_YY 发表于 2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定 ...

谢谢您的回复,您能否指教以下如何确认中断函数的处理时间?单是从Keil编译器自带的sec指标来看,进入中断和出中断中间只差0.6ms,这个时间准不准?
ID:959891 发表于 2021-8-11 10:42
Jiang_YY 发表于 2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定 ...

不好意思,中断函数的处理时间怎么来确认呢?
ID:479619 发表于 2021-8-11 10:05
中断服务函数里的两个函数延时加太长了
ID:959346 发表于 2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定时的时间(1ms),程序会一直在响应中断,跑不到其它的地方,或者响应很慢。
ID:959891 发表于 2021-8-11 09:39
lkc8210 发表于 2021-8-10 23:17
因为你的Switch没有Default case, 若Key_Data的值不在你预定的16个case内
Key_Value值会维持为零(因初值预 ...

谢谢您详细的回复,非常感谢。我按照您的意见追加了Key_Value=4;的语句,并不是如预想的那样显示正弦波,不管按哪个键还是显示三角波。
另外,按键扫描用了长时间的延迟delay怎么会影响到中断函数呢?中断函数每个1ms理论上触发一次,只要按键值有变化,就会被捕捉到。
ID:161164 发表于 2021-8-10 23:17
因为你的Switch没有Default case, 若Key_Data的值不在你预定的16个case内
Key_Value值会维持为零(因初值预设为零)
而你又用Key_Value是零作为输出三角波的条件
结果令你觉得按什么都是零
其实什么都不是
验证方法,
                  if(0!=Key_Data)
                        {Key_Value=4;//先为Key_Value附值
                                switch(Key_Data)

看看是否按什么都出正弦波

至于为什么会受中断时间影响
可能是你的按键扫描用了长时间(对单片机来说)的delay吧

                       
       
                                                        

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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