Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по 1-Wire
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
timex
Всем привет! Прошу помочь в одном вопросе.


Есть контроллер RS232>1-Wire DS2480B, подключённый к микроконтроллеру AVR. Компилятор - WinAVR (это к тому, что у него нет библиотеки для работы с 1-Wire).
К нему подключён термодатчик (в принципе не важно какой) DS18B20 с уже известным серийным номером (который 8 байт).

Сейчас понадобилось подключать к этой шине таблетку DS1990A для охранных функций.

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

Термодатчик для программирования таблетки отключать не предполагается.

Алгоритм нужен примерно такой: периодически опрашивается термодатчик. Тут прикладывают таблетку. Микроконтроллер считывает её номер и что-то делает в зависимости от того, совпал он с уже хранящим е ЕЕПРОМ или нет, при этом возобновляется опрос термодатчика.

В другом случае, когда нужно запомнить новую таблетку, предполагается так: периодически опрашивается термодатчик. Тут нажимают кнопку программирования и в течении 5 секунд микроконтроллер ждёт прикладывания новой таблетки. После того как её приложили и считали её номер или по прошествии 5 секунд возобновляется опрос термодатчика.

Искал в документации на DS2480B и в описаниях стандартов 1-Wire команду для "временного отключения от шины с последующим включением", не нашёл. А она в данном случае очень пригодилась бы.

Единственный вариант, который придётся использовать - поиск устройств на шине. Но как раз им не хочется заморачиваться, ибо plug&play на шине 1-Wire ещё не освоил и кажется будет много возни с ним.

Вопрос: есть ли ещё варианты такой совместной работы кроме того, в котором придётся реализовывать поиск устройсв на шине? Например, может сущствует какия-то команда временного отключения известного устройства от шины?
Сергей Борщ
Цитата(timex @ Sep 10 2008, 10:53) *
Вопрос: есть ли ещё варианты такой совместной работы кроме того, в котором придётся реализовывать поиск устройсв на шине?
Переключить термодатчик на любой свободный вывод порта и опрашивать его программно. На входе для таблетки оставить только таблетку. Готовой библиотеки в компиляторе конечно нет, но ее написать - на полдня работы с даташитом перед глазами. В самом крайнем случае - в форуме по AVR есть ветка "исходники программ и библиотек" - там выложено штук 5 примеров реализации 1-wire.

Цитата(timex @ Sep 10 2008, 10:53) *
Например, может сущствует какия-то команда временного отключения известного устройства от шины?
Все известные команды описаны в даташите. Предлагаете кому-то прочитать его за вас?
revolution
Цитата(timex @ Sep 10 2008, 10:53) *
Искал в документации на DS2480B и в описаниях стандартов 1-Wire команду для "временного отключения от шины с последующим включением", не нашёл. А она в данном случае очень пригодилась бы.

Это не подойдёт?
COMMUNICATION COMMANDS
Reset
The Reset command must be used to begin all 1-Wire communication. The speed selection included in
the command code immediately takes effect. The response byte includes a code for the reaction on the
1-Wire bus (bits 0 and 1) and a code for the chip revision (bits 2 to 4).
Ledmaster
Цитата(timex @ Sep 10 2008, 13:53) *
Искал в документации на DS2480B и в описаниях стандартов 1-Wire команду для "временного отключения от шины с последующим включением", не нашёл. А она в данном случае очень пригодилась бы.
Существуют, конечно, специальные девайсы, типа DS2409, но в Вашем случае это явный перебор. Вам достаточно подключить датчик температуры не напрямик к шине, а через аналоговый ключ, например, на полевом транзисторе. Вы же точно знаете, когда он Вам не нужен, чтобы просто оторвать от шины, закрыв полевик.
Warlockwolf
Цитата(timex @ Sep 10 2008, 11:53) *
Единственный вариант, который придётся использовать - поиск устройств на шине. Но как раз им не хочется заморачиваться, ибо plug&play на шине 1-Wire ещё не освоил и кажется будет много возни с ним.


Не так там все и сложно. исходники есть на самом максиме.
Уж лучше подумать над программой, чем городить ключи и отключения от шины.

http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm
xemul
Цитата(timex @ Sep 10 2008, 11:53) *
Всем привет! Прошу помочь в одном вопросе.
Есть контроллер RS232>1-Wire DS2480B, подключённый к микроконтроллеру AVR. Компилятор - WinAVR (это к тому, что у него нет библиотеки для работы с 1-Wire).
К нему подключён термодатчик (в принципе не важно какой) DS18B20 с уже известным серийным номером (который 8 байт).

Сейчас понадобилось подключать к этой шине таблетку DS1990A для охранных функций.

Но для её идентификации нужно сначала её запомнить в микроконтроллере для последующих сравнений. Но таблетка эта - не единственная. Т.е. серийный номер заранее не известен.
...
Единственный вариант, который придётся использовать - поиск устройств на шине. Но как раз им не хочется заморачиваться, ибо plug&play на шине 1-Wire ещё не освоил и кажется будет много возни с ним.

Без SearchROM с несколькими устройствами на шине не справиться. У производителя где-то в аппнотах были и С-шные сорцы для SearchROM.
А дальше просто. Сначала придумываете процедуру обучения, в которой через SearchROM запоминаете ROM ID всех нужных ванварных устройств.
Потом с устройствами, которые отвечают на MatchROM (н-р, DS18B20), работаете через MatchROM по известным ROM ID, а с неотвечающими (DS1990A) - через ту же SearchROM с последующим сравнением полученных ROM ID с известными (здесь алгоритм поиска можно сразу заворачивать только в сторону семейства 0x01).
Harbour
был когда-то у далласа an187.pdf, где усе описано - для ленивых выкладываю свой древний код, который был написан по их исходникам. нужная ф-ия называется u64 w1_search_devices()
timex
xemul, спасиб, нашёл кое-что у maxim, читаю...

Harbour, тож спасиб, разберёмся.

щас нашёл - оказывается, у DS24B08 есть команда для автоматизиции поиска. видимо эту команду и заюзаю...
Цыкетчик
Цитата(Harbour @ Sep 11 2008, 14:25) *
был когда-то у далласа an187.pdf, где усе описано - для ленивых выкладываю свой древний код, который был написан по их исходникам. нужная ф-ия называется u64 w1_search_devices()

А не могли бы в кратце рассказать на каком принципе там усё работает? А то я в СИ (так же как и в английском) не очень силЁн.

Просто я сейчас работаю на похожей темой вот тут
Harbour
binary tree leafs discovery - читайте pdf там английским по белому все расписано
Ledmaster
Цитата(Цыкетчик @ Sep 24 2008, 00:31) *
А не могли бы в кратце рассказать на каком принципе там усё работает? А то я в СИ (так же как и в английском) не очень силЁн.

Просто я сейчас работаю на похожей темой вот тут

Вкратце, среди устройств на шине устраивается "соцопрос": - У кого в серийнике ноль в 63 разряде, поднимите руку (вернее, опустите ногу)! smile.gif А теперь, у кого в 62-м, и т.д. Поскольку на шине монтажное "или", ноль в заданном разряде может быть одновременно у нескольких устройств, поэтому, в общем случае, за один проход вычисляется только один серийный номер.
Цыкетчик
Спасибо. Вы очень доходчиво объяснили (сразу видно, что Вы действительно разбираетесь).

Цитата(Ledmaster @ Sep 24 2008, 07:55) *
поэтому, в общем случае, за один проход вычисляется только один серийный номер.

А после того, как MAC очередного девайса определён ему даётся команда "отключится от опроса"?


А можно определять MAC не как в 1-Wire последовательно, по одному адресу, а сразу несколько адресов последовательно увеличивая кол-во распознанных бит?
xemul
Цитата(Цыкетчик @ Sep 24 2008, 12:03) *
А после того, как MAC очередного девайса определён ему даётся команда "отключится от опроса"?

Направлением поиска рулит мастер, который не будет повторять дважды один и тот же маршрут.
Ванварный алгоритм поиска:
1) мастер выдает команду поиска
2) (оставшиеся в поиске) слейвы выдают на шину младший (очередной) бит своих серийных номеров
3) (оставшиеся в поиске) слейвы выдают на шину инверсию младшего (очередного) бита своих серийных номеров
4) по комбинации из 2) и 3) мастер определяет направление дальнейшего поиска, выдавая на шину 0 или 1; устройства, у которых направление поиска не совпало с текущим битом серийного номера, в дальнейшем поиске не участвуют
5) while(++SN_Bit_Cnt < SN_LENGTH) goto 2)
6) получили SN очередного устройства
7) если в дереве поиска остались неоднозначности, goto 1)

Посмотрите все-таки на досуге app187.pdf
Цыкетчик
Цитата(xemul @ Sep 24 2008, 12:42) *
получили SN очередного устройства

А можно ли определять SN сразу всех устройств? Т.е. сначала 1-й бит SN всех устройств. Потом первые 2 бита. Потом первые 3 бита сразу ВСЕХ устройств. Потом все биты ВСЕХ устройств.

Т.е. можно ли сканирование организовать таким образом?
xemul
Цитата(Цыкетчик @ Sep 24 2008, 13:53) *
А можно ли определять SN сразу всех устройств?

Конечно можно. Н-р, подписываете SN'ы на крышках устройств, читаете картинку каким-нить глазом, распознаете SN'ы - ву а ля.
Цитата
Т.е. сначала 1-й бит SN всех устройств. Потом первые 2 бита. Потом первые 3 бита сразу ВСЕХ устройств. Потом все биты ВСЕХ устройств.

Т.е. можно ли сканирование организовать таким образом?

Конечно можно. Меняете в приведенном выше ванварном алгоритме внутренний и внешний циклы местами - ву а ля. Только при таком подходе и при неизвестном количестве устройств требуемая разрядность дерева поиска также неизвестна.

Всякоразные алгоритмы поиска очень хорошо разобраны, по-моему, в 3-м томе "Искусства программирования" Кнута. Рекомендую.
Цыкетчик
Цитата(xemul @ Sep 24 2008, 14:20) *
Только при таком подходе и при неизвестном количестве устройств требуемая разрядность дерева поиска также неизвестна.

По моим подсчётам она равно 2 x [Разрядность MAC-адреса] x[Кол-во девайсов на общей магистрали]
xemul
Цитата(Цыкетчик @ Sep 24 2008, 14:53) *
По моим подсчётам она равно 2 x [Разрядность MAC-адреса] x[Кол-во девайсов на общей магистрали]

Интересный подсчет. А в каких попугаях? Битах, байтах, n-байтовых словах?
Посмотрите все-таки app187.pdf. Там, если не привязываться к структуре ванварной ROM ID, весь поиск можно вообще свести к одной глобальной
int LastDiscrepancy;
(память под массив найденных ROM ID и некоторое количество локальных переменных не считаю),
что позволит обнаружить до 2^sizeof(int) устройств на шине за число внешних циклов поиска, равное числу устройств на шине.

Представьте пространство существующих адресов в виде 2-мерной матрицы разрядностью sizeof(MAC)*8 x число устройств на шине. Чтобы пересчитать все устройства, Вам по-любому придется пройтись по всем элементам матрицы, и совершенно без разницы, в каком порядке Вы их будете перебирать.
Но в ванварных девайсах уже есть "железная" поддержка "деревянного" поиска, а Вам, возможно, придется софтово организовать п.п.1)-4) алгоритма (реализация п.п.2),3), т.е. выявление коллизий, будет зависить от "физики" используемой шины и/или возможностей устройств эти коллизии обнаруживать).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.