查看: 274|回复: 2
打印 上一主题 下一主题

有关DS18B20时序的疑问

[复制链接] qrcode

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
楼主
跳转到指定楼层
发表于 2015-12-9 12:32 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这第二种写入为什么写不进去...
原来用汇编写的时候也是这样,为什么,进行了一次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_(); }
回复

使用道具 举报

8

主题

102

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
沙发
发表于 2015-12-26 01:34 AM | 只看该作者
感觉第二种的确会打乱时序! 首先系统通过_nop_();产生延时,而这种延时是利用系统空运行1个时钟周期造成的,而那个判断在C语言是1条语句,但对于单片机来说,又要寻址,又要要移位,还有余运算,最后还有比较,多的要10多个指令周期,少的要几个个,对于在1条指令周期的延时情况下时钟周期不乱才怪,特别是频率低,MIPS低的情况更是如此!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

16

帖子

34

积分

新手上路

Rank: 1

积分
34
板凳
发表于 2015-12-26 02:58 AM | 只看该作者
一楼分析的是if ((com>>k) & 0x01)DQ = 1;会打乱时序                                                                                                                                                                       
回复 支持 反对

使用道具 举报

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

本版积分规则

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