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

 
 
> разделение источников в прерывании 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
Ответов
rezident
сообщение Oct 25 2006, 06:45
Сообщение #2


Гуру
******

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



Цитата(-=Space=- @ Oct 24 2006, 15:44) *
однако ни одна ветка не не выполняется в режиме реального времени, хотя
в отладке по шагам все работает
если поставить точки останова в строках (1) и (2),
и после остановки в (1) выполнить переход по шагам то tbiv получает парвильное значение и все работает
если после остановки в (1) нажать F5 то программа остановится в (2) но tbiv будет =0, и ниодна ветка не сработает, хотя отлабчик упорно показывает что TBIV = 0x2.

У меня мысль что TBIV сбрасывается еще до входа в прерывание , а при отладке по шагам TBIV вновь устанавливается от нового захвата (импульсы продолжают идти)
Вообщем я уже порядочно запутался.

Цитата из Компэловской книги "Семейство микроконтроллеров MSP430x1xx.
Руководство пользователя."
Код
Генератор вектора прерывания TBIV
Флаг TBIFG и флаги TBCCRx CCIFG (кроме TBCCR0 CCIFG) распределены по при-
оритетам и объединены в источник одного вектора прерывания. Регистр вектора пре-
рывания TBIV используется для определения, какой флаг запросил прерывание.
Разрешенное прерывание с наивысшим приоритетом (кроме TBCCR0
CCIFG) генерирует число в регистре TBIV (см. описание регистра). Можно оце-
нить это число или добавить его к программному счетчику для автоматическо-
го входа в соответствующую процедуру программы. Запрещенные прерывания
таймера В не воздействуют на значение TBIV.
Любой тип доступа: чтение или запись регистра TBIV автоматически сбра-
сывает флаг наивысшего ожидающего прерывания. Если установлен другой
флаг прерывания, будет немедленно сгенерировано другое прерывание после
обработки изначального прерывания. К примеру, если флаги TBCCR1 и TBCCR2
CCIFG установлены, когда процедура обработки прерывания обращается к ре-
гистру TBIV, флаг TBCCR1 CCIFG автоматически сбрасывается. После выпол-
нения команды процедуры обработки прерывания RETI, флаг TBCCR2 CCIFG
генерирует другое прерывание.

Во-первых, проверьте разрешены ли у вас идивидуальные прерывания от регистров capture - бит CCIE в регистрах TBCCTLx.
Во-вторых, для того чтобы обслужить все флаги в одном прерывании нужно прочитать TBIV столько раз сколько имеется источников прерываний в данном модуле (6+1). У вас же насколько я вижу TBIV читается один раз. Поэтому обрабатываться за одно прерывание может только один источник прерываний модуля TimerB. И для обработки трех установленных флагов (в вашем случае) прерывание должно быть вызвано последовательно три раза.
Go to the top of the page
 
+Quote Post



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

 


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


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