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

 
 
> Проблема с RS 485. Третий день туплю...
Axxel
сообщение Feb 7 2007, 14:42
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



Доброго времени суток!
Проблема с RS485, третий день туплю.

Собрал простой переходник с RS232 на RS485 по этой схемке:

схема.


Схема ИМХО работает, но с передачей данных появились проблемы
использовал Terminal. Для МК была написана простая тестовая программка:

_______________________________________________________________
//ICC-AVR application builder : 05.02.07 16:50:48
// Target : M16
// Crystal: 6.4Mhz

#include <iom16v.h>
#include <macros.h>
#define RXBUF_SIZE 4
#define TXBUF_SIZE 4
unsigned char RxBuffer[RXBUF_SIZE],TxBuffer[TXBUF_SIZE];
unsigned char TranRequest=0,flag=0,done=0;
unsigned char RxIndex=0,TxIndex=0;
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFF; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
TCCR0 = 0x05;
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9524 (0,8%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;
UBRRL = (unsigned char)41; //set baud rate lo
UBRRH = (unsigned char)41>>8; //set baud rate hi
UCSRB = 0xD8;
}


void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();

MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
unsigned char RXchar;
RXchar=UDR;
RxBuffer[RxIndex++]=RXchar;
if(RxIndex>=(RXBUF_SIZE)){flag=1;RxIndex=0;PORTD=0xFF;/*на передачу*/}
}

#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if(done==1){done=0;PORTD=0x00;/*на прием*/}
if(TranRequest==1)
{
unsigned char TXchar;
TXchar=TxBuffer[++TxIndex];
if(TxIndex==(TXBUF_SIZE-1)){TranRequest=0;TxIndex=0;done=1;}
UDR=TXchar;
}
}

void main()
{
init_devices();
while(1)
{
if(flag==1)
{
unsigned char inc;
flag=0;
TranRequest=1;
for(inc=0;inc<=(TXBUF_SIZE-1);inc++){TxBuffer[inc]=RxBuffer[inc];}
UDR=TxBuffer[0];
}



}
}
_______________________________________________________________
Смысл: передаем с ПК 4 любых символа, МК возвращает их обратно
МК их конечно же возвращает, но 1 из 5-7 пакетов-"битый".
На этом форуме я натыкался на тему, где описывалась проблема
с RS 485 с "лишним" 0-вым битом в символе,примерно похоже на мою
проблему: в основном в неверных символах у меня "лишний" как раз или 0-й
или 7-й бит.

Причем проблема именно с передачей с ПК.
МК шлет обратно то, что ему прислали, это
я проверил это следующим способом:

Конструкция типа:

PORTD=0xFF;//всегда передача
.....................
.....................
.....................
while(1)
{
puts("a very long string");
delayms(1500);
}

работает без единой ошибки передачи.
______________________________________

А конструкция типа:

PORTD=0x00;//всегда прием.
..................
.................
.................
................
получаем 4 символа,
проверяем равны ли они
символу(предположим) 'x'
если равны, то зажигаем
св.диод на 1сек.

на 5-7 пакетов дает сбой.



По поводу переходника: линию CTS не получилось
использовать из-за отсутсвия необходимого пина
в разъеме от мыши :-)
Но это так, к слову, я на это даже и не думаю...

Кто-нибудь сталкивался с подобной проблемой?
Можете натолкнуть на свежую мысль?
А то уже 3-й день туплю :-)

Заранее спасибо!
Прикрепленные файлы
Прикрепленный файл  RS232toRS485.bmp ( 250.62 килобайт ) Кол-во скачиваний: 155
 


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Feb 7 2007, 17:16
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Axxel @ Feb 7 2007, 11:42) *
Проблема с RS485, третий день туплю.
Собрал простой переходник с RS232 на RS485 по этой схемке:

Схема ИМХО работает, но с передачей данных появились проблемы
использовал Terminal. Кто-нибудь сталкивался с подобной проблемой?
Можете натолкнуть на свежую мысль?
А то уже 3-й день туплю :-)

Заранее спасибо!


По-моему, ошибка у вас кроется в нижеследующем фрагменте
Код
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;
UBRRL = (unsigned char)41; //set baud rate lo
UBRRH = (unsigned char)41>>8; //set baud rate hi
UCSRB = 0xD8;
}

а именно в строчке UCSRC = 0x06; насколько я понимаю, вы хотите установить 8-битные данные, но записываете не в UCSRC, а в UBRRH, т.к. бит URSEL=0. Строчку надо просто заменить на UCSRC = 0x86, тогда будет именно 8-бит данных и ошибки должны пропасть.

Ну и надо бы переставить местами следующие строчки, вот так

UBRRH = (unsigned char)41>>8; //set baud rate hi
UBRRL = (unsigned char)41; //set baud rate lo

хотя не полностью уверен, что это атомарная операция для М16.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 7 2007, 17:25
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(=GM= @ Feb 7 2007, 16:16) *
Ну и надо бы переставить местами следующие строчки, вот так

UBRRH = (unsigned char)41>>8; //set baud rate hi
UBRRL = (unsigned char)41; //set baud rate lo

хотя не полностью уверен, что это атомарная операция для М16.

Дело здесь очевидно в соблюдении правил доступа к 16-битным регистрам (Accessing 16-bit
Registers), описанным в документации на любой МК AVR.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 7 2007, 18:40
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(IgorKossak @ Feb 7 2007, 14:25) *
Цитата(=GM= @ Feb 7 2007, 16:16) *

Ну и надо бы переставить местами следующие строчки, вот так

UBRRH = (unsigned char)41>>8; //set baud rate hi
UBRRL = (unsigned char)41; //set baud rate lo

хотя не полностью уверен, что это атомарная операция для М16.

Дело здесь очевидно в соблюдении правил доступа к 16-битным регистрам (Accessing 16-bit
Registers), описанным в документации на любой МК AVR.

К счастью для Axxel, я здесь ошибся, поэтому в предыдущем посте и писал, что не полностью уверен. Для МК М16 регистры UBRRH и UBRRL не образуют "атомарную единицу", как скажем, регистры данных 16-битного таймера1, где данные для старшего регистра пишутся во временный регистр и потом переписываются в регистр таймера одновременно с записью в младший регистр.

Так что, можно записывать данные в пару UBRRH-UBRRL в любом порядке. Хотя почему-то во всех примерах сначала пишут в старший байт, потом в младший. Может для будущих расширений?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Axxel   Проблема с RS 485. Третий день туплю...   Feb 7 2007, 14:42
- - Andy Mozzhevilov   Если у вас именно двухпроводный RS485, с переключе...   Feb 7 2007, 16:45
|- - IgorKossak   Цитата(Andy Mozzhevilov @ Feb 7 2007, 15...   Feb 7 2007, 17:15
- - SasaVitebsk   С такой схемой не сталкивался. На схеме видно сигн...   Feb 7 2007, 16:53
- - SpiritDance   На время передачи с МК попробуйте выключать его пр...   Feb 7 2007, 18:10
- - muravei   Только что сделал преобразователь RS-232>RS-485...   Feb 7 2007, 18:23
|- - SasaVitebsk   Цитата(muravei @ Feb 7 2007, 19:23) Тольк...   Feb 8 2007, 01:00
|- - rezident   Цитата(SasaVitebsk @ Feb 8 2007, 03:00) Н...   Feb 8 2007, 01:08
|- - muravei   Цитата(rezident @ Feb 8 2007, 01:08) Это ...   Feb 8 2007, 13:50
- - Axxel   Спасибо всем за ответы, буду проверять все вариант...   Feb 8 2007, 05:52
- - Axxel   Всем доброго времени суток! __________________...   Feb 8 2007, 07:32
- - Axxel   А еще скорее всего перепутал hanshaking c flow con...   Feb 8 2007, 11:06
- - Axxel   Да, именно так и вышло, тему можно закрывать.   Feb 8 2007, 11:58


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

 


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


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