Есть ли примеры согласования МК по RS-485, где в шине более двух устройств?
Есть ли примеры согласования МК по RS-485, где в шине более двух устройств?
Хочу посмотреть как нормальные люди организовывают прием и отправку данных по RS-485, где в шине более двух устройств (хотя бы два).
Хотелось бы сделать без ведомого, просто одно устройство посылает сообщение, а два других его слушают, если один из двух понял что эт сообщение ему то он его принимает и обрабатывает, после чего отсылает ответ. Предполагается использовать двух проводную (одна пара) схему, и отсутствие ведущего.
Помогите пожалуйста гугл поиск не помог.
Уточнение: сама по себе RS-485 -последовательная шина. А хотелось бы ее заюзать как параллельную!
Схемотехнические вопросы интересны лишь в вопросе одной двух пар, и большой длины проводов. (советы по разводке, нагрузке, емкости и прочие могу найти и сам).
Вобщем то я бы заюзал i2c (у меня не более 15 метров), но вот необходимость опрашивать с ведомого все приемники (в моем случае 20) это уже жесть. Жесть потому что на передау даных будет завеено прерывание, и тогда мои приемники будут 50% времени парсить линию, или же тогда ведомый долго не будет знать что там твориться у ведомого.
Да что РС что И2С хороши для того чего они созданы, но мне нужна именно локальная сеть равноправная (звезда) когда при изменении на одном устройстве, оно само вышло в эфир и сообщило об изменении.
Я уже подумаю о двух проводном ЮАРТ, взять его и запаралелить, в случае необходимости, устройство, почитало линию, и если идет чья то передача даных, то подождало рандомное время, если не ведется передача, то послала в эфир необщодимый восьми битный байт, а все остальные его получили и пропарсили и исходя из этой команды приняли или не приняли действия.
Насколько помню в стандарте RS-485 три линии: A, B и 0 (плюс в особо запущенных случаях экран). А то убежит потенциал линий А и В далеко за пределы питания, приемник в насыщение уйдет и будет некорректно работать, а как максимум из строя может выйти. Хотя конечно это все зависит от электромагнитной обстановки и длины линии.
Непонятно какое интересует согласование.
Если физическое, то между А и B необходимо в самых дальних точках линии поставить терминальные резисторы 100 Ом 0,25 Вт.
Плюс необходимо обеспечить начальное смещение линий, притянув B через резистор к питанию, а А через резисторы к нулю в каком-то одном месте линии. Линия по умолчанию должна находиться в состоянии, когда Ub > Ua.
Что касается логического согласования, про взаимодействие без ведомого. То стандарт rs485 это не определяет, но можно делать обычное разрешение коллизий. Шлешь посылку и сам читаешь. Если пришло, то что отправлял, значит в этот момент никто ничего не передавал и посылка ушла успешно. Если принятое отличается, от переданного, значит коллизия (два передатчика одновременно передавали). Ждешь случайное время меньше T и повторяешь передачу. Т - настраивается, зависит от активности взаимодействия и количества абонентов.
Если абоненты питаются разными источниками, находятся далеко друг от друга нужен третий провод.
При тестирования на столе можно и двумя обойтись.
Абсолютное значение потенциалов А и В не может далеко уходить от нуля. Там далеко не тысячи вольт, а что-то типа 10...15 В. Опять же это по стандарту. Возможно производители что-то там и делают свое, расширяют границы возможностей своих компонентов. Я бы лично не стал на них полагаться, если вдруг когда-нибудь нужно будет сменить приемопередатчик на приемопередатчик другого производителя или появятся новые дальние абоненты.
У вас применение какое? как далеко абоненты? в разных зданиях? в разных крыльях самолета? На соседних столах?
Что вокруг? Машиностроительный цех? Две комнаты и кухня? Палаточный городок на Грушинском фестивале?
Насколько ответственное применение? Кардиостимулятор? Или передача температуры за бортом с балкона к компьютеру?
Юмор, конечно, но в каждой шутке есть промежутки...
Дмитрий Макаров: я сомневаюсь что за ответственными решениями стоило бы писать на тостер =) общ протяженность линии 15-20 метров, малая частота событий, 8-ми битные события
В общем, можно сделать правильно по стандарту. А можно бюджетненько не по стандарту, используя приемопередатчики, которые разрабатывались для работы по стандарту.
В первом случае: будет работать, во втором случае: скорее всего будет работать. Если работать не будет, то как минимум понятно куда копать...
в общем, я решил заюзать юарт. на моих МК 2-4 ЮАРТА есть, никто мне не мешает 2 из них заюзать, смысл будет простой, приняли команду, если команды нет в списке то передали эту же команду далее.
эм....в uart`е уже два контакта TX и RX. Вполне можно одновременно и отправлять, и принимать на одном и том же uart`e.
Надо только помнить, что обычно в приемопередатчиках rs485 нужно на время передачи включать передатчик (Driver). То есть всего для работы с обычным приемопередатчиком rs485 нужно uart (TX и RX) и GPIO для управления DE (Driver Enable). Все время включенные передатчики включенными на одну линию нельзя держать: конфликтовать будут.
Правда есть приемопередатчики (как минимум один) с автоматическим управлением драйвером, в них хватит одного uart`а.
Все время держать включенными приемники можно.
Дмитрий Макаров: спасибо уже смотрел... Решил просто заюзать цепочку. последоательно с контролера на котролер передавть команду, убивать трансляцию на получателе.
Начнем с того, что RS-485 представляет собой только требования к физическому уровню. На уровне побайтовой передачи это чаще всего UART.
Далее, мне кажется, что вы запутались в понятиях ведущего-ведомого и последовательной-параллельной шины. RS-485 - последовательная шина, но ничто не запрещает использовать топологию "звезда", которая, как я понял, вам нужна. Если одно устройство передает, а остальные принимают - то оно и есть ведущий, а остальные - ведомые.
Я делал похожую систему, работающую через RS-485. Так вот я взял конвертеры уровней RS-485 и подключил их к UART'у. Протокол был самописный, пакетный, с одним ведущим и кучей (по требованиям до 200+) ведомых. В таком варианте все работает. Еще раз, RS-485 не тождественен Profibus, Modbus и прочим протоколам - они работают поверх него.
Да вы правы я запутался, реализовал с по четырех проводной системе. общий ноль две даты, и один "передаю" Кодом проверяю, идет ли передача данных, и проверяю есть ли потенциал на "Передача", если все тихо то даю бит на передаю, что вызывает прерывание на остальных ведомых, и они начинают слушать первые четыре восемь бит данных адреса, если это не он не подходит, то продолжает выполнять код. Если подходит, слушает команду и ее параметр. если команда, требует ответа, то в конце передачи, после подтверждения приема, отправляет команду и параметр по дата не дергая "Передаю". В конце оба устройства переходят в рабочий режим, У всех устройств при появлении бита на линии СЛУШАЮ, по прерыванию вызывается обработчик слушающий адрес, который при необходимости вызывает обработчик поступающих данных, и тд. Единственное, возник вопрос, какой драйвер готовый выбрать? (да и кстати, можно при условии питания по одной шине остаться на двух проводах.)
Сергей Кордубин: Честно сказать, я ничего не понял. Вы что ли сами битовую передачу реализовали? Так для этого можно было использовать стандартый аппаратный блок UART. Просто все устройства принимают пакет, потом анализируют адрес, и то, у которого адрес совпал, выполняет команду.
LampTester: стандартный мне показался что не подходит, так как там нужен какой нибудь драйвер апаратный чтобы можно было в звезду все подключить. А с моей реализацией, исключены колизии, апаратный драйвер, это всего лишь два операционника и четыре опто пары.
Сергей Кордубин: Аппаратный драйвер нужен в любом случае. Но, я так понял, вы самостоятельно сделали и его, вместо того, чтобы поставить одну готовую микросхему.
Вообще, обычно подобное делается так: берется контроллер, в котором есть USART, и к нему берется полудуплексный драйвер типа ST3485. В обычном режиме устройство постоянно слушает линию. Если линия свободна (например, в контроллерах STM8L в этом случае блок USART взводит флаг line idle) и надо что-то передать - передает. Если принят байт - сравнивает его со своим адресом. Если адрес совпал - обрабатывает, если не совпал - отбрасывает и слушает линию дальше. Опять же, в STM8 сравнение адреса может происходить аппаратно. Самописной обработки - минимум, внешних компонентов - минимум.
Боюсь без контроллера шина на RS-485 не получиться. Для общей шины надо использовать трансформатор как в Ethernet, специальные микросхемы драйверов как у CAN или открытый коллектор - тогда физических конфликтов на шине не будет и ни чего не сгорит. Но надо иметь механизм обработки коллизий - когда несколько устройств хочет выйти на шину одновременно.
Согласование требуется на концах линий - два терминатора (резистора) по 120 Ом. Все устройства должны быть подключены последовательно, а не звездой.