|
|
  |
Проблемы USART0 + ADM2483, То ли лыжи не едут, ... |
|
|
|
May 11 2007, 20:05
|

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

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

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

|
Цитата Жду очистки бита UDRE в регистре UCSR0A Зачем его ждать, разве TXC0 не достаточно?... Цитата И тут возникает проблема: На PE0 никакой сигнал не поступает, но бит RXC0 устанавливается. Мистика.. У вас на драйвере закорочены DE и RE? если управляете только DE, то тогда приемник не блокируется в момент передачи, и сразу после отправки символа вы примете то, что отпралялось...
|
|
|
|
|
May 11 2007, 20:17
|

Частый гость
 
Группа: Свой
Сообщений: 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. Получается что во время передачи происходит эхо, а так как регистры приема и пердачи физически разные в меге, то передаваемый байт тут же принимается, о чем вам и говорит флаг. Не помогает.
|
|
|
|
|
May 11 2007, 20:25
|

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

|
Цитата(eXeC001er @ May 12 2007, 00:22)  а чего хоть принимает то?! UDR0 содержит нули.
|
|
|
|
|
May 11 2007, 20:27
|

кекс
     
Группа: Свой
Сообщений: 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 после передачи? С вопросом уже опоздал...
|
|
|
|
|
May 11 2007, 20:50
|

Частый гость
 
Группа: Свой
Сообщений: 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);
|
|
|
|
|
May 11 2007, 21:27
|

Частый гость
 
Группа: Свой
Сообщений: 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 ничего не дал.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|