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

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

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

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

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

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

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

Закрытая тема
Опции темы
Непрочитано 31.08.2013, 22:59   #31
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,924
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
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   #32
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Далее - зачем запрещать прерывание на передачу по TXC? Не надо этого делать. Это лишние такты. В обработчике - если нет данных для передачи - просто выходим. Есть - записываем в UDR очередной байт и корректируем счётчики.
Я, наверно, посреди ночи "туплю", но как иначе поймать окончание передачи? Запрещение прерывания - только в конце всех данных, чтобы в flush_tx дождаться опустошения всех буферов и дальше спокойно заснуть... Пока есть что передавать, разумеется, просто передаём. А вот, как всё передали - уже делаем хоть какой признак, что очередь пуста. Изначальная-то беда была как раз в передаче мусора в момент засыпания с не полностью отправленным байтом.
av0000 вне форума  
Непрочитано 01.09.2013, 03:11   #33
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 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   #34
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

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

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

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

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

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

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

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

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

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

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

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

Сообщение от _Артём_ Посмотреть сообщение
Не будет быстрей работать, вообще неработоспособной такая программа окажется. На delay_ms только что-то примитивное написать можно, какой-нибудь моргатель светодидом, не более.
Какой самоуверенный вывод. Настолько самоуверенный, насколько и неверный.
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, время: 23:31.


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