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

 
 
> 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
 
Start new topic
Ответов
Shivers
сообщение Dec 7 2011, 10:55
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:05
Рейтинг@Mail.ru


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