Страница 1 из 2
Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 16:09:29
alex1126
Вот есть у меня два таймера. На разные промежутки времени. И я так понимаю, что пока обрабатывается прерывание от одного таймера, второе прерывание "пропускается". Какие есть варианты что бы один из таймеров гарантированно сработал?
Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 17:01:44
Сериг
Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 17:30:35
alex1126
Сериг писал(а):Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
я тоже могу ошибаться, но, помоему, когда возникает прерывание, аппаратно запрещаются все другие прерывания пока не закончится обработка этого прерывания.
Мне же нужно как раз гарантированно словить одно из прерываний одного таймера.
Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 18:06:02
uk8amk
Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
Если недопустима какая-либо задержка, то в самом обработчике можно проверять статусный регистр и оперативно реагировать на события. Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 18:37:50
alex1126
uk8amk писал(а):Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
замечательно. Спасибо большое.
Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
это я знаю. Там же он стек сохраняет что бы потом вернуться в исходное место, и если такую фишку провернуть пару раз то кранты наступят

Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 22:49:27
libral
второе прерывание не потеряется, не пропустится, а выполнится чуть позже
Писал одну программу и там как раз такое не прокатывало. Нужно было одновременно выполнять два действия. Как вариант использовать 2 контроллера.
Re: Работа с несколькими прерываниями
Добавлено: Вс июн 09, 2013 23:09:09
blackx
Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.
Пропуск события происходит только тогда, когда при глобальном запрете прерываний (то есть, сброшен бит I регистра SREG командой cli, или же он сброшен выполняюшимся прерыванием), происходит 2 или больше события, приводящих к одному и тому же прерыванию.
В случае, если произошло несколько событий различных прерываний одновременно, то первым всегда происходит переход по тому вектору прерывания, который выше в таблице векторов (то есть, адрес которого меньше).
Re: Работа с несколькими прерываниями
Добавлено: Пн июн 10, 2013 10:16:20
alex1126
blackx писал(а):Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.
а когда закончится обработка первого прерывания, запустится обработчик второго прерывания или надо руками флаги смотреть?
Re: Работа с несколькими прерываниями
Добавлено: Пн июн 10, 2013 12:43:03
ibiza11
если после выхода из прерывания есть флаг произошедшего события, то обработчик сам запустится. никаких ручных просмотров флагов.
Re: Работа с несколькими прерываниями
Добавлено: Пн июн 10, 2013 16:30:38
Kavka
В дополнение к написанному ibiza11.
После reti произойдёт возврат из прерывания, выполниться одна команда МК, а потом он уйдёт на обработку следующего прерывания.
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 10:28:31
vovk69
доброго времени суток!
у меня происходит прерывание по переполнению Т2 -выполняются действия
потом наступает опять переполнение Т2 - выполняется
в этот момент происходит перепонение Т0 - оно выпосняется после предыдущего
но при выходе из него стоят флаги "Н" "С"- перезагрузка.
даже если ничего не делать в прерывании [7]
atmega8, CVAVR
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 11:20:22
uk8amk
Может я чего не понял, но эти флаги - результат арифметических действий и к перезагрузке прямого отношения не имеют.

Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 12:32:38
vovk69
это единственное, что я вижу в avrstudio
сам ничего не понимаю если глобально не разрешать прерывания - то работает
если разрешить то такая хрень...
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 14:53:23
eess9
Потерять прерывание можно только в том случае, если выполнять большой обработчик, и в течении этого времени произойдет 2 прерывания от одного и того же таймера, к примеру. Тогда первое прерывание потеряно. Поэтому рекомендуют обработчик делать как можно компактней и короче.
Также есть такое понятие как приоритет прерываний. К примеру, в PIC24, XMega приоритет прерывания можно задавать. В Tiny, Mega он прошит жестко. Возьмем всеми любимый atmega8. Очень высокий приоритет у внешних прерываний и слабенький у TWI. Если во время обработки прерывания от INT0 генерируется INT1, а во время INT1 будет приходить INT0, то контроллер будет переключаться между этими двумя прерываниями, а до остальных прерываний (и основной программы, кстати тоже) дело так и не дойдет. Или я не прав?
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 14:56:47
vovk69
прав, только ничего такого я не использую в мойм прерывании бало только x++?
да и это потов вытер
внешних нет, есть только шим на Т1
и на Т2 часы хочу запустить...
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 16:05:14
vovk69
вот уже и аватар выбрал... и все равно никто не отвечает...
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 16:14:15
BOB51
Можно все, чего пожелается...
И "вложенные прерывания" в том числе.
Только изначально определить приоритет и зоны взаимоперекрытия.
АВРка в этом отношении далеко не MCS51, но все же и не ПИК.
Так что дерзайте! На симулятор студии не слишком надейтесь - для начала стоит поглядеть хелп студии по ограничениям для применяемого МК.
Под асмом возможно проконсультирую, под Сии - ффырршшш!!!

Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 16:21:22
КРАМ
На что отвечать?
Вам уже ответили, что флаги статус-регистра никакого отношения к сбросу не имеют.
С - перенос
Н - перенос между нибблами (полубайтами)
Re: Работа с несколькими прерываниями
Добавлено: Вт июл 23, 2013 18:02:59
Kavka
vovk69, может вы с синтаксисом намудрили и у вас обработчик прерывания не восстанавливает SREG при выходе.
Исходника нет...телепатов тоже нет...

Re: Работа с несколькими прерываниями
Добавлено: Ср июл 24, 2013 09:36:56
vovk69
снял разрешение на переполнение Т0
TIMSK 0b01010000
все пошло
Скажите, можно ли использовать предделитель в Т2 если я использую внутренний генератор
4 Мгц
в одной статье читал, что нельзя, зато во множестве других - ни слова...