Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Множественные прерывания в TimerB
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
korobov_michael
День добрый.
Работаю с F148, хочу использовать два прерывания по захвату (CCR0 и CCR1), а также прерывание по переполнению. Все от TimerВ. Работаю в IAR.
Проблема в том, что если я разрешаю все три типа прерываний, то в обработчике, обрабатывающем прерывание CCR1 (TBIV == 0x02) и переполнения (TBIV == 0x0E) обрабатывается только наиболее приоритетное прерывание (CCR1). Второго контроллер будто не видит. Если отключить обработку CCR1, то переполнение обрабатывается нормально.
Может быть, мало курил документацию... но никто ли не сталкивался с подобным? Что можно сделать?
Огромное спасибо!
rezident
Приведите фрагмент кода обработчика прерывания. Думаю там у вас ошибка в ветвлении. Для нормального ветвления по значению этого вектора нужно только один раз при входе в прерывание считывать TBIV, иначе каждое его чтение уменьшает вложенность количество запросов прерываний.
Пример.
Код
#pragma vector=TIMERB1_VECTOR
#pragma type_attribute=__interrupt
void TimerB1_ISR(void)
{ unsigned int reg;
  reg=TBIV;
  switch(reg)
  { case 0x02:
     // обработчик от TBCCR1
      break;
    case 0x0E:
    //обработчик прерывания от переполнения
      break;
    default: //все остальные не используем
      break;
  }
}

Ну и не следует забывать, что у таймераB два вектора прерываний. Один для TBCCR0, и второй для всех остальных.
korobov_michael
Код
// Timer_B7 Interrupt Vector (TBIV) handler
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B1_6(void)
{
    switch( TBIV )
    {
    case  2:
        P1OUT ^= 0x01;//здесь ставится Breakpoint чтобы убедиться что попадаем
                        //по захвату
        break;
    case 14:
        P1OUT ^= 0x01;//здесь ставится Breakpoint чтобы убедиться что попадаем
                        //по переполнению
        break;
    }
}

// Timer_B7 Interrupt Vector (TBIV) handler
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void)
{
    static unsigned char tmp = 0;
    tmp++;    //пока просто дабы убедиться что попадаем сюда
}


Вот примерно так. Реальные обработчики я заменил переключением ножки контроллера, дабы не захламлять код.
Про два вектора знаю. Учел. Прикол с однократным считыванием TBIV вроде тоже учел. Но проблема остается -- если разрешены все прерывания, то обрабатывается только наиболее приоритетное. Как только оно запрещается - обрабатывается следующее по приоритету - в моем случае обработчик переполнения
rezident
Цитата(korobov_michael)
если разрешены все прерывания, то обрабатывается только наиболее приоритетное. Как только оно запрещается - обрабатывается следующее по приоритету - в моем случае обработчик переполнения

Не вижу здесь чего-либо неординарного. Так и должны работать прерывания с разными приоритетами. Возможно вас вводит в недоумение использование breakpoint. При установке breakpoint на метке case 2: следующий вызов опять попадет на этот же вектор, т.к. несмотря на "останов по бряку" таймер в железе продолжает "щелкать", а прерывания формироваться. Вы лучше счетчики вместо "ногодрыгалки" сделайте или "дрыгайте" разными пинами в разных прерываниях, а не одним и тем же. Тогда вы сможете увидеть (например, осциллографом) работают ли все обработчики прерываний или только одно с самым высоким приоритетом.
P.S. IAR вроде корректно реализует switch(TBIV) с созданием копии этого регистра в РОНе, но на всякий случай посмотрите асм-овый исходник в этой части. Вдруг IAR лажается и TBIV дважды считывается в одном прерывании?
korobov_michael
Цитата(rezident @ Aug 21 2007, 00:19) *
несмотря на "останов по бряку" таймер в железе продолжает "щелкать", а прерывания формироваться.


Я перехожу на MSP с AVR. В АВР в настройках IAR была возможность на время программного останова останавливать таймера. в ИАРе для MSP я такой возможности не нашел. Ее не существует или я плохо искал?
Но что касается счетчиков вместо ногодрыгалки - обязательно посмотрю. Спасибо большое

P.S. Смущает, правда, тот момент, что если я ставлю breakpoint только в ветви с менее приоритетным прерыванием, то (при разрешенном более приоритетном) контроллер в эту ветвь не заходит. Будем искать
shasik
Цитата(korobov_michael @ Aug 21 2007, 07:25) *
В АВР в настройках IAR была возможность на время программного останова останавливать таймера. в ИАРе для MSP я такой возможности не нашел. Ее не существует или я плохо искал?


Плохо Искали. Есть.
Dog Pawlowa
Цитата(korobov_michael @ Aug 21 2007, 07:25) *
P.S. Смущает, правда, тот момент, что если я ставлю breakpoint только в ветви с менее приоритетным прерыванием, то (при разрешенном более приоритетном) контроллер в эту ветвь не заходит. Будем искать

Может я и не копал глубоко, но у меня сложилось впечатление, что использование точек останова в прерываниях MSP действительно более непредсказуемо, чем у того же AVR. Но я достаточно легко мирюсь с этим.
korobov_michael
Цитата(shasik @ Aug 21 2007, 08:35) *
Плохо Искали. Есть.

Если можно, укажите, пожалуйста, где его искать. Лично я не нашел.
Поскольку у меня все еще имеются сомнения насчет возможности останова таймеров при программном стопе, скажите, пожалуйста, может быть, имеются какие-то специфические приемы при отладке?
korobov_michael
Вопрос в догонку. Я хочу запитать ACLK от 4МГц. Однако только что вычитал, что ACLK предназначен для низкочастотной работы. Насколько реальна запитка от 4МГц?
shasik
Цитата(korobov_michael @ Aug 21 2007, 11:51) *
Если можно, укажите, пожалуйста, где его искать. Лично я не нашел.


Когда запускаете программу в IAR, то появляется новая панелька, там есть кнопка с изображением часиков - ее нужно нажать. Или то же самое через пункты меню Emulator->Advanced->Clock Cotrol.
Нажав на кнопку/выбрать пункт меню, вываливается окошко с несколькими chekbox'ами: Stop ACKL on emulation stop, Stop SMCKL on emulation stop или что-то подобное.

Одно но! Сам я никогда этой приблудой не пользовался. Для чего она нужна и работает ли она вообще точно не знаю. Хотя смысл в принципе понятен...

Расскажите потом, что у Вас получилось
jorikdima
Цитата(korobov_michael @ Aug 21 2007, 14:01) *
Вопрос в догонку. Я хочу запитать ACLK от 4МГц. Однако только что вычитал, что ACLK предназначен для низкочастотной работы. Насколько реальна запитка от 4МГц?

используйте SMCLK . Либо (тут не уверен) подавайте на какую то там ногу контроллера такт от внешнего генератора
korobov_michael
Цитата(shasik @ Aug 21 2007, 13:20) *
Когда запускаете программу в IAR, то появляется новая панелька, там есть кнопка с изображением часиков - ее нужно нажать. Или то же самое через пункты меню Emulator->Advanced->Clock Cotrol.
Нажав на кнопку/выбрать пункт меню, вываливается окошко с несколькими chekbox'ами: Stop ACKL on emulation stop, Stop SMCKL on emulation stop или что-то подобное.

Одно но! Сам я никогда этой приблудой не пользовался. Для чего она нужна и работает ли она вообще точно не знаю. Хотя смысл в принципе понятен...

Расскажите потом, что у Вас получилось

Мгм... С радостью увидел твой пост. Но, увы, F148 не имеет, похоже, этого пресловутого EnhancedEmulationModule sad.gif жаль
shasik
Цитата(korobov_michael @ Aug 21 2007, 15:53) *
Мгм... С радостью увидел твой пост. Но, увы, F148 не имеет, похоже, этого пресловутого EnhancedEmulationModule sad.gif жаль

F148?! Это фича IAR'а. Это есть для любого камня, поддерживаемого средой. Может дело в программаторе? У меня самый простой JTAG, который через LPT.
rezident
Цитата(korobov_michael @ Aug 21 2007, 16:01) *
Вопрос в догонку. Я хочу запитать ACLK от 4МГц. Однако только что вычитал, что ACLK предназначен для низкочастотной работы. Насколько реальна запитка от 4МГц?

В кристаллах с двумя кварцевыми генераторами XT1 может работать как с высокочастотным, так и с часовым кварцем. XT2 только с высокочастотным. Так что можно оба кварца поставить высокочастотных. В кристаллах с одним генератором присутствует только XT1, который может работать как с высокочастотным, так и с часовым кварцами. Проблема лишь в том, что в двухгенераторных кристаллах ACLK может формироваться от XT1, а SMCLK от DCO или XT2.
exSSerge
Цитата(korobov_michael @ Aug 21 2007, 15:51) *
может быть, имеются какие-то специфические приемы при отладке?

Конечно!
(1) Отладочная печать (или "дрыгание ножкой") для того чтобы понять как именно проявляет себя ошибка и
(2) внимательное чтение текста в поисках ошибки - самый старый и по-прежнему самый эффективный метод отладки.
Он появился ещё до изобретения мышей и окон и наверняка их переживёт.
Отсутствие необходимости возиться ещё и с отладчиком оставляет больше времени на самое главное - пункт (2). smile.gif

P.S. Шутки шутками, но из предыдущего обсуждения не понятно - Вы без отладчика, в естественной, так сказать среде, проверяли? Судя по тексту - должно работать.
korobov_michael
Большое спасибо всем принявшим участие в обсуждении!
Железка запущена - этому в немалой степени способствали проблемы у провайдера smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.