AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.08.2013, 22:59
|
#31
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,924
Сказал спасибо: 2,985
Сказали Спасибо 3,163 раз(а) в 2,147 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от Godzilla82
|
Тут не понятно. Вроде как устанавливается после сдвига всего фрейма (включая стартовые и стоповые биты) из регистра сдвига. Но! в регистре сдвига вроде как не должно быть стартового и стопового битов.
|
Написано именно то, что написано. В регистре сдвига передатчика находится полный фрейм, включая стартовый и стовый[ые] бит. См. "Frame formats" несколько раньше по тексту TFM.
Сообщение от Godzilla82
|
Кстати, если до окончания передачи из регистра сдвига в регистр UDR что-то записать, то после завершения передачи текущего байта из сдвигового регистра флаг TCX не установится. Может я не так понял, поправьте.
|
Именно так, потому, что UDR буферизирован и для передачи (сам UDR с битом UDRE + сдвиговый регистр с битом TXC) и для приёма (UDR + FIFO на 2 байта + биты RXC и DOR).
|
|
|
|
01.09.2013, 02:26
|
#32
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Сообщение от Godzilla82
|
Далее - зачем запрещать прерывание на передачу по TXC? Не надо этого делать. Это лишние такты. В обработчике - если нет данных для передачи - просто выходим. Есть - записываем в UDR очередной байт и корректируем счётчики.
|
Я, наверно, посреди ночи "туплю", но как иначе поймать окончание передачи? Запрещение прерывания - только в конце всех данных, чтобы в flush_tx дождаться опустошения всех буферов и дальше спокойно заснуть... Пока есть что передавать, разумеется, просто передаём. А вот, как всё передали - уже делаем хоть какой признак, что очередь пуста. Изначальная-то беда была как раз в передаче мусора в момент засыпания с не полностью отправленным байтом.
|
|
|
|
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
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от _Артём_
|
Так что от незапрещения прерывания TXC экономии никакой нет.
|
Можно и проще:
void flush(void)
{
while(_tx.cnt);
delay_ms(1); // здесь нужно поставить время передачи 1 байта
}
|
|
|
|
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
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от _Артём_
|
Что такого сложного в использовании прерывания TXC и даже DRE в придачу?
|
Если прерываний нет, то и новые городить не надо. Достаточно проверить DRE и в случае 1 проваливаться в сон.
|
|
|
|
01.09.2013, 22:42
|
#37
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от _Артём_
|
Можно проще, но зачем?
|
Зачем усложнять? Надо стремиться к упрощению. Чем проще - тем "прозрачнее" программа, проще её анализировать, меньше ошибок, легче их находить. Да и работать будет быстрее.
P.S. всё гениальное - просто.
|
|
|
|
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
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от _Артём_
|
Стремится надо, но не всегда возможно сделать по простому.
|
Но там, где можно просто - усложнять ни к чему.
Сообщение от _Артём_
|
Не будет быстрей работать, вообще неработоспособной такая программа окажется. На delay_ms только что-то примитивное написать можно, какой-нибудь моргатель светодидом, не более.
|
Какой самоуверенный вывод. Настолько самоуверенный, насколько и неверный.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:31.
|
|