fmdost 0 19 августа, 2007 Опубликовано 19 августа, 2007 (изменено) · Жалоба Доброго времени суток! Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё? Передаю сразу 2 байта, и жду прерывания, для переключения драйвера 485 на приём. Приёма на другом конце не происходит. Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём. ЗЫ. В прерывании сбрасывал флаг записью в него 1. При передаче 2х байт запрещал прерывания для неразрывности, всё равно ничего не добился. Смотрел по осцылу время нахождения в режиме передача, но ничего непонял. Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт? Изменено 20 августа, 2007 пользователем Т.Достоевский Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Доброго времени суток! Помогите разобраться с работой USART в tiny2313. Немогу понять как работает флаг TXC. В даташите написано что он выставляется по окончании передачи. Но там есть буферизация в 2 байта. Он выставляется если передал 1 байт или если передал всё? Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст и готов к отправке следующего байта. Рекомендую воспользоваться этим прерыванием. ЗЫ. В прерывании сбрасывал флаг записью в него 1. При передаче 2х байт запрещал прерывания для неразрывности, всё равно ничего не добился. Смотрел по осцылу время нахождения в режиме передача, но ничего непонял. Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт? Флаг в прерывании сбрасывать ненужно. Это происходит автоматически, если прерывание было вызвано. Вообще для отладки всего воспользуйтесь терминальной программой и подключите USART МК через MAX232 к com порту компьютера. Так Вы сумеете устранить все ошибки без особого усилия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Заслали Вы в буфер байт или 2 байта. начинается передача. если буфер пуст, то выставляется UDRE. Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC. Я использую оба флага. По UDRE подкачиваю данные в буфер, а поTXC перехожу на прием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC. Прошу прощения, не учел особенностей RS485 :01: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Для 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Заслали Вы в буфер байт или 2 байта. начинается передача. если буфер пуст, то выставляется UDRE. Но передача еще идет и в случаее RS485 нельзя переключаться на прием. Когда буфер будет пуст и будет отправлен последний бит, то выставиться TXC. Я использую оба флага. По UDRE подкачиваю данные в буфер, а поTXC перехожу на прием. Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IEC 1 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Сколько реально времени (включая служебные биты 1-четности и 1-стоп 9-ый) будет передавать 2 байта усарт? Зависит от скорости передачи Ftx (Бод -> бит в секуду ) Ttx = 1/Ftx - передача одного бита данных в секундах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 20 августа, 2007 Опубликовано 20 августа, 2007 (изменено) · Жалоба #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(); } } Перед передачей отключаю приемник и переключаю драйвер. По прерыванию переключаю драйвер и включаю приемник. Не совсем понял Ваш код в прерывании. Зачем нужна проверка флага? Изменено 20 августа, 2007 пользователем Т.Достоевский Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IEC 1 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Тоесть флаг TXC выставляется только по окончании передачи ВСЕГО? Но у меня почемуто не работает! Вечером заменю камень и перепроверю. ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба ВСЕГО байта, который был отправлен в буфер, т.е. после передачи стопового бита!!! Тоесть если Я отослал в буфер 2 байта то и прерываний будет 2? Зависит от скорости передачи Ftx (Бод -> бит в секуду ) Ttx = 1/Ftx - передача одного бита данных в секундах. Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Тоесть если Я отослал в буфер 2 байта то и прерываний будет 2? Спасибо! Незнал длинну битов "старт" и "стоп". По привычке считал её отличающейся от длинны обычных бит. Длина старт бита "по привычке" всегда была один бит. А длина стопа может быть 1-1.5-2 бита и задаётся вами же при инициализации УСАРТА. Смотрите внимательнее описалово. Если вы отослали 2 байта, то вы получите 2 прерывания: сначала UDRE потом TXC. Если передадите по первому UDRE третий байт, то получите 2 UDRE и один TXC. Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст и готов к отправке следующего байта. Рекомендую воспользоваться этим прерыванием. .... Прошу прощения, не учел особенностей RS485 01.gif Если хотите получить максимальную скорость обмена, то правильно будет использовать оба флага и при работе с RS232. По-моему это очевидно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Работает только если после передачи первого байта проверять флаг вручную и передавать второй байт после его установки. Соответственно так же переключаю на приём. Не надо ничего проверять. Сделайте очередь. В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием. PS: вы на чем пишете программу? asm/c? Честно говоря никогда не испольвал этот флаг. Использую вместо него UDRE, он выставляется если регистр данных передатчика пуст честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 20 августа, 2007 Опубликовано 20 августа, 2007 (изменено) · Жалоба Не надо ничего проверять. Сделайте очередь. В прерывании TXC посылайте следующий байт - если нечего слать - то переключайте линию на прием. PS: вы на чем пишете программу? asm/c? честно говоря никогда не использовал UDRE. Т.к. по TXC все что связано с 485-м реализуется гораздо удобнее, как бонус даже межсимвольный интервал непроизвольно получается. Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт. Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг! Изменено 20 августа, 2007 пользователем Т.Достоевский Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 20 августа, 2007 Опубликовано 20 августа, 2007 · Жалоба Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт. Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг! Простите пожалуйста, но лично у меня фраза "камень глючит" или "винда не так села" вызывает пену у рта и лёгкое подколбашивание. Кто-то на форуме собирал камни которые "глючат" как редкую реликвию. И, наверное перекупили бы у вас такой камень. К сожалению, скорее всего "глючит" другой прибор не техногенного происхождения. Во всяком случае с очень большой долей вероятности. Я бы рекомендовал провести больше тестов и лучше изучить работу USARTа на большем числе простейших тестах. Прерывание пока отложить, а просто анализировать регистр флагов выводя его в какой-нибудь порт. Так как похоже отладчика у вас нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 21 августа, 2007 Опубликовано 21 августа, 2007 · Жалоба Пишу на асме. Вот и Я этот бонус захотел. Всётаки наверное камень глючит. Походу 2 прерывания даёт. Посылаю сразу 2 байта. И получаю 2 прерывания по TXC! К сожалению новый будет только в четверг! Я где-то приводил пример работы с UART на asm'e.. Искать долго, поэтому просто прикляю его еще раз. смотрите в атаче. Пример написан под AT90S2313, чтобы переделать под Tiny2313 надо будет поменять таблицу векторов и возможно пару штрихов с настройкой UART'a. Так же надо будет выставить константы Fosc и BaudRate согласно вашим потребностям. константа .equ PD7 = 7 ; // объявим константу которая не прописана в .inc файле используется как флажек (прием/передачи) поменяйте ее на Pin которым у вас меняется направление (прием/передача) 485-го. у меня фраза "камень глючит" или "винда не так села" вызывает .... Согласен. Камень тут не причем. 2 TXC на 2 переданных байта - абсолютно нормальное поведение чипа. HelloWorld.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться