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

 
 
 
Reply to this topicStart new topic
> зависание 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
yahoo
сообщение Nov 1 2009, 18:51
Сообщение #2





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



дребезг контактов сыграл свое дело..изменил логику - теперь хоть не зависает....попробую дальше облагораживать прогрмму) Всем спасибо))))
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 1 2009, 20:18
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
yahoo
сообщение Nov 1 2009, 20:24
Сообщение #4





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



Цитата(demiurg_spb @ Nov 1 2009, 23:18) *
При входе в обработчик прерывания все прерывания блокируются аппаратно автоматически. И разрешаются обратно по reti.


спасибо, буду знать)
Go to the top of the page
 
+Quote Post
Ronin
сообщение Nov 5 2009, 11:13
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 10-02-05
Из: Краснодар
Пользователь №: 2 558



Я начинающим когда не хотел морочиться с дребезгом, просто кондёр ставил на вход wink.gif
Go to the top of the page
 
+Quote Post

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

 


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


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