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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Окончание передачи 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
bgc
сообщение Apr 5 2007, 08:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



у меня на 64 меге все ок. По биту освобождения буфера передачи (окончания передачи) (отличается от готовности передатчика к приему следующего байта) я отключаю передатчик 485.
На глюк не похоже. Либо ошибка в программе, либо непонимание описания.


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 5 2007, 08:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Ioann @ Apr 5 2007, 07:23) *
Может, кому-то будет полезно...
Интересно, это был глюк только у меня или везде так. И также интересно, как у других ATMeg. Если кто-то сталкивался - поделитесь.

Полезно не будет :-)
На 128, 32 - все нормально. Ищите ошибку у себя.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 5 2007, 08:18
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Пример передачи символа из DS не привязан к конкретной реализации интерфейса, сам налетел на эти грабли с RS485. Смотри предыдущие сообщения ( биты окончания передачи и освобождения буфера) и все будет нормально.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 5 2007, 08:37
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



TXE - это что за бит? Наверное, нужно читать - UDRE?
Проблема с определением окончания передачи у меня возникала только на больших скоростях (2 Mбод). При прерываниях по UDRE за время запихивания очередного (последного в последовательности на передачу) байта иногда оказывался переданным байт из сдвигового регистра - и бит TXC оказывался установленным. Сброс ТXC после записи в UDR исправляет ситуацию.
Go to the top of the page
 
+Quote Post
tag
сообщение Apr 5 2007, 08:54
Сообщение #6


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Ioann @ Apr 5 2007, 07:23) *
Может, кому-то будет полезно...

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

Интересно, это был глюк только у меня или везде так. И также интересно, как у других ATMeg. Если кто-то сталкивался - поделитесь.



...работаю с 128 и таких проблем не было, поищете ошибку у себя
Go to the top of the page
 
+Quote Post
Ioann
сообщение Apr 5 2007, 09:03
Сообщение #7


Участник
*

Группа: 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
Палыч
сообщение Apr 5 2007, 09:24
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Выдержка из исходника - обработчик прерывания по UDRE? Обработчика прерывания по TXC - нет? TXC сбрасывается аппаратно по обработке прерывания по TXC. Если обработчика этого прерывания нет, то бит TXC нужно сбрасывать программно.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 5 2007, 09:38
Сообщение #9


Гуру
******

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
mse
сообщение Apr 5 2007, 09:38
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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
Палыч
сообщение Apr 5 2007, 09:49
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Цитата из DS на m128: USART Control and Status Register A Bit 6 – TXCn: USART Transmit Complete

This flag bit is set when the entire frame in the Transmit Shift Register has been shifted
out and there are no new data currently present in the transmit buffer (UDRn).
Go to the top of the page
 
+Quote Post
XsanyaX
сообщение Apr 5 2007, 10:02
Сообщение #12


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

Группа: Свой
Сообщений: 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
Kuzmi4
сообщение Apr 5 2007, 10:03
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 bgc - в принципе если вам будет интересно , то я тут где то выкладывал проэктик как раз такого плана, поищите по форуму - то что он рабочий - проверял не я один и не один день, и всё работало как надо.
Если не найдёте, могу выслать - мне не жалко..
да , проверял на меге 8-й и 168-й, и 16-й..

Сообщение отредактировал Kuzmi4 - Apr 5 2007, 10:03
Go to the top of the page
 
+Quote Post
mse
сообщение Apr 5 2007, 11:18
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Apr 5 2007, 12:11
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Делал на м640 и на 8515. Использовал все признаки и прерывания. Использовал все сигналы интерфейса. Также ни одной ошибки или неточности не находил!
Go to the top of the page
 
+Quote Post

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

 


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


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