Перейти к содержанию
    

Есть преобразователь RS232->RS485. Желание отказаться от использования линий RTS и CTS для выбора прием/передача привели к необходимости использовать МК, а именно AT89C4051. Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200.

Проблема состоит в необходимости определения этой скорости, ибо от этого зависит время удержания управляющего сигнала прием/передача.

Собственные размышления приводят к сложным конструкциям с мутным результатом :)

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перед началом передачи отправлять маркер (все 1) по которому можно выполнить настройку скорости передачи. Вот такое вот решение навскидку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть преобразователь RS232->RS485. Желание отказаться от использования линий RTS и CTS для выбора прием/передача привели к необходимости использовать МК, а именно AT89C4051. Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200.

Проблема состоит в необходимости определения этой скорости, ибо от этого зависит время удержания управляющего сигнала прием/передача.

Собственные размышления приводят к сложным конструкциям с мутным результатом :)

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

А возможно ли зарезервировать первый байт, так чтобы первый импульс был всегда 1 а за ним 0.

чтобы по его длине определить скорость. а принимать данные уже со второго байта и настроенной скорости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Кстати, забыл сказать, используется протокол ModBus.

 

А почему не использовать преобразователь USB<-->RS-485 и не париться?

 

Задача стоит именно модернизировать существующее устройство, а не создавать новое. Т.е. RS-232<->RS-485, с автоматическим определением направления и скорости передачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно - схемка с сайта rs485.com позволяет это делать без заглавных символов и на таймере 555.

lp24.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть преобразователь RS232->RS485. Желание отказаться от использования линий RTS и CTS для выбора прием/передача привели к необходимости использовать МК, а именно AT89C4051. Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200.

Проблема состоит в необходимости определения этой скорости, ибо от этого зависит время удержания управляющего сигнала прием/передача.

Собственные размышления приводят к сложным конструкциям с мутным результатом :)

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Вообще-то, логика выбора не совсем ясна. Я без проблем использую AVR. Там в UART имеется специальный флажок завершения передачи, фиксирующий момент выдачи последнего бита из UART, когда сдвиговый регистр передатчика опустошается. После передачи последнего байта в пакете нужно просто подождать установки этого флажка и смело переключать драйвер RS-485 на прием. Этот флажок может формировать запрос на прерывание, чем я, собственно и пользуюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть преобразователь RS232->RS485. Желание отказаться от использования линий RTS и CTS для выбора прием/передача привели к необходимости использовать МК, а именно AT89C4051. Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200.

Проблема состоит в необходимости определения этой скорости, ибо от этого зависит время удержания управляющего сигнала прием/передача.

Собственные размышления приводят к сложным конструкциям с мутным результатом :)

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Вообще-то, логика выбора не совсем ясна. Я без проблем использую AVR. Там в UART имеется специальный флажок завершения передачи, фиксирующий момент выдачи последнего бита из UART, когда сдвиговый регистр передатчика опустошается. После передачи последнего байта в пакете нужно просто подождать установки этого флажка и смело переключать драйвер RS-485 на прием. Этот флажок может формировать запрос на прерывание, чем я, собственно и пользуюсь.

 

Применение AVR не является возможным. Использование UART, видимо, было бы лучшим вариантом, но увы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200...

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Сталкивались.

В данном случае джампера помогут :-)

Или использовать программно считываемые перемычки регилия не позволяет?

Или скорость меняется в динамике?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перед началом передачи отправлять маркер (все 1) по которому можно выполнить настройку скорости передачи. Вот такое вот решение навскидку.

а дальше что? ну высветил я старт бит

таймером померил длительность...

и прикинул после этого бодрейт?

или не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200...

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Сталкивались.

В данном случае джампера помогут :-)

Или использовать программно считываемые перемычки регилия не позволяет?

Или скорость меняется в динамике?

 

джампера - это уже не совсем автоматически получается :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Все бы ничего, но вот скорости передачи могут быть из числа: 9600, 38400, 115200...

Может кто сталкивался с подобным или просто есть мысли, буду рад помощи.

Сталкивались.

В данном случае джампера помогут :-)

Или использовать программно считываемые перемычки регилия не позволяет?

Или скорость меняется в динамике?

 

джампера - это уже не совсем автоматически получается :)

В одной сетке скорости обычно уже определены и необходимости автоматического определения baud rate нет. Исключение составляет какой-нибудь хитрож@пый мастер, который конвертором протоколов работает. Но поскольку у вас протокол один - modbus и ряд скоростей известен заренее я считаю, что городить конвертор интерфейсов с автоподстройкой baud rate это, извините, пижонство и ухудшение надежности работы сети. А если уж вы хотите сделать нормальный конвертор RS232<->RS485, то нужно чтобы он выполнял как минимум две функции.

1. задержка выдачи битового потока в линию RS485 на определенный интервал времени (для RTU >=3,5 символа) после переключения приемопередатчика RS485 на передачу

2. задержка переключения приемопередатчика RS485 на прием после передачи в линию (учитывая буфер битового потока) последнего символа (для RTU >=3,5 символа)

Из этих двух функций вытекает еще и наличие буфера для битового потока, который нужно контролировать с двух сторон - на входе конвертора (RS-232) и на выходе (RS485).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Кстати, забыл сказать, используется протокол ModBus.

 

А почему не использовать преобразователь USB<-->RS-485 и не париться?

 

Задача стоит именно модернизировать существующее устройство, а не создавать новое. Т.е. RS-232<->RS-485, с автоматическим определением направления и скорости передачи.

 

Задача "автобод" реализована во всех модемах и обсуждалась неоднократно в том числе на данном форуме. Я реализовывал, и по моим подсчётам необходимо примерно 7 мипсов для скорости 115к. Для получения достоверной информации. (т.е. рекомендую поставить 2313 для данной цели) Сам протокол MODBUS явно предназначен для rs485, так как в начале посылки указывает свою длину, что позволяет при перехвате посылки высчитать время для переключения. Существуют также различные схемы для автоматического перехода по таймеру. (Типа если не пришла "1" хх мс, то переключить.)

А вот ещё идея на вскидку. Можно сделать задержку. (Для этого вовсе не требуется вообще распознавать данные. Что пришло, - то ушло) Т.е. принимать все данные и передавать их с задержкой. Если за время задержки данные не пришли, то можно на передающей переключить.

Ещё один момент. Применение сигнала RTS для данной цели, по моему, фактически стандарт. Чем Вас данное решение не устраивает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще, можно и без микроконтроллера, если допускается достаточно большой таймаут на линии: RC-цепочка с Rout 232-го + триггер Шмитта выходом на DE приемопередатчика 485. Запускается от старт-бита. Сам не пробовал, но видел тех кто видел тех кто пробовал :) Видимо пост. времени надо выбирать в 1.5 - 2 раза больше длительности передачи байта на самой низкой скорости.

Если все же с МК, то вот http://focus.ti.com/lit/an/slaa215/slaa215.pdf. Рекомендую, может поможет чем-нибудь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Применение сигнала RTS для данной цели, по моему, фактически стандарт. Чем Вас данное решение не устраивает?

 

Наверное тем, что есть косяки в управлении RTS под Виндами. Было бы правильнее разобраться с программой, чем городить лишнюю аппаратуру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...