Перейти к содержанию

Програмный Вызов Прерываний.


Br.Misha

Рекомендуемые сообщения

Сдрасте!

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

Например у меня в обработчике внешнего прерывания на INT0 есть какой нить код, это прерывание выполняеться когда на ножке INT0 появляеться низкий уровень(в зависимости от настроек внешних прерываний) и INTF0 в регистре GIFR сбрасываеться в 0. Можно ли в коде программы написать GIFR &= (0<<INTF0) чтобы выполнилась подпрограма обработки даного прерывания?

ЗЫ: так же мне нада будет чтобы выполнялись программы обработки прерываний юарта, спи и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А в чем проблема? Прерывание - это аппаратная функция, но ВЕКТОР прерывания - это просто стартовый адрес подпрограммы, которая заканчивается возвратом. Значит вызов подпрограммы с вектором(адресом) обработчика из ЛЮБОГО места программы совершенно законная процедура. Только прерывания при этом не будут запрещены. И это будет Вашей заботой. (перед вызовом нужно их запретить специально).

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Добавлю.

В Avr внешние прерывания генеряться даже если эти порты настроены как Выходы, то есть Вы можете полноценно формировать прерывания управляя этими портами

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я уже пробовал вызывать прерывания и все было так. как я хотел, но я не запрещал прерывания, у меня после конфигурации портов, таймеров, юсарта и АЦП написано sei() и больше я нигде эти прерывания не запрещаю

Ссылка на комментарий
Поделиться на другие сайты

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Брат Миша! Видите ли, тут такое дело... Когда прерывания генерируются аппаратно, то запрет глобальных прерываний устанавливается АВТОМАТИЧЕСКИ, а при выходе из обработчика он разрешается. Можно конечно не запрещать перерывания, войти в обработчик и сразу разрешить (при программном вызове просто не запрещать...) Но у Вас есть уверенность, что во время обработки не произойдет второй вызов? Если Вы уверены в емкости стека и глубине этих вложений, а так же Вас устроит временная задержка у первого прерывания(вызов то не предсказуем).... на здоровье, не запрещайте...

Однако чуется мне - кашу получите вместо временной диаграммы... Особенно ваяя свои нетленки на Си...

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

У меня как раз програмный вызов прерывания стоит в обработчике иного прерывания:)

Какроче там сделано так: юарт принимает даные и при это делает аппаратное прерывание, в этом прерывание выполняет код а в самом конце делает програмное прерывание TXC.

Ещё вопрос: коммандой cli() запрещаються только аппаратные прерывания? или с программы я тоже не смогу их вызвать?

ЗЫ: я просто не могу отпределиться когда запрещать прерывания. перед програмным вызовом или в начале подпрограммы обработчика перрывания.

Е ещё один: в конце подпрограммы прерывания разрешать глобально перрывания или МК сам это сделает?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
Когда прерывания генерируются аппаратно, то запрет глобальных прерываний устанавливается АВТОМАТИЧЕСКИ, а при выходе из обработчика он разрешается.
Ссылка на комментарий
Поделиться на другие сайты

Ещё вопрос: коммандой cli() запрещаються только аппаратные прерывания? или с программы я тоже не смогу их вызвать?

ЗЫ: я просто не могу отпределиться когда запрещать прерывания. перед програмным вызовом или в начале подпрограммы обработчика перрывания.

Е ещё один: в конце подпрограммы прерывания разрешать глобально перрывания или МК сам это сделает?

Что-то ты, Br.Misha, мечешься из стороны в сторону "прерывания, программы обработки прерываний...". Тебе надо определиться что такое прерывание и подпрограмма обработки прерываний. Прерывание (нормального хода программы) наступает в связи с определенным событием (условием), в следствие чего в стеке сохраняется содержимое счетчика команд РС и в него (этот самый счетчик) загружается адрес вектора прерывания (вызвавшего данное событие), где находится всего лишь команда безусловного перехода на подпрограмму обработки прерывания. Все ничего более.

Сама же подпрограмма обработки имеет довольно косвенное отношение к самому прерыванию, точнее лишь тем, что ее вызывают во время данного прерывания. И от любых других подпрограмм отличается командой RETI на выходе. Ничто тебе не мешает вызывать ее (подпрограмму) из тела основной программы независимо от запрета прерываний как и любую другую. my504 уже об этом говорил.

Ты можешь (должен) запретить прерывания ПЕРЕД вызовом программы обработки прерывания, но ничто не запретит тебе вызвать эту подпрограмму из основного кода, т.к. ты не вызываешь  само прерывание, а лишь код его обаботки.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Геннадий, возможно я вас не так понял, но:

:int0
;некий код
reti

:main
;некий код
cli
call int0

это же неправильно - после call надо возвращаться по ret, а не reti?

мне кажется что правильнее вынести общий код в отдельную функцию:

:int0
call handler
reti

:handler
;некий код
ret

:main
;некий код
call handler

Главный недостаток такого решения - медленно работает обработчик прерывания.

Ссылка на комментарий
Поделиться на другие сайты

Именно!! Вынести общий код в отельную функцию и позвать её раз из прерывания и сколько хотите раз из програмы!!! Миша - вы сам себе выдумываете проблемы!!! Будьте проще!!! Иначе люди вам перестанут скоро отвечать на вопросы...

Ссылка на комментарий
Поделиться на другие сайты

Почему медленно? Что задерживает?

Если не напрягает время отклика или в программе мало кода, когда несколько тактов не играют роли, можно сделать так. В прерывании поднимай флаг и выходи. В main делаешь проверку флага и если опущен, "перескакиваешь" через вызов функции, т.е. не вызываешь. Флаг поднят - вызываешь функцию, но в ней не забудь опустить флаг, поднимаемый в прерывании. Иначе будет "крутиться" постоянно. Да ты и сам это описАл, только через call.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...