Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с таймером ARM через прерывание
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
alt3857
Привет
Есть функция-обработчик прерывания от таймера
__irq void TIMER2_IRQHandler(void)
{
LPC_TIM2->TCR = 2;//timer disable and reset

if (a==1) {LPC_TIM2->MR0 = 10000;b=1;};
if (a==2) {LPC_TIM2->MR0 = 20000;};
if (a==3) {LPC_TIM2->MR0 = 30000;b=0;a=0;};
a++;
LPC_TIM2->TCR = 1;//counter enable
LPC_TIM2->IR = 1;//сброс прерывания MR0 таймера2
};
Задача такая, чтобы условия выполнялись через заданные промежутки времени,
которые задаю совпадением mr0.
Нужно, чтобы условия при каждом a выполнялись без пребоя. Так-то работает, но
иногда (редко) переменная b устанавливается в 1 и не сбрасывается в 0.
Не могу причину найти. В программе есть еще один обработчик внешнего прерывания.
Подскажите в чем может быть проблема или как лучше сделать отсчет времени и
выполнение нужной функции по истечению, чтобы не было сбоев в работе.
Параметр b используется в основной программе вне прерываний.
Может быть такое, что счетчик проскакивает совпадение mr0 по каким-то причинам и поэтому условие не выполняется?
Спасибо.
DpInRock
volatile
alt3857
DpInRock, сделал переменную volatile, но проблема осталась. Все-таки возможно ли такое, что совпадение таймера проскакивает (например, другое прерывание происходит)? Просто задача у меня критическая к выполнению последовательности действий через заданные промежутки времени, т.е. первое действие, например, через 30 мс, второе через 100, третье через 70 и.т.д., пропуск действий недопустим. Подcкажите каким образом реализовать?
Dog Pawlowa
Цитата(alt3857 @ Jan 29 2011, 09:53) *
Подcкажите каким образом реализовать?

Лично я никогда не управляю периодом прерываний таймера, и Вам не советую.

У меня во всех проектах есть таймер, который вызывает прерывания каждую миллисекунду, а уже внутри прерывания имеется программный счетчик, который инкрементируется и сравнивается с константами.

Причина Ваших проблем может быть от тупого использования переменной 'a' (классное имя для глобальной переменной!) где-то еще, до большой длительности второго используемого прерывания.
alt3857
Dog Pawlowa, спасибо, хороший совет. Тогда вопрос - не слишком ли часто получится дергать прерывание 1 мс, просто как я делаю у меня прерывание происходит 1 раз, а так будет происходить каждую мс? А по поводу глобальной переменной 'a' дак это я просто для примера написал), так-то она у меня по другому названа и точно больше нигде не используется.
sergeeff
Цитата(alt3857 @ Jan 30 2011, 13:38) *
Dog Pawlowa, спасибо, хороший совет.


Вот и воспользуйтесь этим хорошим советом. Если посмотрите на Windows/UNIX, там тоже также сделано - системный таймер с постоянным тактом и от него все задержки программные формируются.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.