|
Окончание передачи UART |
|
|
|
Apr 5 2007, 07:23
|
Участник

Группа: Validating
Сообщений: 32
Регистрация: 7-06-05
Пользователь №: 5 790

|
Может, кому-то будет полезно...
Делал RS485 на ATMega128. Нужно было отлавливать момент окончания передачи символа - есть соответствующий бит TXC. Так вот, оказалось, что этот бит устанавливается почему-то ДО окончания передачи последнего символа (одновременно с TXE), хотя по datasheet должен по окончании. Когда по этому биту делал переключение драйвера на приём, последний символ не передавался. Пришлось делать программную задержку в виде пустого цикла.
Интересно, это был глюк только у меня или везде так. И также интересно, как у других ATMeg. Если кто-то сталкивался - поделитесь.
|
|
|
|
|
Apr 5 2007, 08:54
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Ioann @ Apr 5 2007, 07:23)  Может, кому-то будет полезно...
Делал RS485 на ATMega128. Нужно было отлавливать момент окончания передачи символа - есть соответствующий бит TXC. Так вот, оказалось, что этот бит устанавливается почему-то ДО окончания передачи последнего символа (одновременно с TXE), хотя по datasheet должен по окончании. Когда по этому биту делал переключение драйвера на приём, последний символ не передавался. Пришлось делать программную задержку в виде пустого цикла.
Интересно, это был глюк только у меня или везде так. И также интересно, как у других ATMeg. Если кто-то сталкивался - поделитесь. ...работаю с 128 и таких проблем не было, поищете ошибку у себя
|
|
|
|
|
Apr 5 2007, 09:03
|
Участник

Группа: Validating
Сообщений: 32
Регистрация: 7-06-05
Пользователь №: 5 790

|
1. прошу прощения, UDRE, а не TXC...
2. если подскажете, буду благодарен если укажете на ошибку (сам что-то не нашёл...), хоть из ситуации и вышел, но считаю что "криво", хочется всё-таки чтобы было красивее... вот выдержка из исходника:
// ждать окончания передачи... while((UCSR0A & (1<<TXC0)) == 0); - вот это и не даёт нужного эффекта
// очистить регистр признака приёма символов while (UCSR0A & (1<<RXC0)) symbol = UDR0; // временная задержка - подобрано - это взамен ожидания окончания передачи. for(i=0;i<3500;i++); // разрешить прерывания по приёму символов UCSR0B = UCSR0B | (1<<RXCIE0); // запретить передачу в драйвере RS-485 PORTE = PORTE & ~(1<<TxEN); - TxEN - это ножка порта E, что управляяет драйвером 485
|
|
|
|
|
Apr 5 2007, 09:38
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Ioann @ Apr 5 2007, 09:03)  1. прошу прощения, UDRE, а не TXC... 2. если подскажете, буду благодарен если укажете на ошибку (сам что-то не нашёл...) Использование прерывания несколько удобнее и понятнее (по крайней мере для меня) Код #pragma vector=USART0_TXC_vect __interrupt void USART0_transmit_complete(void) { usart0_status_timer = 2; usart0_status = Usart0WaitReceiving; }
фрагмент процесса обслуживания порта:
switch (usart0_status) ..... case Usart0Transmitting: if (!usart0_status_timer) { usart0_status = Usart0Unconfigured; } break;
case Usart0WaitReceiving: if (usart0_status_timer == 0) { ClearRxBuffer0(); SetReceiveDirection0(); usart0_status = Usart0Waiting; } break; }
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 5 2007, 09:38
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата(Ioann @ Apr 5 2007, 10:03)  1. прошу прощения, UDRE, а не TXC...
2. если подскажете, буду благодарен если укажете на ошибку (сам что-то не нашёл...) Ошыбку искать впадлу, скажу в обчем: УДРЕ устанавливается, когда регистр УДР на запись освобождается. При переносе из УДР в сдвиговый регистр УАРТа, например. ТХС устанавливается, когда из сдвигового регистра ушол хвост стоп-бита. 485 драйверить надо так: Засылаем строку в УАРТ. По УДРЕ набиваем УДР до блевоты. И контролируем загрузку последнего символа. ТХС игнорируем, т.е. запрещщяем. Загрузили последний символъ. Прерывания по УДРЕ запрещаем, сбрасываем ТХС, разрешаем прерывания по ТХС. Имеем в виду, что сейчас у нас один символ в сдвиговом регистре, второй - в УДР. Значить на втором ТХС калитку закрываем на приём.
|
|
|
|
|
Apr 5 2007, 10:02
|
Частый гость
 
Группа: Свой
Сообщений: 75
Регистрация: 7-04-05
Из: Украина
Пользователь №: 3 948

|
Цитата(mse @ Apr 5 2007, 09:38)  Ошыбку искать впадлу, скажу в обчем: Имеем в виду, что сейчас у нас один символ в сдвиговом регистре, второй - в УДР. Значить на втором ТХС калитку закрываем на приём. Палыч правильно сказал - прерывания по TXC не будет пока в UDR будут данные.... т.е прерывание по TXC будет только одно - по выдаче на TX стопового бита последнего передаваемого байта..
--------------------
Метрология - наука о достаточной точности.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|