К основному контенту

Параллельная работа с 1-wire

Продолжая свой полет, неожиданно сделал давно задуманную, да почему-то постоянно откладываемую на потом, штуку... А именно: параллельный опрос нескольких термодатчиков семейства DS18x20.

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

Последовательный опрос нескольких датчиков, хоть по адресу хоть без увеличивает общее время опроса пропорционально количеству датчиков. В частности, в моих личных играх опрос 8 датчиков последовательно затягивался почти на 100 мс. С учетом того, что примерно половина этого времени будет требовать запрета прерываний (кусочками по 65 мкс примерно), такая длительность выглядит не очень хорошо.

Кроме того, при "адресной" работе даже с тремя датчиками возникает проблема иного рода, так сказать, верхнеуровневая. Устройство должно как-то опознавать назначение каждого датчика по его адресу - этот измеряет температуру на улице, этот - в помещении, а этот - воду в системе отопления. И как вы себе представляете процесс присваивания "назначений" адресам этих датчиков? Сами по себе датчики никакой маркировки о собственном номере не имеют, т.е. на глаз их отличить невозможно. И получается геморрой. А когда датчиков восемь - геморроев на 1 человека получается слишком много...

Нет, если вы делаете для себя, то вы, конечно, можете адреса этих датчиков и вручную прописать в программу, и красочкой их пометить... А если это "на сторону" устройство? А если датчик в процессе эксплуатации выйдет из строя и потребует замены? Вот зачем пользователю все эти проблемы с сопоставлением адреса датчика и функцией устройства? С моей точки зрения - оно ему не нужно.

Альтернатива - повесить на один порт один датчик, а портов задействовать столько, сколько надо. Минус, конечно, есть, и не маленький - расход пинов микроконтроллера. Зато плюсов существенно больше. 

Во-первых, нет гемора с адресацией: любой датчик используется в режиме SKIP_ROM, потому как он единственный на своей линии. Достаточно к линии порта, ответственной за температуру на улице, подключить уличный датчик, и "соответствие" автоматически обеспечено.

Во-вторых, считывать информацию с датчиков, подключенных к одному порту, можно одновременно, т.е. по сравнению с "последовательным опросом" многократно быстрее!

Идея проста, как колумбово яйцо (правое): управляя не отдельным битом порта, а сразу всеми битами, формируются тайм-слоты чтения (при записи тоже ничто не препятствует, но это менее интересно, т.к. одновременная запись в "обычную" цепочку 1-wire датчиков возможна и так), и считывание битов из 8 линий происходит одновременно. Т.е. вместо 72 битов из одного датчика мы получаем 8х72 бита из 8-и датчиков. Накопив в отдельный массив эти 72 байта за время опроса ОДНОГО датчика, мы затем можем пройтись по этому массиву и выделить информацию каждого из восьми... Ну понятно же, что в 0-ом бите всех байтов массива будут биты из датчика с линии 0, в 1-ом бите - из датчика с линии 1 и т.д.

Поскольку обработка массива может вестись на предельной частоте микроконтроллера, длиться она будет крайне незначительное время, не смотря на кажущуюся громоздкость. В частности, в своих играх я получаю информацию с 8-и параллельно подключенных к одному порту датчиков за 12 мс (примерно) - ощутите разницу! Ровно (на самом деле нет) в 8 раз быстрее, чем традиционным способом.

Так что если интересуетесь многодатчиковыми системами контроля температуры - рекомендую.

Комментарии

Популярные сообщения из этого блога

Приставка для счастья

К телевизору стремится, как известно, вся безумная больница. Как говорится, наплевав на режим. И поэтому очень важно, что этот самый телевизор показывает. Бермудский треугольник не способствует, однако... А вот интернет - тут наука точных данных не имеет. Поэтому приобрел я себе вот такую приставочку, чтобы подключиться напрямую во всемирную паутину, и, уж если пропадать, так не в треугольниках, а интернетах...

Чего-с изволите-с?

Тут в наших палатах что произошло! Вдруг стали санитары чаевые требовать! Дескать, колем вас, кормим и поим, иной раз даже утки за вами носим, и что ж, всё это без чаевых?! И задумался я остатками мозга: а что такое, эти самые чаевые? Почему вдруг ни с того, ни с сего, ОЗОН стал навязчиво предлагать дать чаевые в сотруднику ПВЗ?  В транспортную компанию зайдешь - там вывеска "Чаевые сотруднику можно перевести....". Теперь в ОЗОНе то же самое... Это я еще на прогулках редко бываю за нрав буйный, а то даже представить боюсь, где еще такое мог бы увидеть... В полиции, например... А чем, собственно, полицейские хуже работников ОЗОНа? Они что, ради себя стараются? Нет, ради нас, болезных... А за чаевые полицейскому можно и его на нары упрятать, и самому из палаты в камеру переехать... Почему так? Когда подаяние стало нормой, и, не побоюсь, обязанностью?! Чем чаевые отличаются от подаяния, спрашиваю я вас? Когда нищий на паперти пристаёт "дай!" - это не очень приятно, так...

Вежливость города берёт!

Каюсь, грешен: нервный стал, не могу сдерживаться... Особенно, когда всякие недобрые люди из Госуслуг, прокуратур, медицинских учреждений, пенсионных фондов и других таких же колл-центров звонят и пробуют меня раскрутить на ввод кода из СМС. Однако, лечение не зря принимаю, уже не сразу матом крою, а прежде интересуюсь, давно ли звонящий был послан на хер? Вот и сегодня, только что состоялся диалог: - Алло, меня зовут Алексей, я вам звоню по поводу плановой замены полиса медицинского страхования. Я культурно интересуюсь: - Алексей, а тебя сегодня уже на хер посылали? И что вы думаете?! Отвечает: - Еще нет. Давайте, вы будете первым? Нет, вы представляете?! Вот она, вежливость в дистиллированном виде! Это явный шаг вперед у работников ножа и топора... Культура прёт в массы... Ну, я, конечно, уважил, послал, но теперь просто сияю! Люди! Ничто не даётся нам так дёшево, и не ценится так дорого, как вежливость! P.S. В этой истории нет ни капли лжи.