Для этого хочу использовать режим захвата таймера B
входы TB0-TB3
c TB0 все нормальнго , для него отдельное прервывание TIMERB0
а вот на 3 сигнала TB1-TB3 вектор один - TIMERB1
в мануале предлагается по регистру TBIV определять сточник прерывания
даже есть примерчик на асме.
Я пришу прогу на IAR C
вот код прерывания:
Код
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B1 (void)
{
unsigned char tbiv = TBIV; // (1)
if(tbiv == 0x02) // (2)
{
delta1 = TBCCR1 - count1;
count1 = TBCCR1;
}
if(tbiv == 0x04)
{
delta2 = TBCCR2 - count2;
count2 = TBCCR2;
}
if(tbiv == 0x06)
{
delta3 = TBCCR3 - count3;
count3 = TBCCR3;
}
}
__interrupt void Timer_B1 (void)
{
unsigned char tbiv = TBIV; // (1)
if(tbiv == 0x02) // (2)
{
delta1 = TBCCR1 - count1;
count1 = TBCCR1;
}
if(tbiv == 0x04)
{
delta2 = TBCCR2 - count2;
count2 = TBCCR2;
}
if(tbiv == 0x06)
{
delta3 = TBCCR3 - count3;
count3 = TBCCR3;
}
}
однако ни одна ветка не не выполняется в режиме реального времени, хотя
в отладке по шагам все работает
если поставить точки останова в строках (1) и (2),
и после остановки в (1) выполнить переход по шагам то tbiv получает парвильное значение и все работает
если после остановки в (1) нажать F5 то программа остановится в (2) но tbiv будет =0, и ниодна ветка не сработает, хотя отлабчик упорно показывает что TBIV = 0x2.
У меня мысль что TBIV сбрасывается еще до входа в прерывание , а при отладке по шагам TBIV вновь устанавливается от нового захвата (импульсы продолжают идти)
Вообщем я уже порядочно запутался.