avatar_Игорь

Определение номера DS18B20

Автор Игорь, 24-05-2014, 11:24:08

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

ИгорьTopic starter

Комплектуя шлейфы датчиков температуры для куба, дистиллятора и колонны, постоянно решаю одинаковую и нудную задачу определения очередности датчиков на шине 1wire. Решил каким-то образом облегчить себе жизнь. Написал маленькую прогу - считываю 8 байт серийного номера, отбразываю первый байт (он всегда равен 40 в десятичном или 23 в шестнадцатеричном виде), отбрасываю последний байт (это контрольная сумма)  и вывожу оставшиеся 6 байт на дисплей.
Не могу понять логику определения очередности датчиков.
Датчик...
с номером 82.88.79.5.0.0 определяется 1wire как первый, хотя по моей логике должен быть вторым ;
с номером 209.220.79.5.0.0 - определяется как второй, а вроде должен быть четвертым;
с номером 213.32.79.5.0.0 - как третий, а должен быть первым...;
с номером 43.220.79.5.0.0 - как третий, а на мой взгляд должен быть третьим.

Я понимаю, что причина несоответствия - мой дилетантизм, и что мне нужно просто научиться правильно сравнивать числа такого рода.
Может кто-то наставит на путь истинный?

Может рассматривать эти байты в HEX формате?
52 58 4F 05 00 00 - первый по мнению 1wire
D1 DC 4F 05 00 00 - второй
D5 20 4F 05 00 00 - третий
2B DC 4F 05 00 00 - четвертый
Нет, все равно не вижу никакой логики...

Может стоит рассмотреть еще восьмой байт - СRC ?
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ИгорьTopic starter

Вывел восьмой байт...
Первый датчик на линии имеет контрольную сумму 186 (BA)
второй - 221 (DD)
третий - 134 (86)
четвертый - 96 (60)
Снова не вижу никакой логики...

Задумка была такая. Определить номера и подписать имеющиеся датчики, а потом расставлять их по местам, ориентируясь на эти номера. Но что-то не складывается.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

mistral

Кроме номеров датчиков нужно еще знать логику ИРТшки по раскидыванию номеров, может легче написать письмо производителю, или позвонить в техотдел. Разработчики, в основном. народ добродушный и с удовольствием объясняют тонкости процесса ( это из личного опыта).
В мире еще столько граблей, на которые не ступала нога человека!

ИгорьTopic starter

#3
Логика нумерации датчиков в ИРТ соответствует протоколу 1wire. Я проверил это. Датчики, подключенные к ИРТ, нумеруются точно в такой-же последовательности, как и на моем самодельном устройстве на атмега8, вход которого сконфигурирован как 1wire.
Разработчиков не интересует логика нумерации, связь определяемого порядкого номера датчика с его серийным номером. Разработчикам важна повторяемость, чтобы порядковая нумерация не менялась со временем...

Пытаясь найти стандартные правила порядковой нумерации, я немного порылся в даташитах и апноутах... Нашел, что датчики с меньшим номером определяются первыми. Но проверка не подтвердила этого. Буду искать еще.


Нашел фразу "Нумерация датчиков в протоколе 1-Wire привязана к их адресам и не совсем тривиальна."
А я искал тривиальную логику - больше серийный номер - старше порядковый номер... или наоборот...
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ИгорьTopic starter

#4
Цитата: Игорь від 24-05-2014, 11:24:08
Может рассматривать эти байты в HEX формате?
52 58 4F 05 00 00 - первый по мнению 1wire
D1 DC 4F 05 00 00 - второй
D5 20 4F 05 00 00 - третий
2B DC 4F 05 00 00 - четвертый
Вроде разобрался, покурив 187-й аппноут.
Во-первых, байты нужно записать в направлении не от второго к седьмому, а наоборот.
00 00 05 4F 58 52
00 00 05 4F DC D1
00 00 05 4F 20 D5
00 00 05 4F DC 2B

Теперь их надо преобразовать в двоичный код.

00000000 00000000 000000101 01001111   00111010 01010010
00000000 00000000 000000101 01001111   11011100 11010001
00000000 00000000 000000101 01001111   00010100 11010101
00000000 00000000 000000101 01001111   11011100 00101011

Теперь идем справа налево...
У кого ноль - тот получает меньший номер, у кого единица - тот больший. Если совпадает - сравниваем следующий (левее) бит.

У первого крайний левый бит - нолик, у остальных единица. Поэтому первый датчик получает номер 1 и его больше не рассматриваем.
Смотрим второй бит. У второго и третьего - ноль, у четвертого - единица. Четвертый получает номер 4 и больше не рассматривается.
Сравниваем третий бит у оставшихся.
У второго ноль, поэтому он второй.
Оставшийся получает последний свободный номер - номер 3.

Действительно, алгоритм  нетривиальный... Поищу варианты упрощения.

Может кто-то что-то подскажет сантехнику?

Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

ГОГа

#5
C моей точки зрения, ты - гений)))), в области поиска решений не специалистом в специальных условиях. На это надо иметь талант. Хотя, думаю, что специалистом это решалось бы проще простого. Игорь, как говорят в народе: респект и уважуха - таким, как ты. Завидую белой завистью твоему таланту.

добавлено: 24-05-2014, 16:01:08

Единственный "грех" на земле - это глупость

Бандерівець

Цитата: Игорь від 24-05-2014, 15:35:19Может кто-то что-то подскажет сантехнику?
Так и есть. Ты правильно написал. Не чего подсказывать.

ИгорьTopic starter

То, что эту задачу в тематической статье назали "нетривиальной", чем чуть не заставила меня усомниться в своих силах. но все оказалось банальным.
Взял значение из седьмого бита в двоичном виде. "Перевернул" байт наоборот - седьмой бит сделал нулевым, шестой - первым, и так далее. Получил новое двоичное число. Превратил его в двоичное. Получил значение в диапазоне от 0 до 255. Этот преобразованный серийный номер датчика отражает порядок нумерации для ИРТ4к. Датчик с самым маленьким номером пределяется как первый, с самым большим - как четвертый. Средние тоже определяются правильно.

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


Нумерация 30-ти датчиков заняла 10 минут. Номера совпали у трех. Поставлю их в разные шлейфы - и все дела.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

Бандерівець

Правильно датчики привязывать не по порядковому номеру, а по его серийнику

ИгорьTopic starter

Что значит "правильно"? Нумерация все равно происходит по серийникам, и никак иначе. Протокол 1wire присваивает номера датчикам именно  по серийникам, но по особому алгоритму - вычисляет старшинство начиная не со старших битов, а с младших. Я не вижу разницы.
А я раскусил этот алгоритм и понял, как зная серийники двух или более датчиков,  узнавать какой номер 1wire присвоит каждому из них при работе в одной линии.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

KlimD

Игорь, если надо могу сбросить исходники на Си. Полная библиотека 1-wire и поиск и распознавание датчиков. Писал сам, согласно даташиту. Все с комментами, прекрасно работает (сейчас делаю себе электронику сам). Писал под MikroC, там есть своя библиотека, но решил все сделать сам. Долбался дня 3. Но как я уже писал, все работает.

ИгорьTopic starter

Я пользуюсь баскомом. В нем есть все необходимые библиотеки для 1wire.
Віриш ти в Бога чи ні, йому байдуже.
Важливо, щоб Бог в тебе вірив, а не навпаки.

KlimD

Я сначала тоже ваял на Protone (одна из разновидностей Бейсика). Там тоже куча библиотек. В одном проэкте была сильная привязка к временным интервалам - пришлось учить АСМ :). Где-то полгода назад перешел на Си и прозрел его гибкости. Теперь ваяю только на нем. Но это так, уже отступление от темы. Все никак не могу заставить себя изучить AVR... Пока только с ПИКами.

Бандерівець

Цитата: KlimD від 29-01-2015, 10:43:56AVR
Spoiler
Может имел ввиду ARM, точнее ARM32?  ;)
[close]

KlimD

На ARM пока надобности не было. Придет время и за это возьмемся. Пока только с ПИКами. Параллельно все-таки займусь еще и AVR - они дешевле и зачастую функциональнее. Будет время - займемся остальным. Просто это не основной заработок. 3D-шники мы :).   

SMF spam blocked by CleanTalk