找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3884|回复: 13
打印 上一主题 下一主题
收起左侧

在单片机主程序通讯中的delay(),怎样避开中断的干扰

[复制链接]
跳转到指定楼层
楼主
ID:387856 发表于 2019-9-11 09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20黑币
单片机控制一串幻彩LED灯串,这幻彩LED是又驱动IC的,单片机和驱动IC要通讯。通讯协议是:send_1(){dat=0;delay_us(4);dat=1;delay_us(12);}这就是发送数据1,send_0(){dat=0;delay_us(4);dat=1;delay_us(6);}这就是发送数据0,send_end(){dat=0;delay_us(4);dat=1;delay_us(20);}这就是发送数据结束码,发了结束码之后,驱动IC就把LED点亮。单片机每点亮一个LED要发32+1=33个码,前8个码是LED驱动IC的地址,再接着8个是红色led占空比值,再接着8个是蓝色色led占空比值,再接着8个是绿色led占空比值,再加一个结束码。现在问题就来了:我在主程序里发送码值驱动LED灯时,完全OK,但是只要一开定时器中断,就不行了,因为定时器中断后,使delay_us();延时的值变了,导致通讯数据错误。 所以看看哪位高人指点一下,万分感谢

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:517466 发表于 2019-9-12 22:57 | 只看该作者
中央处理器同一时刻只能处理一个事务,所以在有中断事务的场合,外部处理是一定会被打断的,如果在外部处理中有和时序有关的通讯,是肯定会出问题的。你可以采用双单片机,单片机之间使用串口通讯方式收发数据,由于串口之间有自己的通讯机制,不会被其他中断处理打断。或者在单片机与驱动IC之间加入数据缓冲电路进行隔离,类似于DMA通讯方式。单片机与数据缓冲电路之间,严格使用脉冲的上升或者下降沿来锁存数据,这样也不会受到中断的影响。
你现在的电路不改,想完全通过软件来调整是有难度的。
建议你还是通过硬件电路实现和驱动IC之间的通讯时序。

评分

参与人数 2黑币 +46 收起 理由
liuhailan5757 + 6 感谢参与
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:282850 发表于 2019-9-11 11:00 | 只看该作者
在通讯开始的时候,关闭定时器中断或总中断,通讯结束时再打开中断即可。

评分

参与人数 1黑币 +9 收起 理由
liuhailan5757 + 9 现在只有这个方法可行了

查看全部评分

回复

使用道具 举报

地板
ID:387856 发表于 2019-9-11 13:55 | 只看该作者
首先谢谢您的回答 ,按照您的方法的话,那定时器的定时又不准了,因为我要用定时器解码红外遥控器,开控制这个LED的
回复

使用道具 举报

5#
ID:405193 发表于 2019-9-11 19:13 | 只看该作者
通讯协议里的延时用定时器来做呢?
回复

使用道具 举报

6#
ID:123289 发表于 2019-9-11 21:50 | 只看该作者
很简单,延时不要用DELAY做!!!
回复

使用道具 举报

7#
ID:138097 发表于 2019-9-12 08:21 | 只看该作者
liuhailan5757 发表于 2019-9-11 13:55
首先谢谢您的回答 ,按照您的方法的话,那定时器的定时又不准了,因为我要用定时器解码红外遥控器,开控制 ...

难道只有一个定时器吗,可以用其他的定时器啊
回复

使用道具 举报

8#
ID:158375 发表于 2019-9-12 14:57 | 只看该作者
看起来,楼主还是不理解什么是单片机啊。
回复

使用道具 举报

9#
ID:387856 发表于 2019-9-12 17:18 | 只看该作者
笨笨兔 发表于 2019-9-12 14:57
看起来,楼主还是不理解什么是单片机啊。

请高手指教。单片机规格:晶振最高4M 2T,两个定时器,不要奢望定时器产生4uS的延时
回复

使用道具 举报

10#
ID:490330 发表于 2019-9-12 17:46 | 只看该作者
delay之前关中断,结束后开中断即可

评分

参与人数 1黑币 +9 收起 理由
liuhailan5757 + 9 只能用这个方法了

查看全部评分

回复

使用道具 举报

11#
ID:387856 发表于 2019-9-14 09:59 | 只看该作者
温酒斩华腾 发表于 2019-9-12 17:46
delay之前关中断,结束后开中断即可

现在只能用这个方法了,有外部中断(按键或是红外遥控)就停止发码,开定时器。
回复

使用道具 举报

12#
ID:387856 发表于 2019-9-14 10:00 | 只看该作者
f556 发表于 2019-9-11 11:00
在通讯开始的时候,关闭定时器中断或总中断,通讯结束时再打开中断即可。

有外部中断(按键或是红外遥控)就停止发码,开启定时器
回复

使用道具 举报

13#
ID:387856 发表于 2019-9-14 10:05 | 只看该作者
suncat0504 发表于 2019-9-12 22:57
中央处理器同一时刻只能处理一个事务,所以在有中断事务的场合,外部处理是一定会被打断的,如果在外部处理 ...

我这个LED控制器的单片机才2毛钱一个,没有串口,更不可能用双单片机控制。现在的唯一的办法就是,只要有外部中断(中断和遥控)就停止发码,开定时器,因为处理一个按键和遥控器的时间也就几十个毫秒,反应到LED上看不出来。谢谢您的参与
回复

使用道具 举报

14#
ID:611393 发表于 2019-9-14 14:15 | 只看该作者
延时的时候一般不用delay()的,delay()函数会一直占用CPU,单片机执行delay的时候就不能干其他的工作了。这样是很浪费资源的。一般延时可以用中断来做,解放CPU去执行其他工作,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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