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

 
 
> Работа с таймером 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
Ответов (1 - 5)
DpInRock
сообщение Dec 3 2010, 00:45
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



volatile


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
alt3857
сообщение Jan 29 2011, 05:53
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


Гуру
******

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



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

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

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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
alt3857
сообщение Jan 30 2011, 10:38
Сообщение #5


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

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



Dog Pawlowa, спасибо, хороший совет. Тогда вопрос - не слишком ли часто получится дергать прерывание 1 мс, просто как я делаю у меня прерывание происходит 1 раз, а так будет происходить каждую мс? А по поводу глобальной переменной 'a' дак это я просто для примера написал), так-то она у меня по другому названа и точно больше нигде не используется.

Сообщение отредактировал alt3857 - Jan 30 2011, 10:42
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 30 2011, 10:57
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(alt3857 @ Jan 30 2011, 13:38) *
Dog Pawlowa, спасибо, хороший совет.


Вот и воспользуйтесь этим хорошим советом. Если посмотрите на Windows/UNIX, там тоже также сделано - системный таймер с постоянным тактом и от него все задержки программные формируются.
Go to the top of the page
 
+Quote Post

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

 


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


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