AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.08.2013, 20:29
|
#21
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Сообщение от Godzilla82
|
Тогда не совсем понятно с прерыванием. Ну выставился он в 1. Теперь, если прерывание разрешено, оно возникает. Но мы в нём ничего не пишем в UDR0. И UDRIE0 не трогаем.
|
Так не бывает. Или пишем в UDR0, или запрещаем прерывания. Всё, как велит мануал. И да, будет возникать, пока не запишем что-то или не запретим.
Сообщение от Godzilla82
|
Логичнее обрабатывать прерывание по TXC.
|
Не. Тогда не будет нормально работать 485 ибо сразу после передачи байта надо отпускать линию (о чём вполне конкретно намекает мануал), в этом случае будет она дёргаться постоянно, да и задержки будут получаться между байтами, особенно на высоких скоростях.
|
|
|
|
25.08.2013, 21:23
|
#22
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
Тогда не будет нормально работать 485 ибо сразу после передачи байта надо отпускать линию (о чём вполне конкретно намекает мануал), в этом случае будет она дёргаться постоянно, да и задержки будут получаться между байтами, особенно на высоких скоростях.
|
Вот отпускать линию надо после передачи пакета - то есть всей строки или чего там. То есть, _tx.cnt = 0. А пока пакет передаётся, отключать ничего не надо. Да и по тактам быстрее будет. Лишние такты на проверку, на вкл/откл. прерываний.
|
|
|
|
26.08.2013, 19:48
|
#23
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
[РЕШЕНО] Глюк с UART при засыпании
Докладываю!
Первое предположение таки оказалось верным - правильная подготовка к засыпанию сводится к очистке UDRE и TXC с последующим ожиданием взвода TXC, как признака, что всё окончательно передалось.
Добавка сброса TXC в обработчик UDRIE сразу решила проблему.
Благодарю всех участников за дельные советы и идеи.
|
|
|
|
27.08.2013, 21:41
|
#24
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
Код стандартный, как его традиционно и делают в обработчике UDRE
|
Используйте, как говорит Годзила, прерывание завершения передачи байта, а не прерывание опустошения буфера, по типу закончили передавать байт, и если передали не всё, пихаем в УДР следующий. Код станет проще. Не надо никакие флаги будет чистить-ставить. И никаких пауз между байтами на осциле вам увидеть не удастся.
Последний раз редактировалось Someone; 27.08.2013 в 21:52.
|
|
|
|
28.08.2013, 10:07
|
#25
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Someone, В чищеном варианте, видимо, так и сделаю. Тем более под 485-й всё равно потребуется...
Остаётся пара сомнений:
1. Решается простым тестом - что окажется в TXC после передачи и запрещения прерываний? Взведётся ли он сам иди придётся делать флаг в обработчике прерывания... На досуге проверю, пока же надо побороть не желающего "засыпать" китайского nrf24l01+...
2. Непонятно почему тогда во всех примерах предлагают именно прерывание по UDRE? Настораживает
|
|
|
|
28.08.2013, 11:48
|
#26
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,925
Сказал спасибо: 2,986
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
Решается простым тестом - что окажется в TXC после передачи и запрещения прерываний? Взведётся ли он сам
|
Что значит "сам"? Если передача закончилась, новых данных не записали и сбросили флаг - то нет. "Самовзвод" только у UDRE.
Сообщение от av0000
|
2. Непонятно почему тогда во всех примерах предлагают именно прерывание по UDRE?
|
М.б. перфекционизм? 100% использование USART'а - как только можно записать данные их пишут и передача идёт без зазоров между "Stop" и "Start".
|
|
|
|
29.08.2013, 23:48
|
#27
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
1. Решается простым тестом - что окажется в TXC после передачи и запрещения прерываний?
|
TXC в смысле флага, или ты про UDR? Флаг выставится когда в линию уйдёт последний бит передаваемого байта, т.е. сдвиговый регистр (не буферный UDR, а тот, куда контроллер перегружает байт из UDR) опустеет. Естественно, если прерывания запрещены, ничего кроме установки флага не произойдёт.
Сообщение от av0000
|
Взведётся ли он сам иди придётся делать флаг в обработчике прерывания...
|
Взведётся в смысле сбросится? Да, после выполнения прерывания флаг сбрасывается автоматически при выходе из прерывания - потому выше и говорил - что никаких манипуляций с флагами не требуется. О бо всём этом кстати говорится в даташите: The Transmit Complete (TXCn) Flag bit is set one when the entire frame in the Transmit Shift Register has been shifted out and there are no new data currently present in the transmit buffer. The TXCn Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location.
Сообщение от av0000
|
2. Непонятно почему тогда во всех примерах предлагают именно прерывание по UDRE? Настораживает
|
Дык ясное дело, что написав в примере после описания флага UDRE
while ( !(UCSRA & (1‹‹UDRE)))
считают, что после описания флага TXC нет смысла повторять пример, отличающийся только в 4...5 символах:
while ( !(UCSRA & (1‹‹TXC)))
Сообщение от ForcePoint
|
передача идёт без зазоров между "Stop" и "Start".
|
А зазора нет при использовании любого из этих флагов, посмотрите осциллограмму передачи пакета из нескольких нескольких байт. Хоть в реале, хоть в протеусе или ещё каком симуляторе.
|
|
|
|
29.08.2013, 23:52
|
#28
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от ForcePoint
|
М.б. перфекционизм?
|
Тут скорее психология - в даташиты вникать не любят, лениво, нашли первое подходящее и ладно, типа вот пример, копи-паст его, дальше читать не интересно.
|
|
|
|
30.08.2013, 10:28
|
#29
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Someone,
По первому пункту, алгоритм :
- отправили последний байт в обработчике TXC
- счетчик байт обнулили /TXC сбросился/
- О! вот тут ответ на вопрос - здесь же запретили прерывания, раз счётчик нулевой.
- в tx_flush ждём взвода TXC
собственно, так и получилось - стоило внимательно задуматься над алгоритмом (даже пробовать не пришлось), как ответ нашелся сам собой. Сомнения были в том, как отловить TXC, если он сбрасывается при выходе из прерывания...
По второму. Видимо, таки - да, психология. С другой стороны в официальном мануале так все варианты разрисованы, а этот пропущен… Что-то мне вспоминается из "лохматых 2000-х" тема про "если использовать UDRE, то не возникнет пауз, коли придёт прерывание между посылками байта" - минимальная аппаратная буферизация, на случай если у меня много прерываний отъедают кучу времени. Но, учитывая давность и порядка 10 лет паузы, когда я занимался совсем другими контроллерами (не -микро, ) могу и фантазировать...
|
|
|
|
31.08.2013, 20:27
|
#30
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Глюк с UART при засыпании
Насчёт флага TXC:
Цитата:
|
The Transmit Complete (TXCn) Flag bit is set one when the entire frame in the Transmit Shift Register has been
shifted out and there are no new data currently present in the transmit buffer.
|
Тут не понятно. Вроде как устанавливается после сдвига всего фрейма (включая стартовые и стоповые биты) из регистра сдвига. Но! в регистре сдвига вроде как не должно быть стартового и стопового битов.
Другими словами, после установки флага начинает передаваться стоп-бит (а это на скорости 115200 аж 7 мкс).
В худшем случае да - возникнет задержка на вход в прерывание и до начала записи в UDR (около 20 тактов) - а это около 2 мкс при клоке 10 МГц.
Кстати, если до окончания передачи из регистра сдвига в регистр UDR что-то записать, то после завершения передачи текущего байта из сдвигового регистра флаг TCX не установится. Может я не так понял, поправьте.
Далее - зачем запрещать прерывание на передачу по TXC? Не надо этого делать. Это лишние такты. В обработчике - если нет данных для передачи - просто выходим. Есть - записываем в UDR очередной байт и корректируем счётчики.
Последний раз редактировалось Godzilla82; 31.08.2013 в 20:36.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:16.
|
|