Перейти к содержанию
    

Доброго времени суток!

Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё?

Передаю сразу 2 байта, и жду прерывания, для переключения драйвера 485 на приём. Приёма на другом конце не происходит. Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём.

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

Изменено пользователем Т.Достоевский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё?

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заслали Вы в буфер байт или 2 байта.

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заслали Вы в буфер байт или 2 байта.

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

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

Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт?

Зависит от скорости передачи Ftx (Бод -> бит в секуду )

Ttx = 1/Ftx - передача одного бита данных в секундах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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();
  }
}

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

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

Изменено пользователем Т.Достоевский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю.

ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!!

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

 

Зависит от скорости передачи Ftx (Бод -> бит в секуду )

Ttx = 1/Ftx - передача одного бита данных в секундах.

Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит.

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

 

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

 

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

....

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

 

Если хотите получить максимальную скорость обмена, то правильно будет использовать оба флага и при работе с RS232. По-моему это очевидно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Не надо ничего проверять.

Сделайте очередь.

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не надо ничего проверять.

Сделайте очередь.

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

 

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

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

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

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

Изменено пользователем Т.Достоевский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

Я бы рекомендовал провести больше тестов и лучше изучить работу USARTа на большем числе простейших тестах. Прерывание пока отложить, а просто анализировать регистр флагов выводя его в какой-нибудь порт. Так как похоже отладчика у вас нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Я где-то приводил пример работы с UART на asm'e..

Искать долго, поэтому просто прикляю его еще раз.

смотрите в атаче.

 

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

 

константа

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

 

используется как флажек (прием/передачи)

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

 

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

Согласен. Камень тут не причем.

2 TXC на 2 переданных байта - абсолютно нормальное поведение чипа.

HelloWorld.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...