Как поместить прерывание в цикл?

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
aLedorn
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 12, 2013 07:55:15

Как поместить прерывание в цикл?

Сообщение aLedorn »

Здравствуйте.
Я начал разбираться с прерываниями и возник вопрос.

Как поместить прерывание в цикл while?
вот пример:

Код: Выделить всё

void main(void)
{
  while(1)
   {
       if(bool == 1)
         {
           interrupt [TIM1_COMPA] void timer1_compa_isr(void)
              {
                 s++; // увеличиваем переменную каждую секунду
                 if(s>59) // обнуляем секунды после 59
                   {
                      s=0;
                   } 
              }
         }
   }
}
Ругается: Error: 'interrupt' or '__interrupt' attributes not allowed in this context.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Как поместить прерывание в цикл?

Сообщение Kavka »

Мнда.... И, вот, опять... и снова... :))
Такого поворота мысли я ещё не встречал. :)) :))
Это на правах лирического отступления, так сказать.

А если серьёзно...
Во-первых, почитайте как работают прерывания вообще.
Во-вторых, как работает таймер, который вы пытаетесь использовать.
В-третьих, самое главное, обратите внимание как запускается код находящийся в прерывании.
В-четвёртых, компилятор правильно ругается. По стандарту Си так делать нельзя. Обработчик прерывание это отдельная процедура.

Какой, кстати, компилятор (среда разработки)? А то TIM1_COMPA в квадратных скобках как-то в глаза бросается.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Как поместить прерывание в цикл?

Сообщение Gudd-Head »

aLedorn писал(а):Как поместить прерывание в цикл while?
Что значит "поместить прерывание в цикл"??? :shock:
Прерывание — это событие.

Как поместить День Рождения в цикл?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
kobzar
Грызет канифоль
Сообщения: 278
Зарегистрирован: Вт дек 03, 2013 11:04:04
Откуда: Киев
Контактная информация:

Re: Как поместить прерывание в цикл?

Сообщение kobzar »

Gudd-Head писал(а):
aLedorn писал(а):Как поместить прерывание в цикл while?
Как поместить День Рождения в цикл?
А оно и так в цыкле - каждый год в одно и то же время :)
Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
Реклама
Эиком - электронные компоненты и радиодетали
aLedorn
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 12, 2013 07:55:15

Re: Как поместить прерывание в цикл?

Сообщение aLedorn »

Среда разработки CodeVisionAVR Evaluation.

У меня задача включить секундомер по условию(изменение значения переменной).
Т.е. прерывание нельзя запустить по условию(if)?
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Как поместить прерывание в цикл?

Сообщение Gudd-Head »

aLedorn писал(а):Т.е. прерывание нельзя запустить по условию(if)?
Что вы подразумеваете под "запустить прерывание"?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
aLedorn
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пн авг 12, 2013 07:55:15

Re: Как поместить прерывание в цикл?

Сообщение aLedorn »

Вот у внешнего прерывание есть условие для прерывания: изменения логического уровня к примеру.
Вот такого же условия я добиваюсь.

Проще говоря прерывание по условию с дополнительным условием.
У меня прерывание происходит каждую десятую секунды. Но мне хотелось бы еще условие, начать прерывание после изменения переменной.
metan
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Re: Как поместить прерывание в цикл?

Сообщение metan »

aLedorn писал(а):Т.е. прерывание нельзя запустить по условию(if)?
Аппаратное прерывание и так выполняется по условию. Но можно в прерывании проверить еще какие-то условия (без фанатизма конечно :)).

Код: Выделить всё

interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
  if (bool)  {
    s++; // увеличиваем переменную каждую секунду
    if (s>59) // обнуляем секунды после 59
      s=0;
  }
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18592
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как поместить прерывание в цикл?

Сообщение ARV »

Код: Выделить всё

if(bool)
      sei(); // разрешаем прерывания
else
      cli(); // запрещаем прерывания
или выборочно - разрешение/запрет только прерывания от таймера.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Как поместить прерывание в цикл?

Сообщение dosikus »

ARV писал(а):......
А если подумать , то что затеял ТС и на не нужно .
И надо то всего-то подумать ...
Верно же было озвучено - нельзя нубам своеволничать ...
mrFox
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Re: Как поместить прерывание в цикл?

Сообщение mrFox »

aLedorn писал(а): Как поместить прерывание в цикл while?

Код: Выделить всё

void main(void)
{
  while(1)
   {
       if(bool == 1)
         {
           interrupt [TIM1_COMPA] void timer1_compa_isr(void)
              {
                 s++; // увеличиваем переменную каждую секунду
                 if(s>59) // обнуляем секунды после 59
                   {
                      s=0;
                   } 
              }
         }
   }
}
Ругается: ...
не ну можно что-то делать не особо разбираясь, но чтоб ТАК :cry:

вообще-то нужно просто включать/выключать таймер
и в прерывании считать

а вообще есть гугл, есть яндекс - набираешь там
микроконтроллер AVR таймер
микроконтроллер AVR прерывания
микроконтроллер AVR для начинающих
информации море и все на русском
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Как поместить прерывание в цикл?

Сообщение YS »

aLedorn, ваша задача 100% имеет другое алгоритмическое решение, без прерываний в цикле. :)) Может статься, вам и прерывания-то не нужны.

А так, внеочередное срабатывание прерывания можно принудительно вызвать, руками установив его флаг. Включать/выключать прерывания можно тоже соответствующим флагом, либо глобально, сразу все (sei()/cli(), не знаю, как оно конкретно называется в CVAVR).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Re: Как поместить прерывание в цикл?

Сообщение dr.doc »

Судя по вопросу человек пока не имеет понятия об устройстве МК. А ему "локально, глобально, алгоритмическое решение" - не издевайтесь.
PS Если МК ничего не делает - постоянно проверяете свое условие (или несколько раз в основном цикле программы). Как только оно истинно (нужно запустить таймер) - переходите на подпрограмму, разрешающую работу этого таймера. Если быстродействие критично, то выполняете все настройки (инициализацию), кроме подачи тактовой частоты на счетный вход таймера (регистр TCCR1B) и делаете это уже по условию.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Как поместить прерывание в цикл?

Сообщение dosikus »

dr.doc писал(а):Судя по вопросу человек пока не имеет понятия об устройстве МК. А ему "локально, глобально, алгоритмическое решение" - не издевайтесь.
Сие было бы верно , если бы человек просто повторял чужую конструкцию.
Коли пишешь код - изволь и "кишки" досконально изучить .
А так все это детским садом и аурдуньей попахивает.
Ответить

Вернуться в «Разные вопросы по МК»