Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы USART0 + ADM2483
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
nss
Что есть: Связка ATMega64l + ADM2483. Размер кадра 9 бит.
Что получается:
Переключаю ADM2483 в режим передачи.
Жду очистки бита UDRE в регистре UCSR0A
Устанавливаю 9 бит UCSR0B|=(1<<TXB8)
Отправляю остальные данные UDR0=data
Жду передачи данных бит TXC0 регистра UCSR0A
Переключаю ADM2483 в режим приема
Жду получения данных бит RXC0 регистра UCSR0A
И тут возникает проблема: На PE0 никакой сигнал не поступает, но бит RXC0 устанавливается.
eXeC001er
немного не понятно.
вы имеете ввиду что никакой инфы по каналу не проходи к меге64 а она все равно сигнализирует о приме?!
nss
Цитата(eXeC001er @ May 12 2007, 00:04) *
немного не понятно.
вы имеете ввиду что никакой инфы по каналу не проходи к меге64 а она все равно сигнализирует о приме?!

Именно.
eXeC001er
а не пробовали ли вы отключать приемник на время передачи?!
у вас схемное решение всего такое:
RE висит на земле постоянно, т.е. приемник включен всегда, а прием передачу вы переключаете путев подачи(снятия) "1" на DE. Получается что во время передачи происходит эхо, а так как регистры приема и пердачи физически разные в меге, то передаваемый байт тут же принимается, о чем вам и говорит флаг.
defunct
Цитата
Жду очистки бита UDRE в регистре UCSR0A

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


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

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

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

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

UDR0 содержит нули.
eXeC001er
а с нормальной (8-ми битной) посылкой все нормал?!
и код если можно.
defunct
Цитата(nss @ May 11 2007, 22:17) *
1) Перед этим может работать другая функция на отправку

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

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

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

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

С вопросом уже опоздал...
nss
Цитата(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);
defunct
Ок, давайте так:

Код
    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
nss
Цитата(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 ничего не дал.
defunct
Цитата(nss @ May 11 2007, 23:27) *
pull-up ничего не дал.

Внешний? (внутренний не будет работать, т.к. отключается периферией уарта)
nss
Всем спасибо. Проблему решил.
Виноваты были мои кривые руки и невыспавшийся мозг.
Были перепутаны резисторы защитного смещения со стороны дифференциальной линии. В следствии этого при переключении в режим приема присутствовал низкий уровень на входе PE0 (что для UART является стартовым битом). Выличилость правильным подключением резисторов защитного смещения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.