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

 
 
> разделение источников в прерывании TIMERB1, какой то глюк с TBIV
-=Space=-
сообщение Oct 24 2006, 09:44
Сообщение #1


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

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



есть 4 исмпульсных сигнала, частоту которых необходимо померить.
Для этого хочу использовать режим захвата таймера 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;
    }

}


однако ни одна ветка не не выполняется в режиме реального времени, хотя
в отладке по шагам все работает
если поставить точки останова в строках (1) и (2),
и после остановки в (1) выполнить переход по шагам то tbiv получает парвильное значение и все работает
если после остановки в (1) нажать F5 то программа остановится в (2) но tbiv будет =0, и ниодна ветка не сработает, хотя отлабчик упорно показывает что TBIV = 0x2.

У меня мысль что TBIV сбрасывается еще до входа в прерывание , а при отладке по шагам TBIV вновь устанавливается от нового захвата (импульсы продолжают идти)
Вообщем я уже порядочно запутался.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
-=Space=-
сообщение Oct 25 2006, 06:23
Сообщение #2


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

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



как я понял вся разница в использовании или нет функции __even_in_range

насчет switch или if? у меня раньше и был switch, надо будет к ней вернуться

единственно что ни как не вкурю что за __even_in_range и что она делает
референсгуайд и нелп читал , не помогает
Цитата(CompilerReferenceGuide)
The interrupt vector register contains information about the interrupt source, and the
interrupt service routine normally uses a switch statement to find out which interrupt
source issued the interrupt. To help the compiler generate optimal code for the switch
statement, the intrinsic function __even_in_range must be used. The following
example defines a Timer A interrupt routine:
Код
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
switch (__even_in_range(TAIV, 10))
{
case 2: P1POUT ˆ= 0x04;
break;
case 4: P1POUT ˆ= 0x02;
break;
case 10: P1POUT ˆ= 0x01;
break;
}
}


The intrinsic function __even_in_range requires two parameters, the interrupt vector
register and the last value in the allowed range. The effect of the intrinsic function is that
the generated code can only handle even values within the given range, which is exactly
what is required in this case as the interrupt vector register for Timer A can only be 0,
2, 4, 6, 8, or 10. If the __even_in_range intrinsic function is used in a case where an
odd value, or a value outside the given range could occur, the program will fail.
Go to the top of the page
 
+Quote Post



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

 


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


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