Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

Закрытая тема
Опции темы
Непрочитано 25.08.2013, 20:29   #21
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Тогда не совсем понятно с прерыванием. Ну выставился он в 1. Теперь, если прерывание разрешено, оно возникает. Но мы в нём ничего не пишем в UDR0. И UDRIE0 не трогаем.
Так не бывает. Или пишем в UDR0, или запрещаем прерывания. Всё, как велит мануал. И да, будет возникать, пока не запишем что-то или не запретим.

Сообщение от Godzilla82 Посмотреть сообщение
Логичнее обрабатывать прерывание по TXC.
Не. Тогда не будет нормально работать 485 ибо сразу после передачи байта надо отпускать линию (о чём вполне конкретно намекает мануал), в этом случае будет она дёргаться постоянно, да и задержки будут получаться между байтами, особенно на высоких скоростях.
Реклама:
av0000 вне форума  
Непрочитано 25.08.2013, 21:23   #22
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
Тогда не будет нормально работать 485 ибо сразу после передачи байта надо отпускать линию (о чём вполне конкретно намекает мануал), в этом случае будет она дёргаться постоянно, да и задержки будут получаться между байтами, особенно на высоких скоростях.
Вот отпускать линию надо после передачи пакета - то есть всей строки или чего там. То есть, _tx.cnt = 0. А пока пакет передаётся, отключать ничего не надо. Да и по тактам быстрее будет. Лишние такты на проверку, на вкл/откл. прерываний.
Godzilla82 вне форума  
Непрочитано 26.08.2013, 19:48   #23
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
Хорошо [РЕШЕНО] Глюк с UART при засыпании

Докладываю!
Первое предположение таки оказалось верным - правильная подготовка к засыпанию сводится к очистке UDRE и TXC с последующим ожиданием взвода TXC, как признака, что всё окончательно передалось.

Добавка сброса TXC в обработчик UDRIE сразу решила проблему.

Благодарю всех участников за дельные советы и идеи.
av0000 вне форума  
Непрочитано 27.08.2013, 21:41   #24
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
Код стандартный, как его традиционно и делают в обработчике UDRE
Используйте, как говорит Годзила, прерывание завершения передачи байта, а не прерывание опустошения буфера, по типу закончили передавать байт, и если передали не всё, пихаем в УДР следующий. Код станет проще. Не надо никакие флаги будет чистить-ставить. И никаких пауз между байтами на осциле вам увидеть не удастся.

Последний раз редактировалось Someone; 27.08.2013 в 21:52.
Someone вне форума  
Непрочитано 28.08.2013, 10:07   #25
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Someone, В чищеном варианте, видимо, так и сделаю. Тем более под 485-й всё равно потребуется...

Остаётся пара сомнений:
1. Решается простым тестом - что окажется в TXC после передачи и запрещения прерываний? Взведётся ли он сам иди придётся делать флаг в обработчике прерывания... На досуге проверю, пока же надо побороть не желающего "засыпать" китайского nrf24l01+...

2. Непонятно почему тогда во всех примерах предлагают именно прерывание по UDRE? Настораживает
av0000 вне форума  
Непрочитано 28.08.2013, 11:48   #26
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,925
Сказал спасибо: 2,986
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
Решается простым тестом - что окажется в TXC после передачи и запрещения прерываний? Взведётся ли он сам
Что значит "сам"? Если передача закончилась, новых данных не записали и сбросили флаг - то нет. "Самовзвод" только у UDRE.

Сообщение от av0000 Посмотреть сообщение
2. Непонятно почему тогда во всех примерах предлагают именно прерывание по UDRE?
М.б. перфекционизм? 100% использование USART'а - как только можно записать данные их пишут и передача идёт без зазоров между "Stop" и "Start".
ForcePoint вне форума  
Непрочитано 29.08.2013, 23:48   #27
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию 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".
А зазора нет при использовании любого из этих флагов, посмотрите осциллограмму передачи пакета из нескольких нескольких байт. Хоть в реале, хоть в протеусе или ещё каком симуляторе.
Someone вне форума  
Непрочитано 29.08.2013, 23:52   #28
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от ForcePoint Посмотреть сообщение
М.б. перфекционизм?
Тут скорее психология - в даташиты вникать не любят, лениво, нашли первое подходящее и ладно, типа вот пример, копи-паст его, дальше читать не интересно.
Someone вне форума  
Непрочитано 30.08.2013, 10:28   #29
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Someone,
По первому пункту, алгоритм :
- отправили последний байт в обработчике TXC
- счетчик байт обнулили /TXC сбросился/
- О! вот тут ответ на вопрос - здесь же запретили прерывания, раз счётчик нулевой.
- в tx_flush ждём взвода TXC

собственно, так и получилось - стоило внимательно задуматься над алгоритмом (даже пробовать не пришлось), как ответ нашелся сам собой. Сомнения были в том, как отловить TXC, если он сбрасывается при выходе из прерывания...

По второму. Видимо, таки - да, психология. С другой стороны в официальном мануале так все варианты разрисованы, а этот пропущен… Что-то мне вспоминается из "лохматых 2000-х" тема про "если использовать UDRE, то не возникнет пауз, коли придёт прерывание между посылками байта" - минимальная аппаратная буферизация, на случай если у меня много прерываний отъедают кучу времени. Но, учитывая давность и порядка 10 лет паузы, когда я занимался совсем другими контроллерами (не -микро, ) могу и фантазировать...
av0000 вне форума  
Непрочитано 31.08.2013, 20:27   #30
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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.
Godzilla82 вне форума  
Закрытая тема

Закладки

Метки
avr, sleep, usart

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Омывание стирального бака СМА при полоскании Слесарь Делимся опытом 33 29.05.2013 00:03
Проблемы с передачей по UART, нужна помощь sansan25 Микроконтроллеры, АЦП, память и т.д 3 28.01.2012 13:19
Водка и как с ней бороться SerjT Отвлекитесь, эмбеддеры! 108 29.09.2009 21:25
Проблема с электропитанием квартиры tourent Источники питания и свет 85 16.09.2009 07:51
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49


Часовой пояс GMT +4, время: 01:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot