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

 
 
> ATmega48PA не выводится из сна Таймером2 в асинхронном режиме
bvn123
сообщение Dec 22 2016, 11:43
Сообщение #1


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

Группа: Свой
Сообщений: 112
Регистрация: 9-08-04
Пользователь №: 468



Здравствуйте,

не получается вывести МК из спящего режима.

ATmega48PA,
Тактирование микроконтроллера выбрано установкой Fuses от внутреннего RC-генератора 8МГц (проверил, тактирование МК от 8МГц есть)

кварц 32768Гц подключен к TOSC1,2 и тактирует Таймер2 в асинхронном режиме.
Переполнение Таймера2 раз в 0,5с изменяет состояние на контакте МК, для индикации к контакту подключен светодиод.

Если команда _SLEEP() заблокирована, Таймер2 в асинхронном режиме работает, светодиод мигает с расчетной частотой.

МК не пробуждается Таймером2 в асинхронном режиме, если выполнена команда _SLEEP().

В то же время МК пробуждается, если заблокировать асинхронный режим (убрать команду ASSR=(1<<AS2)) - тогда светодиод мигает очень часто (на таймер2 поступает частота 8МГц/1024, кроме того, чтобы видеть мигание, приходится и в TCNT2 грузить 216 вместо 16-ти)

Т.е., проблема возникает при одновременном использовании SLEEP и асинхронного режима Таймера2,
можно сказать, отдельно они работают.

То же написал на ассемблере в AVR Studio с тем же результатом.

В чем ошибка?

CODE
//===========Листинг:=========//
#include <iom48PA.h>
#include <ina90.h>

#pragma vector=TIMER2_OVF_vect //KBD & Indication
__interrupt void TIMER2_OVF(void)
{ SMCR=0;
TCNT2=256-16;
PIND=1<<PD4;}

void main()
{ SP=RAMEND;
DDRD=(1<<PD4);

//Запрет работы WDT - без изменений из описания ATmega48PA
_CLI();
_WDR();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0x00;

//Инициализация Таймера2
ASSR=(1<<AS2); //асинхронный режим: кварц 32768Гц на TOSC1,2 -> Таймер2
TIMSK2=(1<<TOIE2); //прерывание переполнения Таймера2 разрешить
TCNT2=256-16; //при Ftosc2=32768 /1024 = 32Гц это 0.5с срабатывания таймера
TCCR2B=(1<<CS22) | (1<<CS21) | (1<<CS20); // Pre2=1024, Ftimer2 = 32 Гц

_SEI(); //Разрешить прерывания

while (1)
{
SMCR= (0<<SM2) | (1<<SM1) | (1<<SM0) | (1<<SE); // 0000 0111 - разрешить Power Save sleep mode
_SLEEP(); //перевести МК в спящий режим
}
}


Сообщение отредактировал bvn123 - Dec 22 2016, 20:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post



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

 


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


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