реклама на сайте
подробности

 
 
> Прерывания для MSP430, Как правильно прописать в C?
JohnKorsh
сообщение Apr 4 2012, 14:09
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



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

Сообщение отредактировал IgorKossak - Apr 4 2012, 18:50
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
rezident
сообщение Apr 4 2012, 23:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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 идет до конца строки.
Go to the top of the page
 
+Quote Post
JohnKorsh
сообщение Apr 5 2012, 04:24
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 6-01-05
Из: Россия, Москва
Пользователь №: 1 820



Спасибо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 20:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016