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

 
 
 
Closed TopicStart new topic
> Проблемы USART0 + ADM2483, То ли лыжи не едут, ...
nss
сообщение May 11 2007, 19:50
Сообщение #1


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Что есть: Связка ATMega64l + ADM2483. Размер кадра 9 бит.
Что получается:
Переключаю ADM2483 в режим передачи.
Жду очистки бита UDRE в регистре UCSR0A
Устанавливаю 9 бит UCSR0B|=(1<<TXB8)
Отправляю остальные данные UDR0=data
Жду передачи данных бит TXC0 регистра UCSR0A
Переключаю ADM2483 в режим приема
Жду получения данных бит RXC0 регистра UCSR0A
И тут возникает проблема: На PE0 никакой сигнал не поступает, но бит RXC0 устанавливается.
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение May 11 2007, 20:04
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



немного не понятно.
вы имеете ввиду что никакой инфы по каналу не проходи к меге64 а она все равно сигнализирует о приме?!
Go to the top of the page
 
+Quote Post
nss
сообщение May 11 2007, 20:05
Сообщение #3


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(eXeC001er @ May 12 2007, 00:04) *
немного не понятно.
вы имеете ввиду что никакой инфы по каналу не проходи к меге64 а она все равно сигнализирует о приме?!

Именно.
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение May 11 2007, 20:06
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



а не пробовали ли вы отключать приемник на время передачи?!
у вас схемное решение всего такое:
RE висит на земле постоянно, т.е. приемник включен всегда, а прием передачу вы переключаете путев подачи(снятия) "1" на DE. Получается что во время передачи происходит эхо, а так как регистры приема и пердачи физически разные в меге, то передаваемый байт тут же принимается, о чем вам и говорит флаг.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 11 2007, 20:12
Сообщение #5


кекс
******

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



Цитата
Жду очистки бита UDRE в регистре UCSR0A

Зачем его ждать, разве TXC0 не достаточно?...


Цитата
И тут возникает проблема: На PE0 никакой сигнал не поступает, но бит RXC0 устанавливается.
Мистика..
У вас на драйвере закорочены DE и RE?
если управляете только DE, то тогда приемник не блокируется в момент передачи, и сразу после отправки символа вы примете то, что отпралялось...
Go to the top of the page
 
+Quote Post
nss
сообщение May 11 2007, 20:17
Сообщение #6


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(defunct @ May 12 2007, 00:12) *
Зачем его ждать, разве TXC0 не достаточно?...
Мистика..
У вас на драйвере закорочены DE и RE?
если управляете только DE, то тогда приемник не блокируется в момент передачи, и сразу после отправки символа вы примете то, что отпралялось...

1) Перед этим может работать другая функция на отправку
2) DE и RE закорочены.

Цитата(eXeC001er @ May 12 2007, 00:06) *
а не пробовали ли вы отключать приемник на время передачи?!
у вас схемное решение всего такое:
RE висит на земле постоянно, т.е. приемник включен всегда, а прием передачу вы переключаете путев подачи(снятия) "1" на DE. Получается что во время передачи происходит эхо, а так как регистры приема и пердачи физически разные в меге, то передаваемый байт тут же принимается, о чем вам и говорит флаг.

Не помогает.
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение May 11 2007, 20:22
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



а чего хоть принимает то?!
Go to the top of the page
 
+Quote Post
nss
сообщение May 11 2007, 20:25
Сообщение #8


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(eXeC001er @ May 12 2007, 00:22) *
а чего хоть принимает то?!

UDR0 содержит нули.
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение May 11 2007, 20:27
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



а с нормальной (8-ми битной) посылкой все нормал?!
и код если можно.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 11 2007, 20:27
Сообщение #10


кекс
******

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



Цитата(nss @ May 11 2007, 22:17) *
1) Перед этим может работать другая функция на отправку

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

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

Цитата
2) DE и RE закорочены.

Вы можете сделать Double Check?
т.к. если это действительно так и нет короткого между RX0 и TX0, то вероятно что-то с 9-ти битным режимом. Еще сразу вопрос - что примнимается в UDR0 и RXB8 после передачи?

С вопросом уже опоздал...
Go to the top of the page
 
+Quote Post
nss
сообщение May 11 2007, 20:50
Сообщение #11


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(defunct @ May 12 2007, 00:27) *
Надобность все равно непонятна, если следовать вашему алгоритму, то после отправки кадра вы ждете чтобы переключить UART на прием, раз все равно ждете окончания передачи, зачем проверять UDRE?

Ну да ладно, несомневаюсь, в конечной программе у Вас будет все работать в прерываниях без ожиданий.
Вы можете сделать Double Check?
т.к. если это действительно так и нет короткого между RX0 и TX0, то вероятно что-то с 9-ти битным режимом. Еще сразу вопрос - что примнимается в UDR0 и RXB8 после передачи?

С вопросом уже опоздал...



Двойная проверка помогает
Код
    while(!(UCSR0A & (1<<RXC0)));
    tmp = UDR0;
    while(!(UCSR0A & (1<<RXC0)));


Цитата(eXeC001er @ May 12 2007, 00:27) *
а с нормальной (8-ми битной) посылкой все нормал?!
и код если можно.


в восьми битном режиме тоже самое
Собственно код
Код
    
    while(!(UCSR0A & (1<<UDRE)));
    PORTE|=RS485_IO;
        UCSR0B|=(1<<TXB8);
    UDR0 = (address<<4)|RS485_CMD_SEND;
    
    
    while(!(UCSR0A & (1<<TXC0) ));
      
    PORTE&=~RS485_IO;

    while(!(UCSR0A & (1<<RXC0)));

Инициализация порта
Код
    DDRE|=RS485_IO;

    UCSR0C|=(1<<UCSZ01)|(1<<UCSZ00);
    UBRR0L = 0x0B;
       UBRR0H = 0x00;
    UCSR0B|=(1<<RXEN0)|(1<<TXEN0)|(1<<UCSZ02);
Go to the top of the page
 
+Quote Post
defunct
сообщение May 11 2007, 21:13
Сообщение #12


кекс
******

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



Ок, давайте так:

Код
    while(!(UCSR0A & (1<<UDRE)));
    PORTE|=RS485_IO;
    if (UCSR0A & (1<<RXC0)) // Может символ был принят "до" отправки, а не "после".
    {
        volatile unsigned char tmp = UDR0;
    }
    UCSR0B|=(1<<TXB8);
    UDR0 = (address<<4)|RS485_CMD_SEND;
    
    
    while(!(UCSR0A & (1<<TXC0) ));
      
    PORTE&=~RS485_IO;

    while(!(UCSR0A & (1<<RXC0)));



И еще... Когда вы отключаете приемник, выход драйвера уходит в Z состояние, возможно на RX0 нужен pull-up
Go to the top of the page
 
+Quote Post
nss
сообщение May 11 2007, 21:27
Сообщение #13


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(defunct @ May 12 2007, 01:13) *
Ок, давайте так:

Код
    while(!(UCSR0A & (1<<UDRE)));
    PORTE|=RS485_IO;
    if (UCSR0A & (1<<RXC0)) // Может символ был принят "до" отправки, а не "после".
    {
        volatile unsigned char = UDR0;
    }
    UCSR0B|=(1<<TXB8);
    UDR0 = (address<<4)|RS485_CMD_SEND;
    
    
    while(!(UCSR0A & (1<<TXC0) ));
      
    PORTE&=~RS485_IO;

    while(!(UCSR0A & (1<<RXC0)));

И еще... Когда вы отключаете приемник, выход драйвера уходит в Z состояние, возможно на RX0 нужен pull-up

Флаг RXC0 устанавливается после передачи
pull-up ничего не дал.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 11 2007, 21:32
Сообщение #14


кекс
******

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



Цитата(nss @ May 11 2007, 23:27) *
pull-up ничего не дал.

Внешний? (внутренний не будет работать, т.к. отключается периферией уарта)
Go to the top of the page
 
+Quote Post
nss
сообщение May 12 2007, 09:22
Сообщение #15


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Всем спасибо. Проблему решил.
Виноваты были мои кривые руки и невыспавшийся мозг.
Были перепутаны резисторы защитного смещения со стороны дифференциальной линии. В следствии этого при переключении в режим приема присутствовал низкий уровень на входе PE0 (что для UART является стартовым битом). Выличилость правильным подключением резисторов защитного смещения.
Go to the top of the page
 
+Quote Post

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

 


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


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