找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3296|回复: 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();延时的值变了,导致通讯数据错误。 所以看看哪位高人指点一下,万分感谢

回复

使用道具 举报

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的
回复

使用道具 举报

ID:405193 发表于 2019-9-11 19:13 | 显示全部楼层
通讯协议里的延时用定时器来做呢?
回复

使用道具 举报

ID:123289 发表于 2019-9-11 21:50 | 显示全部楼层
很简单,延时不要用DELAY做!!!
回复

使用道具 举报

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

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

使用道具 举报

ID:158375 发表于 2019-9-12 14:57 | 显示全部楼层
看起来,楼主还是不理解什么是单片机啊。
回复

使用道具 举报

ID:387856 发表于 2019-9-12 17:18 | 显示全部楼层
笨笨兔 发表于 2019-9-12 14:57
看起来,楼主还是不理解什么是单片机啊。

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

使用道具 举报

ID:490330 发表于 2019-9-12 17:46 | 显示全部楼层
delay之前关中断,结束后开中断即可

评分

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

查看全部评分

回复

使用道具 举报

ID:387856 发表于 2019-9-14 09:59 | 显示全部楼层
温酒斩华腾 发表于 2019-9-12 17:46
delay之前关中断,结束后开中断即可

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

使用道具 举报

ID:387856 发表于 2019-9-14 10:00 | 显示全部楼层
f556 发表于 2019-9-11 11:00
在通讯开始的时候,关闭定时器中断或总中断,通讯结束时再打开中断即可。

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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