Страница 43 из 59

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

Добавлено: Вс сен 13, 2015 14:26:56
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)
- таймслот чтения данных из регистров датчика

При таком алгоритме должно работать?

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

Добавлено: Вс сен 13, 2015 14:59:57
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

DS18B20 Vs DS18S20

Добавлено: Чт дек 24, 2015 11:05:28
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 нелепость. С чем это может быть связанно, или выкинуть уже этот протеус, ибо что то он как то часто не совпадает с реальностью.

Re: DS18B20 Vs DS18S20

Добавлено: Чт дек 24, 2015 11:15:40
А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;
Собственно, у Вас так и сделано в первом варианте. Для чего Вы добавили какие-то магические вычисления со сдвигами, и чего они делают, совершенно не понятно...

Re: DS18B20 Vs DS18S20

Добавлено: Чт дек 24, 2015 13:05:06
Pit-Bul
повторюсь, температура считывается и переводиться нормально, в протеусе адекватные значения для обоих типов датчиков. Проблема когда прошиваю реальный контроллер и опять же для обоих типов датчиков. Могу выложить тестовый проект.

Re: DS18B20 Vs DS18S20

Добавлено: Чт дек 24, 2015 17:39:24
Аlex
Pit-Bul писал(а):повторюсь, ..... опять же для обоих типов датчиков.
А это чьи слова :
Pit-Bul писал(а):Для DS18B20 температура правильная, для DS18S20 нелепость.
?
О чём Вы хотите повториться ? :facepalm:
Вы уж определитесь, где у Вас и что не работает, а что работает и для каких разновидностей. А то сами запутались, ещё и нас пришли путать...
Pit-Bul писал(а):Могу выложить тестовый проект.
Т.е. Вы ждёте, когда его у Вас попросят ? :)

Re: DS18B20 Vs DS18S20

Добавлено: Чт дек 24, 2015 18:28:31
Pit-Bul
Прошу прощения, в первом посту опечатался, на реальном камне ересь в обоих случаях. Проект приложил, в папке Debug лежит файл протеусовский где все работает норм.

Re: DS18B20 Vs DS18S20

Добавлено: Пт дек 25, 2015 07:18:20
Аlex
А рекомендации по очистке бита OW_WIRE в PORTx соблюдены ? Что-то я не нахожу этого у Вас в программе.
Странно конечно, но почему автор модуля не добавил эту очистку сам ? :dont_know: Достаточно было добавить ещё функцию сброса и в неё добавить эту очистку...

Re: DS18B20 Vs DS18S20

Добавлено: Пт дек 25, 2015 07:28:40
ARV
судя по вышеприведенным кусочкам кода используется чтение только 2 байтов из SCRATCHPAD-памяти датчика без проверки CRC.
я бы за такое убивал

Re: DS18B20 Vs DS18S20

Добавлено: Пт дек 25, 2015 07:48:15
А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);
Что это ?
Мне одному кажется, что это не совсем импульс сброса ? :)

ТС'у. В общем, приводите свой код к нормальному работоспособному виду, и всё у Вас заработает. А сейчас - разговор ни о чём. Особенно пинки в сторону инструментов.

Re: DS18B20 Vs DS18S20

Добавлено: Пт дек 25, 2015 10:21:26
Pit-Bul
сам я врядли разберусть в этом модуле, код нашел пример в интернете. Может тогда подскажете нормальную рабочую библиотеку ??

Re: DS18B20 Vs DS18S20

Добавлено: Пт дек 25, 2015 11:00:00
Аlex
Зачем Вам нужна какая-то библиотека ? Просто разберитесь с 1-Wire интерфейсом, он не такой уж сложный и описаний на него в интернете целый вагон и маленькая тележка.
Вот, к примеру, на этом же сайте есть - http://radiokot.ru/articles/13/

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

Добавлено: Вс дек 27, 2015 15:13:01
asidalv
В общем датчик я прочитал ура!

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

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

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

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

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

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

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

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

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

Диагноз, изначально был верен. Из за убитого датчика (по линии питания) не отрабатывала команда 44$.
В любом случае надо топать в магазин за новым, 200р выкинул.
Зато - понял в чем дело и в итоге - заработало)

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

Добавлено: Вс дек 27, 2015 16:20:50
Мурик
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

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

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

Алиэкспресс - долго.
ЧипДип - неприлично дорого.
А паять/программировать охота каждый день))
Впереди 10 дней безделия хочу часы дописать запустить.

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

Добавлено: Пн дек 28, 2015 11:00:05
uk8amk
asidalv писал(а):есть ли такие датчики в UPSах, бытовой технике и тд?
В мощных UPS-ах и инверторах на радиаторах иногда бывают термисторы.
Ставить туда точный цифровой термометр производителю нет никакого смысла, когда вполне достаточно измерений +\- 10*С с копеечного датчика.
Впрочем из дешевого термистора и даже обычного кремниевого диода 4148 получается весьма неплохой термометр при надлежащей калибровке и линеаризации аналоговой части.

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

Добавлено: Пн дек 28, 2015 12:59:42
BOB51
asidalv писал(а):Скажите, чтоб избежать финансовых затрат, есть ли такие датчики в UPSах, бытовой технике и тд? В магазин пошел - сказали датчиков таких больше нет и не будет в ближайшее время по понятным причинам. Ассортимент местного магазина - съёжился до неприличного уровня (((
А паять/программировать охота каждый день))
В принципе термодатчик на основе тоонюююсенького медного провода в виде катушки в стекляной пробирочке с минеральным масличком еще никто не отменял - дешево и сердито.
Как вариант - катушка на каркасе для воздушного датчика (довольно громоздкое сооружение).
:wink:

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

Добавлено: Чт дек 31, 2015 17:42:31
BOB51
Вот такое устройство:
121006113012.jpg
(66 КБ) 401 скачивание
8)

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

Добавлено: Пн янв 04, 2016 14:10:03
Соник
С новым годом.
Есть термометр на одном датчике DS18B20. Хочу прикрутить к нему второй DS18B20. Как их коммутировать? Шину данных и общий вывод впараллель, а питание подавать по очереди? Я бы генератор сделал, который с частотой 10с циклически подавал через два ключика питание на датчики... Сработает?

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

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