搜索
bottom↓
回复: 50

多个DS18B20并联,求指导!

[复制链接]

出0入0汤圆

发表于 2012-3-31 15:10:32 | 显示全部楼层 |阅读模式
哪位大侠做过多个DS18B20并联?希望能给予指导,不会走太多弯路。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入98汤圆

发表于 2012-3-31 15:14:02 | 显示全部楼层
单总线多点测温的文章很多 简单搜索一下就可以

出0入0汤圆

发表于 2012-3-31 19:05:15 | 显示全部楼层
1wire 搜索算法。

出0入0汤圆

 楼主| 发表于 2012-3-31 19:09:01 | 显示全部楼层
参考网上资料,刚刚把DS18B20的ID读出来了,然后需要怎样?

出0入0汤圆

 楼主| 发表于 2012-3-31 19:12:35 | 显示全部楼层
有一个ID是DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H,不知道什么意思,而且前后顺序重要吗?

出0入0汤圆

发表于 2012-3-31 19:21:45 | 显示全部楼层
本帖最后由 BXAK 于 2012-3-31 19:31 编辑
lvwenjie 发表于 2012-3-31 19:12
有一个ID是DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H,不知道什么意思,而且前后顺序重要吗? ...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-3-31 20:28:27 | 显示全部楼层
把DS18B20的ID读出来

出0入0汤圆

 楼主| 发表于 2012-3-31 20:48:39 | 显示全部楼层
zhenglu891028 发表于 2012-3-31 20:28
把DS18B20的ID读出来

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

出0入0汤圆

 楼主| 发表于 2012-4-1 15:21:52 | 显示全部楼层
BXAK 发表于 2012-3-31 19:21

多谢了,我试试去

出0入0汤圆

发表于 2012-4-2 13:19:02 | 显示全部楼层
貌似官网上有相关代码

出0入0汤圆

发表于 2012-4-5 16:35:39 | 显示全部楼层
读出ROM号后,发送匹配命令,然后读出相应的温度

出0入0汤圆

发表于 2012-4-5 16:43:41 | 显示全部楼层
你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1820太多或者线路太长(我搞过50多米好像,记不清了),通信会出现问题,要考虑阻抗

出0入0汤圆

 楼主| 发表于 2012-4-8 14:50:32 | 显示全部楼层
jackielau 发表于 2012-4-5 16:43
你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-8 14:52:21 | 显示全部楼层
补充:匹配失败,暂存器读到数据FF FF FF FF FF FF FF FF FF

出0入0汤圆

 楼主| 发表于 2012-4-8 14:54:33 | 显示全部楼层
BXAK 发表于 2012-3-31 19:21

谢谢提醒,刚刚认真看完datasheet

出0入0汤圆

发表于 2012-4-8 15:47:57 | 显示全部楼层
lvwenjie 发表于 2012-4-8 14:54
谢谢提醒,刚刚认真看完datasheet

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

出0入0汤圆

 楼主| 发表于 2012-4-8 16:31:52 | 显示全部楼层
lvwenjie 发表于 2012-4-8 14:50
前几天,好好看了datasheet,基本的内容了解了,这几天主要是卡在,MATCH_ROM了,无法正确匹配,
跳过MAT ...

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

出0入0汤圆

 楼主| 发表于 2012-4-8 16:33:52 | 显示全部楼层
BXAK 发表于 2012-4-8 15:47
论坛有
http://www.ourdev.cn/thread-5464746-1-1.html

太感谢了!!

出0入0汤圆

发表于 2012-4-8 18:08:22 | 显示全部楼层
单总线多器件难得主要还是搜索部分,如果需要较长引线的话重点是分布电容影响大,可以加强上拉延长距离,调整好读数据的时间尽可能增加可靠性

出0入0汤圆

 楼主| 发表于 2012-4-8 21:12:08 | 显示全部楼层
mcu5i51 发表于 2012-4-8 18:08
单总线多器件难得主要还是搜索部分,如果需要较长引线的话重点是分布电容影响大,可以加强上拉延长距离,调 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-8 21:14:02 | 显示全部楼层
谢谢各位!!

出0入0汤圆

发表于 2012-4-8 22:28:32 | 显示全部楼层
读ID就好啦

出0入0汤圆

发表于 2012-4-8 22:35:34 | 显示全部楼层
直接的现场直播啊

出0入0汤圆

发表于 2012-4-9 14:04:15 | 显示全部楼层
先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了

出0入0汤圆

 楼主| 发表于 2012-4-10 16:19:37 | 显示全部楼层
sunicecream 发表于 2012-4-9 14:04
先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了

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

出0入0汤圆

 楼主| 发表于 2012-4-10 20:34:00 | 显示全部楼层
Search_ROM搞定了,之前问题出在读一位和其取反位之间的时间间隔不对,

出0入0汤圆

 楼主| 发表于 2012-4-11 21:23:10 | 显示全部楼层
本帖最后由 lvwenjie 于 2012-4-12 14:00 编辑

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



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

出0入0汤圆

发表于 2012-4-11 22:45:15 | 显示全部楼层
是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也就驱动不起来了。

出0入0汤圆

 楼主| 发表于 2012-4-12 13:55:15 | 显示全部楼层
嗯,是一个口,我现在只有5个,买的少了;
还有怎么理解理论上,可以计算出来吗,帮忙解释下??

出0入0汤圆

 楼主| 发表于 2012-4-12 13:57:02 | 显示全部楼层
zlqzxl126 发表于 2012-4-11 22:45
是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也 ...

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

出0入0汤圆

发表于 2012-4-12 14:00:31 | 显示全部楼层
lvwenjie 发表于 2012-4-12 13:57
嗯,是一个口;
还有怎么理解“一个IO理论上最大也就8个18b20再大也就驱动不起来了”,帮忙解释下?? ...

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

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

出0入0汤圆

 楼主| 发表于 2012-4-12 14:02:44 | 显示全部楼层
jetli 发表于 2012-4-12 14:00
达拉斯 的 AN 有解释: 线上的容抗加大,造成延迟超过程序最小时隙

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

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

出0入0汤圆

发表于 2012-4-12 15:04:55 | 显示全部楼层
lvwenjie 发表于 2012-4-12 14:02
强上拉就是达拉斯 AN 提供的方案吗?




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

注意别搞短路了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-4-12 17:58:49 | 显示全部楼层
jetli 发表于 2012-4-12 15:04
强上拉,自己去翻文档吧,,

注意别搞短路了。 ,

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

出0入0汤圆

发表于 2012-4-13 08:10:03 | 显示全部楼层
传上来,不过也不知道其他人能否下载,反正大概这个月份开始的资源几乎都无法下载,,,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-13 08:36:22 | 显示全部楼层
lvwenjie 发表于 2012-4-12 17:58
大侠能共享一下你的资源吗?(无线电)

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

出0入0汤圆

 楼主| 发表于 2012-4-13 15:47:48 | 显示全部楼层
jetli 发表于 2012-4-13 08:36
上传了pdf是247kb,但是我自己再把它下载后,都是140kb或者2kb,,,再也打不开,,,你们试试  ...

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-4-16 13:48:15 | 显示全部楼层
mcu5i51 发表于 2012-4-16 11:12
我做过的测试结果:
单线距离300M可靠通讯,线是普通线实测100M电容相当于103,300m就是303的了;
16点星形 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-16 14:14:45 | 显示全部楼层
lvwenjie 发表于 2012-4-13 15:47
谢谢分享,可惜打不开,麻烦发我邮箱一下




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

出0入0汤圆

发表于 2012-4-16 14:32:21 | 显示全部楼层
lvwenjie 发表于 2012-4-16 14:14
前段时间文件不能下载,现在可以了,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的功能,谢谢

出0入0汤圆

 楼主| 发表于 2012-4-16 15:07:19 | 显示全部楼层
动态搜索的话,当然可以实现这几个不同的应用方式
参考资料官网上的算法和datasheet就够了,当然论坛上各位的帮忙和引导也是必须的

出0入0汤圆

 楼主| 发表于 2012-4-16 15:08:10 | 显示全部楼层
程序我换没打包好,挺乱的,打包好以后就会发上来

出0入0汤圆

发表于 2012-4-16 15:17:00 | 显示全部楼层
DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H
你的顺序反了,应该是
28H,C4H,84H,AAH,03H,00H,00H,DFH
还应该有一个CRC的校验

出0入0汤圆

 楼主| 发表于 2012-4-16 15:22:26 | 显示全部楼层
zhxzhx 发表于 2012-4-16 15:17
DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H
你的顺序反了,应该是
28H,C4H,84H,AAH,03H,00H,00H,DFH

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

出0入0汤圆

发表于 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);

idata  char 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_number] & 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_number] |= rom_byte_mask;
   else
     temp_buff[rom_byte_number] &= ~rom_byte_mask;

   OWWriteBit(search_direction,select);

   id_bit_number++;

   rom_byte_mask <<= 1;

   if (rom_byte_mask == 0)
    {docrc8(temp_buff[rom_byte_number]); // 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[0])
{LastDiscrepancy = 0;
  LastDeviceFlag = FALSE;
  search_result = FALSE;
  }
return search_result;
}

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

出0入0汤圆

发表于 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[0]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[1]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[2]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[3]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[4]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[5]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[6]);
  putbyte(',');
  putbyte('0');
  putbyte('x');
  puthex(temp_buff[7]);
  putbyte(',');
  putbyte('/');
  putbyte('/');
  putbyte(' ');
  putbyte('=');
  putbyte(' ');
  DOG=~DOG;
  ls=0;
  if (temp_buff[0]==0x28)        //DS18B20
    {OWInit (select);
     OWWriteByte(0xcc,select);   //skip rom
     OWWriteByte(0x44,select);   //Temperature convert
     ls=gettemp(select);
     }
  if (temp_buff[0]==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;
}

出0入0汤圆

发表于 2012-4-16 15:42:14 | 显示全部楼层
putbyte 是串口发送,PTT是485的收发控制,可以不理他

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

出0入0汤圆

 楼主| 发表于 2012-4-16 15:45:35 | 显示全部楼层
zhxzhx 发表于 2012-4-16 15:38
你的程序成功了吗?
我给你个搜索程序吧
/*搜索过程的程序代码*/

成功了,不过时间挺长的

出0入0汤圆

 楼主| 发表于 2012-4-16 16:31:53 | 显示全部楼层
zhxzhx 发表于 2012-4-16 15:42
putbyte 是串口发送,PTT是485的收发控制,可以不理他

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


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

出0入0汤圆

 楼主| 发表于 2012-4-16 16:42:38 | 显示全部楼层
jetli 发表于 2012-4-16 14:32
能否共享下你的“搜索算法”程序?上达拉斯下载的那个例子没测试成功。我用  stc58 、11.0592Mhz下测试。 ...

我也研究过他的程序,很好的参考资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 02:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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