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

 
 
> АЦП и энергосберегающий режим, проверка работы
Slavik_tz
сообщение Jul 10 2009, 08:33
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Вот код программы
void InitADC(void)
{
set_sleep_mode(SLEEP_MODE_ADC);//инициализировать енергосберегающий режим
uart_puts("\r MCUCR=");
uart_puti((int)MCUCR);
SET_FRENCH();//устанавливает частоту 112КГц (частота кварца 14 318 180Гц (ADCRA|=_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0)))
ADCCR|=_BV(ADEN);//Выбрать одиночное преобразования
ADMUX|=_BV(REFS0)|_BV(ADLAR);//результ преобразование выравнивается в левую сторону 8бит
ADCCR|=_BV(ADIE);//разрешить прерывание по окончанию преобразования АЦП
uart_puts("\r ADCCR=");
uart_puti((int)ADCCR);
uart_puts("\r ADMUX=");
uart_puti((int)ADMUX);
TCCR0|=_BV(CS01);
TCNT0=0;
ADCCR|=_BV(ADSC);//запустить АЦП
sleep_mode();//перйти в енергосберегающий режим
TCCR0=0;
uart_puts("\r Timer=");
uart_puti((int)TCNT0);
}
результат таков:
MCUCR=16 (00010000b)
ADCCR=143 (10001111b)
ADMUX=96 (01100000b)
Timer=5
вопрос: почему таймер =5, если должен быть равен 25(первое одиночное преобраз)*128(коеффициент деления АЦП)/8 mod(255)= 145 (прерываний от таймера нет), от чего может быть

и следующее вот функция
//Функция получения температуры, параметр kan=номер канала
unsigned int GetTemp(uint8_t kan)
{
volatile unsigned int Temp=0;//значение температуры возращаемое функцией
ADMUX+=kan;
TCCR0|=_BV(CS00);
TCNT0=0;
ADCCR|=_BV(ADSC);//запустить преобразование
//sleep_mode();//ждать пока не закончиться
TCCR0=0;
Temp=(unsigned int)ADCH;//результат в регистр
// _delay_us(1);
uart_puts(" Timer=");
uart_puti((int)TCNT0);
uart_puts(" Temp=");
uart_puti(Temp);
uart_puts(" ");
ADMUX&=~_BV(MUX0)&~_BV(MUX1)&~_BV(MUX2);
return Temp+170;// прибавить начальные установки
}
SIGNAL(SIG_ADC)
{
;
}

вопрос следующего характера если раскоментировать sleep_mode() вообще эта функции не работает,
от чего может возникать прерывание, в Proteus sleep вообще не работает, это его глюк или я что-то делаю не так
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Slavik_tz
сообщение Jul 10 2009, 11:17
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



если закоментровать //set_sleep_mode(SLEEP_MODE_ADC);//инициализировать енергосберегающий режим
то получится Idle (по умолчанию), и все начинает работать так как надо, просмотрев ассемблерный код то биты устанавливаються правельно, в чем траблы.
Go to the top of the page
 
+Quote Post
smac
сообщение Jul 10 2009, 16:49
Сообщение #3


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

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Slavik_tz @ Jul 10 2009, 15:17) *
если закоментровать //set_sleep_mode(SLEEP_MODE_ADC);//инициализировать енергосберегающий режим
то получится Idle (по умолчанию), и все начинает работать так как надо, просмотрев ассемблерный код то биты устанавливаються правельно, в чем траблы.

Да, я вижу Вы ни посты, ни документацию даже и не пытаетесь читать, ну что же, повторюсь еще раз, для особо одареннных ленивых.
Цитата(ATmega16 DS 2466R–AVR–06/08 стр. 33)
When the SM2..0 bits are written to 001, the SLEEP instruction makes the MCU enter ADC
Noise Reduction mode, stopping the CPU but allowing the ADC, the External Interrupts, the
Two-wire Serial Interface address watch, Timer/Counter2 and the Watchdog to continue operat-
ing (if enabled). This sleep mode basically halts clkI/O, clkCPU, and clkFLASH, while allowing the
other clocks to run.

Краткое содержание абзаца: режим ADC Noise Reduction останавливает ЦПУ, но позволяет фунциклировать АЦП, внешним прерываниям, TWI (в режиме слежения за адресом), Таймеру/Счетчику2 и Сторожевой_собаке (ясный пень если эти модули включены). В данном режиме останавливается тактирование ЦПУ, ввода-вывода (IO), и флеш, остальное тактирование работает.

Цитата(ATmega16 DS 2466R–AVR–06/08 стр. 87)
Timer/Counter1 and Timer/Counter0 share the same prescaler module, but the Timer/Counters
can have different prescaler settings. The description below applies to both Timer/Counter1 and
Timer/Counter0

The Timer/Counter can be clocked directly by the system clock (by setting the CSn2:0 = 1). This
provides the fastest operation, with a maximum Timer/Counter clock frequency equal to system
clock frequency (fCLK_I/O). Alternatively, one of four taps from the prescaler can be used as a
clock source. The prescaled clock has a frequency of either fCLK_I/O/8, fCLK_I/O/64, fCLK_I/O/256, or
fCLK_I/O/1024.

Краткое содержание абзацев: таймер/счетчк0 и таймер/счетчик1 имеют один и тот же модуль предделителя, но могут иметь индивидуальные настройки предделителя. Следующее описание относится к таймеру/счетчику0 и к таймеру/счетчику1.
Таймер/счетчик может татктироаться как напрямую от системного тактового сигнала, так и от поделенного на 8, 64, 256 или 1024. Далее судя по обозначениям предделитель таймеров тактируется от тактового сигнала ввода-вывода, что подтверждает рисунок 39 на следующей (88-ой) странице названного даташита.
Ну и собственно выводы:
Поскольку тактовая ввода-вывода выключена в режиме ADC Noise Reduction, то и таймер считать не будет, ибо на его вход не приходят тактовые импульсы. Считать он начнет только когда эти пресловутые импульсы появятся на его входе, т. е. при выходе из котроллера из sleep. Соответственно таймер, судя по Вашему коду, насчитает совсем немного до того момента когда будет остановлен (ну может еще немного насчитает до момента входа контроллера в слип).
P. S. Наболело.

Сообщение отредактировал smac - Jul 10 2009, 16:52
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Jul 13 2009, 06:39
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Цитата(smac @ Jul 10 2009, 19:49) *
...

Насчет таймера, я понял, на спасибо за комент.
Но вопрос в другом, почему по разному ведет себя микроконтроллер с режимами Idle и ADC Noise Reduction (вот по этой причине был закручен таймер).

Сообщение отредактировал IgorKossak - Jul 19 2009, 19:56
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
smac
сообщение Jul 13 2009, 08:47
Сообщение #5


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

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Slavik_tz @ Jul 13 2009, 10:39) *
Насчет таймера, я понял, на спасибо за комент.
Но вопрос в другом, почему по разному ведет себя микроконтроллер с режимами Idle и ADC Noise Reduction (вот по этой причине был закручен таймер).

Вы что издеваетесь? Вы в документацию-то загляните, там написано, что он должен вести себя по разному т. к. Idle и ADC Noise Reduction это разные режимы.
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Jul 14 2009, 14:09
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Цитата(smac @ Jul 13 2009, 11:47) *
Вы что издеваетесь? Вы в документацию-то загляните, там написано, что он должен вести себя по разному т. к. Idle и ADC Noise Reduction это разные режимы.

А я не говорил что они одинаковые и заглядывал, а там написано что прерывание от АЦП в режиме ADC Noise Reduction
возможно.
Алгоритм програмы
1. Запускаем АЦП
2. переходим в енергосберг. режим (Idle, ADC Noise Reduction), ждем в спящем режиме прерывание от АЦП и продолжаем выполнение дальше (больше никакие прерывания не разрешены)
3. считываем данные из АЦП
4. меняем канал
5.. передаем данные на ПК через UART
6. возращаемся в 1
и в этом случае ведет по-разному
а на вопрос по Proteus: энергосберегающий режим симулируется в нем или нет, так никто и не ответил
Go to the top of the page
 
+Quote Post



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

 


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


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