|
|
  |
Работа TXC в USART, Не могу разобраться с флагом "окончание передачи", помогите |
|
|
|
Aug 20 2007, 03:06
|

Познающий...
     
Группа: Свой
Сообщений: 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 порту компьютера. Так Вы сумеете устранить все ошибки без особого усилия.
--------------------
Выбор.
|
|
|
|
|
Aug 20 2007, 07:06
|
Тутэйшы
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 20 2007, 10:46
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(Т.Достоевский @ Aug 20 2007, 02:46)  Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт? Зависит от скорости передачи Ftx (Бод -> бит в секуду ) Ttx = 1/Ftx - передача одного бита данных в секундах.
|
|
|
|
|
Aug 20 2007, 10:47
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 20 2007, 10:49
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

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

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

|
Цитата(IEC @ Aug 20 2007, 14:49)  ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!! Тоесть если Я отослал в буфер 2 байта то и прерываний будет 2? Цитата(IEC @ Aug 20 2007, 14:46)  Зависит от скорости передачи Ftx (Бод -> бит в секуду ) Ttx = 1/Ftx - передача одного бита данных в секундах. Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит.
|
|
|
|
|
Aug 20 2007, 14:56
|
Гуру
     
Группа: Свой
Сообщений: 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. По-моему это очевидно.
|
|
|
|
|
Aug 20 2007, 15:46
|

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

|
Цитата Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём. Не надо ничего проверять. Сделайте очередь. В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием. PS: вы на чем пишете программу? asm/c? Цитата Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается.
|
|
|
|
|
Aug 20 2007, 20:11
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 21 2007, 00:41
|

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