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

 
 
> разделение источников в прерывании 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, 07:51
Сообщение #2


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

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



попробовал с функцией __even_in_range
вообщем она влияет на компиляциию и в асме видно что код становится короче
девайса пока нет, проверить в железе не могу, но в Симуляции НЕ работает!!!

прерывание вызывается, но ни в один из cаse не заходит
в симуляторе TBIV упорно хранит 0, хотя прерывания вызывал пачками

давайте выложу проект полностью
Прикрепленные файлы
Прикрепленный файл  project.zip ( 11.61 килобайт ) Кол-во скачиваний: 37
 
Go to the top of the page
 
+Quote Post
Shread
сообщение Oct 25 2006, 19:42
Сообщение #3


иногда заглядывающий
****

Группа: Свой
Сообщений: 900
Регистрация: 18-05-05
Из: Зеленоград
Пользователь №: 5 170



Цитата(-=Space=- @ Oct 25 2006, 11:51) *
попробовал с функцией __even_in_range
вообщем она влияет на компиляциию и в асме видно что код становится короче
девайса пока нет, проверить в железе не могу, но в Симуляции НЕ работает!!!

прерывание вызывается, но ни в один из cаse не заходит
в симуляторе TBIV упорно хранит 0, хотя прерывания вызывал пачками

давайте выложу проект полностью

Симулятор периферию не симулит, в том числе таймеры.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 25 2006, 20:58
Сообщение #4


Гуру
******

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



Цитата(Shread @ Oct 26 2006, 01:42) *
Цитата(-=Space=- @ Oct 25 2006, 11:51) *

попробовал с функцией __even_in_range
вообщем она влияет на компиляциию и в асме видно что код становится короче
девайса пока нет, проверить в железе не могу, но в Симуляции НЕ работает!!!

прерывание вызывается, но ни в один из cаse не заходит
в симуляторе TBIV упорно хранит 0, хотя прерывания вызывал пачками

давайте выложу проект полностью

Симулятор периферию не симулит, в том числе таймеры.

Точнее будет сказать не полностью симулирует.
В C-CPY есть оконо Forced Interrupt Window, где можно симулировать прерывания, выбрав нужное и кликнув по кнопке Trigger. В поле Description этого окна указаны пары: маска прерывания и флаг прерывания. Например, у вектора TIMERB1_VECTOR можно вызвать прерывания с маской TBCCTLx.CCIE и флагом TBCCTLx.CCIFG (где x - номер соответствующего регистра capture/compare). Но если, остановив дебаггер, последовательно симулировать вызов нескольких разных прерываний с вектором TIMERB1_VECTOR, а потом немного пошагать, то видно что симулятор вполне правильно установил флаги соответствующих прерываний в регистрах TBCCTLx. И сбрасываются они по одному при каждом вызове прерывания с вектором TIMERB1_VECTOR в соответствии с их приоритетами. А вот TBIV при этом действительно не изменяется и если нужно проверить логику выполнения ветвлений по TBIV, то его значение следует выставлять в симуляторе ручками.
Go to the top of the page
 
+Quote Post



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

 


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


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