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

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

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

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

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

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

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

 
Опции темы

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

Непрочитано 23.08.2013, 22:34  
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию [РЕШЕНО] Глюк с UART при засыпании

Приветствую!
Подскажите, куда копать, мысли закончились Как правильно готовить USART к переходу в спящий режим?

Ковырялся с чтением АЦП и записью результатов в порт (всё с прерываниями и засыпанием) и упёрся в непонятность - при входе в любой режим сна в порт посылается ещё кусок мусора. Кусок всегда одинаковый, как будто шлётся лишняя память. При изменении и перезаливке программы меняется. Если после записи в порт добавлять задержку от 1мс, то, вроде, мусор не шлётся. Перед засыпанием "очищаю" выходной буфер ожиданием UDRE и TXC. Попробовал уже в АВР-студии просимулировать - там всё работает корректно.

Электрически - мега328Р на макетке, встроенный RC на 8МГц, питание 3.3В, TX/RX напрямую подключены к FT232RL (с неё же идёт питание через 1117-3.3) и (в процессе эксперментов) через резисторы 10к на землю.

UART на прерываниях по UDR/RXC, самопал, но практически 1:1 традиционный FIFO, буфер не переполняется. Глюк повторяется даже при выводе 1 символа.

Пример ниже честно выводит в порт текст "StartADC", глотает последний символ и добавляет несколько байт мусора.
Код:
// куски кода
  // Appnote: AVR4013, не влияет на глюк
  // DDRD = 0x00; 
  // PORTD = 0xFF;

  UBRR=BAUD38400;
  UCSRA=0;
  UCSRB = (1‹‹RXCIE) | (1‹‹RXEN) | (1‹‹TXEN);
  ADC_DDR &= ~((1‹‹ADC0) | (1‹‹ADC1) | (1‹‹ADC2));
  ADC_DIDR |= (1‹‹ADC0) | (1‹‹ADC1) | (1‹‹ADC2);
  ADMUX = (1‹‹REFS0) | (1‹‹ADLAR) | (0‹‹MUX0);
  ADCSRA = (1‹‹ADEN) | (1‹‹ADPS2) | (0‹‹ADPS1) | (1‹‹ADPS0);

//...
ISR (ADC_vect) {
  adcval=ADCW;
  uart_putch('.'); //TEST
}
//...
//Собственно запуск:
uart_print("Start ADC\n");
uart_tx_flush(); // wait UDRE & TCX =! 0

// UCSRB &= ~((1‹‹TXEN) | (1‹‹RXEN)); - не влияет
// _delay_ms(5); // вот с этим всё начинает работать

set_sleep_mode(SLEEP_MODE_ADC);
sleep_bod_disable();
sleep_enable();

ADCSRA |= (1‹‹ADSC) | (1‹‹ADIE); // Start ADC
sleep_cpu();
sleep_disable();

for (;;) { ; }
Реклама:

Последний раз редактировалось av0000; 26.08.2013 в 21:40. Причина: решено
av0000 вне форума  
Непрочитано 24.08.2013, 00:24  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
//Собственно запуск:
uart_print("Start ADC\n");
uart_tx_flush(); // wait UDRE & TCX =! 0
Мало данных: что собой представляет uart_print?

Сообщение от av0000 Посмотреть сообщение
Попробовал уже в АВР-студии просимулировать - там всё работает корректно.
Что там работает? Мега в симуляторе к Com-порту подключена?

Сообщение от av0000 Посмотреть сообщение
Перед засыпанием "очищаю" выходной буфер ожиданием UDRE и TXC.
А перед посылкой следующего байта флаг TXC очищается? Если нет, то он так и останется установленным после посылки первого байта и к концу строки будет равен 1, хотя байт ещё не передался, а только начал передаваться. Или у вас прерывание на tx_complete есть?
_Артём_ вне форума  
Сказали "Спасибо" _Артём_
av0000 (24.08.2013)
Непрочитано 24.08.2013, 01:14  
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от _Артём_ Посмотреть сообщение
Мало данных: что собой представляет uart_print?
uart_print - тупое в цикле while (*str) uart_putch(*str++). В аттаче, вроде, актуальная версия uart.c (485й pin тут не используется)...

Сообщение от _Артём_ Посмотреть сообщение
Что там работает? Мега в симуляторе к Com-порту подключена?
Просто симуятор с выводом в hapsim. Ради этого добра пришлось лезть в виртуалку (под убунту сижу)

Сообщение от _Артём_ Посмотреть сообщение
А перед посылкой следующего байта флаг TXC очищается?
...
Или у вас прерывание на tx_complete есть?
А вот это интересная мысль! Нет, не очищается и tx_complete в данном случае нет. В железе проверить смогу только в понедельник - макетка на работе. Но это, мне кажется, не должно давать до десятка переданных байт. Грешил на "подвисающие" в воздухе ноги, но "мусор" всегда одинаковый до перекомпиляции...
Количество мусора коррелирует с длиной переданной строки - на '.' раз в секунду - пара байтов (x00, xF9 кажется), на "....." - 4 точки и байт 8 мусора (всё примерно, поскольку железка на работе)
Вложения:
Тип файла: zip uart.zip (2.8 Кб, 49 просмотров)

Последний раз редактировалось av0000; 24.08.2013 в 01:16.
av0000 вне форума  
Непрочитано 24.08.2013, 07:39  
kosmos440o
Заблокирован
 
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
kosmos440o на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Я бы не посылал ничего в UART в прерывании АЦП, даже для теста.

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

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

Сообщение от av0000 Посмотреть сообщение
Как правильно готовить USART к переходу в спящий режим?
Ковырялся с чтением АЦП и записью результатов в порт (всё с прерываниями и засыпанием) и упёрся в непонятность - при входе в любой режим сна в порт посылается ещё кусок мусора.
Моё мнение - копать в uart_tx_flush(). В обычном режиме - достаточно опрашивать только UDRE, так будет использоваться внутренный буфер. Перед переходом в спящий - дождаться установки TXC.

Ну и Х.З., что там в архиве.
Сообщение от av0000 Посмотреть сообщение
В аттаче, вроде, актуальная версия uart.c (485й pin тут не используется)...
...
Нет, не очищается и tx_complete в данном случае нет.
Как я понимаю, код из архива может вести передачу только при разрешённом прерывании по UDRE.
ForcePoint вне форума  
Непрочитано 24.08.2013, 18:01  
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от ForcePoint Посмотреть сообщение
Моё мнение - копать в uart_tx_flush(). В обычном режиме - достаточно опрашивать только UDRE, так будет использоваться внутренный буфер. Перед переходом в спящий - дождаться установки TXC.
Там почти так и происходит, разве что TXC ждётся всегда (а не только перед сном), _но_ перед ожиданием не очищается, на что намекнул _Артём_.

Сообщение от ForcePoint Посмотреть сообщение
Как я понимаю, код из архива может вести передачу только при разрешённом прерывании по UDRE.
Да. Код стандартный, как его традиционно и делают в обработчике UDRE: есть, что передавать - в UDR его, закончилось - запретили UDRIE.
Добавлено только обнуление счётчиков буфера - также на время поиска глюка.

Пока остается дождаться понедельника и попробовать вариант с чисткой TСX.
av0000 вне форума  
Непрочитано 25.08.2013, 03:07  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
Код:
//Собственно запуск:
uart_print("Start ADC\n");
uart_tx_flush(); // wait UDRE & TCX =! 0
Не уверен, что "Start ADC\n" имеет завершающий нуль.
Godzilla82 вне форума  
Непрочитано 25.08.2013, 11:02  
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Сообщение от Godzilla82 Посмотреть сообщение
Не уверен, что "Start ADC\n" имеет завершающий нуль.
Не, вот тут-то всё правильно. Это же Си, там с asciiz строками всё честно

Кроме того, не было б там нуля - мусор бы печатался и при использовании _delay_ms(5), с которой всё нормально работает. Кстати, в мусоре и нулей хватает порой…

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

Сообщение от av0000 Посмотреть сообщение
Код:
  UBRR=BAUD38400;
  UCSRA=0;
  UCSRB = (1‹‹RXCIE) | (1‹‹RXEN) | (1‹‹TXEN);
//...
// UCSRB &= ~((1‹‹TXEN) | (1‹‹RXEN)); - не влияет
for (;;) { ; }
Залез в даташит. Везде ссылки на UBRR0, UCSR0A, UCSR0B, UDR0 и т.п.

Последний раз редактировалось Godzilla82; 25.08.2013 в 14:06.
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, время: 07:37.


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