Доброго всем времени суток! Начал недавно заниматься программированием микроконтроллеров. Возникла проблема следующего характера: Есть большая программа написанная на IAR для MSP430F161. Дописал кусок программы в котором инициализировал второй блок захвата/сравнения для таймера B таким образом, чтобы прерывании осуществлялось каждые 1/500 сек. Но программа отказывалась работать. В режиме деббагинга установил, что MSP не выходит из прерывания, инициализированного вторым блоком захвата/сравнения. Вот куски программы: Основное тело программы:
#define TB_DIVIDER 1024 #define TB_DIVIDER2 64
void main(void) { ... InitHW(); // инициализация HW, в том числе и таймеров _EINT(); // разрешение прерываний от таймеров ... for (;;) { // Бесконечный цикл } }
void InitHW(void) { WDTCTL = WDTPW + WDTHOLD; ... BCSCTL2 |= SELM1 + SELS; //Инициализация таймера: TBCTL = TBSSEL0 + TBCLR; // ACLK, clear TBR TBCCTL0 = CCIE; // TRCCR0 interrupt enabled TBCCTL1 = CCIE; // TRCCR1 interrupt enabled TBCCR0 = TB_DIVIDER; // ~10 Ticks per second TBCCR1 = TB_DIVIDER2; // ~500 Ticks per second TBCTL |= MC0; ... }
// Timer B1 interrupt service routine #pragma vector=TIMERB1_VECTOR __interrupt void Timer_B1(void) { if(amd==1) { if(Per1>0) Per1--; if(Per2>0) Per2--; if(Per3>0) Per3--; if(Per4>0) Per4--; } }
// Timer B0 interrupt service routine #pragma vector=TIMERB0_VECTOR __interrupt void Timer_B(void) { //кусок программы, исправно работающий при отсутствии строчки TBCCTL1 = CCIE; }
Причем, если в #define TB_DIVIDER2 поставить значение большее 1024, то программа, которая была до внесения мной изменений, выполняется. В чем может быть проблема? Возможно ли что эта проблема связана с приоритетом прерывания? Т.к. "скорость" появления прерывания от TIMERB1_VECTOR больше чем у TIMERB0_VECTOR, а приоритеты наоборот... или нет? Тактовая частота 8 MГц. ACLK - 32768 Гц. За ранее благодарю. Прошу сильно не пинать, ибо, повторюсь, новичок в этом.
|