реклама на сайте
подробности

 
 
> АЦП запускается от спящего режима!, хотя я его об этом не просил :(
777777
сообщение Apr 29 2010, 06:04
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Я делаю спящий режим обычным (idle):
Код
    SMCR = _BV(SE); // Idle sleep mode

А АЦП хочу запускать от таймера:
Код
    ADCSRA = _BV(ADEN) | _BV(ADATE) | _BV(ADIE) | 5;
    ADCSRB = 3; // запуск по Timer/Counter0 Compare Match A

несмотря на это он запускается каждый раз, как только процессор входит в спящий режим. Более того, если выкинуть команду sleep, то он не запускается вообще, даже от таймера. Как же заставить его работать по таймеру?

Нашел, оказывается

7.1 Idle Mode
<...>
If the ADC is enabled, a conversion starts automatically when this mode is entered.

Чем же тогода этот sleep отличается от ADC Noise Reduction Mode? И как войти в спящий режим не запуская АЦП?

Сообщение отредактировал 777777 - Apr 29 2010, 05:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
777777
сообщение Apr 30 2010, 04:56
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(ILYAUL @ Apr 29 2010, 23:08) *
Не очевидно , там есть маленький подводный камешек . Команда sleep в прерываниях не работает . Вы оцените насколько уж Вам так необходим режим Idle или ADC Noise Reduction.
<...>

Честно говоря, я мало что понял из вашего поста. По-видимому я недостаточно ясно описал проблему.
Во-первых, контроллер ATmega168.
Во-вторых, ADC Noise Reduction мне не нужен, (так же как и накапливание 512 значений) у меня и так шум АЦП не превышает одной единицы.
В-третьих, запуск по таймеру означает запуск АЦП непосредственно таймером минуя процессор. (По-видимому это зачатки event system которую сделали в xmega smile.gif ) Если в регистре ADCSRA установить бит ADATE, то АЦП будет запускаться каждый раз при возникновении события, выбираемого битами ADTS2:0 регистра ADCSRB, в моем случае Timer/Counter0 Compare Match A. Мне нужно запускать его каждые 33.3 мс и анализировать полученный сигнал. Но при использовании sleep он запускается каждый раз при входе в этот режим и таким образом нарушается равномерность и частота семплирования. Sleep же нужен, так как прибор будет работать при высокой температуре, поэтому хотелось бы уменьшить нагрузку чтобы он не грелся лишнего, а работать он будет по моим прикидкам 5...10% всего времени.

Пока что я вижу из этой ситуации только один выход - разрешить прерывание таймера Timer/Counter0 Compare Match A, а в его обработке запускать АЦП "вручную", то есть установкой бита ADSC в регистр ADCSRA. Но обработка прерывания таймера тоже может задержаться на несколько десятков микросекунд (а может и больше сотни) что приведет к неравномерности семплирования (не говоря уже о том, что такое решение выглядит весьма уродски)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 18:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016