Пишу на 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;
}
}
__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 - язык со своболным форматом, но,
если первые две строки обработчика прерываний написать в одну, то компилятор выдаёт ошибку.