Работа с несколькими прерываниями
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Вот есть у меня два таймера. На разные промежутки времени. И я так понимаю, что пока обрабатывается прерывание от одного таймера, второе прерывание "пропускается". Какие есть варианты что бы один из таймеров гарантированно сработал?
- Реклама
Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
Может я и ошибаюсь.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
я тоже могу ошибаться, но, помоему, когда возникает прерывание, аппаратно запрещаются все другие прерывания пока не закончится обработка этого прерывания.Сериг писал(а):Может я не до конца понимаю,но я думаю что вам нужно на время одного пребывания запретить другое...
Может я и ошибаюсь.
Мне же нужно как раз гарантированно словить одно из прерываний одного таймера.
Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
Если недопустима какая-либо задержка, то в самом обработчике можно проверять статусный регистр и оперативно реагировать на события. Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
Если недопустима какая-либо задержка, то в самом обработчике можно проверять статусный регистр и оперативно реагировать на события. Можно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
замечательно. Спасибо большое.uk8amk писал(а):Когда таймер срабатывает, он выставляет соответствующий флаг в статусный регистр. После выхода из предыдущего прерывания запускается следующее перывание, по выходу статусный флаг очищается. Т.о. второе прерывание не потеряется, не пропустится, а выполнится чуть позже.
это я знаю. Там же он стек сохраняет что бы потом вернуться в исходное место, и если такую фишку провернуть пару раз то кранты наступятМожно также разрешать прерывания в обработчике(вложеные прерывания), но это в крайнем случае и требует тщательного проектирования и отладки алгоритма, чтобы программа и стек не разрушились при выполнении.
- Реклама
- Сообщения: 37
- Зарегистрирован: Вт июн 04, 2013 01:23:39
Писал одну программу и там как раз такое не прокатывало. Нужно было одновременно выполнять два действия. Как вариант использовать 2 контроллера.второе прерывание не потеряется, не пропустится, а выполнится чуть позже
Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.
Пропуск события происходит только тогда, когда при глобальном запрете прерываний (то есть, сброшен бит I регистра SREG командой cli, или же он сброшен выполняюшимся прерыванием), происходит 2 или больше события, приводящих к одному и тому же прерыванию.
В случае, если произошло несколько событий различных прерываний одновременно, то первым всегда происходит переход по тому вектору прерывания, который выше в таблице векторов (то есть, адрес которого меньше).
Пропуск события происходит только тогда, когда при глобальном запрете прерываний (то есть, сброшен бит I регистра SREG командой cli, или же он сброшен выполняюшимся прерыванием), происходит 2 или больше события, приводящих к одному и тому же прерыванию.
В случае, если произошло несколько событий различных прерываний одновременно, то первым всегда происходит переход по тому вектору прерывания, который выше в таблице векторов (то есть, адрес которого меньше).
only pure true norwegian blackx 
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
а когда закончится обработка первого прерывания, запустится обработчик второго прерывания или надо руками флаги смотреть?blackx писал(а):Когда происходит событие прерывания, вначале устанавливается флаг этого прерывания, и затем происходит переход по вектору, если прерывание разрешено. При этом бит I в регистре SREG очищается, запрещая все прерывания. Если во время выполнения первого происходит еще одно событие, вызывающее другое прерывание, то только лишь устанавливается флаг.
если после выхода из прерывания есть флаг произошедшего события, то обработчик сам запустится. никаких ручных просмотров флагов.
Ставим плюсы: )
В дополнение к написанному ibiza11.
После reti произойдёт возврат из прерывания, выполниться одна команда МК, а потом он уйдёт на обработку следующего прерывания.
После reti произойдёт возврат из прерывания, выполниться одна команда МК, а потом он уйдёт на обработку следующего прерывания.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Сообщения: 23
- Зарегистрирован: Пн май 27, 2013 14:13:32
доброго времени суток!
у меня происходит прерывание по переполнению Т2 -выполняются действия
потом наступает опять переполнение Т2 - выполняется
в этот момент происходит перепонение Т0 - оно выпосняется после предыдущего
но при выходе из него стоят флаги "Н" "С"- перезагрузка.
даже если ничего не делать в прерывании [7]
atmega8, CVAVR
у меня происходит прерывание по переполнению Т2 -выполняются действия
потом наступает опять переполнение Т2 - выполняется
в этот момент происходит перепонение Т0 - оно выпосняется после предыдущего
но при выходе из него стоят флаги "Н" "С"- перезагрузка.
даже если ничего не делать в прерывании [7]
atmega8, CVAVR
- Сообщения: 23
- Зарегистрирован: Пн май 27, 2013 14:13:32
это единственное, что я вижу в avrstudio
сам ничего не понимаю если глобально не разрешать прерывания - то работает
если разрешить то такая хрень...
сам ничего не понимаю если глобально не разрешать прерывания - то работает
если разрешить то такая хрень...
Потерять прерывание можно только в том случае, если выполнять большой обработчик, и в течении этого времени произойдет 2 прерывания от одного и того же таймера, к примеру. Тогда первое прерывание потеряно. Поэтому рекомендуют обработчик делать как можно компактней и короче.
Также есть такое понятие как приоритет прерываний. К примеру, в PIC24, XMega приоритет прерывания можно задавать. В Tiny, Mega он прошит жестко. Возьмем всеми любимый atmega8. Очень высокий приоритет у внешних прерываний и слабенький у TWI. Если во время обработки прерывания от INT0 генерируется INT1, а во время INT1 будет приходить INT0, то контроллер будет переключаться между этими двумя прерываниями, а до остальных прерываний (и основной программы, кстати тоже) дело так и не дойдет. Или я не прав?
Также есть такое понятие как приоритет прерываний. К примеру, в PIC24, XMega приоритет прерывания можно задавать. В Tiny, Mega он прошит жестко. Возьмем всеми любимый atmega8. Очень высокий приоритет у внешних прерываний и слабенький у TWI. Если во время обработки прерывания от INT0 генерируется INT1, а во время INT1 будет приходить INT0, то контроллер будет переключаться между этими двумя прерываниями, а до остальных прерываний (и основной программы, кстати тоже) дело так и не дойдет. Или я не прав?
- Сообщения: 23
- Зарегистрирован: Пн май 27, 2013 14:13:32
прав, только ничего такого я не использую в мойм прерывании бало только x++?
да и это потов вытер
внешних нет, есть только шим на Т1
и на Т2 часы хочу запустить...
да и это потов вытер
внешних нет, есть только шим на Т1
и на Т2 часы хочу запустить...
- Сообщения: 23
- Зарегистрирован: Пн май 27, 2013 14:13:32
Можно все, чего пожелается...
И "вложенные прерывания" в том числе.
Только изначально определить приоритет и зоны взаимоперекрытия.
АВРка в этом отношении далеко не MCS51, но все же и не ПИК.
Так что дерзайте! На симулятор студии не слишком надейтесь - для начала стоит поглядеть хелп студии по ограничениям для применяемого МК.
Под асмом возможно проконсультирую, под Сии - ффырршшш!!!

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


