|
вопрос по 1-Wire, работа с двумя устройствами с одним неизвестным серийным номером |
|
|
|
Sep 10 2008, 07:53
|

Участник

Группа: Участник
Сообщений: 16
Регистрация: 27-04-05
Из: Воронеж
Пользователь №: 4 541

|
Всем привет! Прошу помочь в одном вопросе.
Есть контроллер RS232>1-Wire DS2480B, подключённый к микроконтроллеру AVR. Компилятор - WinAVR (это к тому, что у него нет библиотеки для работы с 1-Wire). К нему подключён термодатчик (в принципе не важно какой) DS18B20 с уже известным серийным номером (который 8 байт).
Сейчас понадобилось подключать к этой шине таблетку DS1990A для охранных функций.
Но для её идентификации нужно сначала её запомнить в микроконтроллере для последующих сравнений. Но таблетка эта - не единственная. Т.е. серийный номер заранее не известен.
Термодатчик для программирования таблетки отключать не предполагается.
Алгоритм нужен примерно такой: периодически опрашивается термодатчик. Тут прикладывают таблетку. Микроконтроллер считывает её номер и что-то делает в зависимости от того, совпал он с уже хранящим е ЕЕПРОМ или нет, при этом возобновляется опрос термодатчика.
В другом случае, когда нужно запомнить новую таблетку, предполагается так: периодически опрашивается термодатчик. Тут нажимают кнопку программирования и в течении 5 секунд микроконтроллер ждёт прикладывания новой таблетки. После того как её приложили и считали её номер или по прошествии 5 секунд возобновляется опрос термодатчика.
Искал в документации на DS2480B и в описаниях стандартов 1-Wire команду для "временного отключения от шины с последующим включением", не нашёл. А она в данном случае очень пригодилась бы.
Единственный вариант, который придётся использовать - поиск устройств на шине. Но как раз им не хочется заморачиваться, ибо plug&play на шине 1-Wire ещё не освоил и кажется будет много возни с ним.
Вопрос: есть ли ещё варианты такой совместной работы кроме того, в котором придётся реализовывать поиск устройсв на шине? Например, может сущствует какия-то команда временного отключения известного устройства от шины?
|
|
|
|
|
Sep 10 2008, 08:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(timex @ Sep 10 2008, 10:53)  Вопрос: есть ли ещё варианты такой совместной работы кроме того, в котором придётся реализовывать поиск устройсв на шине? Переключить термодатчик на любой свободный вывод порта и опрашивать его программно. На входе для таблетки оставить только таблетку. Готовой библиотеки в компиляторе конечно нет, но ее написать - на полдня работы с даташитом перед глазами. В самом крайнем случае - в форуме по AVR есть ветка "исходники программ и библиотек" - там выложено штук 5 примеров реализации 1-wire. Цитата(timex @ Sep 10 2008, 10:53)  Например, может сущствует какия-то команда временного отключения известного устройства от шины? Все известные команды описаны в даташите. Предлагаете кому-то прочитать его за вас?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 10 2008, 08:47
|
Частый гость
 
Группа: Свой
Сообщений: 94
Регистрация: 21-06-06
Из: Рига, Латвия
Пользователь №: 18 255

|
Цитата(timex @ Sep 10 2008, 10:53)  Искал в документации на DS2480B и в описаниях стандартов 1-Wire команду для "временного отключения от шины с последующим включением", не нашёл. А она в данном случае очень пригодилась бы. Это не подойдёт? COMMUNICATION COMMANDS ResetThe 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).
|
|
|
|
|
Sep 10 2008, 09:16
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 18-02-08
Из: Челябинск
Пользователь №: 35 141

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

Участник

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358

|
Цитата(timex @ Sep 10 2008, 11:53)  Единственный вариант, который придётся использовать - поиск устройств на шине. Но как раз им не хочется заморачиваться, ибо plug&play на шине 1-Wire ещё не освоил и кажется будет много возни с ним. Не так там все и сложно. исходники есть на самом максиме. Уж лучше подумать над программой, чем городить ключи и отключения от шины. http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm
Сообщение отредактировал Warlockwolf - Sep 10 2008, 10:11
|
|
|
|
|
Sep 10 2008, 10:35
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(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).
|
|
|
|
Guest_Цыкетчик_*
|
Sep 23 2008, 18:31
|
Guests

|
Цитата(Harbour @ Sep 11 2008, 14:25)  был когда-то у далласа an187.pdf, где усе описано - для ленивых выкладываю свой древний код, который был написан по их исходникам. нужная ф-ия называется u64 w1_search_devices() А не могли бы в кратце рассказать на каком принципе там усё работает? А то я в СИ (так же как и в английском) не очень силЁн. Просто я сейчас работаю на похожей темой вот тут
|
|
|
|
|
Sep 24 2008, 03:55
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 18-02-08
Из: Челябинск
Пользователь №: 35 141

|
Цитата(Цыкетчик @ Sep 24 2008, 00:31)  А не могли бы в кратце рассказать на каком принципе там усё работает? А то я в СИ (так же как и в английском) не очень силЁн. Просто я сейчас работаю на похожей темой вот тутВкратце, среди устройств на шине устраивается "соцопрос": - У кого в серийнике ноль в 63 разряде, поднимите руку (вернее, опустите ногу)!  А теперь, у кого в 62-м, и т.д. Поскольку на шине монтажное "или", ноль в заданном разряде может быть одновременно у нескольких устройств, поэтому, в общем случае, за один проход вычисляется только один серийный номер.
|
|
|
|
|
Sep 24 2008, 08:42
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Цыкетчик @ 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
|
|
|
|
Guest_Цыкетчик_*
|
Sep 24 2008, 09:53
|
Guests

|
Цитата(xemul @ Sep 24 2008, 12:42)  получили SN очередного устройства А можно ли определять SN сразу всех устройств? Т.е. сначала 1-й бит SN всех устройств. Потом первые 2 бита. Потом первые 3 бита сразу ВСЕХ устройств. Потом все биты ВСЕХ устройств. Т.е. можно ли сканирование организовать таким образом?
|
|
|
|
|
Sep 24 2008, 10:20
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Цыкетчик @ Sep 24 2008, 13:53)  А можно ли определять SN сразу всех устройств? Конечно можно. Н-р, подписываете SN'ы на крышках устройств, читаете картинку каким-нить глазом, распознаете SN'ы - ву а ля. Цитата Т.е. сначала 1-й бит SN всех устройств. Потом первые 2 бита. Потом первые 3 бита сразу ВСЕХ устройств. Потом все биты ВСЕХ устройств.
Т.е. можно ли сканирование организовать таким образом? Конечно можно. Меняете в приведенном выше ванварном алгоритме внутренний и внешний циклы местами - ву а ля. Только при таком подходе и при неизвестном количестве устройств требуемая разрядность дерева поиска также неизвестна. Всякоразные алгоритмы поиска очень хорошо разобраны, по-моему, в 3-м томе "Искусства программирования" Кнута. Рекомендую.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|