PDA

Просмотр полной версии : Удобочитаемая форма представления кодов



Слесарь
13.06.2016, 09:21
Здравствуйте!
Главное устройство читает 6-байтные идентификаторы всех однопроводных устройств 1-wire. Количество однопроводных устройств может достигать десятка.
Главное устройство выводит на экран идентификаторы всех устройств, а пользователь должен назначить каждому устройству предназначение.
В общем, это гирлянда датчиков температуры DS18B20, пользователь должен будет при конфигурировании устройства назначить всем датчикам температуры удобочитаемые названия, типа: подача, слив, нагрев, и т.п...
6-байтный идентификатор, визуально выглядит так: 0000FBCA03CC
Для пользователя не очень удобочитаемо отличать HEX коды один от другого, можно ли как-то сократить представление идентификаторов, чтоб пользователю было легче отличить один идентификатор от другого?
Быть может как-то преобразовать коды в буквы алфавита?

ra3rbe
13.06.2016, 09:50
Табличное преобразование.

КОД - название
0000FBCA03CC - подача
0000FBCA03BB - слив
0000FBCA03AA - нагрев

Либо считать циклическую сумму 6 байт и в соответствие каждой сумме ставить название.
Предварительно можно просчитать суммы, чтобы убедиться, что нет повторов.

Если я конечно правильно понял автора...

Слесарь
13.06.2016, 10:05
CRC - 1 байт циклическая сумма, рассчитывается полюбому для контроля достоверности данных, но если правильно понимаю есть 1/256 вероятность совпадения CRC для двух различных датчиков?

Вообще, все ради минимизации дисплея где отобразятся данные. На индикаторе 16х2 надо отобразить код идентификатора, изменяемое назначение и фактические данные.
Код идентификатора - понятно.
Назначение назначит пользователь путем перебора.
Фактические данные в данном случае - температура. Пользователь подберет назначение каждому датчику ориентируясь по данным о фактической температуре.

Слушатель эфира
13.06.2016, 11:38
если правильно понимаю есть 1/256 вероятность совпадения CRC для двух различных датчиков?Как Вы получили значение 1/256?

Слесарь
13.06.2016, 12:11
Я не получал, а предположил.. Нельзя получить достоверные значения когда речь идет о вероятности.
Хотите предложить какой-либо метод по сути вопроса?

vadim_d
13.06.2016, 12:22
6-байтный идентификатор, визуально выглядит так: 0000FBCA03CC
Первое, что приходит в голову - если это однотипные датчики одного изготовителя, то откидывать общий для всех префикс. Но и тут лучше давать пользователю не магические числа, которые ему не с чем сравнивать, а какие-то осмысленные названия, типа "второй с конца", "средний в ряду"

Слесарь
13.06.2016, 12:34
Префикс там указывает на семейство однопроводных устройств, если префикс 0x28, то значит загружается идентификатор датчика температуры. Префикс и так исключается на стадии проверки, что подключен датчик температуры, а не что либо другое. Кроме префикса там 6 байт кода идентификатора конкретного датчика в гирлянде. Коды для всех датчиков уникальны, зашиты на стадии производства.

в итоге, программа будет вызывать по мере необходимости конкретные датчики на одном проводе транслируя идентификатор в коде команды. Но прежде пользователь должен указать программе какие датчики какую функцию выполняют. Необходимо как-то избавить пользователя от необходимости визуально изучать 6-байтные коды датчиков.

vadim_d
13.06.2016, 12:35
Коды для всех датчиков уникальны, зашиты на стадии производства
Если они уже зашиты, то и не надо их показывать пользователь, давайте ему просто номер датчика по порядку

Слесарь
13.06.2016, 12:42
Ну так когда пользователь первоначально включит устройство, программа не будет знать какие датчики какую роль играют, программа запросит пользователя распределить датчики по назначению...
Датчики, это гирлянда из DS16B20. По мере эксплуатации прибора гирлянда или отдельные датчики может выходить из строя, пользователь должен иметь средство зарегистрировать идентификаторы новых датчиков.

А по порядку не получится. ведь не известно на одном проводе, датчик с младшим кодом идентификатора в начале или в конце гирлянды...

vadim_d
13.06.2016, 12:46
Ну так когда пользователь первоначально включит устройство, программа не будет знать какие датчики какую роль играют
Добавьте EEPROM с таблицей датчиков по порядку их входов, которая зашивается в производстве, дальше у пользователя останется только логическое имя датчика. Выход из строя - ремонт - перепрошивка таблицы - возврат пользователю. Дуло исчезнет :smile:


датчик с младшим кодом идентификатора в начале или в конце гирлянды...
Это если гирлянду делает пользователь, если ее даете Вы - все известно

Слесарь
13.06.2016, 12:54
Пользователь будет приобретать прибор отдельно, а гирлянду датчиков отдельно, приобретать или делать самостоятельно. Полюбому, у пользователя должно быть средство привязать к программе новые датчики без обращения в сервисный центр. Понятно, что EEPROM, только должно быть средство у пользователя самостоятельно записи EEPROM. Что и необходимо реализовать. Только не хочется напрягать пользователя копаться в кодах идентификаторов подключенных датчиков. Надо чтоб программа прочитала какие идентификаторы подключили и удобочитаемо выдала на экран, а пользователь нажатием кнопок распределил у какого датчика, какое предназначение. Запишется в EEPROM.


Это если гирлянду делает пользователь, если ее даете Вы - все известно

Мне тоже неизвестно, пока программа не прочтет что ей подключили на однопроводной линии и не выдаст на дисплей. Что мне, что конечному пользователю надо указывать назначение каждого подключенного датчика видя только список идентификаторов.
А датчиков на одном проводе может быть и сотня...

vadim_d
13.06.2016, 13:00
Только не хочется напрягать пользователя копаться в кодах идентификаторов подключенных датчиков
А ничего другого Вы ему предложить не можете. Либо делать плату датчиков самому, скрывать все коды датчиков и давать пользователю только номер ее входа, либо давать ID датчика. Как пользователь определит, где нужный ему датчик - вопрос, ибо ID для этого бесполезен, только погреть датчик пальцем и посмотреть, меняются ли показания :smile:

Oleg 9
13.06.2016, 13:40
Если проблема в том, что пользователя смущает шестнадцатеричный вид представления числа с буквами, преобразуйте эти числа в десятичные. Тогда каждому устройству будет соответствовать некоторое привычное число. В этом случае FBCA03BB будет отображаться как 4224320443, а FBCA03CC как 4224320460.

Слушатель эфира
13.06.2016, 13:48
Я не получал, а предположил.. Нельзя получить достоверные значения когда речь идет о вероятности.
Во-первых, предположение тоже основано на его получении как-то, если просто так сказали - "взяли с потолка", тогда так и скажите, но это тогда и не предположение ))
Во-вторых, при чём здесь достоверность предположения??? Далее не буду комментировать эту часть ... просто слов нет ))))

Хотите предложить какой-либо метод по сути вопроса?
Хотите сказать, что Ваше "предположение" об 1/256 не имеет отношения к сути вопроса? Тогда зачем Вы сами множите сущности, которые не имеют отношения к сути вопроса? )))))))))))

PS А по основному вопросу, много неизвестных мне, чтобы дать ответ на него.

Слесарь
13.06.2016, 13:49
Я полагал что можно преобразовывать 16-ричныйкод в какой-либо иной, более удобочитаемый... Символьный код вроде более информативный, преобразовывать 6 байт в шестнадцатиричном коде 12 символов, в какой-либо другой код с меньшим количеством символов.

Слушатель эфира
13.06.2016, 13:52
преобразовывать 6 байт в шестнадцатиричном коде 12 символовЕсли у Вас считывается код, то Вы можете его программно перекодировать во что угодно, так в чём суть вопроса?

vadim_d
13.06.2016, 13:53
в какой-либо другой код с меньшим количеством символов
В стандарте Фортрана-4 была возможность определить основание системы счисления для ввода-вывода пользователем, максимум составлял 36 (10 цифр и 26 букв английского алфавита) :smile:

Oleg 9
13.06.2016, 13:55
Тогда преобразуйте в 32-ричное представление и в качестве символов используйте 32-е буквы алфавита, каждое устройство будет отображаться каким то набором букв :crazy:. Но тут есть подводные камни, некоторые идентификаторы могут отобразится в виде матерных слов :smile:.

Слесарь
13.06.2016, 14:02
В этом случае FBCA03BB будет отображаться как 4224320443, а FBCA03CC как 4224320460.
Еще больше символов... Вы предлагаете отображать как в формате IP адреса, разделяя десятичные значения байт точкой.

Oleg 9
13.06.2016, 14:06
Еще больше символов...Да фиг знает, что вам нужно :smile:. Если набор датчиков постоянный, то после их опроса, отсортировать по числовому значению идентификатора и присвоить номера 1,2,3,4 и т,д, по возрастанию значения идентификатора.
Или при первом опросе, за устройством, идентификатор которого был первым получен, навсегда закреплять номер 1, за следующим номер 2 и т.д. запоминая эти соответствия и номер последнего устройства. В этом случае можно добавлять новые устройства и они будут нумероваться далее, не влияя на нумерацию предыдущих.

Слесарь
13.06.2016, 14:16
каждое устройство будет отображаться каким то набором букв :crazy:. .

Нормальное решение... Как понимаю, длина строки символов может сократиться в два раза?
Какой будет алгоритм?
Допустим два байта 0х0A 0x0B, как выводить на дисплей?

Добавлено через 8 минут(ы):


Или при первом опросе, за устройством, идентификатор которого был первым получен, навсегда закреплять номер 1, за следующим номер 2 и т.д.

Возможно так и надо... Но тогда от пользователя будет сокрыто как система отличает один датчик от другого, пока еще не теряю надежды научится отображать 16-ричный код в более плотном формате.

Oleg 9
13.06.2016, 14:24
Нормальное решение... Как понимаю, длина строки символов может сократиться в два раза?При 4 байтном числе длина сократится на 1 символ. Вроде так...

Какой будет алгоритм?Берёте первые 5 битов, и выводите букву номер которой соответствует числовому значению этих битов. Потом следующие 5 бит ....


Возможно так и надо... Но тогда от пользователя будет сокрыто как система отличает один датчик от другогоЕсли пользователю известны идентификаторы датчиков, тогда это имеет смысл :). А если не известны, то зачем ему знать, как система их отличает...

Слесарь
13.06.2016, 14:24
Хорошо.. Спасибо! Буду думать...

Слушатель эфира
13.06.2016, 14:25
Да фиг знает, что вам нужноПотому и не отвечаю, особенно после таких высказываний
не теряю надежды научится отображать 16-ричный код в более плотном формате.

от пользователя будет сокрыто как система отличает один датчик от другогоА зачем ему это вообще нужно?

Oleg 9
13.06.2016, 14:28
Потому и не отвечаю, особенно после таких высказыванийМожет быть дело в том, что просто ответить нечего? :smile::smile::smile : (это смайлики ;-), 3 штуки+1 в скобках)

Слесарь
13.06.2016, 14:32
Если пользователю известны идентификаторы датчиков, тогда это имеет смысл :). А если не известны, то зачем ему знать, как система их отличает...

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

Oleg 9
13.06.2016, 14:36
Если произойдет замена датчиков с ранними номерами, порядок нарушится...Он в любом случае нарушится, так как новый датчик будет иметь другой идентификатор. Пользователю всё равно придётся назначать ему понятное имя... В чём проблема, назначить датчику номер 12 то же имя, что было у датчика номер 5 ... Или там ещё какой прикол есть? (это относится к нумерации по мере получения идентификаторов, когда номер нового датчика добавится сверху к тем, что были когда-либо подключены ранее)

Слушатель эфира
13.06.2016, 14:58
Может быть дело в том, что просто ответить нечего?Так я и говорю, что нечего, поскольку от автора читаю некий поток сознания. То, на что я ответить мог бы автору прямо сейчас, я уточнил, получил ... кхе-кхе, мягко говоря, некорректные высказывания в ответ )))
Может Вы мне поясните, раз у Вас возникла "ясновидящая" связь, сакральный смысл вот этого высказывания

пока еще не теряю надежды научится отображать 16-ричный код в более плотном формате.
?
Ну а я уж у Вас "поучусь" )))
Вот и подтверждение

Пока не знаю..
Автор сам не знает что ему надо, поскольку и задача толком не поставлена, а уж о решении что говорить ...

Oleg 9
13.06.2016, 15:09
Автор сам не знает что ему надо, поскольку и задача толком не поставлена, а уж о решении что говорить ...Это в конечном итоге проблема автора. Просто в контексте темы предложенной автором я размышляю о своём :smile:, о том что мне может быть полезно. Если оно ещё и автору поможет - очень хорошо. Ну а не поможет, - так не поможет.
Чем корректнее сформулирована задача, тем больше вероятность получить полезный совет. Однако это забота исключительно Т.С. - как говорится, каков вопрос таков и ответ ;-).

Слушатель эфира
13.06.2016, 15:16
Это в конечном итоге проблема автора.Естественно автора. Но ведь он сам поставил вопрос о вероятности, значит оно ему надо зачем-то, вот я и уточнил, а в ответ что? (Хоть посмеялся))) А основной "сути" я и не собирался касаться в такой постановке вопроса, как у автора.

Слесарь
13.06.2016, 15:21
Или там ещё какой прикол есть?

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

vadim_d
13.06.2016, 15:22
Но ведь он сам поставил вопрос о вероятности
Так он и дал ответ - для однобайтной CRC есть всего 256 значений :smile:. Тут решение скорее ближе к известному "парадоксу дней рождения", когда уже при 60 произвольных значениях вероятность совпадения хотя бы двух близка к 0.5

UR4UDT
13.06.2016, 15:35
Использовал следующую методику для решения сходной задачи.
1.Составляется таблица в EEPROM.
Состоит из двух полей:
-название (объект 1, объект 2, ..., объект N). Желательно организовать
добавление новых устройств и редактирования названия пользователем,
как ему будет удобно;
-идентификатор оборудования (в вашем случае 6 байт).
2.Через меню входим в режим "Инсталляция".
Выбираем нужное название или создаем новое.
3.Вновь инсталируемое устройство (датчик) подключаем по вспомогательной
линии. Основную можно отключить вообще.
4.Нажимаем кнопку "Установить". Идентификатор оборудования запишется
в соответствубщее поле.
5.Повторяем для всех датчиков. Аналогично при замене или добавлении оборудования.
Для простоты названия можно ввести заранее с большим запасом.
Полей в таблице может быть больше, если Вам нужны еще какие-то
внутрипрограммные идентификаторы.
Составляется подробная инструкци и процедуру выполняет без труда школьник.

Слушатель эфира
13.06.2016, 15:40
он и дал ответ - для однобайтной CRC есть всего 256 значенийОн предположил, как сам написал. Значений в байте 256 и два произвольных числа из данного диапазона совпадут с вероятностью 1/256. Вот только у автора ведь не два числа ...

Тут решение скорее ближе к известному "парадоксу дней рождения", когда уже при 60 произвольных значениях вероятность совпадения хотя бы двух близка к 0.5Совершенно в яблочко пример

Oleg 9
13.06.2016, 16:04
Он предположил, как сам написал. Значений в байте 256 и два произвольных числа из данного диапазона совпадут с вероятностью 1/256. Вот только у автора ведь не два числа ...Со стороны непонятно к чему вы прицепились ... Слесарь написал, что даже вероятность в 1/256 его не устраивает.
Нельзя получить достоверные значения когда речь идет о вероятности.Хорошо, пусть вы знаете, что там вероятность гораздо больше, ну и что? Если даже 1/256 это много то любая большая вероятность тем более не подойдёт, какая разница, сколько там на самом деле 1/43 или 98/99 ;-). Вывод то правильный, что CRC для данной задачи не подходит.

Слушатель эфира
13.06.2016, 17:21
Слесарь написал, что даже вероятность в 1/256 его не устраивает.Где именно Вы это прочитали?

PS Вы додумали так, я не додумывал, потому и задал вопрос, что в этом криминального?

Oleg 9
13.06.2016, 17:24
Где именно Вы это прочитали?Тут #3 (http://www.cqham.ru/forum/showthread.php?33344-%D0%A3%D0%B4%D0%BE%D 0%B1%D0%BE%D1%87%D0% B8%D1%82%D0%B0%D0%B5 %D0%BC%D0%B0%D1%8F-%D1%84%D0%BE%D1%80%D 0%BC%D0%B0-%D0%BF%D1%80%D0%B5%D 0%B4%D1%81%D1%82%D0% B0%D0%B2%D0%BB%D0%B5 %D0%BD%D0%B8%D1%8F-%D0%BA%D0%BE%D0%B4%D 0%BE%D0%B2&p=1267840&viewfull=1#post12678 40). А вы что там прочитали? ;-)
Вообще Вас сложно понять :smile:. Слесарь пишет про 2 датчика:
но если правильно понимаю есть 1/256 вероятность совпадения CRC для двух различных датчиков?
Нельзя получить достоверные значения когда речь идет о вероятности.
Вы в ответ то же самое, про 2 числа:

Значений в байте 256 и два произвольных числа из данного диапазона совпадут с вероятностью 1/256. Вот только у автора ведь не два числа ...Дело тёмное в общем, нам это не понять :smile::smile::smile :

Слушатель эфира
13.06.2016, 17:26
Тут #3. А вы что там прочитали?
Там вот это

CRC - 1 байт циклическая сумма, рассчитывается полюбому для контроля достоверности данных, но если правильно понимаю есть 1/256 вероятность совпадения CRC для двух различных датчиков?и этого
вероятность в 1/256 его не устраивает.там нет.
Вы не ясновидящий?

Oleg 9
13.06.2016, 17:32
и этого там нет.А это что?
Нельзя получить достоверные значения когда речь идет о вероятности.
Вы не ясновидящий?Зависть - не лучшее качество, если вы лишены дара ясновидения, то это не делает Вам чести :smile::smile::smile :.

UR4UDT
13.06.2016, 17:35
Господа, право не стоить судачить о величине вероятности, если она должна быть 100%.
Тем более, что речь вовсе не об этом.

Oleg 9
13.06.2016, 17:39
Помните старую байку про женскую логику - "какая вероятность встретить на улице динозавра?"
Мужчина подумал и ответил - "Приблизительно одна миллиардная".
А женщина ответила - "50/50 - либо встречу, либо не встречу".

Слушатель эфира
13.06.2016, 18:39
А это что?Во-первых, это уже из другого сообщения, а не по Вашей ссылке.
Во-вторых, вот это

Нельзя получить достоверные значения когда речь идет о вероятности.
Вообще непонятно о чём, пока не разъяснено, что имеется в виду. Например, сама вероятность наступления события вполне конкретное число и есть достоверная величина )))
А женщина ответила - "50/50 - либо встречу, либо не встречу".Это всего лишь байка, а теория вероятности математическая теория.
Вот потому и важно чётко формулировать свои мысли, чтобы не получался правильный результат (с меньшей вероятностью))), как итог двойного искажения (ошибки) - первое писавшего, второе читавшего.

Слесарь
13.06.2016, 19:24
может школьник.

самое интересное было описать алгоритм поиска идентификаторов всех подключенных 1-wire устройств. Целый день рисовал нули и единицы на бумаге. Раньше работал только с одним Даллас устройством на проводе.

R7LC
13.06.2016, 19:30
Это что? К геотермальному насосу.
Гори, гори моя звезда........

UR4UDT
13.06.2016, 20:59
самое интересное было описать алгоритм поиска идентификаторов всех подключенных 1-wire устройств
Если датчик имеет уникальный идентификатор производителя, то оный указывается на корпусе (в сопроводиловке бумажной) или считывается по команде "Читать ID".
Процедура инсталляции предполагает использование такой команды. Если для используемого датчика такая команда отсутствует, то его один раз придется ввести вручную по тому что есть.
Возможны варианты перебора в окне адресов. Необходимо смотреть DS на конкретное устройство. Способы доступные обязательно быть должны.

Слесарь
13.06.2016, 21:23
Да. Метод SearchROM

UR4UDT
13.06.2016, 21:38
Посмотрел описание DS18B20.
Всё предусмотрено.
В процессе инсталляции на вспомогательной шине одно устройство и можно узнать ID.
Потом включаем все датчики на один провод и перебираем в нужной последовательности.
Проблемы отсутствуют.
Отлаживайте на двух устройствах и тиражируйте алгоритм на необходимое количество.
Вот и всё. Успехов.

Здесь нет ноу-хау.
Классика для тоннелей термоусадки групповой упаковки ПЭ бутылок (уверен на 99%).

Леонид3
13.06.2016, 22:10
на вспомогательной шине одно устройство и можно узнать ID Только потом не перепутать при установке, какой куда :smile: Да и команд там достаточно для любых конфигураций. Единственная трудность с которой столкнулся -- вычисление контрольной суммы (CRC-8), вычисляется не как нарисовано в инструкции (младшие биты -- тип), а наоборот, как выдаётся из чипа, пока дошло, изматерился весь :D

UR4UDT
13.06.2016, 22:33
Только потом не перепутать при установке, какой куда
Так ведь алгоритм инсталляции, который я описал исключает ошибки. Проверено за много лет. Полет до сих пор нормальный.

Слесарь
13.06.2016, 22:54
Теперь только SearchROM, все остальное от лукавого. Очень интересный метод узнать ID каждого из множества подключенных по однопроводной шине устройств. Попробуйте самостоятельно описать алгоритм. Готовых примеров кода как понимаю не так много. Уже подумываю применить метод для работы множества устройств на одной частоте с одной модуляцией по типу OOK вычитывать ID всех устройств по радиоэфиру.

UR4UDT
13.06.2016, 23:07
вычитывать ID всех устройств по радиоэфиру.
Если нет возможности организовать вспомогательную шину для индивидуальной идентификации устройств, то р/канал в помощь. Просто нужно в столбик сложить все "ЗА" и "ПРОТИВ" и по разнице сумм в рублях принять решение.
Всё на сегодня. Уже сплю.

Слесарь
13.06.2016, 23:15
Ну типа как 1-wire. Устройства работают навстречу при методе SearchROM, так и попробовать устройствам поработать по эфииру навстречу для поиска всех устройств.

Вспомогательная шина не интересно. Интересней по одной шине.

UR4UDT
13.06.2016, 23:24
Вспомогательная шина не интересно.
Вы просто ни чего не поняли.............. .................... ........

Слесарь
13.06.2016, 23:27
Возможно. Не понял.
А Вы. SearchROM используете?

UD0DAB
14.06.2016, 11:55
Слесарь, представте код в виде какой-нибудь ascii подобной кодировке. Или в UTF8. Таблицы есть в сети...

Слесарь
14.06.2016, 12:21
Это как? Представлять пользователь буквы и просто закорючки. А если код пустого знак места или перевод/конец строки?

Слесарь
16.06.2016, 19:44
Мой вариант кода поиска множества 1-wire устройств на общей шине.
Первые тесты ошибок вроде не выявили...



char ds18b20_CRC8( char seed, char inData )
{
char bitsLeft, temp;

for ( bitsLeft = 8; bitsLeft > 0; bitsLeft-- )
{
temp = ( ( seed ^ inData ) & 0x01 );
if ( temp == 0 ) seed >>= 1;
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}

return seed;
}

char ds18b20_SearchFirstU nit( void )
{
char c, b0, b1, crc, new_bit;

ds18b20_unitcount = 0;
ds18b20_conflict = 0xFF; // начальное значение

// Отчистка памяти под новые данные
ds18b20_UNITs[0].famyli = 0x00;
for( c=0; c<6; c++ ) ds18b20_UNITs[0].byteROM[c] = 0x00;
ds18b20_UNITs[0].crc = 0x00;

// Ждать пока не освободится шина 1-wire
while( DS_INPORT == DS_INPORT_LOW );

// сообщить устройства на шине 1-wire команду
ds18b20_init();
ds18b20_write_byte( DS_SEARCH_ROM ); // Search ROM

// Поиск первого устройства на шине 1-wire
for( c = 0; c < 64; c++ )
{
b0 = ds18b20_read_bit();
b1 = ds18b20_read_bit();

if( b0 && b1 ) return 0;


if( b0 == 0 && b1 == 0 )
{
// Обноружен конфликт на шине двух устройств
ds18b20_conflict = c; // error
ds18b20_write_bit( 0 );
new_bit = 0x00;
}
else if( ! b0 && b1 ) new_bit = 0x00; // 0
else if( b0 && ! b1 ) new_bit = 0x01; // 1

ds18b20_write_bit( new_bit );

// Запись идентификатора нового устройства. Запись только TRUE бит.
if( new_bit )
{
if( c < 8 ) ds18b20_UNITs[0].famyli |= ( 0x01 << c );
else if( c < 16 ) ds18b20_UNITs[0].byteROM[0] |= (0x01 << (c-8) );
else if( c < 24 ) ds18b20_UNITs[0].byteROM[1] |= (0x01 << (c-16) );
else if( c < 32 ) ds18b20_UNITs[0].byteROM[2] |= (0x01 << (c-24) );
else if( c < 40 ) ds18b20_UNITs[0].byteROM[3] |= (0x01 << (c-32) );
else if( c < 48 ) ds18b20_UNITs[0].byteROM[4] |= (0x01 << (c-40) );
else if( c < 56 ) ds18b20_UNITs[0].byteROM[5] |= (0x01 << (c-48) );
else if( c < 64 ) ds18b20_UNITs[0].crc |= (0x01 << (c-56) );
}
}

// Расчет циклической суммы CRC
crc = 0x00;
crc = ds18b20_CRC8( crc, ds18b20_UNITs[0].famyli );
for( c=0; c<6; c++ ) crc = ds18b20_CRC8( crc, ds18b20_UNITs[0].byteROM[c] );

if( ds18b20_UNITs[0].crc == crc )
{
ds18b20_unitcount++; // Счет количества устройств на шине
ds18b20_UNITs[0].temperature = DS_TEMPERATURE_ERROR ;
return 1;
}

return 0; // Неуспешно. Данные не достоверны.
}

char ds18b20_SearchNextUn it( char next )
{
char c, b0, b1, crc, new_conflict, new_bit;
char i = 0;

if( next < 1 || next > 5 ) return 0;

// проверить, были ли конфликты на линии при предыдущем поиске
if( ds18b20_conflict == 0xFF ) return 0; // другие устройства на линии не обнаружены.

// Ждать пока не освободится шина 1-wire
while( DS_INPORT == DS_INPORT_LOW );

// сообщить устройства на шине 1-wire команду
ds18b20_init();
ds18b20_write_byte( DS_SEARCH_ROM ); // Search ROM

new_conflict = 0xFF;

// Отчистка памяти под новые данные
ds18b20_UNITs[next].famyli = 0x00;
for( i=0; i<6; i++ ) ds18b20_UNITs[next].byteROM[i] = 0x00;
ds18b20_UNITs[next].crc = 0x00;

// Поиск следующего устройства на шине 1-wire
for( i=0; i<64; i++ )
{
// Читать с шины 1-wire пары бит посылаемых устройствами
b0 = ds18b20_read_bit();
b1 = ds18b20_read_bit();

if( b0 && b1 ) // Ошибка шины данных
return 0;

// Действия до старшего бита, когда произошедшел конфликт при поиске предыдущего устройства
if( ds18b20_conflict > i )
{
// вне зависимости есть конфликт или нет, писать код предыдущего устройства
if( i < 8 ) new_bit = ds18b20_UNITs[next-1].famyli >> i;
else if( i < 16 ) new_bit = ds18b20_UNITs[next-1].byteROM[0] >> (i-8);
else if( i < 24 ) new_bit = ds18b20_UNITs[next-1].byteROM[1] >> (i-16);
else if( i < 32 ) new_bit = ds18b20_UNITs[next-1].byteROM[2] >> (i-24);
else if( i < 40 ) new_bit = ds18b20_UNITs[next-1].byteROM[3] >> (i-32);
else if( i < 48 ) new_bit = ds18b20_UNITs[next-1].byteROM[4] >> (i-40);
else if( i < 56 ) new_bit = ds18b20_UNITs[next-1].byteROM[5] >> (i-48);
else if( i < 64 ) new_bit = ds18b20_UNITs[next-1].crc >> (i-56);
new_bit &= 0x01;

// если пишется бит 0, запоминать новые конфликты
if( ! new_bit && ! b0 && ! b1 ) new_conflict = i; // Err
}
else if( ds18b20_conflict == i )
{
// На этом бите при предыдущем поиске произошел конфликт
// писать 1
new_bit = 0x01;
}
else
{
// Других конфликтов при предыдущем поиске не зафиксировано.
if( b0 == 0 && b1 == 0 ) // Err
{
// если пишется бит 0, запоминать новые конфликты
new_bit = 0x00;
new_conflict = i;
}
else if( ! b0 && b1 ) // 0
{
new_bit = 0x00;
}
else if( b0 && ! b1 ) // 1
{
new_bit = 0x01;
}
}

// писать новые биты на шину.
ds18b20_write_bit( new_bit );

// Запись идентификатора нового устройства. Запись только TRUE бит.
if( new_bit )
{
if( i < 8 ) ds18b20_UNITs[next].famyli |= ( 0x01 << i );
else if( i < 16 ) ds18b20_UNITs[next].byteROM[0] |= (0x01 << (i-8) );
else if( i < 24 ) ds18b20_UNITs[next].byteROM[1] |= (0x01 << (i-16) );
else if( i < 32 ) ds18b20_UNITs[next].byteROM[2] |= (0x01 << (i-24) );
else if( i < 40 ) ds18b20_UNITs[next].byteROM[3] |= (0x01 << (i-32) );
else if( i < 48 ) ds18b20_UNITs[next].byteROM[4] |= (0x01 << (i-40) );
else if( i < 56 ) ds18b20_UNITs[next].byteROM[5] |= (0x01 << (i-48) );
else if( i < 64 ) ds18b20_UNITs[next].crc |= (0x01 << (i-56) );
}
}

// Расчет циклической суммы CRC
crc = 0x00;
crc = ds18b20_CRC8( crc, ds18b20_UNITs[next].famyli );
for( i=0; i<6; i++ ) crc = ds18b20_CRC8( crc, ds18b20_UNITs[next].byteROM[i] );

if( ds18b20_UNITs[next].crc == crc ) // Проверка достоверности данных
{
ds18b20_unitcount++; // Счет количества устройств на шине
ds18b20_UNITs[next].temperature = DS_TEMPERATURE_ERROR ;

if( new_conflict == 0xFF )
return 0; // Успешно! Нет больше устройств на шине 1-wire

ds18b20_conflict = new_conflict;
return 1; // Успешно! Есть еще устройства на шине 1-wire
}

return 0; // Неуспешно. Данные не достоверны.
}