标题: 在单片机主程序通讯中的delay(),怎样避开中断的干扰 [打印本页]

作者: liuhailan5757    时间: 2019-9-11 09:03
标题: 在单片机主程序通讯中的delay(),怎样避开中断的干扰
单片机控制一串幻彩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();延时的值变了,导致通讯数据错误。 所以看看哪位高人指点一下,万分感谢

作者: f556    时间: 2019-9-11 11:00
在通讯开始的时候,关闭定时器中断或总中断,通讯结束时再打开中断即可。
作者: liuhailan5757    时间: 2019-9-11 13:55
首先谢谢您的回答 ,按照您的方法的话,那定时器的定时又不准了,因为我要用定时器解码红外遥控器,开控制这个LED的
作者: yong761228    时间: 2019-9-11 19:13
通讯协议里的延时用定时器来做呢?
作者: yzwzfyz    时间: 2019-9-11 21:50
很简单,延时不要用DELAY做!!!
作者: whx.000    时间: 2019-9-12 08:21
liuhailan5757 发表于 2019-9-11 13:55
首先谢谢您的回答 ,按照您的方法的话,那定时器的定时又不准了,因为我要用定时器解码红外遥控器,开控制 ...

难道只有一个定时器吗,可以用其他的定时器啊
作者: 笨笨兔    时间: 2019-9-12 14:57
看起来,楼主还是不理解什么是单片机啊。
作者: liuhailan5757    时间: 2019-9-12 17:18
笨笨兔 发表于 2019-9-12 14:57
看起来,楼主还是不理解什么是单片机啊。

请高手指教。单片机规格:晶振最高4M 2T,两个定时器,不要奢望定时器产生4uS的延时
作者: 温酒斩华腾    时间: 2019-9-12 17:46
delay之前关中断,结束后开中断即可
作者: suncat0504    时间: 2019-9-12 22:57
中央处理器同一时刻只能处理一个事务,所以在有中断事务的场合,外部处理是一定会被打断的,如果在外部处理中有和时序有关的通讯,是肯定会出问题的。你可以采用双单片机,单片机之间使用串口通讯方式收发数据,由于串口之间有自己的通讯机制,不会被其他中断处理打断。或者在单片机与驱动IC之间加入数据缓冲电路进行隔离,类似于DMA通讯方式。单片机与数据缓冲电路之间,严格使用脉冲的上升或者下降沿来锁存数据,这样也不会受到中断的影响。
你现在的电路不改,想完全通过软件来调整是有难度的。
建议你还是通过硬件电路实现和驱动IC之间的通讯时序。
作者: liuhailan5757    时间: 2019-9-14 09:59
温酒斩华腾 发表于 2019-9-12 17:46
delay之前关中断,结束后开中断即可

现在只能用这个方法了,有外部中断(按键或是红外遥控)就停止发码,开定时器。
作者: liuhailan5757    时间: 2019-9-14 10:00
f556 发表于 2019-9-11 11:00
在通讯开始的时候,关闭定时器中断或总中断,通讯结束时再打开中断即可。

有外部中断(按键或是红外遥控)就停止发码,开启定时器
作者: liuhailan5757    时间: 2019-9-14 10:05
suncat0504 发表于 2019-9-12 22:57
中央处理器同一时刻只能处理一个事务,所以在有中断事务的场合,外部处理是一定会被打断的,如果在外部处理 ...

我这个LED控制器的单片机才2毛钱一个,没有串口,更不可能用双单片机控制。现在的唯一的办法就是,只要有外部中断(中断和遥控)就停止发码,开定时器,因为处理一个按键和遥控器的时间也就几十个毫秒,反应到LED上看不出来。谢谢您的参与
作者: 高峰.c    时间: 2019-9-14 14:15
延时的时候一般不用delay()的,delay()函数会一直占用CPU,单片机执行delay的时候就不能干其他的工作了。这样是很浪费资源的。一般延时可以用中断来做,解放CPU去执行其他工作,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1