烽火社区

标题: 有关DS18B20时序的疑问 [打印本页]

作者: buxiaotanke    时间: 2015-12-9 12:32 AM
标题: 有关DS18B20时序的疑问
下面这第二种写入为什么写不进去...
原来用汇编写的时候也是这样,为什么,进行了一次if判断就打断写时序了吗?

// 第一种写法,成功写入,k是循环变量
for (k = 0; k < 8; ++k) { if ((com>>k) & 0x01) { DQ = 0; _nop_(); _nop_(); DQ = 1; dely60us(); } else { DQ = 0; dely60us(); DQ = 1; _nop_(); _nop_(); } } // 第二种写法,失败,估计一个Bit也写不进去.. for (k = 0; k < 8; ++k) { DQ = 0; _nop_(); _nop_(); if ((com>>k) & 0x01) DQ = 1; dely60us(); _nop_(); _nop_(); }
作者: wxqms    时间: 2015-12-26 01:34 AM
感觉第二种的确会打乱时序! 首先系统通过_nop_();产生延时,而这种延时是利用系统空运行1个时钟周期造成的,而那个判断在C语言是1条语句,但对于单片机来说,又要寻址,又要要移位,还有余运算,最后还有比较,多的要10多个指令周期,少的要几个个,对于在1条指令周期的延时情况下时钟周期不乱才怪,特别是频率低,MIPS低的情况更是如此!                                                                                                                                                                       
作者: lee2018    时间: 2015-12-26 02:58 AM
一楼分析的是if ((com>>k) & 0x01)DQ = 1;会打乱时序                                                                                                                                                                       




欢迎光临 烽火社区 (https://bbs.cnecport.com/) Powered by Discuz! X3.2