Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2019, 14:16

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 03:17 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 371
Откуда: Донецк
Граждане, помогите с проблемой, несколько часов ломаю голову не могу осилить:

Код:
// B0 interrupt
#pragma vector = TIMERB0_VECTOR
__interrupt void B0_ISR(void)
{
   if(!button) счетчик_отжатия++; //если не нажата
   else //если нажата
   {
     счетчик_нажатия++;
     счетчик_отжатия=0;
   }
   if(счетчик_отжатия>2 || счетчик_нажатия>200)
   {
     if(счетчик_нажатия > 200) irq=//длинное нажатие;
     else if(счетчик_нажатия> 2) irq=//короткое нажатие;
     else irq=0;
       
     __low_power_mode_off_on_exit();
      TBCCTL0 = 0;
      TBCTL = 0;  // off     
   }
}
   
// PORT2 interrupt
#pragma vector = PORT2_VECTOR
__interrupt void P2_ISR(void)
{
  delay_ms(10);
  if(!button)
  {
     P2IE = 0; //отключаем, что б не мешало определять время нажатия
    __bic_SR_register_on_exit(__SR_OSC_OFF); //переход в  LPM3
    TBCCTL0 = CCIE;           // настройка ТВ3
    TBCCR0 = 120;             //10 ms
    TBCTL = TBSSEL_1 + MC_1;  // ACLK, contmode
    счетчик_нажатия = 0;
    счетчик_отжатия = 0;
  }

  P2IFG = 0;
}

//------------------------------------------------------------------------------
int main( void )
{
//настройка тактирования
//настройка портов и прерываний
   for(;;)
   {
      //включаем прерывания копки
      P2IE = BIT0;
     __low_power_mode_4();
    
     //мигаем диодом

   }
}


Суть такова.
Хочу обрабатывать нажатие кнопки с помощью таймера и прерываний. Более-менее получилось, но есть одна проблема - если кнопку нажимать быстро много раз подряд, программа зависает. Как выяснил - почемуто оказываются отключены прерывания от кнопки. Но я не вижу в каком месте они могут отключится и не в ключится...
При спокойном нажатии (пару раз в секунду) все работает четко.

Прогамма рабботает так:
после инициализации засыпаем, по прерыванию от кнопки запускаем таймер и прерывания от него, а от кнопки отключаем, что б не мешали счету. Переходим в LPM3. Как только счетчик времени нажатия или времени отжатия превысит порог, просыпаемя, мигаем соотв. светодиодом. Затем включаем прерывания кнопки и засыпаем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 13:14 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
Код:
__interrupt void P2_ISR(void)
{
  delay_ms(10);


Это моветон


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 13:18 
Заглядывает иногда

Зарегистрирован: 19 окт 2012, 16:01
Сообщения: 87
Откуда: Чебоксары
Есть подозрения, что со спящими режимами что-то не то. Попробуйте без них запустить прогу.
__low_power_mode_off_on_exit(); эта штука точно выводит из lpm3?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 13:37 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 371
Откуда: Донецк
MrYuran, только из-за того, что прерывание в иделе должно работать быстро?

dr_wap, я тоже подозреваю, что проблема образуется во время входа-выхода из LPM, но в каком месте - не могу отловить.
Можно попробовать без них, но ведь финальная прога должна быть с ними :)

__low_power_mode_off_on_exit(); это выход из любого режима в полнофункциональный, т.е. когда работает все.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 13:42 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
ZoomerJuk писал(а):
MrYuran, только из-за того, что прерывание в иделе должно работать быстро?

Не в идеале, а всегда.
Тем более в MSP, где вложенные прерывания по умолчанию запрещены.
Цитата:
dr_wap, я тоже подозреваю, что проблема образуется во время входа-выхода из LPM, но в каком месте - не могу отловить.
Можно попробовать без них, но ведь финальная прога должна быть с ними :)

Советую посмотреть, что из себя реально представляют эти макросы.
Возможно, что они сбрасывают глобальный флаг IE


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 13:53 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 371
Откуда: Донецк
Нет, IE при выходе не затрагивается, только тактирование
Код:
#define __low_power_mode_off_on_exit()         
  (__bic_SR_register_on_exit(  __SR_CPU_OFF   
                             | __SR_SCG0       
                             | __SR_SCG1       
                             | __SR_OSC_OFF))


Я ставил в программе метки и по ним определил, что проблема в том, что контроллер засыпает с отключенными P2IE, как только коммментирую строку отключения P2IE в обработчике прерывания от PORT2, все работает. Но я, наверное, сотню раз просмотрел программу и не пойму - как может получится так? Ведь если программа зашла в обработчике прерывания от PORT2 и отключила P2IE, значит она и таймер запустила. А раз таймер запущен, он полюбому выведет контроллер из спящего режима и в основном цикле включит прерывания от кнопки.

Хотя да, может получаться, что контроллер не переходит в LPM3, тогда таймер не будет работать и программа зависнет. Надо посмотреть. Правильно я перехожу из LPM4 в LPM3?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 14:13 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 371
Откуда: Донецк
Попробовал без спящих режимом. Нифига - при быстром многократном нажатии программа виснет... При неторопливом нажатии все ок. Но почему? Ведь при обработке первого нажатия прерывания от кнопки отключаютя... как может сработать второе и при этом накосячить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 14:51 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
А много вы выигрываете в LPM4 вместо LPM3? Старт часового кварца - дело не быстрое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с прерываниями
СообщениеДобавлено: 04 дек 2013, 15:02 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 371
Откуда: Донецк
LPM3 у меня от VLO. Судя по ДШ разница в 2 раза, хоть речь о 1 мкА. Да и зачем держать постоянно включенным генератор.

Нашел проблему последнего сообщения - включение прерывания поставил после мигания диодом, так до этого во времы процедуры мигания происходило отключение прерываний, теперь все работает идеально. А вот как теперь спящие режимы применить? В варианте со спящим режимом подобное не поможет, т.к. включение стоит перед входом в спячку, т.е. получается уже после мигания...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB