多个DS18B20并联,求指导!
哪位大侠做过多个DS18B20并联?希望能给予指导,不会走太多弯路。 单总线多点测温的文章很多 简单搜索一下就可以 1wire 搜索算法。 参考网上资料,刚刚把DS18B20的ID读出来了,然后需要怎样?有一个ID是DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H,不知道什么意思,而且前后顺序重要吗? 本帖最后由 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,不知道什么意思,而且前后顺序重要吗? ...
把DS18B20的ID读出来 zhenglu891028 发表于 2012-3-31 20:28 static/image/common/back.gif
把DS18B20的ID读出来
已经读出来了,然后需要怎么做? BXAK 发表于 2012-3-31 19:21 static/image/common/back.gif
多谢了,我试试去 貌似官网上有相关代码 读出ROM号后,发送匹配命令,然后读出相应的温度 你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1820太多或者线路太长(我搞过50多米好像,记不清了),通信会出现问题,要考虑阻抗 jackielau 发表于 2012-4-5 16:43 static/image/common/back.gif
你现在最需要的是认真研究一下,datasheet 这些问题基本上都有
我觉得需要注意的问题是阻抗问题,当并联的1 ...
前几天,好好看了datasheet,基本的内容了解了,这几天主要是卡在,MATCH_ROM了,无法正确匹配,
跳过MATCH_ROM后(目前只用了一个DS18B20)可以读到暂存器内容,但是加上后就读不到了,求解中.......
谢谢各位! 补充:匹配失败,暂存器读到数据FF FF FF FF FF FF FF FF FF
BXAK 发表于 2012-3-31 19:21 static/image/common/back.gif
谢谢提醒,刚刚认真看完datasheet{:biggrin:} 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 14:50 static/image/common/back.gif
前几天,好好看了datasheet,基本的内容了解了,这几天主要是卡在,MATCH_ROM了,无法正确匹配,
跳过MAT ...
{:lol:}MATCH_ROM可以正常工作了,之前不能工作,主要是应为匹配的时候前后数据前后顺序搞错了!
继续中....... 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 static/image/common/back.gif
单总线多器件难得主要还是搜索部分,如果需要较长引线的话重点是分布电容影响大,可以加强上拉延长距离,调 ...
正在搞搜索部分,是官方的算法;
加强上拉延长距离?这么理解??求解!
调整延时,是不是将读取时间延长一点?? 谢谢各位!! 读ID就好啦 直接的现场直播啊
先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了 sunicecream 发表于 2012-4-9 14:04 static/image/common/back.gif
先读出各个18B20的64位ID,然后想读哪一路温度就先匹配一下ID就可以了
嗯,你说的是可以的,我试过了,但是这样不能用Search_ROM动态收索
我卡在Search_ROM这里了,还在调试中.... Search_ROM搞定了,之前问题出在读一位和其取反位之间的时间间隔不对,{:biggrin:} 本帖最后由 lvwenjie 于 2012-4-12 14:00 编辑
又有问题了,多个并联时,有几个读出来的ID跟单个时不一样,只有一个一样,为什么??
解决了,之前读多个ID的方法是网上朋友介绍的,不太好用
后来就用最笨的方法去读单个的ID,结果跟动态搜索出来的一样 是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也就驱动不起来了。 嗯,是一个口,我现在只有5个,买的少了;
还有怎么理解理论上,可以计算出来吗,帮忙解释下?? zlqzxl126 发表于 2012-4-11 22:45 static/image/common/back.gif
是一个IO读的吗?以前做过读了4个18B20,只可惜没有很拉很远的距离了。一个IO理论上最大也就8个18b20再大也 ...
嗯,是一个口;
还有怎么理解“一个IO理论上最大也就8个18b20再大也就驱动不起来了”,帮忙解释下?? lvwenjie 发表于 2012-4-12 13:57 static/image/common/back.gif
嗯,是一个口;
还有怎么理解“一个IO理论上最大也就8个18b20再大也就驱动不起来了”,帮忙解释下?? ...
达拉斯 的 AN 有解释: 线上的容抗加大,造成延迟超过程序最小时隙
解决办法,好的线,mosfet强上下拉 jetli 发表于 2012-4-12 14:00 static/image/common/back.gif
达拉斯 的 AN 有解释: 线上的容抗加大,造成延迟超过程序最小时隙
解决办法,好的线,mosfet强上下拉 ...
强上拉就是达拉斯 AN 提供的方案吗?
lvwenjie 发表于 2012-4-12 14:02 static/image/common/back.gif
强上拉就是达拉斯 AN 提供的方案吗?
强上拉,自己去翻文档吧,,
注意别搞短路了。{:titter:} , jetli 发表于 2012-4-12 15:04 static/image/common/back.gif
强上拉,自己去翻文档吧,,
注意别搞短路了。 ,
大侠能共享一下你的资源吗?(无线电) 传上来,不过也不知道其他人能否下载,反正大概这个月份开始的资源几乎都无法下载,,, lvwenjie 发表于 2012-4-12 17:58 static/image/common/back.gif
大侠能共享一下你的资源吗?(无线电)
上传了pdf是247kb,但是我自己再把它下载后,都是140kb或者2kb,,,再也打不开,,,你们试试{:sweat:} jetli 发表于 2012-4-13 08:36 static/image/common/back.gif
上传了pdf是247kb,但是我自己再把它下载后,都是140kb或者2kb,,,再也打不开,,,你们试试...
谢谢分享,可惜打不开,麻烦发我邮箱一下lwj-92013@163.com 我做过的测试结果:
单线距离300M可靠通讯,线是普通线实测100M电容相当于103,300m就是303的了;
16点星形接法,每条线10m,通讯无错误;
IC STM8S103P3 VCC5V,单IO,双平行线,强上拉方式驱动,好些的线应该还能长些,另外由于是铜包钢的小细线每百米有300欧姆的电阻,这个电阻也是个杀手;300M时近1K电阻,都快拉不到低电平了,供电也是问题 mcu5i51 发表于 2012-4-16 11:12 static/image/common/back.gif
我做过的测试结果:
单线距离300M可靠通讯,线是普通线实测100M电容相当于103,300m就是303的了;
16点星形 ...
非常感谢!我也做做看,现在动态搜索已经调通了,就是用的线短,长线没试过,不做怪可惜的! lvwenjie 发表于 2012-4-13 15:47 static/image/common/back.gif
谢谢分享,可惜打不开,麻烦发我邮箱一下
前段时间文件不能下载,现在可以了,thank you! 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:}
动态搜索的话,当然可以实现这几个不同的应用方式
参考资料官网上的算法和datasheet就够了,当然论坛上各位的帮忙和引导也是必须的
程序我换没打包好,挺乱的,打包好以后就会发上来 DFH, 00H, 00H, 03H, AAH, 84H, C4H, 28H
你的顺序反了,应该是
28H,C4H,84H,AAH,03H,00H,00H,DFH
还应该有一个CRC的校验
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校验 你的程序成功了吗?
我给你个搜索程序吧
/*搜索过程的程序代码*/
#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;
}
这是使用方法
没有的部分你自己过滤吧,
我这个程序是可以选择多个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;
} putbyte 是串口发送,PTT是485的收发控制,可以不理他
?带行号的程序是怎么出来的? zhxzhx 发表于 2012-4-16 15:38 static/image/common/back.gif
你的程序成功了吗?
我给你个搜索程序吧
/*搜索过程的程序代码*/
成功了,不过时间挺长的 zhxzhx 发表于 2012-4-16 15:42 static/image/common/back.gif
putbyte 是串口发送,PTT是485的收发控制,可以不理他
?带行号的程序是怎么出来的? ...
“?带行号的程序是怎么出来的? ”什么意思啊?
jetli 发表于 2012-4-16 14:32 static/image/common/back.gif
能否共享下你的“搜索算法”程序?上达拉斯下载的那个例子没测试成功。我用stc58 、11.0592Mhz下测试。 ...
我也研究过他的程序,很好的参考资料
页:
[1]