не получается вывести МК из спящего режима.
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(); //перевести МК в спящий режим
}
}
#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(); //перевести МК в спящий режим
}
}