реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания в AVR
archi2000
сообщение Nov 12 2006, 17:09
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Хочу уточнить правильно ли я понял.
Если запрещены внешние прерывания, но случается несколько событий, то флаг прерывания устанавливается только один раз. Разрешаем прерывания и этот флаг сбрасывается и выполняется код прерывания по соответствующему вектору?
Теперь еще хочу такое запрограммировать - в соответсвующих регистрах ядра тоже запретить внешние прерывания, а не только коммандой CLI - флаг внешнего прерывания выставляется? Как долго этот флаг существует? Пока я его сам не сброшу или не выполнится вектор прерывания?
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 12 2006, 17:25
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(archi2000 @ Nov 12 2006, 20:09) *
Хочу уточнить правильно ли я понял.
Если запрещены внешние прерывания, но случается несколько событий, то флаг прерывания устанавливается только один раз. Разрешаем прерывания и этот флаг сбрасывается и выполняется код прерывания по соответствующему вектору?
Теперь еще хочу такое запрограммировать - в соответсвующих регистрах ядра тоже запретить внешние прерывания, а не только коммандой CLI - флаг внешнего прерывания выставляется? Как долго этот флаг существует? Пока я его сам не сброшу или не выполнится вектор прерывания?


Поняли неправильно,есть флаг разрешения прерывания и есть флаг запроса прерывания.
Первый разрешает,второй сигнализирует.
Если не хотите прерываний ,не разрешайте.

Можете почитать в разделе "статьи" про всю "физику" работы здесь nix-06.nm.ru ,я думаю популярно обьяснил.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 12 2006, 17:39
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Понимаю я может и правильно, но не правильно задал вопрос.
Итак флаг разшешения прерывания я пишу сам в регистре GICR. Флаг запроса прерывания выставляет внешнее событие.
Если флаг разрешения прерывания сброшен и прерывания запрещены коммандой CLI, то при появлении на выводе МК события выставляется ли флаг запроса именно этого внешнего прерывания?
Я думаю что выставляется и только один раз не зависимо от того сколько внешних событий случилось так как бит этого флага запроса прерывания только один. И будет этот флаг висеть ровно столько, пока я его сам не сброшу и проигнорирую это внешнее событие или не разрешу это прерывание и его не обработаю.
За сайт спасибо.

Сообщение отредактировал archi2000 - Nov 12 2006, 17:51
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 12 2006, 17:54
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Совершенно правильно .
Но с подобными маневрами не шутят,как вы правиьно заметели,и флаги запроса нужны,когда во время обработки прерывания возникает еще одно ,а флаг I еще не установлен командой reti.В противном будем терять прерывания.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 12 2006, 18:02
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Спасибо, но я сам хочу задать время обработки этих внешних собыбий. Я экспериментирую с любительским устройством похожим на сигнализацию. Все работает хорошо, но есть помехи по цепям датчиков около 50 мсек длительностью. Сложно все заэкранировать, хочу програмно на это время заблокировать внешние прерывания и один раз в 50 мсек их разрешать. Также хочу чтобы таких импульсов было не один, а допустим 5 шт. и тогда тревога, иначе просто через определенное время этот флаг очистить. Сигнализация описана для наглядности, устройство немного другое.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 12 2006, 18:17
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Если я правильно понял принцип,то есть другой способ,
по прерыванию от датчика,запускаем таймер,и уже от прерывания таймера в зависимости что нам нужно(импульс до определенной длительности или их количество) меряем что нам нужно.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 12 2006, 18:35
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Таймера и приоритетность прерываний у меня используются. Время длительности полезных событий измеряется секундами. Импульс помехи иногда проскакивает один раз в 10 сек. Хочу так. Допустим за одну секунду 5 раз по 100 м сек было внешнее прерывание. Значит было полезное событие.
С таймером алгоритм подавления помехи нигде не встречал. Ну вобщем это слышал краем уха используется при подавлении дребезга клавиатуры. Но у меня условия другие. Если кнопку можно нажать второй раз на клавиатуре, то в моем случае в случае неправильного принятия решения немного строже ответственность, хотя и не так строго как в сигнализации. Думаю подобрать экспериментально эти пороги правильного обнаружения и ложной тревоги с помощью задержек времени и запрещения/разрешения внешних прерываний и подсчета в теле прерывания количества вызовов.
У меня звуковые датчики. Где посмотреть пример кода того метода с таймером о котором ты говоришь?
Спасибо за ответы.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 12 2006, 18:44
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Ну все очень просто.
1 Пошел сигнал от датчика ,пошло прерывание INT
2 В прерывании INT запускаем таймер с прерванием от него через 1 секунду (например по совпадению)
3 Неспешно считаем количество INT дальше в том же прерывании от INT
4 По прерыванию от таймера ,смотрим сколько было INT ,если 5 УРАА!!!
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 12 2006, 18:51
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Так оно примерно сейчас и работает, таймер меряет время, но он запускается в основной программе и отсчитывает равные промежутки времени с помощью внешней переменной. Только у меня сейчас внешнее событие - это один импульс за 1 сек. Хочу чтобы импульсов было несколько и один раз в сек счетчик импульсов сбрасывать, если не достигли порога 5 шт.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Nov 12 2006, 21:29
Сообщение #10


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(bodja74 @ Nov 12 2006, 22:44) *
...
3 Неспешно считаем количество INT дальше в том же прерывании от INT
...

1) Немного непонятно, как считать INT находясь в INT. Может, в таймере?
2) Тогда, находясь в прерывании, нужно разрешить другие прерывания командой SEI.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 13 2006, 00:50
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(archi2000 @ Nov 12 2006, 21:02) *
Спасибо, но я сам хочу задать время обработки этих внешних собыбий. Я экспериментирую с любительским устройством похожим на сигнализацию. Все работает хорошо, но есть помехи по цепям датчиков около 50 мсек длительностью. Сложно все заэкранировать, хочу програмно на это время заблокировать внешние прерывания и один раз в 50 мсек их разрешать. Также хочу чтобы таких импульсов было не один, а допустим 5 шт. и тогда тревога, иначе просто через определенное время этот флаг очистить. Сигнализация описана для наглядности, устройство немного другое.


У меня это штатная работа. smile.gif
В телефонной линии (цифровой) применён импульсный трансформатор. При передаче сигнала и не очень качественном трансе возникает не одно а два прерывания (на фронт и выброс). Я в обработчике прерывания, перед выходом сбрасываю ложное прерывание.

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

насчёт остального Вам уже пояснили.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 14 2006, 14:47
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Еще прошу помощи - даташит на неродном языке.
Процессор Атмега 8 Регистр GIFR - выписка из даташита.

• Bit 7 – INTF1: External Interrupt Flag 1
When an event on the INT1 pin triggers an interrupt request, INTF1 becomes set (one).
If the I-bit in SREG and the INT1 bit in GICR are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always
cleared when INT1 is configured as a level interrupt.

• Bit 6 – INTF0: External Interrupt Flag 0
When an event on the INT0 pin triggers an interrupt request, INTF0 becomes set (one).
If the I-bit in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always
cleared when INT0 is configured as a level interrupt.

Почему для сброса флага нужно записывать лог. 1 если эта лог. 1 обозначает, что флаг прерывания установлен?
У меня используется прерывание по уровню, в даташите написано, что флаг постоянно сбрасывается.
В какой момент времени он сбрасывается?
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Nov 14 2006, 14:53
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Цитата
Почему для сброса флага нужно записывать лог. 1 если эта лог. 1 обозначает, что флаг прерывания установлен?

Так придумали инженеры ATMEL, причем это работаетsmile.gif
Я понимаю так, не "физически" записать 1, а сам факт записи 1


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
archi2000
сообщение Nov 14 2006, 14:58
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Спасибо, я сам также думал, что когда там 1, то 1+1 будет 0 в двоичной системе и флаг сбросится.
А если флаг не установлен, т.е. в ячейке уже 0 - то запись туда 1 вызовет прерывание?
Мне непонятно, как вообще вызывается прерывание по уровню, если флаг постоянно сбрасывается.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 14 2006, 15:18
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Прерывание по уровню вызывается мгновенно при присутствии активного внешнего сигнала и разрешённых глобальных прерываниях. Бит прерывания нигде не устанавливается, сам не сбрасывается и помогать ему в этом не надо.

Насчёт 1+1=0 прикольно :-)
Мне такое и в голову не приходило. Но скорее всего сделано не так. И программно такой бит не установить. Если кто проверет - сообщите. Самому интересно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.02673 секунд с 7
ELECTRONIX ©2004-2016