|
AVR и ADM485, правильное использование линий RE#, DE |
|
|
|
Dec 18 2008, 21:43
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

|
Добрый день. Суть вопроса в следующем. Работаю с 485 интерфейсом. Линии RE#, DE соединены вместе, контроллер управляет этой парой ножек. Когда я перевожу ножку контроллера из 0 в 1 (т.е. перевожу ADM485 из приемника в передатчик), то по УАРТу получаю прерывание по приходу символа (обычно это 0). Обойти решил изуверским способом. Перед переключением ПРМ->ПРД запретить приемник (RXEN = 0). Но чую, что что-то неправильно. Кто-нибудь сталкивался с подобным? Подскажите, как бороться с проблемой?
P.S. Еще слышал решение (в документации на FTDI232BL), что можно линию DE устанавливать в 1 на время передачи, после чего снимать, а линию RE# держать все время в нуле. При это на линию RxD контроллера заводить логическое ИЛИ от сигнала RO и DE. Практикуется ли подобное и является ли такое решение более правильным?
|
|
|
|
|
Dec 18 2008, 22:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(korobov_michael @ Dec 19 2008, 00:43)  Линии RE#, DE соединены вместе, контроллер управляет этой парой ножек. Когда я перевожу ножку контроллера из 0 в 1 (т.е. перевожу ADM485 из приемника в передатчик), то по УАРТу получаю прерывание по приходу символа (обычно это 0). Обойти решил изуверским способом. Перед переключением ПРМ->ПРД запретить приемник (RXEN = 0). Но чую, что что-то неправильно. Кто-нибудь сталкивался с подобным? Подскажите, как бороться с проблемой? Повесьте pull-up резистор на RXD - линия повисает в воздухе, если nRE = 1. Цитата(korobov_michael @ Dec 19 2008, 00:43)  P.S. Еще слышал решение (в документации на FTDI232BL), что можно линию DE устанавливать в 1 на время передачи, после чего снимать, а линию RE# держать все время в нуле. Правильное решение... Цитата(korobov_michael @ Dec 19 2008, 00:43)  При это на линию RxD контроллера заводить логическое ИЛИ от сигнала RO и DE. Практикуется ли подобное и является ли такое решение более правильным? ...а вот это лишнее: тогда лучше или pull-up, или фильтровать прием. Заодно можно и детектор конфликтов сделать.
|
|
|
|
|
Dec 19 2008, 06:00
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

|
Цитата(aaarrr @ Dec 19 2008, 00:44)  Повесьте pull-up резистор на RXD - линия повисает в воздухе, если nRE = 1. Я правильно понимаю, что если включен UART, то команда PORTE |= _BV(PE0) для включения подтяжки не будет работать? Т.е. нужен внешний pull-up? Цитата(aaarrr @ Dec 19 2008, 00:44)  Заодно можно и детектор конфликтов сделать. Об этом даже не думал. Спасибо. Действительно ценная идея
|
|
|
|
|
Dec 19 2008, 07:22
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(aaarrr @ Dec 19 2008, 00:44)  Повесьте pull-up резистор на RXD - линия повисает в воздухе, если nRE = 1. Цитата Receiver Output Enable. A low level enables the receiver output, RO. A high level places it in a high impedance state. я работаю без подтяжек...нареканий не было...с переключением тоже
|
|
|
|
|
Dec 19 2008, 08:51
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(korobov_michael @ Dec 19 2008, 09:00)  Я правильно понимаю, что если включен UART, то команда PORTE |= _BV(PE0) для включения подтяжки не будет работать? Т.е. нужен внешний pull-up? Работать будет, но я бы в любом случае рекомендовал внешний резистор. Цитата(swisst @ Dec 19 2008, 10:22)  я работаю без подтяжек...нареканий не было...с переключением тоже Вам просто повезло.
|
|
|
|
|
Dec 19 2008, 12:22
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(aaarrr @ Dec 19 2008, 10:51)  Работать будет, но я бы в любом случае рекомендовал внешний резистор. да будет так !
|
|
|
|
|
Dec 19 2008, 15:21
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

|
Цитата(demiurg_spb @ Dec 19 2008, 11:23)  Будет. Только порт на ввод должен быть настроен. Насколько я знаю, при включенном УАРТе ножка RxD автоматически настраивается на вход
|
|
|
|
|
Dec 19 2008, 20:20
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

|
Цитата(aaarrr @ Dec 19 2008, 17:49)  Да, но управление pull-up'ом это не отменяет. Я имел ввиду, что при включении функции УАРТ управление ножками контроллера (включая возможность управления подтяжками) полностью переходит к модулю УАРТ и он блокирует мои выбрыки вроде PORTE |= _BV(PE0); и делает с подтяжками так, как ему это удобно. Надо, блин, покурить мануал
|
|
|
|
|
Dec 19 2008, 23:47
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(korobov_michael @ Dec 18 2008, 23:43)  P.S. Еще слышал решение (в документации на FTDI232BL), что можно линию DE устанавливать в 1 на время передачи, после чего снимать, а линию RE# держать все время в нуле. При это на линию RxD контроллера заводить логическое ИЛИ от сигнала RO и DE. Практикуется ли подобное и является ли такое решение более правильным? Я бы так не стал делать - лишняя зависимость от некой сущности "логического ИЛИ". Поступаю как и Вы - соединяю RE/DE вместе и управляю одной ногой контроллера. Мусор в момент переключения приемника/передатчика меня не особо беспокоит в силу защищенности протокола, хотя также отмечу, что ни разу с такой проблемой как у вас не столкнулся... Всмысле лишнего "0" после переключения ни разу не словил. И с пул-апом и без оного. Может у Вас что-то фонит на плате излишне? Или с линией что-то не так (проверьте появляется ли этот "0" если поставить терминатор 120om между A и B )? Цитата Заодно можно и детектор конфликтов сделать. Можно-то можно. Вопрос зачем? При идеологии шины "1" мастер "много" слейвов. Конфликт ловить бесполезно - т.к. слейв все равно не может делать перепосылку "по собственному хотению", а мастер и так всегда прав. Как по мне, с позиции Rs485 мастера - удобно делать так: - очистить приемный буфер - послать запрос - спать - проверить приемный буфер (и вот чего в этом месте точно не нужно, так это получить собственный же запрос в начале буфера) слейву как бы тоже все ясно: - спать - проверить приемный буфер - ответить. В обоих случаях RX спам своми же сообщениями бесполезен и только будет мешать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|