找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2443|回复: 14
收起左侧

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

[复制链接]
ID:959891 发表于 2021-8-10 21:13 | 显示全部楼层 |阅读模式
我自己编写了一个用按键选择DA输出不同波形的函数。按键0按下,显示三角波;按键1按下,显示锯齿波;除了1、2以外的按键按下,显示正弦波。按键值可以在数码管中显示。  使用硬件:吴鉴鹰开发板     使用编译器:Keil
我把DA输出的函数、和按键在数码管中显示的函数,都在中断函数中执行,如果定时10ms进入一次中断,就可以实现根据按键值来输出波形。如果1ms进入一次中断,不管按哪个按键,都显示三角波。我按键值的扫描时在main函数中执行的,只要有按键按下,就应该能检测到才对,能够检测到按键值,就能选择好输出的到底是哪个波形。然后中断函数执行的时候,就会输出对应波形的各个点的值。为什么会受进入中断的时间影响呢?
0.png

PCF8591_DA_Wave.rar

43.15 KB, 下载次数: 8

Keil工程文件

回复

使用道具 举报

ID:959891 发表于 2021-8-10 21:21 | 显示全部楼层
捕获.JPG
回复

使用道具 举报

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吧

                       
       
                                                        
回复

使用道具 举报

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:959346 发表于 2021-8-11 10:00 | 显示全部楼层
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定时的时间(1ms),程序会一直在响应中断,跑不到其它的地方,或者响应很慢。
回复

使用道具 举报

ID:479619 发表于 2021-8-11 10:05 | 显示全部楼层
中断服务函数里的两个函数延时加太长了
回复

使用道具 举报

ID:959891 发表于 2021-8-11 10:42 | 显示全部楼层
Jiang_YY 发表于 2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定 ...

不好意思,中断函数的处理时间怎么来确认呢?
回复

使用道具 举报

ID:959891 发表于 2021-8-11 10:56 | 显示全部楼层
Jiang_YY 发表于 2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定 ...

谢谢您的回复,您能否指教以下如何确认中断函数的处理时间?单是从Keil编译器自带的sec指标来看,进入中断和出中断中间只差0.6ms,这个时间准不准?
回复

使用道具 举报

ID:161164 发表于 2021-8-11 11:43 来自手机 | 显示全部楼层
yermsir 发表于 2021-8-11 10:56
谢谢您的回复,您能否指教以下如何确认中断函数的处理时间?单是从Keil编译器自带的sec指标来看,进入中 ...

最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17脚的高电平时间
回复

使用道具 举报

ID:57657 发表于 2021-8-11 12:35 | 显示全部楼层
yermsir 发表于 2021-8-11 10:42
不好意思,中断函数的处理时间怎么来确认呢?

这个需要用逻辑分析仪捕捉一下
回复

使用道具 举报

ID:57657 发表于 2021-8-11 13:34 | 显示全部楼层
lkc8210 发表于 2021-8-11 11:43
最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17 ...

P17上电瞬间高电平,建议将电平反过来。
回复

使用道具 举报

ID:959891 发表于 2021-8-11 13:48 | 显示全部楼层
lkc8210 发表于 2021-8-11 11:43
最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17 ...

谢谢,我已经按照您的方法测试,中断执行时间是2ms。我把定时器的时间定为3ms的时候,就解决了问题,可以验证是因为中断函数占用的时间太长导致的。非常感谢。
回复

使用道具 举报

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

非常感谢,已经解决了问题。
回复

使用道具 举报

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

评分

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

查看全部评分

回复

使用道具 举报

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

不用理会上电那一瞬间,因为中断是不断执行的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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