找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5204|回复: 20
收起左侧

大神们帮我看下程序 把程序写在定时器中断里发现主函数很卡

[复制链接]
ID:94642 发表于 2016-10-10 13:30 | 显示全部楼层 |阅读模式
把程序写在定时器中断里的了,单个回路能够正常工作,但是我需要四个回路,都放在定时器中断中会造成中断程序运行不完又进入中断了,只能处理中断中的程序,主函数里的程序就很少运行了,如何更改这个问题啊,程序在附件中,本来用的是一个定时器,发现主函数很卡,用了两个定时器,也是非常卡,)

中频治疗仪2016.10.10.rar

112.04 KB, 下载次数: 9

回复

使用道具 举报

ID:142100 发表于 2016-10-11 00:47 来自手机 | 显示全部楼层
把程序放到主函数里面运行,中断运行程序的时间不能大于中断时间。
回复

使用道具 举报

ID:137261 发表于 2016-10-11 14:31 | 显示全部楼层
中断函数运行时间不能大于中断时间
回复

使用道具 举报

ID:97438 发表于 2016-10-11 16:50 | 显示全部楼层
你这程序太神奇了。。。
回复

使用道具 举报

ID:94642 发表于 2016-10-12 11:45 | 显示全部楼层
luoluoluo136 发表于 2016-10-11 16:50
你这程序太神奇了。。。

怎么神器了,大神帮我看看
回复

使用道具 举报

ID:94642 发表于 2016-10-13 09:34 | 显示全部楼层
淡然若梦 发表于 2016-10-11 14:31
中断函数运行时间不能大于中断时间

这个我知道啊,但是改怎么改啊,我单个回路是没问题的,加了四个同样的函数就有问题了,肯定是在中断中运行的时间太长了,造成中断运行完又进入中断了,主函数中数据不运行了
回复

使用道具 举报

ID:123289 发表于 2016-10-13 10:16 | 显示全部楼层
这样一般人常犯的错误。也是常遇到的问题。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 10:21 | 显示全部楼层
正确的做法是:
在主程序中:
检测事件1标记位,依据标记有无处理事件1。
检测事件2标记位,依据标记有无处理事件2。
......
检测事件N标记位,依据标记有无处理事件N。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 10:24 | 显示全部楼层
在中断程序中:
生产事件1时,不处理事件1,而是置事件1标记,让事件1在主程序中处理,目的使用中断处理时间最短。
同样对待:
事件2,
.....
事件N。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 10:29 | 显示全部楼层
要点:
1、中断处理时间要尽可能短。因为中断可以打断主程序,而主程序无法打断中断。这样可以最合理的提升CPU的使用效率。
2、特殊关键,而不得已的事件,必须在中断中处理,如扫键,扫描显示中的显示位切换。
3、一般事件,尽可能在主程序中处理。注意:处理后事件后。记得清除事件标记。
回复

使用道具 举报

ID:94642 发表于 2016-10-13 12:07 | 显示全部楼层
yzwzfyz 发表于 2016-10-13 10:29
要点:
1、中断处理时间要尽可能短。因为中断可以打断主程序,而主程序无法打断中断。这样可以最合理的提 ...

用的I/O口模拟的PWM波,里面还有载波,放在主函数中波形就不对了,应该必须放在中断中吧,这个放到主程序的标志位不知道如何弄,应为是四个回路,这四个回路能同时工作,要同时产生4个带载波的PWM波,这样中断时间就大大加大了
回复

使用道具 举报

ID:123289 发表于 2016-10-13 17:49 | 显示全部楼层
本帖最后由 yzwzfyz 于 2016-10-13 17:59 编辑

一、4个PWM波,用4个计数器来计时:
TIME1:PWM1=0/1的时间计数器。
......
TIME4:PWM3=0/1的时间计数器。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 17:51 | 显示全部楼层
二、再用8个时间常寄存器来存对应的时间:
CH1:PWM1=1的时间计数器。
CL1:PWM1=0的时间计数器。
......
CH3:PWM4=1的时间计数器。
CL4:PWM3=0的时间计数器。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 17:52 | 显示全部楼层
CHx,CLx的修改处理,在主程序中进行。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 17:57 | 显示全部楼层
本帖最后由 yzwzfyz 于 2016-10-13 18:03 编辑

TIMEx在中断程序中计数,计满时,反转相应的PWM输出(求反)。当PWM输出=1时,用CHx复位TIMEx,反之用CLx复位TIMEx。
如此也只处理4个计数器。时间不长。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 18:04 | 显示全部楼层
本帖最后由 yzwzfyz 于 2016-10-13 18:13 编辑

三、如果有载波:
回复

使用道具 举报

ID:123289 发表于 2016-10-13 18:08 | 显示全部楼层
载波再用另一个定时间器,并要求是高一级的!如定时器0,即它可以打断PWM的中断。
载波中断(如定时器0),只做一件事:
将载波标记反转:如BPWM=!BPWM.
回复

使用道具 举报

ID:123289 发表于 2016-10-13 18:10 | 显示全部楼层
由于不知道你对0载波,还是对1载波。就假设对1载波吧。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 18:13 | 显示全部楼层
有载波时:
在PWM中断的输出处理上,增加一句处理:
将PWMx的输出,与BPWM“与”一下,再输出。
这样输出的1,就被BPWM载波了。
回复

使用道具 举报

ID:123289 发表于 2016-10-13 18:15 | 显示全部楼层
OK了!That's all.
回复

使用道具 举报

ID:94642 发表于 2016-10-14 09:03 | 显示全部楼层
多谢,等解决了再重谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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