Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания для MSP430
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
JohnKorsh
Добрый день!
Пишу на C в IAR. Не поможет ли кто разобраться с технологией прерываний?
Написал из примера обработку прерывания по Таймеру 0
(Up, когда до порга досчитает, предварительно таймер инициализировал:
TA0R = 0; // Reset of the Tomer A0 counter.
TA0CCR0 = 0x14D4; // Set of the upper limit for output frequency 2250 Hz.
TA0CTL |= TASSEL1 | MC1 | TAIE; // Set of the SMCLK as clock sourse, Set of the count up to TA0CCR0, set of the IE).

Вот обработка прерывания:

CODE
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
switch(__even_in_range(TA0IV, 24))
{
case 0x00: // Vector 0: No interrupts
break;
case 0x02: // Vector 2: Capture/compare 1
Test_Flag = true;
break;
case 0x04: // Vector 4: Capture/compare 2
break;
case 0x06: // Vector 6: Capture/compare 3
break;
case 0x08: // Vector 8: Capture/compare 4
break;
case 0x0A: // Vector A: Capture/compare 5
break;
case 0x0C: // Vector C: Capture/compare 6
break;
case 0x0E: // Vector E: UCRXIFG
Test_Flag_1 = true;
break;
default: break;
}
}

При глобальном запрете прерываний программа работает.
При попытке разрешить прерывание программа "улетает" в
область где нет кодов, правда, не сразу, наверное, само прерывание наступает.
(Ставил Break на прерывание, не срабатывает)

Видимо, я что-то недопонял.

И ещё. Я всегда думал, что C - язык со своболным форматом, но,
если первые две строки обработчика прерываний написать в одну, то компилятор выдаёт ошибку.
rezident
Цитата(JohnKorsh @ Apr 4 2012, 19:09) *
Видимо, я что-то недопонял.

Конечно недопоняли. У таймера А два вектора на три, четыре или больше (в зависимости от серии MSP430) источника прерывания. Вы описали функцию только для одного вектора (TIMERA0_VECTOR), который имеет один источник прерываний (CCR0). Но в то же время разрешили другой источник прерываний (TAIFG) функция обработчика для которого должна располагаться по вектору TIMERA1_VECTOR, но она у вас отсутствует. Вектор TIMERA1_VECTOR расшарен для трех источников прерываний (CCR1, CCR2, TAIFG). Читайте внимательно User's Manual в части описания прерываний TimerA. Вам как минимум нужно изменить адрес данного вектора прерываний - TIMERA1_VECTOR вместо TIMERA0_VECTOR или TIMER0_A1_VECTOR вместо TIMER0_A0_VECTOR, т.к. подозреваю, что у вас кристалл из серии MSP430F5xxx.

Цитата(JohnKorsh @ Apr 4 2012, 19:09) *
И ещё. Я всегда думал, что C - язык со своболным форматом, но,
если первые две строки обработчика прерываний написать в одну, то компилятор выдаёт ошибку.

Директиву #pragma нельзя объединять с другими строками. У нее вполне конкретные токены, специфицированные для данного конкретного компилятора. А разбор параметров pragma идет до конца строки.
JohnKorsh
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.