lvwenjie 发表于 2012-3-31 15:10:32

多个DS18B20并联,求指导!

哪位大侠做过多个DS18B20并联?希望能给予指导,不会走太多弯路。

rclong 发表于 2012-3-31 15:14:02

单总线多点测温的文章很多 简单搜索一下就可以

jetli 发表于 2012-3-31 19:05:15

1wire 搜索算法。

lvwenjie 发表于 2012-3-31 19:09:01

参考网上资料,刚刚把DS18B20的ID读出来了,然后需要怎样?

lvwenjie 发表于 2012-3-31 19:12:35

有一个ID是DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H,不知道什么意思,而且前后顺序重要吗?

BXAK 发表于 2012-3-31 19:21:45

本帖最后由 BXAK 于 2012-3-31 19:31 编辑

lvwenjie 发表于 2012-3-31 19:12 static/image/common/back.gif
有一个ID是DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H,不知道什么意思,而且前后顺序重要吗? ...

zhenglu891028 发表于 2012-3-31 20:28:27

把DS18B20的ID读出来

lvwenjie 发表于 2012-3-31 20:48:39

zhenglu891028 发表于 2012-3-31 20:28 static/image/common/back.gif
把DS18B20的ID读出来

已经读出来了,然后需要怎么做?

lvwenjie 发表于 2012-4-1 15:21:52

BXAK 发表于 2012-3-31 19:21 static/image/common/back.gif


多谢了,我试试去

dp1987829 发表于 2012-4-2 13:19:02

貌似官网上有相关代码

PCA 发表于 2012-4-5 16:35:39

读出ROM号后,发送匹配命令,然后读出相应的温度

jackielau 发表于 2012-4-5 16:43:41

你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1820太多或者线路太长(我搞过50多米好像,记不清了),通信会出现问题,要考虑阻抗

lvwenjie 发表于 2012-4-8 14:50:32

jackielau 发表于 2012-4-5 16:43 static/image/common/back.gif
你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1 ...

前几天,好好看了datasheet,基本的内容了解了,这几天主要是卡在,MATCH_ROM了,无法正确匹配,
跳过MATCH_ROM后(目前只用了一个DS18B20)可以读到暂存器内容,但是加上后就读不到了,求解中.......
谢谢各位!

lvwenjie 发表于 2012-4-8 14:52:21

补充:匹配失败,暂存器读到数据FF FF FF FF FF FF FF FF FF

lvwenjie 发表于 2012-4-8 14:54:33

BXAK 发表于 2012-3-31 19:21 static/image/common/back.gif


谢谢提醒,刚刚认真看完datasheet{:biggrin:}

BXAK 发表于 2012-4-8 15:47:57

lvwenjie 发表于 2012-4-8 14:54 static/image/common/back.gif
谢谢提醒,刚刚认真看完datasheet

论坛有
http://www.ourdev.cn/thread-5464746-1-1.html

lvwenjie 发表于 2012-4-8 16:31:52

lvwenjie 发表于 2012-4-8 14:50 static/image/common/back.gif
前几天,好好看了datasheet,基本的内容了解了,这几天主要是卡在,MATCH_ROM了,无法正确匹配,
跳过MAT ...

{:lol:}MATCH_ROM可以正常工作了,之前不能工作,主要是应为匹配的时候前后数据前后顺序搞错了!
继续中.......

lvwenjie 发表于 2012-4-8 16:33:52

BXAK 发表于 2012-4-8 15:47 static/image/common/back.gif
论坛有
http://www.ourdev.cn/thread-5464746-1-1.html

{:cry:} 太感谢了!!

mcu5i51 发表于 2012-4-8 18:08:22

单总线多器件难得主要还是搜索部分,如果需要较长引线的话重点是分布电容影响大,可以加强上拉延长距离,调整好读数据的时间尽可能增加可靠性

lvwenjie 发表于 2012-4-8 21:12:08

mcu5i51 发表于 2012-4-8 18:08 static/image/common/back.gif
单总线多器件难得主要还是搜索部分,如果需要较长引线的话重点是分布电容影响大,可以加强上拉延长距离,调 ...

正在搞搜索部分,是官方的算法;
加强上拉延长距离?这么理解??求解!
调整延时,是不是将读取时间延长一点??

lvwenjie 发表于 2012-4-8 21:14:02

谢谢各位!!

w843387990 发表于 2012-4-8 22:28:32

读ID就好啦

ShawnLinson 发表于 2012-4-8 22:35:34

直接的现场直播啊

sunicecream 发表于 2012-4-9 14:04:15

先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了

lvwenjie 发表于 2012-4-10 16:19:37

sunicecream 发表于 2012-4-9 14:04 static/image/common/back.gif
先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了

嗯,你说的是可以的,我试过了,但是这样不能用Search_ROM动态收索
我卡在Search_ROM这里了,还在调试中....

lvwenjie 发表于 2012-4-10 20:34:00

Search_ROM搞定了,之前问题出在读一位和其取反位之间的时间间隔不对,{:biggrin:}

lvwenjie 发表于 2012-4-11 21:23:10

本帖最后由 lvwenjie 于 2012-4-12 14:00 编辑

又有问题了,多个并联时,有几个读出来的ID跟单个时不一样,只有一个一样,为什么??



解决了,之前读多个ID的方法是网上朋友介绍的,不太好用
后来就用最笨的方法去读单个的ID,结果跟动态搜索出来的一样

zlqzxl126 发表于 2012-4-11 22:45:15

是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也就驱动不起来了。

lvwenjie 发表于 2012-4-12 13:55:15

嗯,是一个口,我现在只有5个,买的少了;
还有怎么理解理论上,可以计算出来吗,帮忙解释下??

lvwenjie 发表于 2012-4-12 13:57:02

zlqzxl126 发表于 2012-4-11 22:45 static/image/common/back.gif
是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也 ...

嗯,是一个口;
还有怎么理解“一个IO理论上最大也就8个18b20再大也就驱动不起来了”,帮忙解释下??

jetli 发表于 2012-4-12 14:00:31

lvwenjie 发表于 2012-4-12 13:57 static/image/common/back.gif
嗯,是一个口;
还有怎么理解“一个IO理论上最大也就8个18b20再大也就驱动不起来了”,帮忙解释下?? ...

达拉斯 的 AN 有解释: 线上的容抗加大,造成延迟超过程序最小时隙

解决办法,好的线,mosfet强上下拉

lvwenjie 发表于 2012-4-12 14:02:44

jetli 发表于 2012-4-12 14:00 static/image/common/back.gif
达拉斯 的 AN 有解释: 线上的容抗加大,造成延迟超过程序最小时隙

解决办法,好的线,mosfet强上下拉 ...

强上拉就是达拉斯 AN 提供的方案吗?

jetli 发表于 2012-4-12 15:04:55

lvwenjie 发表于 2012-4-12 14:02 static/image/common/back.gif
强上拉就是达拉斯 AN 提供的方案吗?




强上拉,自己去翻文档吧,,

注意别搞短路了。{:titter:} ,

lvwenjie 发表于 2012-4-12 17:58:49

jetli 发表于 2012-4-12 15:04 static/image/common/back.gif
强上拉,自己去翻文档吧,,

注意别搞短路了。 ,

大侠能共享一下你的资源吗?(无线电)

jetli 发表于 2012-4-13 08:10:03

传上来,不过也不知道其他人能否下载,反正大概这个月份开始的资源几乎都无法下载,,,

jetli 发表于 2012-4-13 08:36:22

lvwenjie 发表于 2012-4-12 17:58 static/image/common/back.gif
大侠能共享一下你的资源吗?(无线电)

上传了pdf是247kb,但是我自己再把它下载后,都是140kb或者2kb,,,再也打不开,,,你们试试{:sweat:}

lvwenjie 发表于 2012-4-13 15:47:48

jetli 发表于 2012-4-13 08:36 static/image/common/back.gif
上传了pdf是247kb,但是我自己再把它下载后,都是140kb或者2kb,,,再也打不开,,,你们试试...

谢谢分享,可惜打不开,麻烦发我邮箱一下lwj-92013@163.com

mcu5i51 发表于 2012-4-16 11:12:15

我做过的测试结果:
单线距离300M可靠通讯,线是普通线实测100M电容相当于103,300m就是303的了;
16点星形接法,每条线10m,通讯无错误;
IC STM8S103P3 VCC5V,单IO,双平行线,强上拉方式驱动,好些的线应该还能长些,另外由于是铜包钢的小细线每百米有300欧姆的电阻,这个电阻也是个杀手;300M时近1K电阻,都快拉不到低电平了,供电也是问题

lvwenjie 发表于 2012-4-16 13:48:15

mcu5i51 发表于 2012-4-16 11:12 static/image/common/back.gif
我做过的测试结果:
单线距离300M可靠通讯,线是普通线实测100M电容相当于103,300m就是303的了;
16点星形 ...

非常感谢!我也做做看,现在动态搜索已经调通了,就是用的线短,长线没试过,不做怪可惜的!

lvwenjie 发表于 2012-4-16 14:14:45

lvwenjie 发表于 2012-4-13 15:47 static/image/common/back.gif
谢谢分享,可惜打不开,麻烦发我邮箱一下




前段时间文件不能下载,现在可以了,thank you!

jetli 发表于 2012-4-16 14:32:21

lvwenjie 发表于 2012-4-16 14:14 static/image/common/back.gif
前段时间文件不能下载,现在可以了,thank you!

能否共享下你的“搜索算法”程序?上达拉斯下载的那个例子没测试成功。我用stc58 、11.0592Mhz下测试。

1-wire搜索算法有几种不同的应用方式,
能否实现一下几种?


a固定接入:在程序上存储好ds18的id,开电后只读取当前id的ds18探头温度,,,

b上电接入:在一个io上,已经好几个ds18,,,开电,mcu去查找这个io上的id,读出对应温度

c动态接入:在mcu都开电的状态,插入ds18b20,自动查找到id,然后读出id对应的温度


根据网友PCA的帖子:http://www.ourdev.cn/thread-5464746-1-1.html
现在可以实现了a,
希望能实现b和c的功能,谢谢{:handshake:}

lvwenjie 发表于 2012-4-16 15:07:19

动态搜索的话,当然可以实现这几个不同的应用方式
参考资料官网上的算法和datasheet就够了,当然论坛上各位的帮忙和引导也是必须的

lvwenjie 发表于 2012-4-16 15:08:10

程序我换没打包好,挺乱的,打包好以后就会发上来

zhxzhx 发表于 2012-4-16 15:17:00

DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H
你的顺序反了,应该是
28H,C4H,84H,AAH,03H,00H,00H,DFH
还应该有一个CRC的校验

lvwenjie 发表于 2012-4-16 15:22:26

zhxzhx 发表于 2012-4-16 15:17 static/image/common/back.gif
DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H
你的顺序反了,应该是
28H,C4H,84H,AAH,03H,00H,00H,DFH


嗯,是这样的,DFH就是CRC校验

zhxzhx 发表于 2012-4-16 15:38:00

你的程序成功了吗?
我给你个搜索程序吧
/*搜索过程的程序代码*/
#define FALSE 0
#define TRUE 1
//bit OWFirst(unsigned char select);
bit OWSearch(unsigned char select);
unsigned char docrc8(unsigned char value);

idatachar LastDiscrepancy;
bit LastDeviceFlag;
idata unsigned char crc8;

//--------------------------------------------------------------------------
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
// search state.
// Return TRUE : device found, ROM number in ROM_NO buffer
// FALSE : device not found, end of search
//
bit OWSearch(unsigned char select)
{
idata unsigned char id_bit_number;
idata unsigned char last_zero, rom_byte_number;
bit search_result;
bit id_bit, cmp_id_bit;
idata unsigned char rom_byte_mask;
bit search_direction;
id_bit_number = 1;
last_zero = 0;
rom_byte_number = 0;
rom_byte_mask = 1;
search_result = 0;
crc8 = 0;
if (!LastDeviceFlag)
{
OWInit(select);
if (!flag)
{
LastDiscrepancy = 0;
LastDeviceFlag = FALSE;
return FALSE;
}
OWWriteByte(0xF0,select);
do
{
id_bit = OWReadBit(select,0);//0
cmp_id_bit = OWReadBit(select,0); //0
if ((id_bit == 1) && (cmp_id_bit == 1)) //11
{_nop_();
   break;
}
else
{
   if (id_bit != cmp_id_bit)    //10 01
   search_direction = id_bit; // bit write value for search
   else
   {                        //00
       if (id_bit_number < LastDiscrepancy)
         search_direction = ((temp_buff & rom_byte_mask) > 0);
       else
         search_direction = (id_bit_number == LastDiscrepancy);
       if (search_direction == 0)
          {last_zero = id_bit_number;
          }
      }

   if (search_direction == 1)
   temp_buff |= rom_byte_mask;
   else
   temp_buff &= ~rom_byte_mask;

   OWWriteBit(search_direction,select);

   id_bit_number++;

   rom_byte_mask <<= 1;

   if (rom_byte_mask == 0)
    {docrc8(temp_buff); // accumulate the OWCRC
   rom_byte_number++;
   rom_byte_mask = 1;
    }
}
}
while(rom_byte_number < 8); // loop until through all ROM bytes 0-7

if (!((id_bit_number < 65) || (crc8 != 0)))
{LastDiscrepancy = last_zero;
   if (LastDiscrepancy == 0)
   LastDeviceFlag = TRUE;
   search_result = TRUE;
}
}
if (!search_result || !temp_buff)
{LastDiscrepancy = 0;
LastDeviceFlag = FALSE;
search_result = FALSE;
}
return search_result;
}

unsigned char docrc8(unsigned char value)
{
crc8 = CrcTable;
return crc8;
}

zhxzhx 发表于 2012-4-16 15:40:32

这是使用方法
没有的部分你自己过滤吧,
我这个程序是可以选择多个IO口的,SElect定义的,你不要理它,具体的DS18b20读写,你应该知道的
void scan1820(unsigned char select)
{bit rslt;
idata unsigned char i,cnt;
float idata ls;
unsigned int idata lsi;
cnt = 0;
LastDiscrepancy = 0;
LastDeviceFlag = FALSE;
rslt=OWSearch(select);
PTT=0;
while (rslt)
{
cnt++;
putbyte('0');
putbyte('x');
puthex(select);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('0');
putbyte('x');
puthex(temp_buff);
putbyte(',');
putbyte('/');
putbyte('/');
putbyte(' ');
putbyte('=');
putbyte(' ');
DOG=~DOG;
ls=0;
if (temp_buff==0x28)      //DS18B20
    {OWInit (select);
   OWWriteByte(0xcc,select);   //skip rom
   OWWriteByte(0x44,select);   //Temperature convert
   ls=gettemp(select);
   }
if (temp_buff==0xA6)       //DS2438
    {inid=0;
   OWInit (select);
   OWWriteByte(0xcc,select);   //skip rom
   OWWriteByte(0x4E,select);
   OWWriteByte(0x00,select);
   OWWriteByte(0x00,select);

   OWInit (select);
   OWWriteByte(0xcc,select);   //skip rom
   OWWriteByte(0x48,select);
   OWWriteByte(0x00,select);
   delay(250);
   OWInit (select);
   OWWriteByte(0xcc,select);   //skip rom
   OWWriteByte(0xB4,select);   //Temperature convert

   ls=getvol(select);
   }
ls*=10;
lsi=ls;
putint(lsi);
putbyte(' ');
putbyte(':');
putbyte(' ');
putint(inid/256);
putbyte(' ');
putint(inid & 0xFF);
putbyte(' ');
putint(cnt);

putbyte(0x0d);
putbyte(0x0a);
rslt = OWSearch(select);
}
PTT=1;
}

zhxzhx 发表于 2012-4-16 15:42:14

putbyte 是串口发送,PTT是485的收发控制,可以不理他

?带行号的程序是怎么出来的?

lvwenjie 发表于 2012-4-16 15:45:35

zhxzhx 发表于 2012-4-16 15:38 static/image/common/back.gif
你的程序成功了吗?
我给你个搜索程序吧
/*搜索过程的程序代码*/


成功了,不过时间挺长的

lvwenjie 发表于 2012-4-16 16:31:53

zhxzhx 发表于 2012-4-16 15:42 static/image/common/back.gif
putbyte 是串口发送,PTT是485的收发控制,可以不理他

?带行号的程序是怎么出来的? ...

“?带行号的程序是怎么出来的? ”什么意思啊?

lvwenjie 发表于 2012-4-16 16:42:38

jetli 发表于 2012-4-16 14:32 static/image/common/back.gif
能否共享下你的“搜索算法”程序?上达拉斯下载的那个例子没测试成功。我用stc58 、11.0592Mhz下测试。 ...

我也研究过他的程序,很好的参考资料
页: [1]
查看完整版本: 多个DS18B20并联,求指导!