Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: зависание mega8
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
yahoo
Здравствуйте все!

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


Очень прошу помощи! уже отчаялся))Спасибо
yahoo
дребезг контактов сыграл свое дело..изменил логику - теперь хоть не зависает....попробую дальше облагораживать прогрмму) Всем спасибо))))
demiurg_spb
Цитата(yahoo @ Nov 1 2009, 21:51) *
дребезг контактов сыграл свое дело..изменил логику - теперь хоть не зависает....попробую дальше облагораживать прогрмму) Всем спасибо))))
Код
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char ext_int0_source;
#asm("CLI")  // <---------------------------Эта строчка лишняя
...
}
При входе в обработчик прерывания все прерывания блокируются аппаратно автоматически. И разрешаются обратно по reti.
yahoo
Цитата(demiurg_spb @ Nov 1 2009, 23:18) *
При входе в обработчик прерывания все прерывания блокируются аппаратно автоматически. И разрешаются обратно по reti.


спасибо, буду знать)
Ronin
Я начинающим когда не хотел морочиться с дребезгом, просто кондёр ставил на вход wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.