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

 
 
> Проблемы 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
 
Start new topic
Ответов
defunct
сообщение May 11 2007, 20:12
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Свой
Сообщений: 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
defunct
сообщение May 11 2007, 20:27
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 13:18
Рейтинг@Mail.ru


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