Долго искал в Интернете схему, связи компьютера с микроконтроллёром, работающую в двунаправленном режиме по интерфейсу RS485.
Ссылок много, но на них крутятся 3 – 4 одинаковые схемы, по тем или иным причинам меня не устраивающие.
Тимофей Носов, на форуме предложил схему со своего сайта. Может быть она и достойная, но, в ней применяются редко появляющиеся в продаже оптопары.
Долго искал в Интернете схему, связи компьютера с микроконтроллёром, работающую в двунаправленном режиме по интерфейсу RS485.
Ссылок много, но на них крутятся 3 – 4 одинаковые схемы, по тем или иным причинам меня не устраивающие.
Тимофей Носов, на форуме предложил схему со своего сайта. Может быть она и достойная, но, в ней применяются редко появляющиеся в продаже оптопары.
Я зашёл в «ЧИП и ДИП», там сказали, что одна оптопара была в наличии 3 года назад, а другой, вообще никогда не было.
Поэтому пришёл к выводу, что надо придумать, что-то своё.
Немного теории, и информации о применяемых микросхемах.
рисунок MAX232 взят с сайта prog-leon.narod.ru,
описание интерфейса RS485 взято с сайта mayak-bit.narod.ru
Микросхема MAX232, представляет собой четырёх канальный преобразователь уровня RS232 TTЛ.
Два канала, преобразуют ТТЛ-уровни в RS232-уровни, и два канала, преобразуют RS232 в ТТЛ.
Сеть, построенная на интерфейсе RS-485, представляет собой приемопередатчики, соединенные при помощи витой пары — двух скрученных проводов.
В основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных.
Суть его заключается в передаче одного сигнала по двум проводам.
Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) — его инверсная копия.
Другими словами, если на одном проводе "1", то на другом "0" и наоборот.
Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при "1" она положительна, при "0" — отрицательна.
Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе.
Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал.
Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего ("земли").
Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель — дополнительный источник искажений.
А при дифференциальной передаче искажения не происходит.
В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова.
Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.
RS-485 — полудуплексный интерфейс.
Прием и передача идут по одной паре проводов с разделением по времени.
В сети может быть много передатчиков, так как они, могут отключаться в режиме приема.
Микросхема MAX485
Номера и обозначения выводов
(1) — RO ( receiver output) — цифровой выход приемника;
(2) — RE (receiver enable) — разрешение работы приемника;
(3) — DE (driver enable) — разрешение работы передатчика;
(4) — DI (driver input) — цифровой вход передатчика;
(5) – GND
(6) — A — прямой дифференциальный вход/выход;
(7) — B — инверсный дифференциальный вход/выход;
(8) — + питания
D (driver) – передатчик, R (receiver) – приемник.
Переключение микросхемы на приём и передачу, осуществляется подачей на выводы
RE и DE уровней и 1 , следующим образом:
RE = 1 – приём запрещён
RE = – приём разрешён
DE = 1 – передача разрешена
DE = – передача запрещена.
Если соединить выводы RE и DE между собой, то управление состоянием "приём/передача”, осуществляется следующим образом:
Компьютер передаёт данные микроконтроллёру во много раз медленнее чем, микроконтроллёр компьютеру.
В моём случае, длительность передаваемых байтов данных и пауз между ними, при передаче КОМП — > PIC ,была в четыре раза больше, чем при передаче PIC — > КОМП.
Суть в следующем.
Компьютер, каждые две секунды, отсылает одному из нескольких PIC–ов (каждый имеет свой индификационный номер) пачку из пяти байт.
В ответ, PIC должен выдать программе пять байт информации.
Смотрю осциллографом – PIC данные принимает и передаёт.
А программа на компьютере пишет – НЕТ СВЯЗИ.
Для отлаживания процедуры приёма-передачи установил на компьютер программу COM Port Toolkit.
С её помощью я передавал с компьютера PIC–у те же самые пять байт запроса. Но в ответ от PIC-a компьютеру приходило только три байта.
Два байта, где-то терялись.
Поэтому и НЕТ СВЯЗИ.
Переключение с приёма на передачу и обратно, со стороны PIC-a, производится отдельно выделенным для этого портом RC4 .
После передачи всех байтов информации PIC, на своей стороне меняет уровень на RC4 , тем самым, переводя микросхему МАX485 на приём.
Оказалось, что два байта терялись из-за преждевременного переключения МАX485 на приём.
Дело в том, что модуль USART в микроконтроллере реализован аппаратно и работает сам по себе независимо от выполнения основной программы. Программа лишь управляет работой этого модуля.
Запись данных в регистр TXREG не означает, что эти данные мгновенно будут переданы. По даташиту поднятие флага TXIF означает лишь то, что данные считались из регистра TXREG и записались в сдвиговый регистр TSR для передачи и TXREG пуст. Это значит, что программно (с помощью плавающей задержки опроса флага TXIF ) отследить завершение передачи последнего байта не представляется возможным.
Если, сразу после записи очередного байта в регистр TXREG , перевести MAX485 на приём то ни этот байт, ни предшествующий ему (находящийся в это время в сдвиговом регистре TSR не будут переданы. Модулем USART они естественно выпихнутся на передачу, но приёмо-передатчик то ведь уже переключен на приём.
После ввода программной задержки, между записью последнего байта в TXREG , и сменой уровня на RC4, всё пришло в норму.
Со стороны компьютера, переключение с приёма на передачу и обратно, производится с помощью транзистора, включённого в цепь передачи данных преобразованных в ТТЛ-уровни.
Данные есть – сигнал на передачу. Данных нет – сигнал на приём.
Так как компьютер затягивает длительность посылок и пауз, то МАХ485 успевает, во время переключится.
Конденсатор С1, сглаживает импульсы на базе транзистора, тем самым надёжно открывая его. Без него, связь неустойчивая.
Схема, работает и без рекомендуемого, третьего общего провода.
Но на большие расстояния, всё же нужно его использовать, и установить на концах витой пары защитные стабилитроны.
В случае, необходимости согласования сопротивления витой пары с входом/выходом МАХ485, предусмотрены перемычки.
С их помощью, можно подключить параллельно витой паре согласующие резисторы сопротивлением 120 Ом.
Долго искал в Интернете схему, связи компьютера с микроконтроллёром, работающую в двунаправленном режиме по интерфейсу RS485.
Ссылок много, но на них крутятся 3 – 4 одинаковые схемы, по тем или иным причинам меня не устраивающие.
Тимофей Носов, на форуме предложил схему со своего сайта. Может быть она и достойная, но, в ней применяются редко появляющиеся в продаже оптопары.
Долго искал в Интернете схему, связи компьютера с микроконтроллёром, работающую в двунаправленном режиме по интерфейсу RS485.
Ссылок много, но на них крутятся 3 – 4 одинаковые схемы, по тем или иным причинам меня не устраивающие.
Тимофей Носов, на форуме предложил схему со своего сайта. Может быть она и достойная, но, в ней применяются редко появляющиеся в продаже оптопары.
Я зашёл в «ЧИП и ДИП», там сказали, что одна оптопара была в наличии 3 года назад, а другой, вообще никогда не было.
Поэтому пришёл к выводу, что надо придумать, что-то своё.
Немного теории, и информации о применяемых микросхемах.
рисунок MAX232 взят с сайта prog-leon.narod.ru,
описание интерфейса RS485 взято с сайта mayak-bit.narod.ru
Микросхема MAX232, представляет собой четырёх канальный преобразователь уровня RS232 TTЛ.
Два канала, преобразуют ТТЛ-уровни в RS232-уровни, и два канала, преобразуют RS232 в ТТЛ.
Сеть, построенная на интерфейсе RS-485, представляет собой приемопередатчики, соединенные при помощи витой пары — двух скрученных проводов.
В основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных.
Суть его заключается в передаче одного сигнала по двум проводам.
Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) — его инверсная копия.
Другими словами, если на одном проводе "1", то на другом "0" и наоборот.
Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при "1" она положительна, при "0" — отрицательна.
Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе.
Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал.
Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего ("земли").
Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель — дополнительный источник искажений.
А при дифференциальной передаче искажения не происходит.
В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова.
Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.
RS-485 — полудуплексный интерфейс.
Прием и передача идут по одной паре проводов с разделением по времени.
В сети может быть много передатчиков, так как они, могут отключаться в режиме приема.
Микросхема MAX485
Номера и обозначения выводов
(1) — RO ( receiver output) — цифровой выход приемника;
(2) — RE (receiver enable) — разрешение работы приемника;
(3) — DE (driver enable) — разрешение работы передатчика;
(4) — DI (driver input) — цифровой вход передатчика;
(5) – GND
(6) — A — прямой дифференциальный вход/выход;
(7) — B — инверсный дифференциальный вход/выход;
(8) — + питания
D (driver) – передатчик, R (receiver) – приемник.
Переключение микросхемы на приём и передачу, осуществляется подачей на выводы
RE и DE уровней и 1 , следующим образом:
RE = 1 – приём запрещён
RE = – приём разрешён
DE = 1 – передача разрешена
DE = – передача запрещена.
Если соединить выводы RE и DE между собой, то управление состоянием "приём/передача”, осуществляется следующим образом:
Компьютер передаёт данные микроконтроллёру во много раз медленнее чем, микроконтроллёр компьютеру.
В моём случае, длительность передаваемых байтов данных и пауз между ними, при передаче КОМП — > PIC ,была в четыре раза больше, чем при передаче PIC — > КОМП.
Суть в следующем.
Компьютер, каждые две секунды, отсылает одному из нескольких PIC–ов (каждый имеет свой индификационный номер) пачку из пяти байт.
В ответ, PIC должен выдать программе пять байт информации.
Смотрю осциллографом – PIC данные принимает и передаёт.
А программа на компьютере пишет – НЕТ СВЯЗИ.
Для отлаживания процедуры приёма-передачи установил на компьютер программу COM Port Toolkit.
С её помощью я передавал с компьютера PIC–у те же самые пять байт запроса. Но в ответ от PIC-a компьютеру приходило только три байта.
Два байта, где-то терялись.
Поэтому и НЕТ СВЯЗИ.
Переключение с приёма на передачу и обратно, со стороны PIC-a, производится отдельно выделенным для этого портом RC4 .
После передачи всех байтов информации PIC, на своей стороне меняет уровень на RC4 , тем самым, переводя микросхему МАX485 на приём.
Оказалось, что два байта терялись из-за преждевременного переключения МАX485 на приём.
Дело в том, что модуль USART в микроконтроллере реализован аппаратно и работает сам по себе независимо от выполнения основной программы. Программа лишь управляет работой этого модуля.
Запись данных в регистр TXREG не означает, что эти данные мгновенно будут переданы. По даташиту поднятие флага TXIF означает лишь то, что данные считались из регистра TXREG и записались в сдвиговый регистр TSR для передачи и TXREG пуст. Это значит, что программно (с помощью плавающей задержки опроса флага TXIF ) отследить завершение передачи последнего байта не представляется возможным.
Если, сразу после записи очередного байта в регистр TXREG , перевести MAX485 на приём то ни этот байт, ни предшествующий ему (находящийся в это время в сдвиговом регистре TSR не будут переданы. Модулем USART они естественно выпихнутся на передачу, но приёмо-передатчик то ведь уже переключен на приём.
После ввода программной задержки, между записью последнего байта в TXREG , и сменой уровня на RC4, всё пришло в норму.
Со стороны компьютера, переключение с приёма на передачу и обратно, производится с помощью транзистора, включённого в цепь передачи данных преобразованных в ТТЛ-уровни.
Данные есть – сигнал на передачу. Данных нет – сигнал на приём.
Так как компьютер затягивает длительность посылок и пауз, то МАХ485 успевает, во время переключится.
Конденсатор С1, сглаживает импульсы на базе транзистора, тем самым надёжно открывая его. Без него, связь неустойчивая.
Схема, работает и без рекомендуемого, третьего общего провода.
Но на большие расстояния, всё же нужно его использовать, и установить на концах витой пары защитные стабилитроны.
В случае, необходимости согласования сопротивления витой пары с входом/выходом МАХ485, предусмотрены перемычки.
С их помощью, можно подключить параллельно витой паре согласующие резисторы сопротивлением 120 Ом.
Однажды мне понадобилось связать между собой больше двух контроллеров, да еще и сделать это на довольно приличном расстоянии. В процессе гугления выбор пал на протокол ModBus в реализации поверх интерфейса RS485. Описания ModBus-а встречаются повсеместно, и в данной статье не рассматриваются. Остановимся более подробно на интерфейсе RS485.
Для передачи данных между устройствами чаще всего используется витая пара. По одной паре данные идут в обе стороны, но не одновременно, а по очереди. Все устройства, с которыми необходимо общаться, «садятся» на линию параллельно. Интерфейс использует дифференциальные входы-выходы. Вот основные положения…
Что нам может дать использование этого интерфейса? Из плюсов:
— Возможность передачи на большие расстояния;
— Среда передачи получается достаточно помехозащищенная;
— Простота добавления устройств к уже имеющимся линиям;
— Передача на высокой скорости…
Из минусов — нужно продумать политику арбитража. Продумать протокол так, чтобы либо не возникало ситуаций, когда передать данные пытаются одновременно два устройства, либо пути выхода из подобных ситуаций. Я пошел по первому, более простому пути. Выбрал вариант общения контроллеров Single Master (один контроллер является мастером и либо отправляет информацию любому другому, либо запрашивает от устройства передачу информации)
Классическая схема подключения контроллера к сети RS485 выглядит так:
Здесь используется микросхема MAX485 (ad485, st485 или аналогичные). Нога 1 — принятые данные, нога 4 — данные для передачи в линию, а 2 и 3 (на рисунке объединены) для включения приемника или передатчика. При объединении изменением уровня мы меняем направление передачи данных (к нам — от нас). Намеренно не пишу о том, какой из уровней включает приемник, а какой передатчик ибо здесь я сам поймал грабли лбом.
На представленной картинке все правильно нарисовано — здесь приемник включается низким уровнем сигнала, а передатчик — высоким. Я же как-то не обратил на это внимание и решил «улучшить» схему таким образом:
Косяк был обнаружен уже после разводки платы и сборки устройства: в дежурном режиме на выходе TxD постоянно «дежурит» логический «1», а в процессе передачи данных появляются «нули». Таким образом у меня все время выключен приемник и включен передатчик.
Мною было придумана два варианта выхода из этой ситуации:
1. Программный. Вместо аппаратного последовательного порта использовать программный, в котором все данные были бы инвертированы на выходе. Плюс — очевиден: не нужно заново изготавливать платы (а их у меня было целых пять).
2. Аппаратный. Поставить инвертор между выходом контроллера и входом преобразователя. Плюсы — тоже очевидны: не нужно писать свои кривые эмуляции последовательного порта.
Был еще и третий вариант — вернуться к изначальной, «не оптимизированной» схеме — но он повлек бы сразу и изменения в плате и изменения в программе — потому был сразу отброшен. Сам трудности создал — сам и преодолевать буду.
Забегу вперед — ничего я не переписывал и платы новые не разводил. Правду говорят — лень двигатель прогресса. Инвертор на одном транзисторе я собрал, ну так, в плане эксперимента, прям на разрезанной дорожке.
Получилось страшно, но оно заработало!
Дабы сохранить колорит доделки из smd транзистора и двух выводных сопротивлений, схема нарисована в паинте.
В живую смотрелось так-же неаккуратно и страшно, но после трех слоев лака…
В общем я и по настоящее время таким-же образом экономлю одну ногу микроконтроллера, правда схема претерпела несколько изменений и посадочные площадки я стал разводить заранее.
Это часть схемы. Был добавлен резистор, который удержит транзистор в открытом состоянии, в случае отсутствия управления с ноги контроллера. (Если контроллер вынуть из панельки — это не помешает общению остальных устройств).
И кстати, та, самая первая система, вот уже скоро пойдет третий год, как работает.