Поделитесь опытом, кто знает. Использую МК CC2430. Настроено внешнее прерывание. При перепаде уровня на ножке (внешнее воздействие) происходит двойной вызов процедуры обработки прерывания.
Вот как описывается этот обработчик.
// IAR 8051 #define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ #define HAL_ISR_FUNC_DECLARATION(f,v) \ _PRAGMA(vector=v) __near_func __interrupt void f(void) #define HAL_ISR_FUNC_PROTOTYPE(f,v) \ _PRAGMA(vector=v) __near_func __interrupt void f(void) #define HAL_ISR_FUNCTION(f,v) \ HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)
void InterruptInit(void) { //Активация внешнего прерывания на нулевом порту P0_1 PICTL |= 0x09; P0IFG &= ~0x02; P0IE = 1; //Port 0 interrupt Enable }
static ISR_FUNC_PTR fptr;
//Привязка процедуры обработки к вектору прерывания void ButIntConnect(ISR_FUNC_PTR isr) { istate_t key; HAL_INT_LOCK(key); fptr = isr; HAL_INT_UNLOCK(key); }
//обработка события при нажатии на кнопку void push_but(void) { but = TRUE; index++; }
HAL_ISR_FUNCTION(P1_ISR,P0INT_VECTOR) { if (fptr != NULL){ (*fptr)(); P0IFG &= ~0x02; } } //======= MAIN ======
void main() { InterruptInit(); ButIntConnect(&push_but);
while(TRUE){
if(but == TRUE){ but = FALSE;
}
}
|