Работа с несколькими прерываниями

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Вот есть у меня два таймера. На разные промежутки времени. И я так понимаю, что пока обрабатывается прерывание от одного таймера, второе прерывание "пропускается". Какие есть варианты что бы один из таймеров гарантированно сработал?
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Сериг писал(а):Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
я тоже могу ошибаться, но, помоему, когда возникает прерывание, аппаратно запрещаются все другие прерывания пока не закончится обработка этого прерывания.
Мне же нужно как раз гарантированно словить одно из прерываний одного таймера.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
Если недопустима какая-либо задержка, то в самом обработчике можно проверять статусный регистр и оперативно реагировать на события. Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

uk8amk писал(а):Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
замечательно. Спасибо большое.
Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
это я знаю. Там же он стек сохраняет что бы потом вернуться в исходное место, и если такую фишку провернуть пару раз то кранты наступят :)
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 37
Зарегистрирован: Вт июн 04, 2013 01:23:39

Сообщение libral »

второе прерывание не потеряется, не пропустится, а выполнится чуть позже
Писал одну программу и там как раз такое не прокатывало. Нужно было одновременно выполнять два действия. Как вариант использовать 2 контроллера.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.

Пропуск события происходит только тогда, когда при глобальном запрете прерываний (то есть, сброшен бит I регистра SREG командой cli, или же он сброшен выполняюшимся прерыванием), происходит 2 или больше события, приводящих к одному и тому же прерыванию.

В случае, если произошло несколько событий различных прерываний одновременно, то первым всегда происходит переход по тому вектору прерывания, который выше в таблице векторов (то есть, адрес которого меньше).
Изображение only pure true norwegian blackx Изображение
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

blackx писал(а):Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.
а когда закончится обработка первого прерывания, запустится обработчик второго прерывания или надо руками флаги смотреть?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

если после выхода из прерывания есть флаг произошедшего события, то обработчик сам запустится. никаких ручных просмотров флагов.
Ставим плюсы: )
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

В дополнение к написанному ibiza11.
После reti произойдёт возврат из прерывания, выполниться одна команда МК, а потом он уйдёт на обработку следующего прерывания.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

доброго времени суток!
у меня происходит прерывание по переполнению Т2 -выполняются действия
потом наступает опять переполнение Т2 - выполняется
в этот момент происходит перепонение Т0 - оно выпосняется после предыдущего
но при выходе из него стоят флаги "Н" "С"- перезагрузка.
даже если ничего не делать в прерывании [7]
atmega8, CVAVR
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Может я чего не понял, но эти флаги - результат арифметических действий и к перезагрузке прямого отношения не имеют.
Изображение
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

это единственное, что я вижу в avrstudio
сам ничего не понимаю если глобально не разрешать прерывания - то работает
если разрешить то такая хрень...
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Потерять прерывание можно только в том случае, если выполнять большой обработчик, и в течении этого времени произойдет 2 прерывания от одного и того же таймера, к примеру. Тогда первое прерывание потеряно. Поэтому рекомендуют обработчик делать как можно компактней и короче.
Также есть такое понятие как приоритет прерываний. К примеру, в PIC24, XMega приоритет прерывания можно задавать. В Tiny, Mega он прошит жестко. Возьмем всеми любимый atmega8. Очень высокий приоритет у внешних прерываний и слабенький у TWI. Если во время обработки прерывания от INT0 генерируется INT1, а во время INT1 будет приходить INT0, то контроллер будет переключаться между этими двумя прерываниями, а до остальных прерываний (и основной программы, кстати тоже) дело так и не дойдет. Или я не прав?
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

прав, только ничего такого я не использую в мойм прерывании бало только x++?
да и это потов вытер
внешних нет, есть только шим на Т1
и на Т2 часы хочу запустить...
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

вот уже и аватар выбрал... и все равно никто не отвечает...
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Можно все, чего пожелается...
И "вложенные прерывания" в том числе.
Только изначально определить приоритет и зоны взаимоперекрытия.
АВРка в этом отношении далеко не MCS51, но все же и не ПИК. 8)
Так что дерзайте! На симулятор студии не слишком надейтесь - для начала стоит поглядеть хелп студии по ограничениям для применяемого МК.
Под асмом возможно проконсультирую, под Сии - ффырршшш!!!
:tea:
Друг Кота
Аватара пользователя
Сообщения: 25498
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

На что отвечать?
Вам уже ответили, что флаги статус-регистра никакого отношения к сбросу не имеют.
С - перенос
Н - перенос между нибблами (полубайтами)
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

vovk69, может вы с синтаксисом намудрили и у вас обработчик прерывания не восстанавливает SREG при выходе.
Исходника нет...телепатов тоже нет... :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

снял разрешение на переполнение Т0
TIMSK 0b01010000
все пошло

Скажите, можно ли использовать предделитель в Т2 если я использую внутренний генератор
4 Мгц
в одной статье читал, что нельзя, зато во множестве других - ни слова...
Ответить

Вернуться в «AVR»