Страница 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 нелепость.
?
О чём Вы хотите повториться ?

Вы уж определитесь, где у Вас и что не работает, а что работает и для каких разновидностей. А то сами запутались, ещё и нас пришли путать...
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 соблюдены ? Что-то я не нахожу этого у Вас в программе.
Странно конечно, но почему автор модуля не добавил эту очистку сам ?

Достаточно было добавить ещё функцию сброса и в неё добавить эту очистку...
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;
Код: Выделить всё
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ах, бытовой технике и тд? В магазин пошел - сказали датчиков таких больше нет и не будет в ближайшее время по понятным причинам. Ассортимент местного магазина - съёжился до неприличного уровня (((
А паять/программировать охота каждый день))
В принципе термодатчик на основе тоонюююсенького медного провода в виде катушки в стекляной пробирочке с минеральным масличком еще никто не отменял - дешево и сердито.
Как вариант - катушка на каркасе для воздушного датчика (довольно громоздкое сооружение).

Re: Всё по DS18(B/S)20.
Добавлено: Чт дек 31, 2015 17:42:31
BOB51
Вот такое устройство:

Re: Всё по DS18(B/S)20.
Добавлено: Пн янв 04, 2016 14:10:03
Соник
С новым годом.
Есть термометр на одном датчике DS18B20. Хочу прикрутить к нему второй DS18B20. Как их коммутировать? Шину данных и общий вывод впараллель, а питание подавать по очереди? Я бы генератор сделал, который с частотой 10с циклически подавал через два ключика питание на датчики... Сработает?
Re: Всё по DS18(B/S)20.
Добавлено: Пн янв 04, 2016 14:44:29
Аlex
Всё зависит от устройства. Если оно позволит такое горячее подключение другого датчика, то сработает.
Только питание придётся рвать оба (и + и -). Лучше коммутировать линию данных. При одном питающем проводе и проводе данных, датчик может работать на паразитном питании.