Перейти к содержанию
    

Как организовать прерывание по уровню на MSP?

Портирую код с ATmega на MSP430. Нужно прерывание по уровню, которого на MSP нет (по крайней мере на MSP430F149).

Можно ли как-нибудь программно на MSP организовать прерывание по уровню?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли например организовать прерывание по уровню следующим образом...

На примере прерывания по уровню high на линии P1.0:

 

//==============================================

#define INT0_LINE 0x1

 

#define INT0_INIT() do {\

P1SEL &= ~INT0_LINE;/*alt. func*/ \

P1DIR &= ~INT0_LINE;/*as input*/\

P1IES &= ~INT0_LINE;/*rising edge */\

P1IFG &= ~INT0_LINE;/*clear pending int*/\

} while (0)

 

#define INT0_ENABLE() do{ \

P1IE |= INT0_LINE;\

P1IFG |= (INT0_LINE & P1IN);/*!!!!!!!!!!!!!*/\

}while(0)

 

#define INT0_DISABLE() do{ \

P1IE &= ~INT0_LINE;\

}while(0)

 

#define INT0_CLEAR() do{ \

P1IFG &= ~INT0_LINE;/* clear interrupt flag*/\

}while(0)

//==============================================

#pragma vector=PORT1_VECTOR

__interrupt void PORT1_INT(void)

{

__disable_interrupt();

if (P1IFG & INT0_LINE){ // if rising edge occured

INT0_DISABLE();

 

//... do something

 

INT0_CLEAR();

INT0_ENABLE();

}

}

//==============================================

 

Фишка в том, что когда делаем прерывание доступным - INT0_ENABLE(), то проверяем уровень линии и, если уровень-high, то вызываем прерывание. Если же уровень определен как low, то прерывание вызывается когда возникает rising edge.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день. Всех с наступающим на нас праздником.

:cheers:

Как вариант предлагаю оппробовать продублировать прерыванием от таймера если есть какой то извесный интервал ожидания событий и проверять в этом прерывании ногу.

Если нет извесного интервала, то постараться минимизировать запрет прерывания и построить очередь прерываний складывать их в циклический буфер - этот вариант пробовал с USB контроллером - помогло значительно.

До этого контроллер висс из-за необработаных прерыаний.

Надеюсь поможет.

:smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не можеш отрабатывать по фронту, наверное у тебя на линии дребезг: проверять линию на уровень через определенный интревал времени нормально, но данная методика более потребляющаяя. Например: ты отрабатываеш нажатие клавиатуры, в таком случае будут приемлемо не опрос по интервалу а запуск таймера:

interrupt [ PORT2_VECTOR ] void PORT2(void){ 
if ( P2IFG&0x0E ) { TBCCR5 = TBR + 0x100;  TBCCTL5 = 0x0010;   }
   P2IFG = 0x0;
                                          } // interrupt [ PORT2_VECTOR ] void PORT2(void)
interrupt [ TIMERB1_VECTOR ] void TimerALL( void )  {
... 
if ( TBCCTL5&0x10 ) if ( TBCCTL5&0x01 ) { TBCCTL5 = 0x0;  ... = P2IN; 
....

 

но все естесвенно зависит от твоей задачи, и от формы твоего сигнала...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не можеш отрабатывать по фронту, наверное у тебя на линии дребезг: проверять линию на уровень через определенный интревал времени нормально, но данная методика более потребляющаяя. Например: ты отрабатываеш нажатие клавиатуры, в таком случае будут приемлемо не опрос по интервалу а запуск таймера:

interrupt [ PORT2_VECTOR ] void PORT2(void){ 
if ( P2IFG&0x0E ) { TBCCR5 = TBR + 0x100;  TBCCTL5 = 0x0010;   }
   P2IFG = 0x0;
                                          } // interrupt [ PORT2_VECTOR ] void PORT2(void)
interrupt [ TIMERB1_VECTOR ] void TimerALL( void )  {
... 
if ( TBCCTL5&0x10 ) if ( TBCCTL5&0x01 ) { TBCCTL5 = 0x0;  ... = P2IN; 
....

 

но все естесвенно зависит от твоей задачи, и от формы твоего сигнала...

Нет, по фронту все прекрасно отрабатывается. Теперь и по уровню тоже (см. то что я выше предложил) по крайней мере в моей задаче.

Спасибо всем, кто откликнулся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...