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

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

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

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

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

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

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

 
Опции темы

Глюк с UART при засыпании

Непрочитано 31.08.2013, 22:59  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,458
Сказал спасибо: 3,227
Сказали Спасибо 3,512 раз(а) в 2,393 сообщении(ях)
ForcePoint на пути к лучшему
Стрелка Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Тут не понятно. Вроде как устанавливается после сдвига всего фрейма (включая стартовые и стоповые биты) из регистра сдвига. Но! в регистре сдвига вроде как не должно быть стартового и стопового битов.
Написано именно то, что написано. В регистре сдвига передатчика находится полный фрейм, включая стартовый и стовый[ые] бит. См. "Frame formats" несколько раньше по тексту TFM.

Сообщение от Godzilla82 Посмотреть сообщение
Кстати, если до окончания передачи из регистра сдвига в регистр UDR что-то записать, то после завершения передачи текущего байта из сдвигового регистра флаг TCX не установится. Может я не так понял, поправьте.
Именно так, потому, что UDR буферизирован и для передачи (сам UDR с битом UDRE + сдвиговый регистр с битом TXC) и для приёма (UDR + FIFO на 2 байта + биты RXC и DOR).
Реклама:
ForcePoint вне форума  
Непрочитано 01.09.2013, 02:26  
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Далее - зачем запрещать прерывание на передачу по TXC? Не надо этого делать. Это лишние такты. В обработчике - если нет данных для передачи - просто выходим. Есть - записываем в UDR очередной байт и корректируем счётчики.
Я, наверно, посреди ночи "туплю", но как иначе поймать окончание передачи? Запрещение прерывания - только в конце всех данных, чтобы в flush_tx дождаться опустошения всех буферов и дальше спокойно заснуть... Пока есть что передавать, разумеется, просто передаём. А вот, как всё передали - уже делаем хоть какой признак, что очередь пуста. Изначальная-то беда была как раз в передаче мусора в момент засыпания с не полностью отправленным байтом.
av0000 вне форума  
Непрочитано 01.09.2013, 03:11  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
но как иначе поймать окончание передачи?
Если запрещать прерывание по TXC, то это и может быть признаком - TXCIE=0, значит буфер пуст и все байты переданы.

Сообщение от av0000 Посмотреть сообщение
Изначальная-то беда была как раз в передаче мусора в момент засыпания с не полностью отправленным байтом.
Если прерывания TXC не запрещать, то придётся в прерывании TXC выставить флаг окончания передачи, иначе никак.
Код:
volatile bool PacketTxc;
ISR(USARTC1_TXC_vect)
{
 if (BufferEmpty()) PacketTxc=true;
}
void Flush()
{
 while (PacketTxc==false) ;
}

void main ()
{
 //.....
 Flush();
 sleep();

}
Так что от незапрещения прерывания TXC экономии никакой нет.
_Артём_ вне форума  
Непрочитано 01.09.2013, 16:40  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от _Артём_ Посмотреть сообщение
Так что от незапрещения прерывания TXC экономии никакой нет.
Можно и проще:
void flush(void)
{
while(_tx.cnt);
delay_ms(1); // здесь нужно поставить время передачи 1 байта
}
Godzilla82 вне форума  
Непрочитано 01.09.2013, 17:37  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Можно и проще:
Можно проще, но зачем?
Что такого сложного в использовании прерывания TXC и даже DRE в придачу? Так сильно программа переусложняется от них? Элементарные же действия.
_Артём_ вне форума  
Непрочитано 01.09.2013, 21:15  
Wiza_
Гражданин KAZUS.RUN
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 980
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от _Артём_ Посмотреть сообщение
Что такого сложного в использовании прерывания TXC и даже DRE в придачу?
Если прерываний нет, то и новые городить не надо. Достаточно проверить DRE и в случае 1 проваливаться в сон.
Wiza_ вне форума  
Непрочитано 01.09.2013, 22:42  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от _Артём_ Посмотреть сообщение
Можно проще, но зачем?
Зачем усложнять? Надо стремиться к упрощению. Чем проще - тем "прозрачнее" программа, проще её анализировать, меньше ошибок, легче их находить. Да и работать будет быстрее.

P.S. всё гениальное - просто.
Godzilla82 вне форума  
Непрочитано 01.09.2013, 23:19  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Wiza_ Посмотреть сообщение
Если прерываний нет, то и новые городить не надо. Достаточно проверить DRE и в случае 1 проваливаться в сон.
ТС в конечном счёте хотел использовать RS485, а значит нужно определить момент когда нужно переключить драйвер на приём данных, что с DRE сделать не получится.

Да и в сон проваливаться не всегда выход, если сон это не idle.
_Артём_ вне форума  
Непрочитано 01.09.2013, 23:28  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Надо стремиться к упрощению. Чем проще - тем "прозрачнее" программа, проще её анализировать, меньше ошибок, легче их находить.
Стремится надо, но не всегда возможно сделать по простому.

Сообщение от Godzilla82 Посмотреть сообщение
Да и работать будет быстрее.
Не будет быстрей работать, вообще неработоспособной такая программа окажется. На delay_ms только что-то примитивное написать можно, какой-нибудь моргатель светодидом, не более.

Сообщение от Godzilla82 Посмотреть сообщение
P.S. всё гениальное - просто.
Но примитивное - не гениально.
_Артём_ вне форума  
Непрочитано 02.09.2013, 02:26  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от _Артём_ Посмотреть сообщение
Стремится надо, но не всегда возможно сделать по простому.
Но там, где можно просто - усложнять ни к чему.

Сообщение от _Артём_ Посмотреть сообщение
Не будет быстрей работать, вообще неработоспособной такая программа окажется. На delay_ms только что-то примитивное написать можно, какой-нибудь моргатель светодидом, не более.
Какой самоуверенный вывод. Настолько самоуверенный, насколько и неверный.
Godzilla82 вне форума  
 

Метки
avr, sleep, usart
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с передачей по 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, время: 05:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.