Надеюсь кому-нить будет полезна данная информацию. Если где не прав - поправьте меня.
Итак. Что это за зверь. Это просто два провода, на котором висят несколько устройств и они между собой общаются.
Впринципе общее описание найти без проблем в интернете, про то что не подверженно синхфазным помехам, что расстояния приличные, устройств много, про согласующие резисторы, внутренние сопротивления... это все есть много где. Все. Это RS485. Как общаться, кто какие данные шлет - это на откуп программисту. Единственно что хочу заметить, так это то подключать лучше все же не два провода, а три. Третий провод это экран и он заземлен на каждом устройстве -
выравниваются потенциалы, обеспечивается защита. Но это если нет гальванической развязки. В пределах "квартиры", можно без экрана. Кроме этого на плате "блок" RS485 лучше отнести подальше от всяких измерительных линий, так как на проводе может наводиться приличная помеха, которая на сам RS485 не повлияет, но шороху на плате может наделать.
Начнем с небольшой теории о том как работает AVR по этим двум проводам. Впринципе так же как и по простому UART (USART). Т.е. если вы заставите два МК общаться между собой по UART-у, то после добавления двух MAX487 с необходимой обвязкой в разрыв они должны так же продолжить общаться между собой. Единственный ньюанс заключается в том что для того что бы принимать байты, ноги RE DE должны быть выставленны в "ноль" ("прижаты" к "земле"), а для передачи эти ноги нужно поднять до "единицы". Ну и как правило все берут эти ноги и подтягивают к земле через 10k омный резистор. В режиме "отправки", т.е. когда RE DE в единице, MAX487 отключает RO (RX порт UART-а), переводит его в третье состояние. На нем может навестись помеха которую UART может воспринять как прием данных. Я ее подтягиваю к питанию во избежание недоразумений. Можно конечно отключить прием програмно, но вариант с резистором мне кажеться более красивым и не требует работы МК. Подключается MAX487 к AVR очень просто - RO -> RX, DI -> TX, RE вместе с DE подключаються к какому-нить порту для
управления направлением передачи/приема. Ну разумеется конденсатор на питание и само питание. Дальше. Линию A мы
подтягиваем к питанию через 1k резистор и через такой же резистор подтягиваем линию В к земле. На плате я еще
развожу согласующий резистор 120 Ом который ставиться между линиями А и В. Если растояние не большое то не ставлю
его, а если большое, то ставлю. С подключением закончили. Теперь программная составляющая. Прием данных идет так же как и по 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. Прием
}


