реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 1-wire Accelerated ROM search, нужна помощь
Shivers
сообщение Nov 29 2011, 09:04
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Привет!
Кто работал с интерфейсом, помогите понять как работает алгоритм.

Прикрутил далласовскую корку 1-wire master к своему проекту на fpga, пытаюсь сделать алогоритм автоопределения. Для корки есть описание Synthesizable 1-Wire Bus Master. Также нашел app-note 137 с алгоритмом определения. Но, ничерта там не понял, уж очень мутная стейт машина нарисована, да еще и для битовых операций, а у меня корка сразу байт выплевывает за один проход.
Что представляет из себя мастер: это корка с набором команд и 8ми рарядной шиной данных. Для реализации одной итерации автоопределения, нужно подать корке команду сброса, затем перевести ее в режим автоопределения, после чего 16 раз записать байт с маской поиска, и считать 16 байт результата. После этого 16 полученных байт разбираются на определенный ID код (64бит) и некий результат, тоже 64 бит. Из результата надо сформировать маску для следующего запроса. Вроде просто, но как формировать эту маску?

Предположим, повесил я на шину 4 слэйва. Выставил код 0...0, получил ID code и результат - 0x0..18. Согласно гайду выделил старший разряд, получилось 0x0..10. Получил второй айдикод и 0x0..38. Опять взял старший бит, выставил 0x0..20, получил опять 0x0..18! Если же выставлять маску 0x0..08, получаю тот же айдикод что и с маской все нули. И вот тут у меня мозг сломался ... Может, ктонибудь обьяснит на пальцах алгоритм?

p.s. Сишный код тоже видел, для меня он нечитабелен, т.к. Си почти не знаю. Да и реализовать я автомат планировал, или простенькую программу на ассемблере со всеми ключевыми вычислялками на логике ПЛИС.

Спасибо!


upd: вроде разобрался, нужно к старшему биту маски добавлять еще кусок последнего обнаруженного id кода. но полной победы не достигнуто, теперь определяются 7 из 8 устройств)
Go to the top of the page
 
+Quote Post
Aner
сообщение Dec 1 2011, 17:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



через реалтизацию RS_а пробовали оценить?
http://we.easyelectronics.ru/electro-and-p...e-s-kompom.html
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 1 2011, 17:38
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вы знаете , на этой неделе , что-то уж очень много тем по данному интерфейсу. В своё время , работая с датчиком 18B20 собрал небольшую коллекцию всевозможных документов по сему интерфейсу. В том числе для Вас есть и как работать с поиском датчиков от MAXIM 1-Wire Search Algorithm найдёте его в коллекции. И чуть чуть на русском
Прикрепленные файлы
Прикрепленный файл  1_WIRE_UART.rar ( 4.49 мегабайт ) Кол-во скачиваний: 52
 


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Shivers
сообщение Dec 6 2011, 14:48
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Отличная подборка, спасибо!
У меня алгоритм в целом работает, но из N устройств стабильно находит только (N-1) : ) Пока не разобрался, почему так

p.s. статья с RS оказалась бесполезной, поскольку алгоритма Autodetect я там не обнаружил, а общение с датчиком (в качестве датчика у меня модифицированная модель из далласовской корки) у меня проходит на ура - и запись и чтение. Нужно только автодетект допилить, либо покупать на один датчик больше )))
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Dec 6 2011, 16:23
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Shivers @ Dec 6 2011, 17:48) *
Отличная подборка, спасибо!
У меня алгоритм в целом работает, но из N устройств стабильно находит только (N-1) : ) Пока не разобрался, почему так

p.s. статья с RS оказалась бесполезной, поскольку алгоритма Autodetect я там не обнаружил, а общение с датчиком (в качестве датчика у меня модифицированная модель из далласовской корки) у меня проходит на ура - и запись и чтение. Нужно только автодетект допилить, либо покупать на один датчик больше )))

А Вы обратили внимание, что сначала вызываается OWFirst, а потом OWNExt, Может у Вас только OWNext реализовано? Отличия то там только в инициализации переменных, а OWSearch вызывается один и тот же.
З.Ы. В терминах максимовской аппликухи.
Go to the top of the page
 
+Quote Post
Shivers
сообщение Dec 7 2011, 10:55
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Гмм. Ну, OWFirst (условно говоря, поиск первого айдикода) пропустить сложно, т.к. первая маска идет со всеми нолями, и из нее выпадает первый айдикод и первый результат маскирования, из которых формируется маска для итерации OWNExt (поиск следующего). Итого, OWFirst пропустить нельзя никак, я точно не пропустил )

Может, вспомните алгоритм?
У меня сейчас так, пример:
1. посылаем 64'h0. Получаем 128 бит, разделяем на 64бита ROMID0, например 0xfedcba98_76543210 и 64 бита MASK0, например 0x00000000_00000180.
2. в MASK0 выделяем старшую 1 (0x00000000_00000100), заполняем все единицы справа, 0x00000000_000001FF, умножаем на ROMID0 и считаем маску для OWNExt
= 0xfedcba98_76543210 & 0x00000000_000001FF = 0x00000000_00000110. посылаем на шину результат: 0x00000000_00000110, и получаем в ответ следующие ROMID1 и MASKID1, на основе которых повторяется п.2. и так повторяется, пока не
3. Условие по выходу из алгоритма: когда старшая 1 в промежуточном результате вычислений повторится в одной позиции два раза. Это значит что дальше алгоритм будет находить повторные ROMID.

При этом, из 4х дачиков определяются 3, из 8 датчиков - 7 и т.д., причем если выход из алгоритма убрать то начинаются повторы, а один айдикод упорно не отыскивается. Вроде не сложно получилось, но где то здесь зарыт косяк ..
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Dec 7 2011, 18:53
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Shivers @ Dec 7 2011, 13:55) *
Может, вспомните алгоритм?
У меня сейчас так, пример:
1. посылаем 64'h0. Получаем 128 бит, разделяем на 64бита ROMID0, например 0xfedcba98_76543210 и 64 бита MASK0, например 0x00000000_00000180.
2. в MASK0 выделяем старшую 1 (0x00000000_00000100), заполняем все единицы справа, 0x00000000_000001FF, умножаем на ROMID0 и считаем маску для

Алгоритм поиска основан на вычитывании id_bit и cmp_id_bit, поскольку шина 1-wire, если есть устройства с 0 и 1 в одном и том же бите адреса, то id_bit и cmp_id_bit будут 0, если же устройство одно, то будет либо id_bit=1 и cmp_id_bit=0 либо наоброт, id_bit=0 и cmp_id_bit=1. Из этого определяете с каким значением бита устройства у Вас есть на шине. Маска в Вашем случае как раз означает истинное значение бита адреса равное 0.
Посмотрите внимательнее AN187 и DS1WM, Maxim использует одинаковые термины в обоих документах.

Цитата(Shivers @ Dec 7 2011, 13:55) *
3. Условие по выходу из алгоритма: когда старшая 1 в промежуточном результате вычислений повторится в одной позиции два раза. Это значит что дальше алгоритм будет находить повторные ROMID.

Thus, if r’63 and d63 are both 1, an error has occurred during the search procedure and
the last sequence has to be repeated.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 10:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016