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

 
 
> Работа с таймером ARM через прерывание, отсчет времени и выполнение функций после истечения
alt3857
сообщение Dec 2 2010, 04:58
Сообщение #1


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

Группа: Участник
Сообщений: 94
Регистрация: 21-04-10
Пользователь №: 56 794



Привет
Есть функция-обработчик прерывания от таймера
__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 по каким-то причинам и поэтому условие не выполняется?
Спасибо.

Сообщение отредактировал alt3857 - Dec 2 2010, 05:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alt3857
сообщение Jan 29 2011, 05:53
Сообщение #2


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

Группа: Участник
Сообщений: 94
Регистрация: 21-04-10
Пользователь №: 56 794



DpInRock, сделал переменную volatile, но проблема осталась. Все-таки возможно ли такое, что совпадение таймера проскакивает (например, другое прерывание происходит)? Просто задача у меня критическая к выполнению последовательности действий через заданные промежутки времени, т.е. первое действие, например, через 30 мс, второе через 100, третье через 70 и.т.д., пропуск действий недопустим. Подcкажите каким образом реализовать?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 29 2011, 15:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(alt3857 @ Jan 29 2011, 09:53) *
Подcкажите каким образом реализовать?

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

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

Причина Ваших проблем может быть от тупого использования переменной 'a' (классное имя для глобальной переменной!) где-то еще, до большой длительности второго используемого прерывания.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post



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

 


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


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