Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Двойной вызов прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
arttech
Поделитесь опытом, кто знает. Использую МК 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;

}

}
zltigo
1. Неформатированные тексты не читаю принципиально - настоятельно рекомендую уважать читающих и пользовать тэги форманирования.
2. Принципиально причин может быть две
- нет защиты от дребезга.
- контроллер прерываний настроен на работу по уровню.
arttech
Цитата(zltigo @ Dec 11 2008, 01:34) *
1. Неформатированные тексты не читаю принципиально - настоятельно рекомендую уважать читающих и пользовать тэги форманирования.
2. Принципиально причин может быть две
- нет защиты от дребезга.
- контроллер прерываний настроен на работу по уровню.


К счастью тему дребезга освоил давно, поэтому позаботился чтоб этот фактор никак не влиял (формировал импульсы другим МК).
Прерывание в этом МК настраивается только по перепаду либо от 0 к 1, либо наоборот..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.