Полная версия этой страницы:
mega88PA асинхронный счетчик2
Если повтор, то извиняйте - не нашел. тыкните куда надо
нужно запустить Т2 асинхронно с последующим переводом power save и с периодическим пробуждению по переполнению. тактирование от от встроенного кварца 8МГц с , делителем на 8
сделал г.код для отладки именно этого момента:
__disable_interrupt();
while(ASSR); //wait 0
TIMSK2=0; // not inerrupt
while(ASSR); //wait 0
ASSR=(0<<AS2);
while(ASSR); //wait 0
TCNT2=5;
while(ASSR); //wait 0
OCR2A=0;
while(ASSR); //wait 0
OCR2B=0;
while(ASSR); //wait 0
TCCR2B=(1<<CS22)|(1<<CS21)|(0<<CS20);//TIMER0_PRECSALER; // ///////////////CLK/256/250 = 15.625 (64ms)
while(ASSR); //wait 0
TCCR2A=0; //ctc
while(ASSR); //wait 0
TIMSK2=(1<<TOIE2); /* TIMER0 ON */
while(ASSR); //wait 0
TIFR2=(0<<TOV2);
while(ASSR); //wait 0
в сон:
while(ASSR);
while ( count_old==count ) {
__enable_interrupt();
SMCR|=(1<<SM1)|(1<<SM0)|(1<<SE);//MCUCR|=(1<<SE);
__sleep();
SMCR&=~(1<<SE);//MCUCR&=~(1<<SE); // Â sleep
Сергей Борщ
Nov 1 2012, 07:02
А как именно оно не работает? Если надо просто просыпаться, не входя в обработчик прерывания, то перед sleep() надо запретить прерывания.
"Т2 асинхронно" - это с внешним кварцем? Тогда в ASSR надо взвести бит AS2 и проверка while(ASSR) уже будет некорректна. До взведения этого бита можно писать в регистры таймера не дожидаясь снятия статусных битов ASSR.
Запись SMCR |= не самый лучший вариант. SMCR = в этом месте было бы и короче и надежнее.
TIFR2=(0<<TOV2); тоже не имеет смысла - этот флаг сбрасывается записью в него 1.
TCCR2A=0; //ctc - мне кажется тут комментарий не соответствует коду
не работает - т.е. не заходит в прерывание __interrupt void TIMER0_OVF2_interrupt(void).
в прерывании дергаю вывод и смотрю на осциллографе - интервал остается 64мсек.
"Т2 асинхронно" видимо я не правильно выразился. я имел в виду что перевожу ядро в save mode.
еще по разбираюсь - вроде заработало, но не уверен.
Спасибо!
Сергей Борщ
Nov 1 2012, 08:52
QUOTE (arttab @ Nov 1 2012, 11:04)

"Т2 асинхронно" видимо я не правильно выразился. я имел в виду что перевожу ядро в save mode.
А, ну если источник тактирования у таймера и ядра один - то тогда вообще ASSR читать не нужно.
теперь думаю как проверить что ЦП уходит в save mode
Сергей Борщ
Nov 1 2012, 12:38
Загнать в цикл sleep() и дерганье ногой? Если уходит - будет дерганье с частотой таймера, если нет - с частотой ядра.
WD выключил и добавил ногодруганья перед перед и после sleep - дрыгается
Спасибо!!!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.