Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Chip115 »

Всем привет! Жудко туплю и не могу "въехать".
Не могу понять как получить данные от конкретного датчика. Всего их два.
ID датчиков получил. Как теперь по ID обратиться?

- Presence
- 0x55 (MATCH ROM)
- посылаем ID датчика 64 бит
- посылаем 0x44 (запуск измерения темп.)
- ждем конца преобразования
- посылаем 0xBE (READ_SCRATCHPAD)
- таймслот чтения данных из регистров датчика

Такой алгоритм?

Или можно сначала

Код: Выделить всё

u8Presence ();
vOneWireSendByte (SKIP_ROM);
vOneWireSendByte (CONVERT_T);
// ждем окончания преобразования
Мол, все датчики измерили темпер. А потом у каждого вычитать показания.

А потом по алгоритму

- Presence
- 0x55 (MATCH ROM)
- посылаем ID датчика 64 бит
- посылаем 0xBE (READ_SCRATCHPAD)
- таймслот чтения данных из регистров датчика

При таком алгоритме должно работать?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

В 1 случае насколько я понимаю должно быть так:
- Presence
- 0x55 (MATCH ROM)
- посылаем ID датчика 64 бит
- посылаем 0x44 (запуск измерения темп.)
- ждем конца преобразования
- Presence
- 0x55 (MATCH ROM)
- посылаем ID датчика 64 бит
- посылаем 0xBE (READ_SCRATCHPAD)
- таймслот чтения данных из регистров датчика

Во 2 случае:
- Presence
- 0xCC (SKIP ROM)
- посылаем 0x44 (запуск измерения темп.)
- ждем конца преобразования
- Presence
- 0x55 (MATCH ROM)
- посылаем ID датчика 64 бит
- посылаем 0xBE (READ_SCRATCHPAD)
- таймслот чтения данных из регистров датчика

Вот полезный статейки еще
http://chipenable.ru/index.php/programm ... ast-1.html
http://chipenable.ru/index.php/programm ... ast-2.html
http://chipenable.ru/index.php/programm ... ast-1.html
Реклама
Pit-Bul
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт окт 10, 2006 08:38:11

DS18B20 Vs DS18S20

Сообщение Pit-Bul »

Опять протеус вводит в заблуждения. Работал всегда с DS18B20, но вот пришла партия DS18S20, которую надо использовать. Про большую точность начитался и про ответ датчика тоже в курсе, в итоге 2 метода:

Код:
int temp_18b20(int W1_BIT){
unsigned char data[2];
int temp = 0;
if(w1_find(W1_BIT)==1){
w1_sendcmd(0xcc, W1_BIT);
w1_sendcmd(0x44, W1_BIT);
_delay_ms(750);
w1_find(W1_BIT);
w1_sendcmd(0xcc, W1_BIT);
w1_sendcmd(0xbe, W1_BIT);
data[0] = w1_receive_byte(W1_BIT);
data[1] = w1_receive_byte(W1_BIT);
temp = data[1];
temp = temp<<8;
temp |= data[0];
temp *= 0.0625;
}
return temp;
}

int temp_18s20(int W1_BIT){
unsigned char data[2];
int temp = 0;
if(w1_find(W1_BIT)==1){
w1_sendcmd(0xcc, W1_BIT);
w1_sendcmd(0x44, W1_BIT);
_delay_ms(750);
w1_find(W1_BIT);
w1_sendcmd(0xcc, W1_BIT);
w1_sendcmd(0xbe, W1_BIT);
data[0] = w1_receive_byte(W1_BIT);
data[1] = w1_receive_byte(W1_BIT);
data[0] >>= 1; // убираем дробную часть
data[1] <<= 7; // убираем лишние знаки
temp = data[1];
temp |= data[0];
//temp *= 0.0625;
}
return temp;
}


первый как видно читает температуру DS18B20, а второй соответственно DS18S20. В протеусе все верно работает для обоих разновидностей, но вот в реальности лажа. Для DS18B20 температура правильная, для DS18S20 нелепость. С чем это может быть связанно, или выкинуть уже этот протеус, ибо что то он как то часто не совпадает с реальностью.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение Аlex »

У 18S20 разрешение = 0.5 C' Соответственно, нужно делить значение на 2 (ну или умножать на 0.5 для плавающей точки).
Т.е. достаточно просто считать 2 байта в переменную и получите температуру, умноженную на 2.

Код: Выделить всё

data[0] = w1_receive_byte(W1_BIT);
data[1] = w1_receive_byte(W1_BIT);
temp = ((int)data[1]<<8) | data[0];
temp/=2;
Собственно, у Вас так и сделано в первом варианте. Для чего Вы добавили какие-то магические вычисления со сдвигами, и чего они делают, совершенно не понятно...
Реклама
Эиком - электронные компоненты и радиодетали
Pit-Bul
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт окт 10, 2006 08:38:11

Re: DS18B20 Vs DS18S20

Сообщение Pit-Bul »

повторюсь, температура считывается и переводиться нормально, в протеусе адекватные значения для обоих типов датчиков. Проблема когда прошиваю реальный контроллер и опять же для обоих типов датчиков. Могу выложить тестовый проект.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение Аlex »

Pit-Bul писал(а):повторюсь, ..... опять же для обоих типов датчиков.
А это чьи слова :
Pit-Bul писал(а):Для DS18B20 температура правильная, для DS18S20 нелепость.
?
О чём Вы хотите повториться ? :facepalm:
Вы уж определитесь, где у Вас и что не работает, а что работает и для каких разновидностей. А то сами запутались, ещё и нас пришли путать...
Pit-Bul писал(а):Могу выложить тестовый проект.
Т.е. Вы ждёте, когда его у Вас попросят ? :)
Реклама
Pit-Bul
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт окт 10, 2006 08:38:11

Re: DS18B20 Vs DS18S20

Сообщение Pit-Bul »

Прошу прощения, в первом посту опечатался, на реальном камне ересь в обоих случаях. Проект приложил, в папке Debug лежит файл протеусовский где все работает норм.
Вложения
1WARE.zip
(87.39 КБ) 183 скачивания
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение Аlex »

А рекомендации по очистке бита OW_WIRE в PORTx соблюдены ? Что-то я не нахожу этого у Вас в программе.
Странно конечно, но почему автор модуля не добавил эту очистку сам ? :dont_know: Достаточно было добавить ещё функцию сброса и в неё добавить эту очистку...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение ARV »

судя по вышеприведенным кусочкам кода используется чтение только 2 байтов из SCRATCHPAD-памяти датчика без проверки CRC.
я бы за такое убивал
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение Аlex »

А я бы ещё и за подобное руки поотрывал :
unsigned char w1_find(int W1_BIT){
W1_DDR |= 1<<W1_BIT;
:facepalm:

Код: Выделить всё

		if((cmd & (1<<i)) == 1<<i){
			W1_DDR |= 1<<W1_BIT;
			_delay_us(2);
Ваши 2us, по сравнению с двумя верхними строчками, - просто ничто. Нужно хоть немного иметь представление о том, во что разворачивается писанина.

Кстати, у меня в протеусе тоже показывает какую-то хрень...

Добавлено:
-----------------------------------
Хе...

Код: Выделить всё

	W1_DDR |= 1<<W1_BIT;
	_delay_us(485);
	W1_DDR &= ~(1<<W1_BIT);
Что это ?
Мне одному кажется, что это не совсем импульс сброса ? :)

ТС'у. В общем, приводите свой код к нормальному работоспособному виду, и всё у Вас заработает. А сейчас - разговор ни о чём. Особенно пинки в сторону инструментов.
Pit-Bul
Открыл глаза
Сообщения: 64
Зарегистрирован: Вт окт 10, 2006 08:38:11

Re: DS18B20 Vs DS18S20

Сообщение Pit-Bul »

сам я врядли разберусть в этом модуле, код нашел пример в интернете. Может тогда подскажете нормальную рабочую библиотеку ??
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: DS18B20 Vs DS18S20

Сообщение Аlex »

Зачем Вам нужна какая-то библиотека ? Просто разберитесь с 1-Wire интерфейсом, он не такой уж сложный и описаний на него в интернете целый вагон и маленькая тележка.
Вот, к примеру, на этом же сайте есть - http://radiokot.ru/articles/13/
asidalv
Грызет канифоль
Сообщения: 271
Зарегистрирован: Ср дек 21, 2011 13:05:30

Re: Всё по DS18(B/S)20.

Сообщение asidalv »

В общем датчик я прочитал ура!

Но счастье было не долгим (( Предистория была такая:

http://radiokot.ru/forum/viewtopic.php?f=57&t=125105

Датчик, упорно, несколько дней (!) копания в коде выдавал одно и тоже значение T=550h что является дефолтовым заводским значением. Поняв в какой-то момент что всё, тупик ничего не получается я сделал следующее:

Сразу после команды 44h я выдал в линию сильную подтяжку тем-же портом MК на котором сидит датчик на время равное преобразованию те около 1 сек и тут же получил температуру! Такой способ, согласно даташиту, применяется при тн "паразитном" питании. Но у меня - питание датчика изначально было нормальное через провод Vdd.

Через какое-то количество опросов датчик умер окончательно... Ток вдруг вырос на 200 ма и датчик нагрелся как печка.

Вывода напрашивается 3:

1. Паять из можно только отключенным паяльником есть подозрение что он сдох изначально когда я его впаивал в схему.

2. На "ходу" их выдергивать нельзя - у меня был сделан разъем для него и я его дергал туда сюда пока он видимо не сдох от этого.

3. Боится статики!

Диагноз, изначально был верен. Из за убитого датчика (по линии питания) не отрабатывала команда 44$.
В любом случае надо топать в магазин за новым, 200р выкинул.
Зато - понял в чем дело и в итоге - заработало)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Всё по DS18(B/S)20.

Сообщение Мурик »

asidalv писал(а):Датчик, упорно, несколько дней (!) копания в коде выдавал одно и тоже значение T=550h что является дефолтовым заводским значением.
Это может быть из-за ошибки в схеме (монтаже) или в программе.
asidalv писал(а):Сразу после команды 44h я выдал в линию сильную подтяжку тем-же портом MК на котором сидит датчик на время равное преобразованию те около 1 сек и тут же получил температуру!
Видимо ошибка в схеме из-за которой датчику не хватает питания.
asidalv писал(а):Ток вдруг вырос на 200 ма и датчик нагрелся как печка.
asidalv писал(а):На "ходу" их выдергивать нельзя - у меня был сделан разъем для него и я его дергал туда сюда пока он видимо не сдох от этого.
Случайно ни разу не вставляли его перевернутым на 180 градусов, т. е. на вывод GND подали плюс, а на Vdd минус? От этого они обычно начинают сильно греться и велика вероятность выхода из строя. Чтобы этого избежать нужно подавать питание через резистор 200 ом и параллельно датчику ставить конденсатор на несколько десятков микрофарад.
asidalv писал(а):1. Паять из можно только отключенным паяльником есть подозрение что он сдох изначально когда я его впаивал в схему.
Не факт. Он работал, а то что начал выдавать нормальную температуру после подачи питания по линии данных, свидетельствует о недостаточном питании.
asidalv писал(а):Диагноз, изначально был верен.
Нет. Выше написал почему.
asidalv писал(а):В любом случае надо топать в магазин за новым, 200р выкинул.
В Китае за эти деньги можно купить 5 датчиков. http://ru.aliexpress.com/item/Free-Ship ... 67007.html
asidalv
Грызет канифоль
Сообщения: 271
Зарегистрирован: Ср дек 21, 2011 13:05:30

Re: Всё по DS18(B/S)20.

Сообщение asidalv »

Спасибо, но в моем случае очень похоже на то, что я навернул датчик в процессе пайки . Разъем не переворачивал точно, я в курсе, что с ним будет от этого, поэтому на разъеме сделал метку. Скажите, чтоб избежать финансовых затрат, есть ли такие датчики в UPSах, бытовой технике и тд? В магазин пошел - сказали датчиков таких больше нет и не будет в ближайшее время по понятным причинам. Ассортимент местного магазина - съёжился до неприличного уровня (((

Алиэкспресс - долго.
ЧипДип - неприлично дорого.
А паять/программировать охота каждый день))
Впереди 10 дней безделия хочу часы дописать запустить.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Всё по DS18(B/S)20.

Сообщение uk8amk »

asidalv писал(а):есть ли такие датчики в UPSах, бытовой технике и тд?
В мощных UPS-ах и инверторах на радиаторах иногда бывают термисторы.
Ставить туда точный цифровой термометр производителю нет никакого смысла, когда вполне достаточно измерений +\- 10*С с копеечного датчика.
Впрочем из дешевого термистора и даже обычного кремниевого диода 4148 получается весьма неплохой термометр при надлежащей калибровке и линеаризации аналоговой части.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS18(B/S)20.

Сообщение BOB51 »

asidalv писал(а):Скажите, чтоб избежать финансовых затрат, есть ли такие датчики в UPSах, бытовой технике и тд? В магазин пошел - сказали датчиков таких больше нет и не будет в ближайшее время по понятным причинам. Ассортимент местного магазина - съёжился до неприличного уровня (((
А паять/программировать охота каждый день))
В принципе термодатчик на основе тоонюююсенького медного провода в виде катушки в стекляной пробирочке с минеральным масличком еще никто не отменял - дешево и сердито.
Как вариант - катушка на каркасе для воздушного датчика (довольно громоздкое сооружение).
:wink:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS18(B/S)20.

Сообщение BOB51 »

Вот такое устройство:
121006113012.jpg
(66 КБ) 398 скачиваний
8)
Аватара пользователя
Соник
Друг Кота
Сообщения: 7576
Зарегистрирован: Пн мар 22, 2010 11:01:14
Откуда: СССР, г. Москва.

Re: Всё по DS18(B/S)20.

Сообщение Соник »

С новым годом.
Есть термометр на одном датчике DS18B20. Хочу прикрутить к нему второй DS18B20. Как их коммутировать? Шину данных и общий вывод впараллель, а питание подавать по очереди? Я бы генератор сделал, который с частотой 10с циклически подавал через два ключика питание на датчики... Сработает?
Я рожден при социализме, и я этим горжусь!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Всё зависит от устройства. Если оно позволит такое горячее подключение другого датчика, то сработает.
Только питание придётся рвать оба (и + и -). Лучше коммутировать линию данных. При одном питающем проводе и проводе данных, датчик может работать на паразитном питании.
Ответить

Вернуться в «Периферия»