Можно ли например организовать прерывание по уровню следующим образом... На примере прерывания по уровню 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.
|