Доброго всем времени суток!
Начал недавно заниматься программированием микроконтроллеров. Возникла проблема следующего характера:
Есть большая программа написанная на 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 Гц.
За ранее благодарю. Прошу сильно не пинать, ибо, повторюсь, новичок в этом.