У меня проблема с использование режима power down на mega8. Теперь по подробнее...
Делаю устройство, которое постоянно должно быть в спящем режиме, просыпаться только по нажатию кнопки и засыпать полностью после отжатия, при чем, когд кнопка нажата процессор находится в power idle mode.
Возникла следующая преблема..При последовательных нажатиях на кнопку процессор зависает и решается все только рестартом
Для полной ясности расскажу, как реализовано все в программе...
Источник прерывания - кнопка( ненажатая кнопка - на входе МК "1"). Так как в power down прерывание по фронту не работает, сделал вот так: перед уходом в powerdown устанавливаю источником для внешнего прерывания нулевой уровень на лапке, когда прерывание произошло( кнопка была нажата), в обработчике прерывания меняю источник прервания на восходящий фронт сигнала, когда в следющий раз происходит прерывание ( кнопка была отжата), в обработчике устанавливаю источником низкий уровень сигнала на лапке МК. Вот спринципе и все...не очень удобно конечно, но нужно обойтись без сторонних элементов, чисто программно
Ниже привожу необходимый код:
Код
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char ext_int0_source;
#asm("CLI")
SLEEP_DISABLED();
ext_int0_source=MCUCR&0x03;
if (ext_int0_source==0)
{
MCUCR|=0x03;
RF_SendPacket(payload1,28);
CHANGE_TO_POWER_IDLE_MODE=TRUE;
}
if (ext_int0_source==3)
{
MCUCR&=0xFC;
RF_SendPacket(payload2,28);
CHANGE_TO_POWER_SAVE_MODE=TRUE;
}
}
main{}
{
...
#asm("SEI")
SLEEP_ENABLED();
SET_POWER_SAVE_MODE();
SLEEP();
while (1)
{
if (CHANGE_TO_POWER_IDLE_MODE)
{
CHANGE_TO_POWER_IDLE_MODE=FALSE;
SLEEP_ENABLED();
#asm("SEI")
SET_POWER_IDLE_MODE();
SLEEP();
}
if (CHANGE_TO_POWER_SAVE_MODE)
{
CHANGE_TO_POWER_SAVE_MODE=FALSE;
SLEEP_ENABLED();
#asm("SEI")
SET_POWER_DOWN_MODE(); //если здесь поставить SET_POWER_IDLE_MODE() процессор не зависает
SLEEP();
}
};
}
{
unsigned char ext_int0_source;
#asm("CLI")
SLEEP_DISABLED();
ext_int0_source=MCUCR&0x03;
if (ext_int0_source==0)
{
MCUCR|=0x03;
RF_SendPacket(payload1,28);
CHANGE_TO_POWER_IDLE_MODE=TRUE;
}
if (ext_int0_source==3)
{
MCUCR&=0xFC;
RF_SendPacket(payload2,28);
CHANGE_TO_POWER_SAVE_MODE=TRUE;
}
}
main{}
{
...
#asm("SEI")
SLEEP_ENABLED();
SET_POWER_SAVE_MODE();
SLEEP();
while (1)
{
if (CHANGE_TO_POWER_IDLE_MODE)
{
CHANGE_TO_POWER_IDLE_MODE=FALSE;
SLEEP_ENABLED();
#asm("SEI")
SET_POWER_IDLE_MODE();
SLEEP();
}
if (CHANGE_TO_POWER_SAVE_MODE)
{
CHANGE_TO_POWER_SAVE_MODE=FALSE;
SLEEP_ENABLED();
#asm("SEI")
SET_POWER_DOWN_MODE(); //если здесь поставить SET_POWER_IDLE_MODE() процессор не зависает
SLEEP();
}
};
}
Очень прошу помощи! уже отчаялся))Спасибо