Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/44: Рейтинг темы: голосов - 44, средняя оценка - 4.68
mykotos
0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 65
1

Вызов прерывания в обработке прерывания

19.10.2010, 20:39. Просмотров 8258. Ответов 13
Метки нет (Все метки)

В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке этого прерывания запускается таймер по прерываниям.Вопрос:Можно ли обрабатывать прерывание от таймера,в обработке прерывания от нажатия кнопки??
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2010, 20:39
Ответы с готовыми решениями:

Принудительный вызов прерывания TIM1_OVF
В основном цикле программы иногда бывает необходимость принудительно вызвать прерывание по...

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

Прерывания
Здравствуйте, такая проблема: Контроллер ATMega32, при нажатии на кнопку, подключенную к PD2/INT0...

прерывания atmega32u4
Приветствую всех участников форума. Помогите пожалуйста решить проблему с прерываниями в...

AT90S8535. Прерывания
Нужно сделать прерывание по сравнению события А таймер счётчик, внешнее прерывание 0 и внешнее...

13
tyx
0 / 0 / 0
Регистрация: 18.10.2006
Сообщений: 547
19.10.2010, 20:43 2
можно, только это не есть хорошо. я бы как-нибудь по другому сделал.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
19.10.2010, 20:45 3
Для этого надо в прерывании от кнопки глобально разрешать прерывания. Т.е. любое другое прерывание может перебить выполнение этого прерывания, что может привести к некоторым труднообнаружимым глюкам...
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
19.10.2010, 20:47 4
1) Когда случается прерывание, то флаг I обнуляется (т.е. остальные прерывания запрещены). При выходе из обработчика он возвращается в прежнее состояние. Можно насильно разрешить прерывания внутри обработчика - команда sei.

2) Второе прерывание может сорвать стек. А может и не сорвать. :)

В общем sei - и ловишь прерывание внутри другого прерывания. Но так делать не правильно :)

UPD: комрады, мы снова говорим хором :)
0
19.10.2010, 20:47
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
19.10.2010, 21:13 5
Можно.

Первое. В начале обработчика ставишь флаг I и ты готов к вложенным прерываниям.

Но тут есть вилы:
У тебя прерывание от кнопки. А у кнопки дребезг. Так что разрешив прерывание сразу же в обработчике ты получишь вложенные прерывания по INT от дребезга этой кнопки. Так что в твоем случае алгоритм разрешения прерываний будет такой:

---- Обработчик ----
Запрещаем прерывание от INT
Разрешаем глобальные прерывания I

что то там делаем
Разрешаем прерывание от INT
Выходим из прерывания INT

Только так.
0
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
19.10.2010, 21:13 6
Ну и да, вложенные прерывания это очень плохо. Лучше чтобы их не было вообще. Но если их не избежать, то надо понимать чем это грозит.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
19.10.2010, 21:22 7
надо просто убрать задержку из прерывания кнопки, тогда не надо будет так долго в нем сидеть ;)
0
tyx
0 / 0 / 0
Регистрация: 18.10.2006
Сообщений: 547
19.10.2010, 21:50 8
надо обработку кнопки из прерывания убрать.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
19.10.2010, 21:58 9
Кнопку лучше читать в главном цикле, на крайняк по таймеру. А ставить кнопку на вход внешнего прерывания - неграмотно.
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
19.10.2010, 22:14 10
Кнопки лучше опрашивать программно. Раз 5-10 в сек - за глаза.
Прерывания - слишком ценный ресурс, чтобы тратить на ерунду. Лучше на него повесить, например, таймер 1 мсек, и в обработчике реализовать кучу программных таймеров, по которым отрабатывать всякие задержки. В том числе и опрос кнопок. Но все это делать в самой программе, в прерывании же - только декремент этих таймеров, если не 0. Программа же, кинув значение в соответствующий таймер, в главном цикле проверяет его на 0.
Можно еще в прерывании флажки по обнулению программных таймеров, или, например, получению байта по SPI или USORT, выставлять.
0
miom-f
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 48
23.10.2010, 15:17 11
Цитата Сообщение от dsodir
2) Второе прерывание может сорвать стек. А может и не сорвать. :)
разовое вложенное прерывание ничего не сорвет. если уверен что внутри одного прерывания, не будет многократно вызываться другое - 99,9% все будет хорошо.
я как то раз попробовал такое - внутри прерывания разрешал прерывания, потом, не выходя из этого обработчика, сново наступало событие на сработку, прерывание сново начинало обрабатываться, и так по кругу. мне удавалось получить 530 вложенных друг в друга прерываний(если в обработчике было только
Код
х++;
PORTA=x;
) или 130 вложений если в обработчике
Код
x++;
if (x==60)  y++;
PORTA=x;
PORTB=Y;
После чего контроллер либо перезагружался(чаще), либо зависал(реже)
так что если обработчики прерываний у вас не громадны, и вложенное будет вызываться один-два раза, скорее всего ничего плохого не произойдет
0
otixiypo
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 1,031
21.11.2010, 17:26 12
в продолжении темы про вложеное прерывание, еще вопрос: есть таймер, который работает на делителе 64. обработчик прерывания выполняется примерно за 90 тактов (оптимизировал уже вдоль и поперек) но в 64 не влазит. с большой вероятностью возникнет ситуация, когда надо будет вызвать обработчик два раза подряд (т.е. на след. счете таймера) - в итоге получиться вложенное прерывание... при этом с маленькой но вероятностью может быть до 20ти вложеных таким макаром прерываний. соответсвенно стек просто переполниться (подозреваю так :))

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

ЗЫ при штатном распределении таймингов между вызовами будет 5-10тиков т.е. машинного времени с избытком.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
21.11.2010, 17:37 13
Стоп.
Таймер с делителем 64. Тикает от 0 до 255. Значит переполнение будет каждые 256*64=16к тактов.
Или не так? Или не до 255 тикает?
0
otixiypo
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 1,031
21.11.2010, 17:42 14
Цитата Сообщение от dsodir
Стоп.
Таймер с делителем 64. Тикает от 0 до 255. Значит переполнение будет каждые 256*64=16к тактов.
Или не так? Или не до 255 тикает?
переполнение да, но вызывается прерывание по сравнению и может вызываться два (двадцать) тиков подряд
0
21.11.2010, 17:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2010, 17:42

AVR прерывания
Написал простенькую программу для Меги8, которая моргает поочередно светодиодами на PD0 и PD1. В...

Не срабатывают прерывания
Привет. Написал программу для измерения длины импульса, прерывания должны срабатывать при приходе...

atmega16 прерывания
Друзья, всем привет! Подскажите, пожалуйста. Пытаюсь собрать программку из книжки Ревича про...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.