AVR и RS485

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Прошло два года. С RS485 я вроде разобрался, но так как до многого приходилось "доходить"самому и информацию собирать по кускам, то хочу рассказать о том как "жить" с этим чудом тут (да и в поисковиках эта тема на первом месте).
Надеюсь кому-нить будет полезна данная информацию. Если где не прав - поправьте меня.

Итак. Что это за зверь. Это просто два провода, на котором висят несколько устройств и они между собой общаются.
Впринципе общее описание найти без проблем в интернете, про то что не подверженно синхфазным помехам, что расстояния приличные, устройств много, про согласующие резисторы, внутренние сопротивления... это все есть много где. Все. Это RS485. Как общаться, кто какие данные шлет - это на откуп программисту. Единственно что хочу заметить, так это то подключать лучше все же не два провода, а три. Третий провод это экран и он заземлен на каждом устройстве -
выравниваются потенциалы, обеспечивается защита. Но это если нет гальванической развязки. В пределах "квартиры", можно без экрана. Кроме этого на плате "блок" RS485 лучше отнести подальше от всяких измерительных линий, так как на проводе может наводиться приличная помеха, которая на сам RS485 не повлияет, но шороху на плате может наделать.

Начнем с небольшой теории о том как работает AVR по этим двум проводам. Впринципе так же как и по простому UART (USART). Т.е. если вы заставите два МК общаться между собой по UART-у, то после добавления двух MAX487 с необходимой обвязкой в разрыв они должны так же продолжить общаться между собой. Единственный ньюанс заключается в том что для того что бы принимать байты, ноги RE DE должны быть выставленны в "ноль" ("прижаты" к "земле"), а для передачи эти ноги нужно поднять до "единицы". Ну и как правило все берут эти ноги и подтягивают к земле через 10k омный резистор. В режиме "отправки", т.е. когда RE DE в единице, MAX487 отключает RO (RX порт UART-а), переводит его в третье состояние. На нем может навестись помеха которую UART может воспринять как прием данных. Я ее подтягиваю к питанию во избежание недоразумений. Можно конечно отключить прием програмно, но вариант с резистором мне кажеться более красивым и не требует работы МК.
Без имени-2.jpg
(77.88 КБ) 1096 скачиваний
Подключается MAX487 к AVR очень просто - RO -> RX, DI -> TX, RE вместе с DE подключаються к какому-нить порту для
управления направлением передачи/приема. Ну разумеется конденсатор на питание и само питание. Дальше. Линию A мы
подтягиваем к питанию через 1k резистор и через такой же резистор подтягиваем линию В к земле. На плате я еще
развожу согласующий резистор 120 Ом который ставиться между линиями А и В. Если растояние не большое то не ставлю
его, а если большое, то ставлю.
Без имени-1.jpg
(52.76 КБ) 1111 скачиваний
С подключением закончили. Теперь программная составляющая. Прием данных идет так же как и по UARTу, ничего менять не надо. Есть ньюанс с отправкой. Нужно поднять ноги RE DE, отправить байт и потом опустить ноги обратно. Впринципе ничего сложного, но опускать ноги надо после того как байт оптравлен. Не запихнут в буфер, или не переслан из буфера в регистр, а отправлен. Тут опускать ноги лучше по прерыванию по отпрвке байта. Повторю, не очистка буфера отправки, а именно отправления байта, так как когда байт из буфера уходит в регистр, он еще не отправлен, но буфер уже очищен. Выглядит это примерно так:

Код: Выделить всё

#define SETBIT(x,y) 	(x|=(1<<y))
#define CLRBIT(x,y) 	(x&=~(1<<y)) 

#define RS485_PORT PORTD;
#define RS485_CONTROL PD2;          // управление приемом/передачей RS485

#define RS485_TR SETBIT(RS485_PORT,RS485_CONTROL); // Установить RE DE в 1. Отправка
#define RS485_RS CLRBIT(RS485_PORT,RS485_CONTROL); // Установить RE DE в 0. Прием

void UART_SendChar(unsigned char Data)
{
	/* Wait for empty transmit buffer */
	while ( !( UCSRA & (1<<UDRE)) );
	/* Put data into buffer, sends the data */
	RS485_TR;  // Установить RE DE в 1. Отправка
	UDR = Data;	
}


ISR(USART_TXC_vect)
{
	RS485_RS; // Установить RE DE в 0. Прием
}
Если есть желание отправить набор байт из буфер, то в этом прерывании можно проверять, все ли отправленно, если нет, то отправлять следующий байт, а после опустошения буфера - опускать ноги.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 154
Зарегистрирован: Вс янв 03, 2010 14:46:48

Сообщение maksipus »

MAX487 дорогая игрушка. SN65HVD3082 то же самое, только ровно в 10 раз дешевле.
Для утилитарного применения, когда общаются только два агента, обычно это 80% случаев, ставите два трансивера RS485 на шину UART, один аппаратно приемник, второй передатчик + витые пары на обе линии и не надо 2года протокол изучать, стоит такое решение копейки. :)) Работает идеально, не ломаеш голову о програмных конфликтах.
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

А макс485 не аналог? Стоит 5р за штучку. Есть adm какой то на котором даже не надо ногами дрыгать для приемопередачи, но дело не в этом, я описывал общие принципы работы и ньюансы которые не везде описаны.
Если надо два устройства соединить то там и по уарту можно...

А протокол... Протокол это отдельная тема, сейчас вот пытаюсь придумать какое нить свое решение...
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

alex1126 писал(а): Если надо два устройства соединить то там и по уарту можно...
Это точно. Особенно если на 1200м
А протокол... Протокол это отдельная тема, сейчас вот пытаюсь придумать какое нить свое решение...
Вот это правильно. Лучше плохонькое, но свое. А всякие там Модбасы пусть катятся к чертям своим буржуинским. И начхать на то, что это уже давно стандарт де-факто и под него заточены сотни промышленных устройств.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Jack_A писал(а):
alex1126 писал(а): Если надо два устройства соединить то там и по уарту можно...
Это точно. Особенно если на 1200м
Ну в разумных пределах
А протокол... Протокол это отдельная тема, сейчас вот пытаюсь придумать какое нить свое решение...
Вот это правильно. Лучше плохонькое, но свое. А всякие там Модбасы пусть катятся к чертям своим буржуинским. И начхать на то, что это уже давно стандарт де-факто и под него заточены сотни промышленных устройств.
Ну и причем тут сотни промышленных устройств? Что модбас, что вайт - я не увидел там нормальной реакции на то, что несколько устройств одновременно начинают вещать. Алгоритм один - не совпадает црц, пакет отбрасывается и передатчик не услышав ответа начинает передачу заново...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Ну тут протокол совсем не при чем, значит, сам алгоритм опроса сделан через опу. Вещать подчиненные слейвы могут, только если им прикажет мастер. Если вдруг случайно из-за сбоя двоим слейвам покажется, что опросили именно его, то как минимум, у одного из них не совпадет CRC, и стандартная его реакция тут -- молчать.
Если автору удастся сделать протокол, по которму при одновременном лопотании нескольких передатчиков удается беспроблемно считывать инфу -- нобелевку не гарантирую, но майкрософт его точно выкрадет и предложит много зеленых рублей оклад жалования :)
Конечно, бывают экстремальные случаи, когда стандартные протоколы -- не выход. У меня самого один такой дивайс выпускается серийно. Но это исключение, а отнюдь не "искусство ради искусства".
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Помоему всё же состояние мастер оно перманентно а не один мастер и на всю жизнь. Вот есть одно устройство типа главное и есть куча не главных. И кто то из не главных захотел что то кому то сообщить. Он становится мастером и вещает.

А насчет протокола где все лапочат и все понятно - ну так радиосвязь так работает. Это еще не протокол, а скорее второй уровень osi, но всё же.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Это зависит от задачи. Мне мультимастерный вариант ваять не приходилось, сборщиком инфы был комп, дивайсы - подчиненными слейвами. Мультимастерный режим тоже есть в пресловутом Modbus, только в версии Modbus + . Мой коллега по работе его вроде использовал, но я подробности не знаю. Там вроде устройства обмениваются маркерами - кому быть мастером.
Если бы мне пришлось такое варганить, фантазирую : сделал бы команду : "У кого из слейвов есть срочное сообщение?". Повторял бы ее периодически. На случай, если таких клиентов нашлось бы несколько, чтоб не было коллизий, разнес бы слейвам время отклика на команду. Если ответов пришло бы несколько, поставил бы их в очередь и по очереди пытал бы. Конечно, в таком варианте на real time рассчитывать не приходится, но сеть RS485 на это и не рассчитана.
Открыл глаза
Сообщения: 68
Зарегистрирован: Вс июн 20, 2010 17:49:47

Сообщение Onkel »

разрешение конфликтов реализовано в железе на can. он в принципе ничем (почти) не сложее, чем 485.
Фонтаны на Outlet Village Белая Дача, г Наро- Фоминск
Цех упаковки стройматериалов
Цех пиролиза покрышек с крекингом и ректификацией
Серийные приборы "Умный Дом" Uniel
Премия первой степени "Больше чем профессия" 2016 г
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Оно конечно. Но исходный вопрос про 485...
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Единственный ньюанс заключается в том что для того что бы принимать байты, ноги RE DE должны быть выставленны в "ноль" ("прижаты" к "земле"), а для передачи эти ноги нужно поднять до "единицы". Ну и как правило все берут эти ноги и подтягивают к земле через 10k омный резистор.
В некоторых случаях номинал этого резистора имеет значение...
В режиме "отправки", т.е. когда RE DE в единице, MAX487 отключает RO (RX порт UART-а), переводит его в третье состояние. На нем может навестись помеха которую UART может воспринять как прием данных. Я ее подтягиваю к питанию во избежание недоразумений. Можно конечно отключить прием програмно, но вариант с резистором мне кажеться более красивым и не требует работы МК.
Еще красивее поставить, например, ST3485. Она гарантирует защиту от такого. В даташите читаем: "Guaranteed high receiver output state for floating inputs with no signal present".

Я ее ставил в диммер с интерфейсом DMX-512.
На плате я еще развожу согласующий резистор 120 Ом который ставиться между линиями А и В. Если растояние не большое то не ставлю его, а если большое, то ставлю.
Это зависит не только от расстояния, но и от скорости. Хотя Texas Instruments рекомендует ставить согласующие резисторы всегда.
Нужно поднять ноги RE DE, отправить байт и потом опустить ноги обратно. Впринципе ничего сложного, но опускать ноги надо после того как байт оптравлен. Не запихнут в буфер, или не переслан из буфера в регистр, а отправлен.
О да, в первом проекте с использованием RS-485 я тоже на это наткнулся. :beer:
Вот это правильно. Лучше плохонькое, но свое. А всякие там Модбасы пусть катятся к чертям своим буржуинским. И начхать на то, что это уже давно стандарт де-факто и под него заточены сотни промышленных устройств.
Если не требуется совместимости с сотнями промышленных устройств, проще сделать свое, чем заморачиваться с модбасом. Когда я делал небольшую сеть из кастомных устройств, я так и сделал. Изобрел простенький протокол с пакетом из шести байт и топологией, рассчитанной на то, что ведущий только один. А когда надо было делать совместимое устройство (DMX-диммер) - реализовал существующий протокол. Так что тут все определяется задачей.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

YS писал(а):Так что тут все определяется задачей.
Я утверждал ровно то же самое. Но перед этим не лишне изучить существующее, чтобы взять отттуда все полезное, доработав под свою конкретику.
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

YS писал(а): В некоторых случаях номинал этого резистора имеет значение...
Во. Спасибо. Именно таких писем я и ждал :beer:
Еще красивее поставить, например, ST3485. Она гарантирует защиту от такого. В даташите читаем: "Guaranteed high receiver output state for floating inputs with no signal present".
дорогая оно, вроде... да и не везде есть я так понял... нашел сейчас за 100р штучка... :(


Это зависит не только от расстояния, но и от скорости. Хотя Texas Instruments рекомендует ставить согласующие резисторы всегда.
Да можно и всегда ставить, но их же надо ставить только на концах провода, а если устройство будет висеть на проходящем кабеле, то не надо....
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

дорогая оно, вроде...
Ну почему же, примерно 50 р. от 10 шт.

Мне она очень понравилась - вообще никаких проблем с ней не было. А распиновка у нее совместимая, так что в случае чего можно заменить аналогом.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

YS писал(а): Это зависит не только от расстояния, но и от скорости. Хотя Texas Instruments рекомендует ставить согласующие резисторы всегда.
Спасибо за пдф, но не увидел там рекомендаций ставить резистор всегда. На концах кабеля - да, но на промежуточных устройствах там нет резистора
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Так не, на промежуточных его никто и не ставит. Он там не нужен. Речь о резисторах на концах линии.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Родился
Сообщения: 2
Зарегистрирован: Чт дек 25, 2014 17:52:31

Сообщение ReZample »

Огромное спасибо alex1126 за его прекрасный пост. Всё летело в тартарары только из-за отсутствия подтяжек через резисторы на линиях A и B.
Ответить

Вернуться в «Интеграция с ПК»