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

 
 
> UART
Enot555
сообщение Apr 25 2008, 23:53
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 25-04-08
Пользователь №: 37 100



Доброго времени суток!
Подскажите, пожалуйста, как вывести контроллер (ATmega8) из режима передачи?
При организации прерываний по USART_DR_Empty и USART_Transmit_Complete после окончания передачи устанавливаются флаги UDRE и TXE и, поскольку UDRE имеет приоритет по прерываниям, то до TXE дело никогда не доходит. Как сбросить UDRE без записи в него новых данных (которые он воспринимает как данные для передачи следующего бита и так далее...)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
tazik
сообщение Apr 26 2008, 06:08
Сообщение #2


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

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Цитата
Хотя нет, попробовал на практике и не понял, ведь когда осуществляется прерывание по UDRIE, еще идет передача битов последнего байта.


Совершенно верно

Цитата
Как тогда контролировать окончание передачи, по последнему биту сдвигового регистра? Если так, то какой его (регистра) адрес (не нашел ни в одном описании)?.


Если Вы хотите "контролировать окончание передачи, по последнему биту сдвигового регистра", то используйте прерывание по TXC:UART Transmit complete.

This flag is
especially useful in half-duplex communications interfaces, where a transmitting application
must enter receive mode and free the communications bus immediately after
completing the transmission.

Т.е. этот флаг особенно полезен при работе с полудуплексным интерфейсом, когда передающее приложение должно перейти в режим приема и освободить линию связи сразу после завершения передачи.

Адреса внутреннего сдвигового регистра ни в одном описании Вы не найдете. Зачем оно нужно, если есть флаг TXC.

Похоже, что в Вашем случае линии TXD и RXD физически разделены (т.е. прием и передача по 2 разным проводам). Тогда лучше использовать прерывание UDRE: UART Data register empty.

Либо UDRE, либо TXC - сразу оба использовать не нужно (в общем случае)

Сообщение отредактировал tazik - Apr 26 2008, 06:11
Go to the top of the page
 
+Quote Post
Enot555
сообщение Apr 26 2008, 11:18
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 25-04-08
Пользователь №: 37 100



Либо UDRE, либо TXC - сразу оба использовать не нужно (в общем случае)

Спасибо, с использованием прерывания TXCIE побайтную передачу организовал.
Но все же мучает вопрос, как (можно ли) организовать передачу массива с использованием прерывания UDRIE, и после окончания передачи всего массива выключить передатчик. Ведь когда осуществляется прерывание по UDRIE, еще идет передача битов из сдвигового регистра, и если выключить передатчик из подпрограммы обработки прерывания, передача последнего байта завершена не будет.
Go to the top of the page
 
+Quote Post
tazik
сообщение Apr 26 2008, 18:31
Сообщение #4


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

Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691



Цитата(Enot555 @ Apr 26 2008, 19:18) *
Ведь когда осуществляется прерывание по UDRIE, еще идет передача битов из сдвигового регистра, и если выключить передатчик из подпрограммы обработки прерывания, передача последнего байта завершена не будет.


В принципе, mdmitry уже дал исчерпывающий ответ...

А как вы предполагаете выключать передатчик? Сбросом бита TXEN в UART Control register?
В документации по этому поводу написано:
Bit 3 – TXEN: Transmitter Enable
This bit enables the UART transmitter when set (one). When disabling the transmitter
while transmitting a character, the transmitter is not disabled before the character in the
shift register plus any following character in UDR has been completely transmitted.

В общем, даже если Вы запретите работу передатчика. Он все-таки завершит передачу данных из промежуточного регистра и следующего символа в регистре UDR (если он есть) и только после этого выключится.

Так что можете смело выключать передатчик - данные не потеряются

Сообщение отредактировал tazik - Apr 26 2008, 18:36
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:48
Рейтинг@Mail.ru


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