Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП запускается от спящего режима!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
777777
Я делаю спящий режим обычным (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? И как войти в спящий режим не запуская АЦП?
Александр Куличок
Ответ очевиден: перед входом запретить АЦП.
Отличается тем, что в ADC Noise Reduction Mode отсутствует тактирование CLK_i/o.
Т.е. в iddle-режиме дополнительно работают SPI, USART, Analog Comparator и все внешние прерывания.
777777
Цитата(Александр Куличок @ Apr 29 2010, 16:50) *
Ответ очевиден: перед входом запретить АЦП.

Не могу я его запретить: он запускается по таймеру. И если при срабатывании таймера он будет запрещен, то он не запустится. Есть менее очевидное решение: по таймеру вызывать прерывание, а в нем разрешать АЦП и запускать его вручную. Но это же уродство. Неужели нет более элегантного решения?
777777
Цитата(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. Но обработка прерывания таймера тоже может задержаться на несколько десятков микросекунд (а может и больше сотни) что приведет к неравномерности семплирования (не говоря уже о том, что такое решение выглядит весьма уродски)
rx3apf
Цитата(777777 @ Apr 30 2010, 08:56) *
Но обработка прерывания таймера тоже может задержаться на несколько десятков микросекунд (а может и больше сотни) что приведет к неравномерности семплирования (не говоря уже о том, что такое решение выглядит весьма уродски)

Если обработка прерывания таймера пойдет из sleep - то откуда может возникнуть задержка обработки, да еще столь чудовищная ? Но решение да, красотой не блещет (я даже и не подозревал о таких особенностях ADC, поскольку не сталкивался - даже сперва не поверил).
777777
Цитата(rx3apf @ Apr 30 2010, 09:05) *
Если обработка прерывания таймера пойдет из sleep - то откуда может возникнуть задержка обработки, да еще столь чудовищная?

Кроме таймера в системе есть и другие прерывания и таймер может сработать во время его обработки. А насчет задержки - да, это я погорячился. Самое длительное прерывание обрабатывается 12...15 мкс, в худшем случае (который наступает через 20 мс) не более 20 мкс. Пожалуй для 30-миллисекундного семплирования это не страшно.
777777
Цитата(ILYAUL @ Apr 30 2010, 10:40) *
Цитата
Кроме таймера в системе есть и другие прерывания и таймер может сработать во время его обработки.
Т.е у Вас вложенное прерывние для таймера?

Разумеется нет, поэтому и может возникнуть задержка на время обработки прерывания, во время которого сработал таймер.
777777
Цитата(ILYAUL @ Apr 30 2010, 12:11) *
Если , я правильно понял , то и не таймер будит процеесор. Тогда после обработки АЦП выключите его (D.S 9.11.3 PRR – Power Reduction Register), а проснётесь включите.

Прочитай пост #5, там все написано.
SysRq
Отбросить лишнее измерение? Флаг таймера всё равно ж надо сбрасывать. Как-то так (AVR Studio не симулирует, а железки нету подходящей):
Код
ISR(ADC_vect)
{
    if(TIFR0 & _BV(OCF0A))
    {
        TIFR0 = _BV(OCF0A);    
        // Get ADC conversion result
    }
}
defunct
Цитата(777777 @ Apr 30 2010, 07:56) *
Пока что я вижу из этой ситуации только один выход - разрешить прерывание таймера Timer/Counter0 Compare Match A, а в его обработке запускать АЦП "вручную",

Если питание не батарейное, то я бы лучше не загонял проц в idle.

Греться там нечему - у чипа без idle рассеиваемая мощность ~5-10mW если не меньше. Т.е. светодиод и тот греется сильнее. Поэтому довод о высокой температуре выглядит немного странно.
Если же питание батарейное, то думаю игрой с напряжением и частотой - можно найти такой режим при котором без idle потребление не изменится по сравнению с тем, что есть сейчас.

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

А есть уверенность в том что с таймером все Ок, и что CompA действительно происходит? Смотрите на реальном железе? В симуляторе такие нюансы могут не работать.
Diz
Действительно, АЦП (если было включено) запускается при уходе в idle. Столкнулся как-то - пришлось отказаться от idle (что обидно, т.к. устройство батарейное).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.