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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Работа TXC в USART, Не могу разобраться с флагом "окончание передачи", помогите
fmdost
сообщение Aug 19 2007, 23:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток!
Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё?
Передаю сразу 2 байта, и жду прерывания, для переключения драйвера 485 на приём. Приёма на другом конце не происходит. Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём.
ЗЫ. В прерывании сбрасывал флаг записью в него 1. При передаче 2х байт запрещал прерывания для неразрывности, всё равно ничего не добился. Смотрел по осцылу время нахождения в режиме передача, но ничего непонял. Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт?

Сообщение отредактировал Т.Достоевский - Aug 20 2007, 00:03
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 20 2007, 03:06
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(Т.Достоевский @ Aug 20 2007, 08:46) *
Доброго времени суток!
Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё?

Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст и готов к отправке следующего байта. Рекомендую воспользоваться этим прерыванием.
Цитата(Т.Достоевский @ Aug 20 2007, 08:46) *
ЗЫ. В прерывании сбрасывал флаг записью в него 1. При передаче 2х байт запрещал прерывания для неразрывности, всё равно ничего не добился. Смотрел по осцылу время нахождения в режиме передача, но ничего непонял. Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт?

Флаг в прерывании сбрасывать ненужно. Это происходит автоматически, если прерывание было вызвано.

Вообще для отладки всего воспользуйтесь терминальной программой и подключите USART МК через MAX232 к com порту компьютера. Так Вы сумеете устранить все ошибки без особого усилия.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 20 2007, 04:04
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Заслали Вы в буфер байт или 2 байта.
начинается передача. если буфер пуст, то выставляется UDRE. Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC.


Я использую оба флага. По UDRE подкачиваю данные в буфер, а поTXC перехожу на прием.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 20 2007, 04:48
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(arttab @ Aug 20 2007, 13:04) *
Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC.

Прошу прощения, не учел особенностей RS485 01.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
vesago
сообщение Aug 20 2007, 07:06
Сообщение #5


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Для 485 я пользую следующие конструкции:
Код
//POPTE
#define RXD0                0
#define TXD0                1

#define RS485_DDR           DDRE
#define RS485_PORT          PORTE
#define RS485_PIN           PINE

#define GL_BUS_DIR          2
#define Global_Bus_RS485_Dir_RX() {RS485_PORT &= ~(1<<GL_BUS_DIR);}
#define Global_Bus_RS485_Dir_TX() {RS485_PORT |= (1<<GL_BUS_DIR);}

#define LL_BUS_DIR          3
#define Local_Bus_RS485_Dir_RX()  {RS485_PORT &= ~(1<<LL_BUS_DIR);}
#define Local_Bus_RS485_Dir_TX()  {RS485_PORT |= (1<<LL_BUS_DIR);}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Запрет приема
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void USART0_DisableRecive(void)
{
  UCSR0B &= ~(1 << RXEN0);
  Global_Bus_RS485_Dir_TX();
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Разрешение приема
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void USART0_EnableRecive(void)
{
  Global_Bus_RS485_Dir_RX();
  UCSR0B |= (1 << RXEN0);
}


#pragma vector=USART0_TXC_vect
__interrupt void USART0_TX_interrupt( void )
{
  if((usart0.flags & (1<<USART0_FLAG_TX_COMPLETE)) != 0)
  {
    usart0.flags &= ~(1<<USART0_FLAG_TX_COMPLETE);
    usart0.flags |= (1<<USART0_FLAG_SHIFT_REG_EMPTY);
    USART0_EnableRecive();
  }
}


Перед передачей отключаю приемник и переключаю драйвер. По прерыванию переключаю драйвер и включаю приемник.
Прикрепленные файлы
Прикрепленный файл  drv.rar ( 1.88 килобайт ) Кол-во скачиваний: 66
 
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 20 2007, 10:44
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(arttab @ Aug 20 2007, 08:04) *
Заслали Вы в буфер байт или 2 байта.
начинается передача. если буфер пуст, то выставляется UDRE. Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC.
Я использую оба флага. По UDRE подкачиваю данные в буфер, а поTXC перехожу на прием.

Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю.
Go to the top of the page
 
+Quote Post
IEC
сообщение Aug 20 2007, 10:46
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Цитата(Т.Достоевский @ Aug 20 2007, 02:46) *
Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт?

Зависит от скорости передачи Ftx (Бод -> бит в секуду )
Ttx = 1/Ftx - передача одного бита данных в секундах.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 20 2007, 10:47
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(vesago @ Aug 20 2007, 11:06) *
Код
#pragma vector=USART0_TXC_vect
__interrupt void USART0_TX_interrupt( void )
{
  if((usart0.flags & (1<<USART0_FLAG_TX_COMPLETE)) != 0) ???????????????????? ВОТ ЭТА ??????????
  {
    usart0.flags &= ~(1<<USART0_FLAG_TX_COMPLETE);
    usart0.flags |= (1<<USART0_FLAG_SHIFT_REG_EMPTY);
    USART0_EnableRecive();
  }
}

Перед передачей отключаю приемник и переключаю драйвер. По прерыванию переключаю драйвер и включаю приемник.

Не совсем понял Ваш код в прерывании. Зачем нужна проверка флага?

Сообщение отредактировал Т.Достоевский - Aug 20 2007, 11:03
Go to the top of the page
 
+Quote Post
IEC
сообщение Aug 20 2007, 10:49
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Цитата(Т.Достоевский @ Aug 20 2007, 13:44) *
Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю.

ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!!
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 20 2007, 11:02
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(IEC @ Aug 20 2007, 14:49) *
ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!!

Тоесть если Я отослал в буфер 2 байта то и прерываний будет 2?

Цитата(IEC @ Aug 20 2007, 14:46) *
Зависит от скорости передачи Ftx (Бод -> бит в секуду )
Ttx = 1/Ftx - передача одного бита данных в секундах.

Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 20 2007, 14:56
Сообщение #11


Гуру
******

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



Цитата(Т.Достоевский @ Aug 20 2007, 14:02) *
Тоесть если Я отослал в буфер 2 байта то и прерываний будет 2?
Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит.

Длина старт бита "по привычке" всегда была один бит. А длина стопа может быть 1-1.5-2 бита и задаётся вами же при инициализации УСАРТА. Смотрите внимательнее описалово.

Если вы отослали 2 байта, то вы получите 2 прерывания: сначала UDRE потом TXC. Если передадите по первому UDRE третий байт, то получите 2 UDRE и один TXC.

Цитата(haker_fox @ Aug 20 2007, 14:02) *
Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст и готов к отправке следующего байта. Рекомендую воспользоваться этим прерыванием.
....
Прошу прощения, не учел особенностей RS485 01.gif


Если хотите получить максимальную скорость обмена, то правильно будет использовать оба флага и при работе с RS232. По-моему это очевидно.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 20 2007, 15:46
Сообщение #12


кекс
******

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



Цитата
Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём.

Не надо ничего проверять.
Сделайте очередь.
В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием.

PS: вы на чем пишете программу? asm/c?

Цитата
Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст

честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Aug 20 2007, 20:11
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Aug 20 2007, 19:46) *
Не надо ничего проверять.
Сделайте очередь.
В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием.

PS: вы на чем пишете программу? asm/c?
честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается.

Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт.
Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг!

Сообщение отредактировал Т.Достоевский - Aug 20 2007, 20:13
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 20 2007, 22:56
Сообщение #14


Гуру
******

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



Цитата(Т.Достоевский @ Aug 20 2007, 23:11) *
Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт.
Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг!


Простите пожалуйста, но лично у меня фраза "камень глючит" или "винда не так села" вызывает пену у рта и лёгкое подколбашивание. Кто-то на форуме собирал камни которые "глючат" как редкую реликвию. И, наверное перекупили бы у вас такой камень. К сожалению, скорее всего "глючит" другой прибор не техногенного происхождения. Во всяком случае с очень большой долей вероятности.

Я бы рекомендовал провести больше тестов и лучше изучить работу USARTа на большем числе простейших тестах. Прерывание пока отложить, а просто анализировать регистр флагов выводя его в какой-нибудь порт. Так как похоже отладчика у вас нет.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 21 2007, 00:41
Сообщение #15


кекс
******

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



Цитата(Т.Достоевский @ Aug 20 2007, 23:11) *
Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт.
Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг!

Я где-то приводил пример работы с UART на asm'e..
Искать долго, поэтому просто прикляю его еще раз.
смотрите в атаче.

Пример написан под AT90S2313, чтобы переделать под Tiny2313 надо будет поменять таблицу векторов и возможно пару штрихов с настройкой UART'a. Так же надо будет выставить константы Fosc и BaudRate согласно вашим потребностям.

константа
.equ PD7 = 7 ; // объявим константу которая не прописана в .inc файле

используется как флажек (прием/передачи)
поменяйте ее на Pin которым у вас меняется направление (прием/передача) 485-го.

Цитата
у меня фраза "камень глючит" или "винда не так села" вызывает ....

Согласен. Камень тут не причем.
2 TXC на 2 переданных байта - абсолютно нормальное поведение чипа.
Прикрепленные файлы
Прикрепленный файл  HelloWorld.zip ( 3.79 килобайт ) Кол-во скачиваний: 100
 
Go to the top of the page
 
+Quote Post

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

 


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


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