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

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 30 2010, 04:56
|

Профессионал
    
Группа: Участник
Сообщений: 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  ) Если в регистре ADCSRA установить бит ADATE, то АЦП будет запускаться каждый раз при возникновении события, выбираемого битами ADTS2:0 регистра ADCSRB, в моем случае Timer/Counter0 Compare Match A. Мне нужно запускать его каждые 33.3 мс и анализировать полученный сигнал. Но при использовании sleep он запускается каждый раз при входе в этот режим и таким образом нарушается равномерность и частота семплирования. Sleep же нужен, так как прибор будет работать при высокой температуре, поэтому хотелось бы уменьшить нагрузку чтобы он не грелся лишнего, а работать он будет по моим прикидкам 5...10% всего времени. Пока что я вижу из этой ситуации только один выход - разрешить прерывание таймера Timer/Counter0 Compare Match A, а в его обработке запускать АЦП "вручную", то есть установкой бита ADSC в регистр ADCSRA. Но обработка прерывания таймера тоже может задержаться на несколько десятков микросекунд (а может и больше сотни) что приведет к неравномерности семплирования (не говоря уже о том, что такое решение выглядит весьма уродски)
|
|
|
|
|
May 3 2010, 22:50
|

кекс
     
Группа: Свой
Сообщений: 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 действительно происходит? Смотрите на реальном железе? В симуляторе такие нюансы могут не работать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|