Всем привет!!!
Кто знает как можно прочитать ds1990a по команде F0h ?
огромная просьба не давать ссылки на сайты типа http://www.maxim-ic.com и прочие - всё это лажа!
Я понял принцип чтения по команде F0h и сам могу объяснить кому угодно, но мне необходимо написать программу на Visual Basic-ке для чтения ROM ds1990a по команде F0h. И ещё просьба - команду 33h не предлагать - я этой командой уже всё прочитал, она работает на ура!
Если у кого-то уже есть готовый пример работы ds1990a через com порт, поделитесь пожалуйста!
Кстати о птичках - с недавних пор домофоны стали читать таблетку не по 33h а именно по F0h!!!!!!!!!!!!! чтобы исключить клоны и прочие эмуляторы там всякие!
Ой народ, ну мяу-ё-маё а, ну ёлки-палки - ну этот проект читает по команде 33h и по 0Fh - это аналогичные команды! Речь идёт о побитном чтении! ПО Б-И-Т-Н-О-М! андестенд ми?
Работает по следующему принципу - даём сброс, даём команду F0h даём два такта и входной буфер com порта заполняется следующими значениями: 1 0 - это значит, что в ROM находится единица, сразу же выдаём таблетке единицу в качестве подтверждения, если получили 0 1 - значит, что в ROM находится 0, опять выдаём подтверждение, но уже не 1 а 0, если получили 1 1 - это значит, что устройство не ответило, отвалилось, сгорело, сгорел com порт и т.д. и т.п., если получили 0 0, это значит, что мы очень хитрые и подключили на шину два устройства и они оба ответили... и всё это 64 раза - получаем 8 байт информации ROM!!! - Так работают современные домофоны, таким образом они отсеивают клоны и эмуляторы!!!
P.S. Почему меня все считают тормозом перестройки???
А возникли сложности переделать данную Вам программу под нужный вам протокол ??
Прочитал статейку, понял всё довольнотаки легко В протоколы обмена не вникал, с удовольствием готов помочь.
Если можете разъясните разницу принципов чтения (алгоритмов), есть идеи по переделки существующей программы..
А возникли сложности переделать данную Вам программу под нужный вам протокол ?? Прочитал статейку, понял всё довольнотаки легко В протоколы обмена не вникал, с удовольствием готов помочь. Если можете разъясните разницу принципов чтения (алгоритмов), есть идеи по переделки существующей программы..
Сложности возникли сразу же!
Существующая программа http://autobills.ru/1w_read_VB6.html читает ds1990a по команде 33h - хорошо читает! Качественно! Красиво! И код красивый и оптимизирован до безобразия. Дело не в этом - вся беда в том, что я прекрасно понимаю как дать команду F0h и как потом прочитать побитно НО чего-то не получается... а именно вот что: Даю сброс, даю команду F0h, даю два такта инструкцией Call DSOutBit (True), затем жду когда что нибудь свалится во входной буфер mscDevCount > 1, ну и к примеру получаю два бита 1 и 0 - отвечаю таблетке 1 Call DSOutBit (True) и повторяю всё это 64 раза - всё было бы хорошо, НО! 1-я пара бит = 1 0, вторая = 1 0 и после 2-й пары бит я получаю 1 1 - а это означает, что устройство не ответило, потому что сгорело или отвалилось - но это всё чушь, устройство на месте и всё с ним в полном порядке! Вот в чём может быть затык?
Если у кого нибудь есть адаптер и кому интересно могу скинуть проект, над которым я мучаюсь - если интересно конечно...
Ну если устраивает, переделай Function DSInByte() в аналогичную функцию которая читает и возвращает только два бита (там только циклы укоротить) и на базе DSoutByte функцию передающую один бит. а дальше дело только техники и пиротехники: читаем 2 бита, посылаем 1, читаем 2, посылаем 1. Сам я с бейсиками не дружу - готового решения не дам. А, вот где, возможно, ошибка:
Цитата:
Даю сброс, даю команду F0h, даю два такта инструкцией Call DSOutBit (True), затем жду когда что нибудь свалится во входной буфер mscDevCount > 1
Внимательнее изучайте диаграмму - после F0 читаются 2 бита, а потом мастер посылает один бит указывая по какому дереву пойдет поиск дальше.
Ой народ, ну мяу-ё-маё а, ну ёлки-палки - ну этот проект читает по команде 33h и по 0Fh - это аналогичные команды! Речь идёт о побитном чтении! ПО Б-И-Т-Н-О-М! андестенд ми?
речь идет об ответе на команду SEARCH_ROM - команде, которая позволяет обнаружить адреса всех одновременно подключенных 1-wire девайсов. у меня на сайте есть моя утилитка, которая позволяет через СОМ-порт выполнять поиск 1-wire девайсов. можете найти ее и скачать - будет как раз (говоря по-вашему) побитное чтение.
хотя я не понимаю - адрес-то один и тот же, вам оно зачем? что так, что эдак - считаете одно и то же...
кстати, в апноуте от производителя есть полный исходник на Си алгоритма поиска адресов - просто возьмите 1 в 1 его и откомпилируйте - и будет работать
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Внимательнее изучайте диаграмму - после F0 читаются 2 бита, а потом мастер посылает один бит указывая по какому дереву пойдет поиск дальше.
Не-не... если попытаться что-то прочитать сразу же после команды F0h то в буфере будет "ничего не будет" и система подвиснет ожидая эти самые два бита. После F0h надо насильно дать два такта в ds1990a, чтобы она (ds1990a) в свою очередь выдала эти два бита, а уж потом читать из буфера и подтверждать первый бит.... как-то так.
у меня на сайте есть моя утилитка, которая позволяет через СОМ-порт выполнять поиск 1-wire девайсов. можете найти ее и скачать - будет как раз (говоря по-вашему) побитное чтение.
Это где это???
ARV писал(а):
хотя я не понимаю - адрес-то один и тот же, вам оно зачем? что так, что эдак - считаете одно и то же...
Домофоны читают ключ именно по F0h, таким образом они отсеивают клоны и эмуляторы, я хочу сделать полный эмулятор ds1990a.
ARV писал(а):
кстати, в апноуте от производителя есть полный исходник на Си алгоритма поиска адресов - просто возьмите 1 в 1 его и откомпилируйте - и будет работать
Не могу сообразить как оттуда перебросить в Visual Basic, так-как совершенно незнаю Си.
Домофоны читают ключ именно по F0h, таким образом они отсеивают клоны и эмуляторы, я хочу сделать полный эмулятор ds1990a.
я мог бы вам помочь, если бы вы работали с Си: я давно сделал библиотеку для поддержки slave-устройств 1-wire, которые умеют реагировать на команды поиска. совсем недавно (вчера) MOLCHEC протестировал ее и собрал с ее помощью свой какой-то девайс страшно нужный ему. но раз вы любите ВижуалВасика - увы...
Cyrix писал(а):
Не могу сообразить как оттуда перебросить в Visual Basic, так-как совершенно незнаю Си.
могу порекомендовать осваивать Си. хотя даже зачатков навыков программиста достаточно, чтобы разобраться в алгоритме и "тупо" переформатировать операторы. я это делал для Pascal (Delphi) - просто заменяя {} на Begin End и операторы = на :=, & на AND и так далее.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Внимательнее изучайте диаграмму - после F0 читаются 2 бита, а потом мастер посылает один бит указывая по какому дереву пойдет поиск дальше.
Не-не... если попытаться что-то прочитать сразу же после команды F0h то в буфере будет "ничего не будет" и система подвиснет ожидая эти самые два бита. После F0h надо насильно дать два такта в ds1990a, чтобы она (ds1990a) в свою очередь выдала эти два бита, а уж потом читать из буфера и подтверждать первый бит.... как-то так.
жду мастера-сенсея по Visual Basic :(
Сенсея по вижуалу здесь может не оказаться. Но не понимаю в чем проблема? Там же все сделано тупо - через ком-порт, в полнючем соответствии с далласовской апнотой.
Код:
Private Function DSInTwoBit() As Byte 'подпрограмма ввода 2 бит Dim Buf() As Byte Dim By As Byte mscDev.InBufferCount = 0 'очищаем входной буфер For I% = 0 To 1 Call DSOutBit(True) Next I% TMInTime# = Now + TimeSerial(0, 0, 1) / 18 ' 1/18 секунды на ответ Do 'ждем когда на вход что нибудь придет, с учетом тайм-аута Loop Until (mscDev.InBufferCount > 1) Or (TMInTime# < Now) 'проверяем, весь ли байт пришел If mscDev.InBufferCount <= 1 Then 'байт не целиком, подставляем пучтой символ и выходим mscDev.InBufferCount = 0 'обнуляем буфер DSInByte = &HFF Exit Function End If Buf = mscDev.Input 'читаем буфер For I% = 0 To 1 If Buf(I%) = &HFF Then By = By + 2 ^ I% End If Next I% DSInByte = By End Function
Примерно так. Функция будет возвращать 0,1,2 или 3.
огромное спасибо uldemir! но к сожалению после 2-й пары бит от устройста я получаю 1 1 - тоесть устройство сгорело, отвалилось или com порт сгорел, естественно ничего из перечисленного не происходит.
Тоесть первая пара 1 0, вторая пара 1 0, а третья пара бит 1 1 - уже всё перепробовал, незнаю даже в чём может быть дело...
[... но раз вы любите ВижуалВасика - увы... могу порекомендовать осваивать Си. хотя даже зачатков навыков программиста достаточно, чтобы разобраться в алгоритме и "тупо" переформатировать операторы. я это делал для Pascal (Delphi) - просто заменяя {} на Begin End и операторы = на :=, & на AND и так далее.
Быть может Вы и правы, возможно мне просто нужно начать изучать Си
огромное спасибо uldemir! но к сожалению после 2-й пары бит от устройста я получаю 1 1 - тоесть устройство сгорело, отвалилось или com порт сгорел, естественно ничего из перечисленного не происходит. Тоесть первая пара 1 0, вторая пара 1 0, а третья пара бит 1 1 - уже всё перепробовал, незнаю даже в чём может быть дело...
А после первой пары бит ты посылаешь подтверждение кого хочешь иметь?
Если тебе пришло 0, 1 - значит есть устройство с 0 в данном бите, то мастер должен послать "0", и читать следующие 2 бита. Если пошлёшь "1", то таблетка подумает, что ее это не касается и отсохнет - вот тогда и получишь "11". Помоему так: Если DSInTwoBit возвращает 1 - надо послать 1, Если 2 - то посылаем 0, Если 0 - у нас развилка: в зависимости от посланного выберется одна или другая ветвь, ну а если 3 - сам знаешь - приехали.
Хм. Мне даже понравилось. Мож тоже поставить вижуал?
Хм. Мне даже понравилось. Мож тоже поставить вижуал?
ну конечно же после первой пары бит я посылаю 1 и после второй пары бит тоже посылаю 1 и если бы мне приходило 0 1 я бы посылал 0, но мне приходит 1 0...
мистика какя-то...
кстати специалистов по Си - целая куча, а вот так чтобы взять и написать что нибудь на Visual Basic - так все попрятались!
ну конечно же после первой пары бит я посылаю 1 и после второй пары бит тоже посылаю 1 и если бы мне приходило 0 1 я бы посылал 0, но мне приходит 1 0...
Wrong! Если посмотреть в конце учебника ответы, то тебе первая пара должна быть 1 0, а вторая 0 1. Если мне склероз не изменяет, то первый идет байт family code (01h) начиная с младшего бита. am i right?
ну конечно же после первой пары бит я посылаю 1 и после второй пары бит тоже посылаю 1 и если бы мне приходило 0 1 я бы посылал 0, но мне приходит 1 0...
Wrong! Если посмотреть в конце учебника ответы, то тебе первая пара должна быть 1 0, а вторая 0 1. Если мне склероз не изменяет, то первый идет байт family code (01h) начиная с младшего бита. am i right?
Да Вы правы на 100% я этот феномен сразу же обнаружил! Сначала идёт фамильный код устройства а это 00000001, тоесть я должен получать такие пары 1 0, 0 1, 0 1, 0 1.... и так до 8-мого бита, а я получаю неизвестно что - 1 0, 1 0 и 1 1 - крандец какой-то! что-же это за такое а? может в церковь сходить???
На уровне моего понимания к коду претензий нет.
Но попробуй добавить контрольные распечатки к каждому действию. И если есть осциллограф, пробник, посмотри - проскакивают ли импульсы. Не стесняйся вставлять паузы - 1-wire допускает. Кстати, можно ли endif не ставить в таком синтаксисе? Я знаю, что бейсик не C, но все же?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения