| Форум РадиоКот https://radiokot.ru/forum/ |
|
| DS1990A https://radiokot.ru/forum/viewtopic.php?f=2&t=21691 |
Страница 1 из 2 |
| Автор: | Cyrix [ Чт ноя 12, 2009 16:27:23 ] |
| Заголовок сообщения: | DS1990A |
Всем привет!!! Кто знает как можно прочитать ds1990a по команде F0h ? огромная просьба не давать ссылки на сайты типа http://www.maxim-ic.com и прочие - всё это лажа! Я понял принцип чтения по команде F0h и сам могу объяснить кому угодно, но мне необходимо написать программу на Visual Basic-ке для чтения ROM ds1990a по команде F0h. И ещё просьба - команду 33h не предлагать - я этой командой уже всё прочитал, она работает на ура! Если у кого-то уже есть готовый пример работы ds1990a через com порт, поделитесь пожалуйста! Кстати о птичках - с недавних пор домофоны стали читать таблетку не по 33h а именно по F0h!!!!!!!!!!!!! чтобы исключить клоны и прочие эмуляторы там всякие! |
|
| Автор: | Alexey1969 [ Чт ноя 12, 2009 17:09:23 ] |
| Заголовок сообщения: | |
Очень странно, что сайт производителя - лажа Не получается возможно потому, что команда 0Fh, а не F0h ? Не поленился, попробовал, все чудно читается.... На VB и через ком порт.... |
|
| Автор: | Alexey1969 [ Чт ноя 12, 2009 17:10:30 ] |
| Заголовок сообщения: | |
Читал вот этим http://autobills.ru/1w_read_VB6.html |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 09:42:01 ] |
| Заголовок сообщения: | |
Alexey1969 писал(а): Читал вот этим http://autobills.ru/1w_read_VB6.html
Ой народ, ну мяу-ё-маё а, ну ёлки-палки - ну этот проект читает по команде 33h и по 0Fh - это аналогичные команды! Речь идёт о побитном чтении! ПО Б-И-Т-Н-О-М! андестенд ми? Работает по следующему принципу - даём сброс, даём команду F0h даём два такта и входной буфер com порта заполняется следующими значениями: 1 0 - это значит, что в ROM находится единица, сразу же выдаём таблетке единицу в качестве подтверждения, если получили 0 1 - значит, что в ROM находится 0, опять выдаём подтверждение, но уже не 1 а 0, если получили 1 1 - это значит, что устройство не ответило, отвалилось, сгорело, сгорел com порт и т.д. и т.п., если получили 0 0, это значит, что мы очень хитрые и подключили на шину два устройства и они оба ответили... и всё это 64 раза - получаем 8 байт информации ROM!!! - Так работают современные домофоны, таким образом они отсеивают клоны и эмуляторы!!! P.S. Почему меня все считают тормозом перестройки??? |
|
| Автор: | Pe3ucTop [ Пт ноя 13, 2009 14:01:15 ] |
| Заголовок сообщения: | |
А возникли сложности переделать данную Вам программу под нужный вам протокол ?? Прочитал статейку, понял всё довольнотаки легко В протоколы обмена не вникал, с удовольствием готов помочь. Если можете разъясните разницу принципов чтения (алгоритмов), есть идеи по переделки существующей программы.. |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 14:50:44 ] |
| Заголовок сообщения: | |
Pe3ucTop писал(а): А возникли сложности переделать данную Вам программу под нужный вам протокол ??
Прочитал статейку, понял всё довольнотаки легко В протоколы обмена не вникал, с удовольствием готов помочь. Если можете разъясните разницу принципов чтения (алгоритмов), есть идеи по переделки существующей программы.. Сложности возникли сразу же! Существующая программа 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 - а это означает, что устройство не ответило, потому что сгорело или отвалилось - но это всё чушь, устройство на месте и всё с ним в полном порядке! Вот в чём может быть затык? Если у кого нибудь есть адаптер и кому интересно могу скинуть проект, над которым я мучаюсь - если интересно конечно... |
|
| Автор: | uldemir [ Пт ноя 13, 2009 20:08:44 ] |
| Заголовок сообщения: | |
Цитата: Существующая программа http://autobills.ru/1w_read_VB6.html читает ds1990a по команде 33h - хорошо читает! Ну если устраивает, переделай Function DSInByte() в аналогичную функцию которая читает и возвращает только два бита (там только циклы укоротить) и на базе DSoutByte функцию передающую один бит. а дальше дело только техники и пиротехники: читаем 2 бита, посылаем 1, читаем 2, посылаем 1. Сам я с бейсиками не дружу - готового решения не дам. А, вот где, возможно, ошибка: Цитата: Даю сброс, даю команду F0h, даю два такта инструкцией Call DSOutBit (True), затем жду когда что нибудь свалится во входной буфер mscDevCount > 1 Внимательнее изучайте диаграмму - после F0 читаются 2 бита, а потом мастер посылает один бит указывая по какому дереву пойдет поиск дальше.
|
|
| Автор: | ARV [ Пт ноя 13, 2009 20:21:46 ] |
| Заголовок сообщения: | |
Cyrix писал(а): Ой народ, ну мяу-ё-маё а, ну ёлки-палки - ну этот проект читает по команде 33h и по 0Fh - это аналогичные команды! Речь идёт о побитном чтении! ПО Б-И-Т-Н-О-М! андестенд ми? речь идет об ответе на команду SEARCH_ROM - команде, которая позволяет обнаружить адреса всех одновременно подключенных 1-wire девайсов. у меня на сайте есть моя утилитка, которая позволяет через СОМ-порт выполнять поиск 1-wire девайсов. можете найти ее и скачать - будет как раз (говоря по-вашему) побитное чтение.
хотя я не понимаю - адрес-то один и тот же, вам оно зачем? что так, что эдак - считаете одно и то же... кстати, в апноуте от производителя есть полный исходник на Си алгоритма поиска адресов - просто возьмите 1 в 1 его и откомпилируйте - и будет работать |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 20:25:08 ] |
| Заголовок сообщения: | |
uldemir писал(а): Цитата: Внимательнее изучайте диаграмму - после F0 читаются 2 бита, а потом мастер посылает один бит указывая по какому дереву пойдет поиск дальше. Не-не... если попытаться что-то прочитать сразу же после команды F0h то в буфере будет "ничего не будет" и система подвиснет ожидая эти самые два бита. После F0h надо насильно дать два такта в ds1990a, чтобы она (ds1990a) в свою очередь выдала эти два бита, а уж потом читать из буфера и подтверждать первый бит.... как-то так. жду мастера-сенсея по Visual Basic |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 20:33:39 ] |
| Заголовок сообщения: | |
ARV писал(а): у меня на сайте есть моя утилитка, которая позволяет через СОМ-порт выполнять поиск 1-wire девайсов. можете найти ее и скачать - будет как раз (говоря по-вашему) побитное чтение. Это где это??? ARV писал(а): хотя я не понимаю - адрес-то один и тот же, вам оно зачем? что так, что эдак - считаете одно и то же... Домофоны читают ключ именно по F0h, таким образом они отсеивают клоны и эмуляторы, я хочу сделать полный эмулятор ds1990a. ARV писал(а): кстати, в апноуте от производителя есть полный исходник на Си алгоритма поиска адресов - просто возьмите 1 в 1 его и откомпилируйте - и будет работать
Не могу сообразить как оттуда перебросить в Visual Basic, так-как совершенно незнаю Си. |
|
| Автор: | ARV [ Пт ноя 13, 2009 20:43:32 ] |
| Заголовок сообщения: | |
Cyrix писал(а): Это где это??? это здесьCyrix писал(а): Домофоны читают ключ именно по F0h, таким образом они отсеивают клоны и эмуляторы, я хочу сделать полный эмулятор ds1990a. я мог бы вам помочь, если бы вы работали с Си: я давно сделал библиотеку для поддержки slave-устройств 1-wire, которые умеют реагировать на команды поиска. совсем недавно (вчера) MOLCHEC протестировал ее и собрал с ее помощью свой какой-то девайс страшно нужный ему. но раз вы любите ВижуалВасика - увы...Cyrix писал(а): Не могу сообразить как оттуда перебросить в Visual Basic, так-как совершенно незнаю Си. могу порекомендовать осваивать Си. хотя даже зачатков навыков программиста достаточно, чтобы разобраться в алгоритме и "тупо" переформатировать операторы. я это делал для Pascal (Delphi) - просто заменяя {} на Begin End и операторы = на :=, & на AND и так далее.
|
|
| Автор: | uldemir [ Пт ноя 13, 2009 20:43:55 ] |
| Заголовок сообщения: | |
Cyrix писал(а): uldemir писал(а): Цитата: Внимательнее изучайте диаграмму - после 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. |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 21:41:04 ] |
| Заголовок сообщения: | |
огромное спасибо uldemir! но к сожалению после 2-й пары бит от устройста я получаю 1 1 - тоесть устройство сгорело, отвалилось или com порт сгорел, естественно ничего из перечисленного не происходит. Тоесть первая пара 1 0, вторая пара 1 0, а третья пара бит 1 1 - уже всё перепробовал, незнаю даже в чём может быть дело... |
|
| Автор: | Cyrix [ Пт ноя 13, 2009 21:43:36 ] |
| Заголовок сообщения: | |
ARV писал(а): [... но раз вы любите ВижуалВасика - увы...
могу порекомендовать осваивать Си. хотя даже зачатков навыков программиста достаточно, чтобы разобраться в алгоритме и "тупо" переформатировать операторы. я это делал для Pascal (Delphi) - просто заменяя {} на Begin End и операторы = на :=, & на AND и так далее. Быть может Вы и правы, возможно мне просто нужно начать изучать Си |
|
| Автор: | uldemir [ Пт ноя 13, 2009 22:06:29 ] |
| Заголовок сообщения: | |
Cyrix писал(а): огромное спасибо 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 - сам знаешь - приехали. Хм. Мне даже понравилось. Мож тоже поставить вижуал? |
|
| Автор: | Cyrix [ Сб ноя 14, 2009 19:32:04 ] |
| Заголовок сообщения: | |
uldemir писал(а): Хм. Мне даже понравилось. Мож тоже поставить вижуал?
ну конечно же после первой пары бит я посылаю 1 и после второй пары бит тоже посылаю 1 и если бы мне приходило 0 1 я бы посылал 0, но мне приходит 1 0... мистика какя-то... кстати специалистов по Си - целая куча, а вот так чтобы взять и написать что нибудь на Visual Basic - так все попрятались! |
|
| Автор: | Cyrix [ Сб ноя 14, 2009 19:55:32 ] |
| Заголовок сообщения: | |
Код: Dim R(128)
Dim Buf() As Byte Dim By As Byte Text1.Text = "" Call DSReset 'выдаем сброс Call DSOutByte(&HF0) 'команда на поиск ПЗУ таблетки R(0) = DSInTwoBit If R(0) = 1 Then Call DSOutBit(True) If R(0) = 2 Then Call DSOutBit(False) If R(0) = 3 Then MsgBox "отвалилась!" R(1) = DSInTwoBit If R(1) = 1 Then Call DSOutBit(True) If R(1) = 2 Then Call DSOutBit(False) If R(1) = 3 Then MsgBox "отвалилась!" R(2) = DSInTwoBit If R(2) = 1 Then Call DSOutBit(True) If R(2) = 2 Then Call DSOutBit(False) If R(2) = 3 Then MsgBox "отвалилась!" For bt = 0 To 2 Debug.Print R(bt); Next bt первый ответ 1, второй ответ 1, третий ответ - сообщение "отвалилась!" что я не так делаю? |
|
| Автор: | uldemir [ Сб ноя 14, 2009 20:59:25 ] |
| Заголовок сообщения: | |
Cyrix писал(а): ну конечно же после первой пары бит я посылаю 1 и после второй пары бит тоже посылаю 1 и если бы мне приходило 0 1 я бы посылал 0, но мне приходит 1 0... Wrong! Если посмотреть в конце учебника ответы, то тебе первая пара должна быть 1 0, а вторая 0 1. Если мне склероз не изменяет, то первый идет байт family code (01h) начиная с младшего бита. am i right?
|
|
| Автор: | Cyrix [ Сб ноя 14, 2009 21:19:12 ] |
| Заголовок сообщения: | |
uldemir писал(а): Cyrix писал(а): ну конечно же после первой пары бит я посылаю 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 - крандец какой-то! |
|
| Автор: | uldemir [ Сб ноя 14, 2009 21:21:00 ] |
| Заголовок сообщения: | |
На уровне моего понимания к коду претензий нет. Но попробуй добавить контрольные распечатки к каждому действию. И если есть осциллограф, пробник, посмотри - проскакивают ли импульсы. Не стесняйся вставлять паузы - 1-wire допускает. Кстати, можно ли endif не ставить в таком синтаксисе? Я знаю, что бейсик не C, но все же? |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


