登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看3472|回14|收藏
楼主 ID:959891 只看他
2021-8-10 21:13
我自己编写了一个用按键选择DA输出不同波形的函数。按键0按下,显示三角波;按键1按下,显示锯齿波;除了1、2以外的按键按下,显示正弦波。按键值可以在数码管中显示。  使用硬件:吴鉴鹰开发板     使用编译器:Keil
我把DA输出的函数、和按键在数码管中显示的函数,都在中断函数中执行,如果定时10ms进入一次中断,就可以实现根据按键值来输出波形。如果1ms进入一次中断,不管按哪个按键,都显示三角波。我按键值的扫描时在main函数中执行的,只要有按键按下,就应该能检测到才对,能够检测到按键值,就能选择好输出的到底是哪个波形。然后中断函数执行的时候,就会输出对应波形的各个点的值。为什么会受进入中断的时间影响呢?
0.png
附件列表

PCF8591_DA_Wave.rar (2021-8-10 21:12 上传)

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理论上触发一次,只要按键值有变化,就会被捕捉到。
5# ID:959346 只看他
2021-8-11 10:00
如果只是修改了定时时间,确认一下中断处理函数用的时间是多少,如果中断处理函数的时间超出或者很接近你定时的时间(1ms),程序会一直在响应中断,跑不到其它的地方,或者响应很慢。
6# ID:479619 只看他
2021-8-11 10:05
中断服务函数里的两个函数延时加太长了
7# ID:959891 只看他
2021-8-11 10:42

引用:

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

不好意思,中断函数的处理时间怎么来确认呢?
8# ID:959891 只看他
2021-8-11 10:56

引用:

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

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

引用:

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

最好当然是在硬件上测量,我的做法是在中断第一行写P17 = 1;在中断尾写P17 = 0;然后用逻辑分析仪测量P17脚的高电平时间
10# ID:57657 只看他
2021-8-11 12:35

引用:

yermsir 发表于 2021-8-11 10:42
不好意思,中断函数的处理时间怎么来确认呢?

这个需要用逻辑分析仪捕捉一下
11# ID:57657 只看他
2021-8-11 13:34

引用:

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

P17上电瞬间高电平,建议将电平反过来。
12# ID:959891 只看他
2021-8-11 13:48

引用:

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

谢谢,我已经按照您的方法测试,中断执行时间是2ms。我把定时器的时间定为3ms的时候,就解决了问题,可以验证是因为中断函数占用的时间太长导致的。非常感谢。
13# ID:959891 只看他
2021-8-11 13:48

引用:

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

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

引用:

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

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

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版