реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Три RS-485 на LPC-1768, Может есть примеры?
Velund
сообщение Nov 6 2013, 21:23
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



Встала задача - реализовать три интерфейса RS-485 на плате расширения к изделию сделанному на LPC1768. Пины всех трех UART (кроме того самого единственного UART1 который аппаратно держит RS-485) и несколько свободных GPIO выведены на разъем расширения. Скорости - скорее всего выше 19200 не будет но хотелось бы потенциально держать до 115200.

Встает целый ряд вопросов с тем, какие "пируэты" придется делать вокруг FIFO этих портов чтобы корректно переключать прием/передачу.
Первая идея была оставить loopback и обрабатывая прерывания приемника от эха определять завершение передачи. Но в чистом виде это не годится - один сбой из за помехи на шине и все "завязывается в узел". Так что видимо придется еще и периодическим таймером поллить состояние передатчиков и "помогать" обработчику прерываний.

Наверняка кто то подобным уже занимался и есть какие то минимально проверенные решения в инете. Может кто нибудь подсказать на что стоит обратить внимание?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 7 2013, 03:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



По-моему вы выдумываете проблемы на ровном месте...
Никаких проблем для RS-485 со всеми UART-и в LPC нет. Единственное неудобство, как вы уже заметили - это необходимость обнаруживать появление бита 6 в LSR после опустошения FIFO.
Кроме как поллингом я думаю это вряд-ли как-то удобно сделать. Ну и что? Ну будет маленькая задержка на переключение, но на той стороне корректно написанное ПО для работы с RS-485
всегда должно вставлять задержку при переключении RX->TX.
У меня в проектах RS-485 работают до 230400 (выше - преобразователь RS-485-RS232 не держит) и никогда не использую функции RS485 UART1.
Какая у вас тактовая частота и загрузка CPU?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 7 2013, 13:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Я лет эдак 10 назад делал расширитель - с 1 RS232 или RS485 на 8 портов RS485. На 115200 работало
Непонятна необходимость в 3х интерфейсах 485, ведь это моноканал фактически, или таковы тех условия? Сами устройства могут жить на виртуально одной паре? если да, то этот хаб - самое оно
вот что-то типа такого
http://www.rs485.com/pdffiles/multiplerepe.../MHUBX8RevE.pdf
http://www.rs485.com/pmhubx8.html
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 7 2013, 15:10
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



QUOTE (jcxz @ Nov 7 2013, 07:04) *
По-моему вы выдумываете проблемы на ровном месте...
Никаких проблем для RS-485 со всеми UART-и в LPC нет. Единственное неудобство, как вы уже заметили - это необходимость обнаруживать появление бита 6 в LSR после опустошения FIFO.


Так поэтому и был вопрос насчет совета по выбору минимально проверенной в работе реализации из того развала что гуглится. wink.gif Как обычно, неохота заниматься изобретением велосипеда.

QUOTE
Кроме как поллингом я думаю это вряд-ли как-то удобно сделать. Ну и что? Ну будет маленькая задержка на переключение, но на той стороне корректно написанное ПО для работы с RS-485 всегда должно вставлять задержку при переключении RX->TX.


Есть сомнения в "корректности" ПО на другой стороне. По части устройств (датчиков) с которыми придется работать уже и производителя нет физически, даже жаловаться некому, если что.

QUOTE
Какая у вас тактовая частота и загрузка CPU?


80 MHz, загрузка невысокая в среднем, но периодически более приоритетная задача в RTOS блокирует процессор на 20-50 мсек полностью (прерывания при этом большую часть времени разрешены, но ими нельзя злоупотреблять особо).

QUOTE (toweroff @ Nov 7 2013, 17:20)
Непонятна необходимость в 3х интерфейсах 485, ведь это моноканал фактически, или таковы тех условия? Сами устройства могут жить на виртуально одной паре?


Нет, не могут. Адская смесь старья с несовместимыми протоколами и с несовпадающими скоростями, которые не получится поменять.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 7 2013, 15:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Velund @ Nov 7 2013, 19:10) *
Нет, не могут. Адская смесь старья с несовместимыми протоколами и с несовпадающими скоростями, которые не получится поменять.

посмотрите схемотехнику этого хаба
спокойно до 230кбод можно сделать для простого UART без всяких пинодрыгов (ну, если LPC мастер, конечно)
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 7 2013, 15:50
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



QUOTE (toweroff @ Nov 7 2013, 19:23) *
посмотрите схемотехнику этого хаба
спокойно до 230кбод можно сделать для простого UART без всяких пинодрыгов (ну, если LPC мастер, конечно)


LPC не везде мастер, в том то и дело. По одному из типов датчиков он должен только "прослушивать" обмен фирменной панели индикации с датчиками, и подхватывать данные, которые идут по запросу панели. И на запросы по некоторым адресам "подсовывать" данные с датчиков другого типа, имитируя совместимые с панелью.

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

Так что вариантов не морочиться с разработкой и использовать коммерчески доступное оборудование похоже нет. А хотелось... wink.gif Изделие по сути даже не мелкосерийное а "несколькоштучное". wink.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 7 2013, 16:05
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Velund @ Nov 7 2013, 19:50) *
LPC не везде мастер, в том то и дело. По одному из типов датчиков он должен только "прослушивать" обмен фирменной панели индикации с датчиками, и подхватывать данные, которые идут по запросу панели. И на запросы по некоторым адресам "подсовывать" данные с датчиков другого типа, имитируя совместимые с панелью.

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

Так что вариантов не морочиться с разработкой и использовать коммерчески доступное оборудование похоже нет. А хотелось... wink.gif Изделие по сути даже не мелкосерийное а "несколькоштучное". wink.gif

не увидел препятствий
ну так сделайте ту линию "мастером"
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 7 2013, 21:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А может взять преобразователи RS485 в RS232, а то и UART сразу, те что сами умеют переключать прием - передачу автоматом. С вашей стороны они все будут нормальными 2 направленными интерфейсами, а вопрос направления решат буферы внутри устройств. Вам же на некоторые задержки в передаче - пофиг, как я понимаю...

хотя я думаю легче отключить FIFO на приемнике - передатчике и пусть АРМ все он-лайн разрулит, или он еще что-то делать будет?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 7 2013, 21:46
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Golikov A. @ Nov 8 2013, 01:33) *
А может взять преобразователи RS485 в RS232, а то и UART сразу, те что сами умеют переключать прием - передачу автоматом. С вашей стороны они все будут нормальными 2 направленными интерфейсами, а вопрос направления решат буферы внутри устройств. Вам же на некоторые задержки в передаче - пофиг, как я понимаю...

там с передачей все нормально емкость разруливает в этом хабе, от контроллера - только RX/TX
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 7 2013, 23:51
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



QUOTE (toweroff @ Nov 7 2013, 20:05) *
не увидел препятствий
ну так сделайте ту линию "мастером"


Hm... Мастером чего?

Три шины, с разными протоколами...

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

Плюс третья шина на которой еще один зоопарк в MODBUS RTU.

И все это должно окучиваться и передаваться оператору на комп по Ethernet (дальше не моя епархия).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 8 2013, 02:31
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Nov 8 2013, 03:33) *
хотя я думаю легче отключить FIFO на приемнике - передатчике и пусть АРМ все он-лайн разрулит, или он еще что-то делать будет?

Причём тут FIFO? Чем FIFO мешает? К тому же автор написал, что есть интервалы с высокой загрузкой прикладной задачей, в которые нежелательно много дрыгаться (к тому же под ОС).
Проблема у автора не в FIFO, а в том, что в LPC нет прерывания по установке бита 6 LSR (завершении передачи последнего бита). Это существенный недостаток UART-ов 16550.
Сам постоянно плююсь от этого.

Цитата(Velund @ Nov 7 2013, 21:10) *
Есть сомнения в "корректности" ПО на другой стороне. По части устройств (датчиков) с которыми придется работать уже и производителя нет физически, даже жаловаться некому, если что.
80 MHz, загрузка невысокая в среднем, но периодически более приоритетная задача в RTOS блокирует процессор на 20-50 мсек полностью (прерывания при этом большую часть времени разрешены, но ими нельзя злоупотреблять особо).

Вижу 2 варианта:
1. Классически: по получению прерывания опустошения буфера (одного из UART), разрешаем прерывания таймера и в нём мониторим биты TEMT LSR. Если вы не уверены в корректности ПО на той стороне и в необходимых задержках
RX->TX на той стороне, придётся конечно увеличить частоту этого прерывания до максимума (хоть до максимальной бодовой скорости) и оптимально писать ISR (может на асме). Сильно это не загрузит процессор, так как разрешаться
это прерывание будет по THRE одного из UART, а запрещаться - при TEMT==1 для всех разрешённых UART. А это всего лишь длительность одного байта на текущей скорости (ну конечно могут быть наложения по времени от неск. UART).
Так как характер времён высокой загрузки у вас порядка десятков мсек, то такой ISR никак не помешает.
2. Завести линию TX каждого UART на отдельное прерывание GPIO, разрешать его по THRE, запрещать по TEMT своего UART. В остальном - подобно п.1.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 8 2013, 08:30
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Velund @ Nov 6 2013, 22:23) *
Встала задача - реализовать три интерфейса RS-485 на плате расширения к изделию сделанному на LPC1768. Пины всех трех UART (кроме того самого единственного UART1 который аппаратно держит RS-485) и несколько свободных GPIO выведены на разъем расширения. Скорости - скорее всего выше 19200 не будет но хотелось бы потенциально держать до 115200.

Предлагаю следующий проверенный вариант:
1. Шина приводится в активное предопределенное состояние на одном из концов резисторами путем "раскорячки": между A и + питания - 330 Ом, между B и землей - 330 ом, между A и B - тоже 330 ом.
2. Вход DI полудуплексного RS-485 чипа садится на землю.
3. Вход DE через инвертор подключается к TX микроконтроллера.
4. Вход RE тоже на землю; во время собственной передачи с шины будет приходить эхо, которое можно обрабатывать программно на предмет совпадения того, что послали и приняли - возможность оценить ошибки на шине - или просто игнорировать.

Сообщение отредактировал KnightIgor - Nov 8 2013, 10:01
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 18 2013, 23:27
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



QUOTE (jcxz @ Nov 8 2013, 06:31) *
придётся конечно увеличить частоту этого прерывания до максимума (хоть до максимальной бодовой скорости) и оптимально писать ISR (может на асме).


У меня возникло большое желание отрать один таймер на это дело и использовать все 4 compare регистра для генерации прерываний примерно через половинку битового интервала после расчетного времени окончания передачи очередного символа. После загрузки байта на передачу обработчик прерываний UART вызывает функцию, которая пихает переданное время (плюс текущее значение счетчика) в соответствующий compare канал. При достижении счетчиком заданного значения генерится прерывание, в котором уже разберемся, не пора ли "погасить" передачу. Если канал уже "ждет" предыдущий символ. то значение в compare регистре увеличивается ровно на длину символа со стартом и стопом.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016