Jump to content

    
Sign in to follow this  
TamTam

RS 485

Recommended Posts

Народ ежеле кому не влом поделитесь примерчиком работы с приемопередатчиком для RS-485

отличие от 232 только в том, что перед отправкой символа надо подать единицу на ноги 2,3 драйвера чтобы переключиться на передачу.

 

алгоритм такой:

 

putchar:

1. Выставить 1 на пин X который подключен к 2,3 драйвера,

2. UDR = отправляемый символ

---

 

3. В обработчике прерывания Tx выставить 0 на пин X, чтобы переключиться обратно на прием.

 

Прием ведется как обычно.

Share this post


Link to post
Share on other sites

хотелось бы уточнить, мало просто выставлять прием передачу, если пакет большой (несколько байт) то ногу в передаче надо держать пока не закончиться передача, иначе произойдет обрезание посылки. в CodeVision был у меня кусок кода для ATmega8

 while (UCSRA.6==0) // пока идет передача
       {
       
       PORTD.2=1;      // нога в единице
       
       };
       
       UCSRA.6=1;     // сбрасываем флаг завершения передачи
       PORTD.2=0;    // драйвер 485 переводим в прием.

Share this post


Link to post
Share on other sites
хотелось бы уточнить, мало просто выставлять прием передачу, если пакет большой (несколько байт) то ногу в передаче надо держать пока не закончиться передача, иначе произойдет обрезание посылки. в CodeVision был у меня кусок кода для ATmega8

 while (UCSRA.6==0) // пока идет передача
       {
       
       PORTD.2=1;      // нога в единице
       
       };
       
       UCSRA.6=1;     // сбрасываем флаг завершения передачи
       PORTD.2=0;    // драйвер 485 переводим в прием.

 

Мысль я понял тест обмен уже произошол, но все равно за код приема передачи буду очень благодарен

Share this post


Link to post
Share on other sites

Можете проверять длину очереди, если не ноль тогда держим, иначе отпускаем. Хотя какой в этом смысл? В обработчик прерывания Tx, попадем только по окончании передачи, а значить посылку не обрежет.

Edited by SS85

Share this post


Link to post
Share on other sites

Вот родился еще вопрос как организовать регистрацию устройств (иными словами как при старте всех устройств коих 8 определить сколько из них сейчас на линни если сразу по включению отправить пакет ониже могут пересечься как грамотно это сделать)

Share this post


Link to post
Share on other sites

Сеть одноранговая?

Вообще, как-то метеостанции соединял, там было два варианта, по включению, все молчат, и Ведущий по очереди опрашивает слушателей, и те по очереди отвечают (время на ответ ограничено), это удобно когда много одинаковых устройств, и соотвественно прошивка у всех одинаковая (номер устройства выставляется перемычкой на ответной части разъема). Еще был вариант, когда по включению все опять же слушают , но первый через секунду отправляет в линию на Центральный -"01", это естественно видит и второй, и после некоторой задержки выдает Центральному "02" и так далее...

Естественно есть и более рациональные способы.

По поводу кода: эм... в CodeVision уже есть готовые функции для работы с UART (putchar, printf), а 485 на этапе выхода Байтов из мк от232 отличается только описанным выше.(включением прием/передача, тк для связи используется диф.линия, ну и ожиданием окончания передачи/приема)

Edited by Robot_Bender

Share this post


Link to post
Share on other sites
Сеть одноранговая?

Вообще, как-то метеостанции соединял, там было два варианта, по включению, все молчат, и Ведущий по очереди опрашивает слушателей, и те по очереди отвечают (время на ответ ограничено), это удобно когда много одинаковых устройств, и соотвественно прошивка у всех одинаковая (номер устройства выставляется перемычкой на ответной части разъема). Еще был вариант, когда по включению все опять же слушают , но первый через секунду отправляет в линию на Центральный -"01", это естественно видит и второй, и после некоторой задержки выдает Центральному "02" и так далее...

Естественно есть и более рациональные способы.

По поводу кода: эм... в CodeVision уже есть готовые функции для работы с UART (putchar, printf), а 485 на этапе выхода Байтов из мк от232 отличается только описанным выше.(включением прием/передача, тк для связи используется диф.линия, ну и ожиданием окончания передачи/приема)

 

Сенькс за ответ.

Share this post


Link to post
Share on other sites

В общем, если интересно, я организовывал сеть на 485 так - есть 1 главный и несколько слэйвов, при чём слэйвы могут посылать данные не по запросу мастера а по завершению своих каких то действий...Вот, борьбу с битым кодом проводил там(собсно сам алгоритм по которому передаётся данные и у слэйва и у мастера) - сижу слушаю лапку РХ, если по истечнию промежутка времени -который надо для передачи полтора байта (де то бит 15 я ждал по времени) - лапка РХ молчит, то тогда начинаю передавать.Схема реализована, так , что я всё время слушаю(даже сам себя когда передаю) - это играет важную роль в передаче - и вот когда я подождал и начал передавать байт, я такой реализацией схемы принимаю то что я должен был передать - и сравниваю с тем байтом который послал на отправку , если всё верно - начинаю передавать 2-й байт по такому же алгоритму, если же полученный байт не равен отправленному - значит была ошибка на линии - я ожидаю рандомно сгенерённое время мсек,далее опять слушаю лапу РХ отведённое время , если за этот промежуток времени всё тихо - начинаю передачу как написано выше..Вотс...В приложенном рисунке схема прицепления SТ485 к контроллеру - стабилитроны и резюки там вместе , потому что в одних вариациях схема намана работала с резюками, в др со стабилитронами..

+ добавил код посылки(чтоб стало совсем ясно).Приём - как обычно в РыСы-232..

st485_.rar

Share this post


Link to post
Share on other sites

Мой пример:

 

//Прием

#pragma interrupt_handler CharacterHasReceived:12

void CharacterHasReceived(void)

{

unsigned char RXchar;

RXchar=UDR;

if(RXchar==NODE_ADRESS) {NodeAdressOk=1;} // If RXchar is an our node adress...

if(NodeAdressOk==1) { if((RXchar==ETX)&&(STXmarker==1)) {ETXmarker=1;STXmarker=0;RxIndex=0;NodeAdressOk=0; ErrorFlag=0;}

if((STXmarker==1)&&(ETXmarker!=1)) {RxBuffer[RxIndex++]=RXchar;}

if(RXchar==STX){STXmarker=1;ETXmarker=0;RxIndex=0;} }

}

 

//Передача

 

#pragma interrupt_handler CharacterHasTransmitted:14

void CharacterHasTransmitted(void)

{

if(TranRequest==1) //Transmition request has been activated. This is some variable(flag) which enables transmition.

{

unsigned char TXchar;

TXchar=TxBuffer[++TxIndex];

if(TxIndex==(TXBUF_SIZE-1)){TranRequest=0;TxIndex=0;}

UDR=TXchar;

}

else{done=1;}

}

 

 

//Запуск передачи

 

void SendBuffer(void)

{

PORTD|=TXD;

delayms(DELAY_BEFORE_SEND);//Если нужно

TranRequest=1;

UDR=TxBuffer[0];

while(!done);

done=0;

delayms(DELAY_AFTER_SEND);//То же самое

PORTD&=RXD;

}

 

Таймаутов,чексумов, и прочих проверок в этих функциях нет.

Не очень красиво, многое не доработно, но суть такая.

Вроде по теме ответ

Edited by Axxel

Share this post


Link to post
Share on other sites
Народ ежеле кому не влом поделитесь примерчиком работы с приемопередатчиком для RS-485

 

Вот , на мой взгляд, хорошая библиотека и пример сети для RS485 одного англичанина.

Проект рабочий. На CCS-PICC.

Добавил проект на Протеусе.Протеус 6.9 Клавиатура из VSMLIBS с ..http://uk.geocities.com/vsmlibs/

Протокол обмена как в Modbus. Только без начального и завершающих символов.

Думаю для старта подойдет.Клавиатура программой не обрабатывается.

tst485.rar

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this