Еще немного о 1-wire + UART

Доделал софтину для ручной работы с 1-wire устройствами через UART.
1w_on_com.PNG

Работает она теперь не только на FT232, но на любом USB<>UART, RS232<>UART, [что-угодно]<>UART переходнике. Главное, чтобы он мог поддерживать скорость до 115200. MAX232, судя по даташиту, может. Подключение я уже описывал. Повторюсь:
sch.PNG

Работа осуществляется через списки действий. Т.е. создаем список -> нажимаем «выполнить» -> изучаем отчет.
Like this:
report.PNG

Есть всего 4 вида действий:
— RESET. Подает сигнал RESET и читает PRESENCE.
— Передать байт. Выбрасывает данные на линию 1-wire. При добавлении команды появится окошко, где можно ввести данные в dec, hex, bin или char.
— Прочитать байт. Считывает байт с линии (ваш К.О.)
— Пауза. Просто задержка на n миллисекунд. Для создания задержки используется функция sleep(), поэтому на это время программа подвисает. Позволяет, к примеру, организовать измерение и чтение температуры с DS18b20 одним списком.

Готовые списки можно сохранять и загружать.
При нажатии на кнопку «загрузить» появлется менюшка с названиями всех сохраненных списков — они хранятся в подпапке \Lists, в папке программы.

При просмотре отчета можно скопировать его в буфер обмена, сохранить в текстовый файл или запустить список на выполнение еще раз (с последующим обновлением отчета). Так-же можно редактировать отправляемые данные — для этого надо сделать даблклик по команде «передать байт» в списке.

Утилита + исходники

  • +5
  • 31 мая 2011, 13:40
  • dcoder

Комментарии (55)

RSS свернуть / развернуть
Может, PRESENCE?
+1
Блин! Почему-то всегда думал, что оно так пишется :(
Пойду исправлять…
0
Вот и все. Никто ничего не видел :)
0
Sleep кстати гарантирует задержку не меньше указанной, больше — запросто. Чуть точнее будет, если тупить в цикле вида while GetTickCount<DelayEnd;. Или задействовать мультимедийный таймер (но он работает в отдельном потоке).
0
  • avatar
  • Vga
  • 31 мая 2011, 15:21
Не знал. А насколько больше может быть задержка?
Думаю там счет на миллисекунды идет. А тут особо точная задержка не нужна — просто подождать, пока 1w девайс работу выполнит.
0
Функция Sleep отдаёт управление другим потокам. Так что пока все остальные потоки, которые ждали управления, не отработают, тебе управление не вернётся.
Кстати, чтобы просто отдать управление другим потокам мона юзать Sleep(0).
0
Ну не все. После окончания выдержки отработает только текущая задача и те, которые не ниже приоритетом. Низкоприоритетные получают время только когда высокоприоритетные спят (sleep, функции ожидания мессаги/события/vsync'а/etc).
0
А, ну да, ты прав конечно :)
Хотя бесконечный цикл скажем, в потоке с реальтаймовым приоритетом вешает винду насмерть.
А в потоке с высоким приоритетом — нет, задачи с низким приоритетом всё же продолжают как-то работать.
Алсо, чтобы поставить реальтаймовый приоритет нужны права одмина.
В общем, видимо, немного хитрее сделано )
0
Ну, не насмерть. Есть же CPU Starvation Detection. Да и нету большой разницы между Realtime и High — во втором случае кроме тупящего в цикле потока время будут получать только потоки с приоритетом High.
Кстати, некоторые дрова тоже умеют тупить в циклах, в том числе и в ISR) Вот это жосско, особенно когда такие фокусы выдают не дрова видюхи (там это привычное состояние, которое учиытвается разработчиками нагружающих видеокарту программ)
0
А хотя, хз. Возможно RT поток даже CSD не прерывает. Давно я читал про это все…
0
Может сейчас уже допилили :)
В моей xp цикл в real — вешает комп намертво)
цикл в high — нет, загрузка проца 100%, но всё работает, в т.ч. с самым низким приоритетом.
0
Работает или получает таймслот раз в 5 секунд при срабатывании CSR?
0
Я уж не помню насколько адекватно вели себя остальные проги :)
Про CSD раньше не слышал.
Видимо, да.
0
CSD — это когда прога ко-как реагирует на нажатие кнопки через полминуты) Обычно уходит минут 5, чтобы вызвать диспетчер задач в таких условиях и прибить висящую прогу.
0
Щас я на нетбучике попробую :)
А то на компе на многоядерном проце чистого эксперимента не получится.
0
Создай потоков по числу процессора. Не помню кому и что я показывал, но когда-то я такое писал) Комп тормозил знатно)
0
Я хочу именно на одноядерном проце попробовать.
Просто ЕМНИП чтобы серьёзно повесть комп надо было создать целую кучу потоков с приоритетом high.
0
Хм, действительно всё успешно повисло:)
Правда всё же пришлось 2 потока запустить чтобы победить гипертрединг.
0
Какой приоритет? Совсем повисло или через минуту-другую после CAD показало диспетчер?)
0
Видимо, совсем. У меня не получилось добиться от explorer'а какой-нить реакции. А диспетчер и так был запущен)
0
Ну, в такой ситуации не до эксплорера) А диспетчер отзывался нормально или через полминуты после действия?
Приоритет high обоим потокам, иначе не виснет )
Ну почему же, есть же еще realtime, в нем повиснет не хуже)
0
Нормально отзывался. У него тоже приоритет high по дефолту.

есть же еще realtime, в нем повиснет не хуже)
ага. ну я подразумевал «как минимум high». Впрочем если заспавнить 100500 потоков с нормальным приоритетом, насколько я помню, эффект будет тот же)
0
Нда. Нашел свою двухпоточную циклотупилку. При выставлении реалтайм приоритета все повисло. Даже тачпад, который вроде на PS/2 (PS/2 мыша последней виснет обычно). Реакции от менеджера задач тоже не дождался. А вот на High диспетчер вполне неплохо работал, и даже эксплорер хоть и медленно, но реагировал.
Странно, а мне помнилось, что я грохал такие процессы, что даже таскман тормозил.
0
Настоящая жесть это когда поток в бесконечном цикле спавнит сам себя.
Тут уже просто пофик на приоритет, система офигеет в любом случае. :)
0
Ну это все-же пореже ситуация, чем повисший в цикле поток) А если задаться задачей повесить систему, то вариантов дофига.
0
Приоритет high обоим потокам, иначе не виснет )
0
Сколько угодно — по сути sleep на N миллисекунд исключает программу из обработки диспетчером. После возврата в обработку ей придется подождать, пока закончится текущая задача (а она вполне может занять весь 130-мс таймслот даже если текущая задача ниже приоритетом), возможно — обработку других задач в конвеере.
А Sleep — зло, которое должно юзаться только при крайней необходимости.
Ну не то чтоб зло, просто ее неправильно назвали. Это не задержка, это функция передачи процессора другим задачам. Некоторые ресурсоемкие приложения (игры, например), иногда применяют Sleep(0), чтобы проц обработал другие задачи не меньшего приоритета (скажем, поток фоновой загрузки данных в той же игре) и вернулся к ним.
0
Тады плохо. Надо переделать.
0
Я еще добавлю. Собственно общение лучше делать в отдельном потоке, выставив ему приоритет realtime.
0
Винда не реалтаймовая ось. Так что в принципе нельзя быть уверенным в таймингах выполнения потока, ибо управление могут отобрать в любой момент.
А Sleep — зло, которое должно юзаться только при крайней необходимости.
0
У мя такое чувство что битбэнги (в т.ч. через уарт) не нужны.
Не пристало большому компу ножками дёргать аки какая тинька (да ещё и задержки sleep'ом отсчитывать).
Справедливости ради, даже в тиньке полно нормальных интерфейсов :)
0
А если надо, к примеру, собрать кучу адресов 1-wire датчиков. Писать прошивку под тиньку чтобы она этим занималась? ИМХО, проще все сделать на компе без лишней возни с железом.
0
А почему бы и нет :)
Горнист годную либу выкладывал
Почему бы на ней и не сделать

ps. В прочем мысль понятна, в нашем неидеальном мире иногда приходится забивать гвозди опрашивать OWI компом :(
0
Видел как-то такую штуку:
CP2102 делает UART из USB, дальше МК, дальше несколько термометров DS18b20. Думаешь так лучше, чем эмулировать UARTом 1-wire?
0
Вообще, если это не разово потыкать пару девайсов — лучше сделать номальную сеть этих датчиков, управляемую МК, а уже на том делать интерфейс к вышестоящей системе.
0
Строго говоря там не совсем битбэнги. Там эмуляция 1-wire UART'ом, который работает в свом нормальном режиме.

А в большом компе и интерфейсы большие, слишком дорого в большинство из них включаться. Не зря же в электронику нормальные процы не ставят (не считая древних АОНов на самопальном МК из Z80, ВВ50, ОЗУ и ПЗУ :), и даже SoC'и для плееров содержат в себе элементы МК.
0
Да я знаю что уарт юзается в как бы нормальном режиме.
Дело не в битбэнге а в том что порт опрашивается в синхронном режиме, а это в нереальтаймовой, многозадачной системе в любом случае очень-очень плохо.
0
Ну, в принципе, собственно посылка/прием отрабатываются железно. Можно ведь пачкой читать/писать — записали полкило байтиков в буфер и ушли спать. Как ушло — смотрим чего в прием нападало.
0
Да, не спорю, всё же это ненастока криво как дёргать ножками в LPT. :)
Я когда то делал преобразователь на логике из UART'а в SPI чтобы прошивать межки/тиньки по ISP, не мучая LPT.
0
мегареспектище, dcoder, спасибо большое.
народ, вопрос- кто- нибудь знает, как считать CRC на Delphi?
0
Вот тут: we.easyelectronics.ru/electro-and-pc/ft232-kak-podruzhit-1-wire-s-kompom.html

Я с термометром DS18b20 разговаривал и CRC считал. По табличке.
0
спасибо!
0
парни, помогите в чем может быть фича не откликается гад, хотя контроллеры вроде нормально читает, не могу разобраться, собрал вот что phreakerclub.com/563 есть у кого соображения?
-1
  • avatar
  • doki
  • 15 февраля 2013, 19:30
Коллектор от протектора отпаялся скорее всего. У моего деда была такая же херня.
0
Боюсь прослыть некропостером, но под win7 прога толком не работает. )))
0
Вернее зависает когда нет ответа от датчика. Совсем зависает…
И не работает с номерами портов выше 9
0
Вернее зависает когда нет ответа от датчика. Совсем зависает…
А в ХР не зависала?

По поводу номера порта — надо заменить 'COM' на '\\.\COM' в строке
h := CreateFile(PChar('COM'+edPort.Text), GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
0
В ХР не пробовали.
Компилятор только С++. ))

С датчиком удалось пообщаться при помощи digiterm. Свое пока не писал — разбирался в сырцах.
0
Компилятор только С++. ))
Ну перепиши, там немного. Или можно поставить Delphi 7 SE Lite (ну или иную версию Delphi Lite).
0
Кстати, откуда такая заморочь с
заменить 'COM' на '\\.\COM'
?
0
Особенности винды.
0
перезалейте файлы
0
у программы слишком большие задержки, DS2431 — не понимает.
Хотел поправить но в delphi7 не собирается.
Какая версия Delphi?
0
исходник надо поправить заменив
строки ExplicitTop = 54 ExplicitWidth = 508 ExplicitHeight = 536

на Top = 54 Width = 508 Height = 536 в файле report.dfm

Теперь он нормально собирается но на большее у меня нет времени.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.