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

 
 
> зависание mega8, проц висит при использовании power down
yahoo
сообщение Nov 1 2009, 15:45
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 1-11-09
Из: Юбилейный
Пользователь №: 53 352



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

У меня проблема с использование режима 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();
                        
                        }
      };
}


Очень прошу помощи! уже отчаялся))Спасибо
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post



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

 


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


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