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

 
 
> Окончание передачи UART
Ioann
сообщение Apr 5 2007, 07:23
Сообщение #1


Участник
*

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



Может, кому-то будет полезно...

Делал RS485 на ATMega128. Нужно было отлавливать момент окончания передачи символа - есть соответствующий бит TXC. Так вот, оказалось, что этот бит устанавливается почему-то ДО окончания передачи последнего символа (одновременно с TXE), хотя по datasheet должен по окончании. Когда по этому биту делал переключение драйвера на приём, последний символ не передавался. Пришлось делать программную задержку в виде пустого цикла.

Интересно, это был глюк только у меня или везде так. И также интересно, как у других ATMeg. Если кто-то сталкивался - поделитесь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ioann
сообщение Apr 5 2007, 09:03
Сообщение #2


Участник
*

Группа: 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
Go to the top of the page
 
+Quote Post
mse
сообщение Apr 5 2007, 09:38
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Ioann @ Apr 5 2007, 10:03) *
1. прошу прощения, UDRE, а не TXC...

2. если подскажете, буду благодарен если укажете на ошибку (сам что-то не нашёл...)

Ошыбку искать впадлу, скажу в обчем:
УДРЕ устанавливается, когда регистр УДР на запись освобождается. При переносе из УДР в сдвиговый регистр УАРТа, например.
ТХС устанавливается, когда из сдвигового регистра ушол хвост стоп-бита.

485 драйверить надо так:
Засылаем строку в УАРТ. По УДРЕ набиваем УДР до блевоты. И контролируем загрузку последнего символа. ТХС игнорируем, т.е. запрещщяем. Загрузили последний символъ. Прерывания по УДРЕ запрещаем, сбрасываем ТХС, разрешаем прерывания по ТХС. Имеем в виду, что сейчас у нас один символ в сдвиговом регистре, второй - в УДР. Значить на втором ТХС калитку закрываем на приём.
Go to the top of the page
 
+Quote Post
XsanyaX
сообщение Apr 5 2007, 10:02
Сообщение #4


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

Группа: Свой
Сообщений: 75
Регистрация: 7-04-05
Из: Украина
Пользователь №: 3 948



Цитата(mse @ Apr 5 2007, 09:38) *
Ошыбку искать впадлу, скажу в обчем:
Имеем в виду, что сейчас у нас один символ в сдвиговом регистре, второй - в УДР. Значить на втором ТХС калитку закрываем на приём.


Палыч правильно сказал - прерывания по TXC не будет пока в UDR будут данные....
т.е прерывание по TXC будет только одно - по выдаче на TX стопового бита последнего передаваемого байта..


--------------------
Метрология - наука о достаточной точности.
Go to the top of the page
 
+Quote Post
mse
сообщение Apr 5 2007, 11:18
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(XsanyaX @ Apr 5 2007, 11:02) *
Палыч правильно сказал - прерывания по TXC не будет пока в UDR будут данные....
т.е прерывание по TXC будет только одно - по выдаче на TX стопового бита последнего передаваемого байта..

Да, имана так. Тормознул. В программках имана так и закладывал.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ioann   Окончание передачи UART   Apr 5 2007, 07:23
- - bgc   у меня на 64 меге все ок. По биту освобождения буф...   Apr 5 2007, 08:01
- - Dog Pawlowa   Цитата(Ioann @ Apr 5 2007, 07:23) Может, ...   Apr 5 2007, 08:09
- - VladimirYU   Пример передачи символа из DS не привязан к конкр...   Apr 5 2007, 08:18
- - Палыч   TXE - это что за бит? Наверное, нужно читать - UD...   Apr 5 2007, 08:37
- - tag   Цитата(Ioann @ Apr 5 2007, 07:23) Может, ...   Apr 5 2007, 08:54
|- - Dog Pawlowa   Цитата(Ioann @ Apr 5 2007, 09:03) 1. прош...   Apr 5 2007, 09:38
|- - Палыч   Цитата(mse @ Apr 5 2007, 09:38) Имеем в в...   Apr 5 2007, 09:49
- - Палыч   Выдержка из исходника - обработчик прерывания по U...   Apr 5 2007, 09:24
- - Kuzmi4   2 bgc - в принципе если вам будет интересно , то я...   Apr 5 2007, 10:03
- - SasaVitebsk   Делал на м640 и на 8515. Использовал все признаки ...   Apr 5 2007, 12:11
- - Ioann   Понял, что надо мне проверить, сбрасываю ли TXC пр...   Apr 5 2007, 12:36
- - defunct   ЦитатаДелал RS485 на ATMega128. Нужно было отлавли...   Apr 5 2007, 19:37


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

 


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


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