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

 
 
> Обьясните разницу в прерываниях UART'a
kurtis
сообщение Dec 25 2008, 14:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Вероятно, я недостаточно внимательно читаю документацию, но возникает вопрос в чем разница между Data Register Empty Interrupt и Transmit Compete Interrupt ? Насколько я понял, это 2 прерывания которые возникают при оправке данных, но первое возникает когда данные из регистра данных попадают в сдвиговый регистр для отправки, а второе когда сдвиговый регистр выдал байт в сеть (насколько я понял). Но тогда получается что они выполняют практически одну и туже задачу.
В чем же тогда разница и зачем потребовалось делать именно 2 прерывания, а не одно ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kurtis
сообщение Dec 25 2008, 14:52
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Ну т.е. если используется Data Register Empty Interrupt и все работает, то особого смысла нету лезть и переделывать что-то под Transmit Compete Interrupt ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 15:45
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(kurtis @ Dec 25 2008, 16:52) *
Ну т.е. если используется Data Register Empty Interrupt и все работает, то особого смысла нету лезть и переделывать что-то под Transmit Compete Interrupt ?
UART имеет двойную буферизацию. Вы кладете байт в UDR, он "проваливается" в сдвигатель (UDR при этом оказывается свободным), и начинает передаваться из сдвигателя. В момент "проваливания" генерится прерывание UDRE, т.е. вы можете писать в UDR следующий байт и он будет ждать в UDR пока освободится сдвигатель. Сдвигатель освободился (заметьте, выданы только биты данных, биты четности и стоп-биты еще не переданы) - в него тут же будет записан новый байт из UDR (при этом UDR освободился и сгенерировано очередное прерывание UDRE), и после передачи стопового бита UART сможет сразу же, без пауз, начинать передачу очередного байта. Т.е. при передачи без пауз у вас есть запас по времени на запись очередного байта в UDR, равный времени передачи 8 бит+бита четности+стоп-битов.
Прерывание TXC возникает, когда выдвинут весь ваш байт из сдвигаетеля, после него выданы на выход бит четности (если включен) и стоп-биты, и к этому моменту в UDR нового байта нет. Если вы организуете запись в UDR по прерыванию TXC, то вы никак не сможете пердавать без пауз - после выдачи стоп-бита будет пауза пока вы отреагируете на прерывание и положите очередной байт в UDR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 25 2008, 20:20
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Сергей Борщ @ Dec 25 2008, 19:45) *
Если вы организуете запись в UDR по прерыванию TXC, то вы никак не сможете пердавать без пауз

И, кстати, это не всегда вредно. smile.gif Если Вам обязательно надо иметь паузу больше, чем 2 стоп-бита, то без TXC это очень сложно реализовать.
Go to the top of the page
 
+Quote Post



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

 


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


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