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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

AVR, UART и режим IDLE

Непрочитано 24.07.2011, 13:20  
anpaza
Прохожий
 
Регистрация: 14.02.2011
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anpaza на пути к лучшему
По умолчанию AVR, UART и режим IDLE

Всем привет!

Имеется девайс, который должен в основное от работы время жрать как можно меньше, но с возможностью обмена данными с компом через интерфейс UART (через USB-UART переходник). Девайс просыпается 16 раз в секунду, делает некие ненпряжные замеры и опять ложится спать до следующего подъёма.

Идея была такая: если нет долго сигналов по UART, то засыпаем "как следует" (режим POWER_SAVE). Если обнаруживаем, что нас тыркают через UART, на некоторое время заменяем POWER_SAVE на режим IDLE, потому как по документации в режиме IDLE подсистема UART продолжает работать.

Пока же реализовал режим исключительно IDLE. И сразу напоролся на проблему.

Частенько байты пролетают "мимо кассы". То есть байт послан, а до микроконтроллера он не дошёл. Весь обмен через UART реализован на прерываниях, то бишь, в случае прихода байта, по идее, микроконтроллер автоматически должен будиться и тут же "ловить" приехавший байт (скорость 9600 бод, частота МК 1 МГц, должен успевать не напрягаясь).

Однако на практике вижу часто ситуации, когда посылается пакет A,B,C,D а МК "видит" только A, B, D.

Если вместо cpu_sleep() воткнуть просто _delay_ms (1000/16), то всё работает шоколадно, никакие байты не проглатываются.

Я чего-то упустил, или это баг микроконтроллера?
Реклама:
anpaza вне форума  
Сказали "Спасибо" anpaza
warel (28.06.2019)
Непрочитано 24.07.2011, 13:26  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Вы где-то что-то упустили...
Сообщение от anpaza Посмотреть сообщение
посылается пакет A,B,C,D а МК "видит" только A, B, D.
Первый и второй байт у вас проходит без ошибок...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 24.07.2011, 15:10  
anpaza
Прохожий
 
Регистрация: 14.02.2011
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anpaza на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Да, именно так - просто произвольный байт "выпадает" из серии, такое ощущение что он принимается, но прерывание не вызывается. Не могу поверить, что байт теряется из-за ошибки - если вместо режима IDLE использовать обычный _delay_ms, никаких ошибок приёма нет.
anpaza вне форума  
Сказали "Спасибо" anpaza
warel (28.06.2019)
Непрочитано 24.07.2011, 15:26  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

МК здесь не при делах...
ИМХО, вы с переменными накосячили... в частности не использовали квалификатор volatile...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 24.07.2011, 18:12  
anpaza
Прохожий
 
Регистрация: 14.02.2011
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
anpaza на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Если бы проблема была в volatile, программа бы глючила каждый раз одинаково.

Я кажись нащупал в чём дело. У меня почти сразу после команды cpu_sleep() стояла cli(). То есть общий вид цикла такой:

Код:
int main ()
{
  ...
  for ( ; ; )
  {
     set_sleep_mode (SLEEP_MODE_IDLE);
     sleep_enable ();
     sleep_cpu ();
     sleep_disable ();

     cli ();
     // здесь делаем замеры и подсчёты через АЦП
     sei ();
  }
}
Вся обработка UART (приём и передача) выполняется, как я говорил, полностью в прерываниях.

Если закоментировать cli и sei то входящие байты не теряются. Посылаемые МК байты, кстати, не теряются никогда.

Вижу пока такое объяснение: в МК аппаратный баг (МК, кстати, атмега48 ), который проявляется следующим образом: если во время спячки возникает прерывание UART, и через несколько команд после команды SLEEP есть команда cli(), то он после просыпания успевает сделать несколько шагов (спросонья ), доходит до cli() и каким-то образом теряет прерывание. Подтверждение этому в том, что если заменить cpu_sleep() на _delay_ms(), байты не теряются никогда, несмотря на наличие cli.
anpaza вне форума  
Сказали "Спасибо" anpaza
warel (28.06.2019)
Непрочитано 24.07.2011, 18:17  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Как у вас во время спячки UART работает? В синхронном режиме что ли? В асинхронном он от тактового генератора работает, который в спячке остановлен.
Я в таком случае заводил линию RX на INT и будил по спаду фронта. Контроллер успевал проснуться и начать прием данных. Ничего не терялось.
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (28.06.2019)
Непрочитано 24.07.2011, 18:36  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Сообщение от anpaza Посмотреть сообщение
Вижу пока такое объяснение: в МК аппаратный баг (МК, кстати, атмега48 )
Баг у вас от недопонимания работы МК, а не в самом МК...
Пересмотрите концепцию проги... нельзя произвольно запрещать прерывания и в то же время ждать неукоснительного выполнения этих самых прерываний...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 24.07.2011, 18:38  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Сообщение от Easyrider83 Посмотреть сообщение
Я в таком случае заводил линию RX на INT и будил по спаду фронта. Контроллер успевал проснуться и начать прием данных. Ничего не терялось.
Проц у него просыпается нормально... иначе терялись бы первые 1-2 байта...
st_1 вне форума  
Сказали "Спасибо" st_1
warel (28.06.2019)
Непрочитано 24.07.2011, 18:44  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Сообщение от st_1 Посмотреть сообщение
Проц у него просыпается нормально... иначе терялись бы первые 1-2 байта...
Это я понимаю. Я не понимаю, как он просыпается?
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (28.06.2019)
Непрочитано 24.07.2011, 18:55  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: AVR, UART и режим IDLE

Сообщение от anpaza Посмотреть сообщение
в МК аппаратный баг (МК, кстати, атмега48 ), который проявляется следующим образом: если во время спячки возникает прерывание UART, и через несколько команд после команды SLEEP есть команда cli(), то он после просыпания успевает сделать несколько шагов (спросонья ), доходит до cli() и каким-то образом теряет прерывание
Этот баг у нас фичей зовется. ВСЕ контроллеры после выхода из спячки выполняют одну операцию, параллельно в фоне проверяют прерывания, и если прерывание есть - во второй операции переходят по вектору. При выходе из прерывания проц выполняет ещё одну операцию из основного цикла, после которой переходит к следующему прерыванию (если во время спячки и/или выполнения первого прерывания произошло несколько прерываний)

Читаем даташиты, там всё есть
niXto вне форума  
Сказали "Спасибо" niXto
warel (28.06.2019)
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Литература по микроконтроллерам (AVR, PIC, ПЛИС и т.д.). Сборка книг - (256 книг+ 27 CD c примерами из книг) [обновление 2011, PDF, DJVU] yurinform Микроконтроллеры, АЦП, память и т.д 5 05.07.2011 19:00
Проблема правильного приема пакета UART AVR Saadov Микроконтроллеры, АЦП, память и т.д 16 27.04.2011 20:11
Проблема с передачей данных между avr по uart code-by Proteus 2 21.01.2011 12:24
Симуляция UART для AVR studio mm12345 Микроконтроллеры, АЦП, память и т.д 0 22.11.2010 15:40
Управление энергопотреблением и режим idle day177 Микроконтроллеры, АЦП, память и т.д 9 28.12.2007 23:53


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


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