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

 
 
 
Reply to this topicStart new topic
> АЦП запускается от спящего режима!, хотя я его об этом не просил :(
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
Александр Куличо...
сообщение Apr 29 2010, 12:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Ответ очевиден: перед входом запретить АЦП.
Отличается тем, что в ADC Noise Reduction Mode отсутствует тактирование CLK_i/o.
Т.е. в iddle-режиме дополнительно работают SPI, USART, Analog Comparator и все внешние прерывания.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 29 2010, 16:58
Сообщение #3


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

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



Цитата(Александр Куличок @ Apr 29 2010, 16:50) *
Ответ очевиден: перед входом запретить АЦП.

Не могу я его запретить: он запускается по таймеру. И если при срабатывании таймера он будет запрещен, то он не запустится. Есть менее очевидное решение: по таймеру вызывать прерывание, а в нем разрешать АЦП и запускать его вручную. Но это же уродство. Неужели нет более элегантного решения?
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2010, 04:56
Сообщение #4


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

Группа: Участник
Сообщений: 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
rx3apf
сообщение Apr 30 2010, 05:05
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(777777 @ Apr 30 2010, 08:56) *
Но обработка прерывания таймера тоже может задержаться на несколько десятков микросекунд (а может и больше сотни) что приведет к неравномерности семплирования (не говоря уже о том, что такое решение выглядит весьма уродски)

Если обработка прерывания таймера пойдет из sleep - то откуда может возникнуть задержка обработки, да еще столь чудовищная ? Но решение да, красотой не блещет (я даже и не подозревал о таких особенностях ADC, поскольку не сталкивался - даже сперва не поверил).
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2010, 06:09
Сообщение #6


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

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



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

Кроме таймера в системе есть и другие прерывания и таймер может сработать во время его обработки. А насчет задержки - да, это я погорячился. Самое длительное прерывание обрабатывается 12...15 мкс, в худшем случае (который наступает через 20 мс) не более 20 мкс. Пожалуй для 30-миллисекундного семплирования это не страшно.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2010, 07:52
Сообщение #7


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

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



Цитата(ILYAUL @ Apr 30 2010, 10:40) *
Цитата
Кроме таймера в системе есть и другие прерывания и таймер может сработать во время его обработки.
Т.е у Вас вложенное прерывние для таймера?

Разумеется нет, поэтому и может возникнуть задержка на время обработки прерывания, во время которого сработал таймер.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2010, 09:16
Сообщение #8


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

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



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

Прочитай пост #5, там все написано.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 1 2010, 13:07
Сообщение #9


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Отбросить лишнее измерение? Флаг таймера всё равно ж надо сбрасывать. Как-то так (AVR Studio не симулирует, а железки нету подходящей):
Код
ISR(ADC_vect)
{
    if(TIFR0 & _BV(OCF0A))
    {
        TIFR0 = _BV(OCF0A);    
        // Get ADC conversion result
    }
}
Go to the top of the page
 
+Quote Post
defunct
сообщение May 3 2010, 22:50
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(777777 @ Apr 30 2010, 07:56) *
Пока что я вижу из этой ситуации только один выход - разрешить прерывание таймера Timer/Counter0 Compare Match A, а в его обработке запускать АЦП "вручную",

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

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

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

А есть уверенность в том что с таймером все Ок, и что CompA действительно происходит? Смотрите на реальном железе? В симуляторе такие нюансы могут не работать.
Go to the top of the page
 
+Quote Post
Diz
сообщение May 4 2010, 03:55
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Действительно, АЦП (если было включено) запускается при уходе в idle. Столкнулся как-то - пришлось отказаться от idle (что обидно, т.к. устройство батарейное).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 10:04
Рейтинг@Mail.ru


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