Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объясните разницу между прерыванием по спадающему фронту и по появлению низкого уровня.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Зверюга
Господа, объясните разницу между прерыванием по спадающему фронту и по появлению низкого уровня.

Замутил програмку - по прерыванию включает на 500 мс светодиод. При установке прерывания по спадающему фронту - подключаю INT0 к минусу - диод загорается на полсекунды и гаснет навсегда.
При установке прерывания по низкому уровню диод горит всегда. Это как понимать - генерация прерывания происходит непрерывно? Тогда с какой частотой опрашивается INT0? И что, если его навечно замкнуть на землю, то контроллер остановит свою работу и будет вечно обрабатывать прерывание?
SysRq
Да, прерывание вызывается постоянно.
Но между выполнениями кода обработчика прерывания будет исполняться по одной ассемблерной команде остального кода. Таким образом, основная программа будт выполняться, но медленно smile.gif
Зверюга
Можете привести практический пример ситуации, в которой этот режим полезен?

Сам пытался пофантазировать, но всегда приходил к выводу что есть иной способ решения.
Tiny
Цитата(Зверюга @ Sep 5 2008, 21:45) *
Господа, объясните разницу между прерыванием по спадающему фронту и по появлению низкого уровня.

Замутил програмку - по прерыванию включает на 500 мс светодиод. При установке прерывания по спадающему фронту - подключаю INT0 к минусу - диод загорается на полсекунды и гаснет навсегда.
При установке прерывания по низкому уровню диод горит всегда. Это как понимать - генерация прерывания происходит непрерывно? Тогда с какой частотой опрашивается INT0? И что, если его навечно замкнуть на землю, то контроллер остановит свою работу и будет вечно обрабатывать прерывание?

Насколько я понимаю разница в том, что при спадающем фронте при переходе на 0 произойдет прерывание, выполнится программа расположенная в теле прерывания (загорится светодиод) и в следующий раз это произойдет только после того, как на входе прерывания установится 1, а потом сбросится на 0.
При прерывании по низкому уровню, при 0 на входе произойдет прерывание и если 0 будет сохраняться, то оно и будет всегда выполняться (гореть светодиод) не дожидаясь установки 1 на входе.
zltigo
Цитата(Зверюга @ Sep 6 2008, 05:13) *
Можете привести практический пример ситуации, в которой этот режим полезен?

Какой из двух помянутых "'этот"? Если по уровню, то, например, применение нескольких источников прерывания на одном входе. Если по фронту, то, например, получение периодического прерывания от генератора меандра.
rv3dll(lex)
если прочитать описание контроллера прерывания любого контроллера там буквально пишут следующее

прерывания подразделяются на прерывания по фронту/срезу или по уровню

при прерываниях по фронту подпрограмма обработки прерывания вызывается 1 раз если длительность фрониа/среза не превышает ХХХ

по уровню будет вызываться непрерывно до тех пор пока уровень не перейдёт в неактивный или
"основной вариант" когда подпрограмма обработчик прерываний воздействием на модуль который генерирует прерывание не сбросит его.
SysRq
Цитата(Зверюга @ Sep 6 2008, 07:13) *
Можете привести практический пример ситуации, в которой этот режим полезен?

Не могу представить чтобы это было основным режимом работы. Скорее, контроллер всегда сидящий в прерывании - это или нештатная ситуация, или может быть попытка решения какой-то задачи на непредназначенном для этого оборудовании, изначально спроектрованным для чего-то еще.
singlskv
Цитата(zltigo @ Sep 6 2008, 11:25) *
Если по уровню, то, например, применение нескольких источников прерывания на одном входе.
ИМХО, это не главное/первоначальное применение данного типа прерываний.
Прерывание по уровню НЕ требует наличия тактового сигнала на mcu, и это основное отличие,
проснуться из "глубокого" слипа можно только по уровню...
Конечно на последних МК это не совсем так, но принципа это не отменяет...
zltigo
Цитата(singlskv @ Sep 7 2008, 19:37) *
Конечно на последних МК это не совсем так, но принципа это не отменяет...

Это совсем не так было уже на 8080 чипсете - прерывание по любому сэмплируется. А железо для просыпания и контроллер прерываний вещи разные.
singlskv
Цитата(zltigo @ Sep 7 2008, 21:48) *
Это совсем не так было уже на 8080 чипсете -
А у 8080 были фишки для уменьшения
энергопотребления ? Чего-то не помню... smile.gif
Сергей Борщ
Цитата(singlskv @ Sep 7 2008, 20:51) *
А у 8080 были фишки для уменьшения энергопотребления ?
А прерывание по уровню было. Казалось бы, зачем?
zltigo
Цитата(singlskv @ Sep 7 2008, 19:51) *
А у 8080 были фишки для уменьшения
энергопотребления ? Чего-то не помню... smile.gif

У 8080 были прерывания по уровню, они тактировались, и что характерно все это было не для "фишек".
singlskv
Цитата(zltigo @ Sep 7 2008, 21:48) *
А железо для просыпания и контроллер прерываний вещи разные.
А парни то из Атмел и не знали... smile.gif
Note that recognition of falling or rising edge interrupts on INT0 and INT1
requires the presence of an I/O clock, described in “Clock Systems and their Distribution”
on page 23. Low level interrupts on INT0/INT1 are detected asynchronously. This
implies that these interrupts can be used for waking the part also from sleep modes
other than Idle mode. The I/O clock is halted in all sleep modes except Idle mode.


Цитата(Сергей Борщ @ Sep 7 2008, 22:02) *
А прерывание по уровню было. Казалось бы, зачем?
Я ни где не говорил что эноргопотребление это единственное применение...
zltigo
Цитата(singlskv @ Sep 7 2008, 20:12) *
Я ни где не говорил что эноргопотребление это единственное применение...

Извите, но не нужно извиваться. Я возражаю против вот этого Вашего утверждения:
Цитата
...это не главное/первоначальное применение данного типа прерываний.

И вот этого:
Цитата
Прерывание по уровню НЕ требует наличия тактового сигнала на mcu,

Что там сделали в частности "парни" дело десятое.
singlskv
Цитата(zltigo @ Sep 7 2008, 22:21) *
Извите, но не нужно извиваться. Я возражаю против вот этого Вашего утверждения:
А я возражаю против приведения примеров 20летней давности...
Ну поменялось уже значение данного типа прерывания..., но Вы зачем-то все равно спорите...


Цитата(zltigo @ Sep 7 2008, 22:21) *
Что там сделали в частности "парни" дело десятое.
Парни развивающие LPC думают примерно так же...
rv3dll(lex)
чего то я в 8080 не помню разницы в прерываниях уровен фронт помню про то что вектор через жопу задавался на шине данных - но это давно совсем было чтото около 86РК
zltigo
Цитата(singlskv @ Sep 7 2008, 20:27) *
Вы зачем-то все равно спорите...

Например, по той простой причине, что сейчас у меня на столе лежит девайс с 32 переферийными чипами подключенными в цепочку на SPI и висящими на одном прерывании LPC2138. И "20 лет назад" тут не причем - ничего не изменилось от того, что кто-то посадил практически параллельно входу еще будильник.
Цитата
Парни развивающие LPC думают примерно так же...

"Парни LPC" нарисовали схемки с которыми может ознакомится каждый желающий в User Manuale:
Reset block diagram including the wakeup timer и External interrupt logic.
Дабы не предаватся фантазиями.
singlskv
Цитата(zltigo @ Sep 7 2008, 22:50) *
Например, по той простой причине, что сейчас у меня на столе лежит девайс с 32 переферийными чипами подключенными в цепочку на SPI и висящими на одном прерывании LPC2138. И "20 лет назад" тут не причем - ничего не изменилось от того, что кто-то посадил практически параллельно входу еще будильник.

"Парни LPC" нарисовали схемки с которыми может ознакомится каждый желающий в User Manuale:
Reset block diagram including the wakeup timer и External interrupt logic.
Дабы не предаватся фантазиями.
Дык у Вас и нет задачек связанных с минимизацией энергопотребления...
Вот Вы и не пользуетесь этими прерываниями по "назначению"...(исходя из текущего момента)
Еще раз повторюсь, придуманно это все(прерывания по уровню) было для
возможности ассинхронной обработки., то есть без тактового сигнала, все остальные применения
вторичны и вытекают из первоначального замысла...
zltigo
Цитата(singlskv @ Sep 7 2008, 21:04) *
Еще раз повторюсь...

Можете повторить эти фантазии еще несколько раз, но от этого слаще во рту не станет smile.gif. Заметьте, что я не утверждаю, что это Ваши фантазии, допускаю, что Вы это где-то на полном серьезе вычитали, но тем не менее это к реальности появления прерываний по уровню отношения не имеет.
singlskv
Цитата(zltigo @ Sep 7 2008, 23:08) *
Можете повторить эти фантазии еще несколько раз, но от этого слаще во рту не станет smile.gif. Заметьте, что я не утверждаю, что это Ваши фантазии, допускаю, что Вы это где-то на полном серьезе вычитали, но тем не менее это к реальности появления прерываний по уровню отношения не имеет.
Вы фсе сказали... ?
Специально для любителей контроллеров NXP, приводим выдержки из их даташитов:
lpc2377.lpc2378.pdf:
7.25.4.2Sleep mode
In Sleep mode, the oscillator is shut down and the chip receives no internal clocks.
....
The Sleep mode can be terminated and normal operation resumed by either a Reset or certain specific interrupts that are able to function without clocks.

Так про какие фантазии Вы там заикались ... ?
zltigo
Цитата(singlskv @ Sep 7 2008, 22:37) *
Вы фсе сказали... ?

Да. И причем в самом первом посте. Потом, когда началась пурга "про Ерему" еще и названия схем из user manual привел. Изучайте, как запускается генератор LPC и как потом прерывние стробируется и обрабатыватся. Заодно поищите системы энергосбережения у контроллеров у которых их отродясь не было, а прерывания по уровню были. Документация на классический контроллер прерываний (именно совсем отдельный контроллер прерываний - дикие времена - начало 80x!!!, микроконтроллеров вообще не было, "зеленых" - тоже ) 8259 вполне доступна - можете легко проверить и там УЖЕ программировались Level/Edge Triggered Mode. В общем, думаю, что что-то еще говорить совершенно излишне. Ну халва-халва-халва можете повторять...
singlskv
Цитата(zltigo @ Sep 8 2008, 01:19) *
Да. И причем в самом первом посте.

Тема LPC и их "without clocks" в даташитах почему-то не была раскрыта...,
интересно, все Ваши советы нужно воспринимать исходя из
элементной базы аля 8080, 8259, итд ?
Или может быть все-таки будем говорить о современных мк ?
zltigo
Цитата(singlskv @ Sep 7 2008, 23:28) *
Тема LPC и их "without clocks" в даташитах почему-то не была раскрыта...,

Раскрыта абсолютна, помянутые схемы будем смотреть, или рассчитывать на то, что многократно произнесенная ложь о "изобретении" Level Trigger для выхода из сна вдруг станет правдой?
Не станет smile.gif
singlskv
Цитата(zltigo @ Sep 8 2008, 01:31) *
Раскрыта абсолютна, помянутые схемы будем смотреть, или рассчитывать на то, что многократно произнесенная ложь вдруг станет правдой?
То есть Вы утверждаете что из PowerDown всегда можно проснуться без
тактового сигнала ? так ?
используя только фронты конечно...
ReAl
Цитата(singlskv @ Sep 7 2008, 22:04) *
Дык у Вас и нет задачек связанных с минимизацией энергопотребления...
Вот Вы и не пользуетесь этими прерываниями по "назначению"...(исходя из текущего момента)
Еще раз повторюсь, придуманно это все(прерывания по уровню) было для
возможности ассинхронной обработки., то есть без тактового сигнала, все остальные применения
вторичны и вытекают из первоначального замысла...
Господи....
Да прервания по уровню были придуманы тогда, когда никому и в кошмаре не снилось, что блок процессора может не получать тактового сигнала не в результате поломки. Никакой необходимости снимать такт с тех гробов не было, они и в статике жрали будь-будь. Ни о какой асинхронной обработке и речи не шло, когда на единственный вход прерывания процессора вешались все источники. Запрос прерывания должен был оставаться до тех пор, пока все источники не будут удовлетворены, а это возможно только при "монтажной" логике, только по уровню.

Или Вы из "поколения пепси", считающего, что компьютеры начались с IBM PC (причём под этим названием понимающих не собственно IBM PC, и даже не IBM PC/XT, а уже IBM PC/AT)?
Так и там никто не снимал такт с процессора, а прерывания по уровню были.
Боинг749
Цитата(Зверюга @ Sep 6 2008, 07:13) *
Можете привести практический пример ситуации, в которой этот режим полезен?

Ну можно например организовать "пошаговое" выполнение программы. В ковычках потому что в критической секции ( участок программы с глобальным запретом прерываний) быть несколько "шагов" будут выполняться как один "шаг" smile.gif

Цитата(zltigo @ Sep 7 2008, 22:04) *
У 8080 были прерывания по уровню, они тактировались, и что характерно все это было не для "фишек".

А у мег оно работает и без тактирования. Именно это и позиционируется как "фишка" в даташите
zltigo
Цитата(Боинг749 @ Sep 8 2008, 16:58) *
А у мег оно работает и без тактирования. Именно это и позиционируется как "фишка" в даташите

Как это примерно делается в общем случае уже писал, могу чуть конкретизировать.
По воздействию на "вход прерывания" отрабатывает подключенный параллельно собственно входу контролера прерываний RS триггрер и будит генератор, если он был выключен. Тактовые импульсы идут на счетчик, который отсчитывает некотрое количество импульсов - задержка для входа генератора в рабочий режим и разрешает тактирование ядра, после чего, естественно, отрабатывает уже при наличии тактовой контроллер прерываний и типа "проснулись". Практически с контроллером прерывания используются только общие входные узлы типа фильтра гличей... Все.
Что там маркетологи некоторых производителей пишут о "работе без тактирования" и величайшем "изобретении" Level Triggering дело десятое.
Боинг749
Цитата(zltigo @ Sep 8 2008, 19:29) *
Что там маркетологи некоторых производителей пишут о "работе без тактирования" ...

Не надо передёргивать. О "работе" процессора без тактирования никто не говорит.

Речь о том, что "спящий" процессор в микроконтроллерах ATmega с остановленным тактовым генератором может быть разбужен только преываниями, обнаруживаемыми асинхронно. А такими прерываниями в AVR являются прерывания по уровню. Причём по НИЗКОМУ уровню.

Вот и всё.

Не более того.

Но и не менее.
zltigo
Цитата(Боинг749 @ Sep 8 2008, 20:04) *
...может быть разбужен только преываниями

Жаль только, что Вы так и не поняли, что собственно механизм "прерывания" к выводу из глухой спячки и не причем. Поскольку мне от этого не холодно ни жарко, то можете продолжать повторять цитаты из книжек для конечного пользователя.
Цитата
Не надо передёргивать. О "работе" процессора без тактирования никто не говорит.

"Без тактирования" это Ваши слова по отношению к контроллеру прерывания, никакого расширенного толкования этому я не давал, посему не надо Вам самого себя заводить и бросаться обвинениями.
ReAl
Цитата(Боинг749 @ Sep 8 2008, 21:04) *
Речь о том, что "спящий" процессор в микроконтроллерах ATmega с остановленным тактовым генератором может быть разбужен только преываниями, обнаруживаемыми асинхронно.
А такими прерываниями в AVR являются прерывания по уровню. Причём по НИЗКОМУ уровню.

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

Кроме того зря так громко при НИЗКИЙ уровень
Мега168:

Цитата
9.4 Power-down Mode
When the SM2..0 bits are written to 010, the SLEEP instruction makes the MCU enter Powerdown
mode. In this mode, the external Oscillator is stopped, while the external interrupts, the 2-
wire Serial Interface address watch, and the Watchdog continue operating (if enabled). Only an
External Reset, a Watchdog System Reset, a Watchdog Interrupt, a Brown-out Reset, a 2-wire
Serial Interface address match, an external level interrupt on INT0 or INT1, or a pin change
interrupt
can wake up the MCU. This sleep mode basically halts all generated clocks, allowing
operation of asynchronous modules only.
pin change - по любому перепаду.
Для PCINT немного изменили схему детектора перепада и она уже работает для побудки и без тактового сигнала.
Боинг749
Цитата(ReAl @ Sep 9 2008, 00:04) *
Речь идёт также о том, что из этого не следует, что прерывания по уровню были придуманы для этого.

Я этого и не говорил. Я сказал о нюансах использования прерываний по уровню в AVR. Мы же о AVR говорим? Или я ошибаюсь?


Цитата(ReAl @ Sep 9 2008, 00:04) *
pin change - по любому перепаду.
Для PCINT немного изменили схему детектора перепада и она уже работает для побудки и без тактового сигнала.

Вот и ладненько. Спасибо за инфу. Просто я юзаю модели Мег, которые были разработаны более 3-х лет назад. Там такого не было.

Как говоритцо, "Век живи - век учись"(с)
smile.gif
ReAl
Цитата(Боинг749 @ Sep 8 2008, 23:19) *
Я этого и не говорил. Я сказал о нюансах использования прерываний по уровню в AVR. Мы же о AVR говорим? Или я ошибаюсь?
Мы говорим об особенностях работы прерывания по уровню при постоянно поданном запросе, с 8-го поста - о "первоначальном" предназначении прерываний по уровню, которое "первоначалось" через десятки лет после того, как сами эти прерывания были придуманы.
В принципе, всё вышесказанное справедливо и для i80c31.

Цитата(Боинг749 @ Sep 8 2008, 23:19) *
Вот и ладненько. Спасибо за инфу. Просто я юзаю модели Мег, которые были разработаны более 3-х лет назад. Там такого не было.
"мухи времени любят стрелки" :-)
Думаю, гораздо больше трёх.
avreal поддерживает программирование atmega48-168 уже больше четырёх лет.
Ну а если об AVR вообще, то тини26, мега162 уже лет шесть существуют.
Tolyaha
Цитата(Зверюга @ Sep 6 2008, 06:13) *
Можете привести практический пример ситуации, в которой этот режим полезен?


Это полезно тогда, когда МК может пропустить фронт/спад сигнала готовности от устройства и никогда его не обработать ( при включении питания, при сбросе).
Ситуация когда устройство обрабатывается по прерыванию и признаком его готовности является переход в лог. ноль. и если МК пропустил этот переход (по разным причинам) так устройство и будет висеть не обработанное вечно, а при прерывании по нулю зависа не будет т.к. прерывание будет висеть до тех пор пока устройство не будет обработано.
Сергей Борщ
Цитата(Tolyaha @ Sep 9 2008, 08:53) *
Ситуация когда устройство обрабатывается по прерыванию и признаком его готовности является переход в лог. ноль.
Я бы сказал так: Тогда и только тогда, когда процессор может сообщить устройству, что запрос обработан и этим заставить устройство снять запрос. Чаще всего это нужно, как уже писали, когда на один вход заведено несколько источников. Тогда запрос будет висеть до тех пор, пока процессор не обработает (и в процессе обработки не снимет) все запросы.
Цыкетчик
Недавно узнал, что оказывается прерывания процессора по сигналам на линиях INT можно сгенерировать и программно. Достаточно запрограммировать пины INTх на вывод и выставить на них '0' командой OUT
rv3dll(lex)
прерывания по уровню предназначены только для того чтобы процессор в любой ситуации знал что оно пришло и ему это грозит и предпринял действия чтобы его снять. при этом гарантировано что то устройство которое это дело выдаёт знает обработано его прерывание или нет.

а энергосбережение тут точно не причём)))
iosifk
Цитата(Tolyaha @ Sep 9 2008, 09:53) *
Это полезно тогда, когда МК может пропустить фронт/спад сигнала готовности от устройства и никогда его не обработать ( при включении питания, при сбросе).
Ситуация когда устройство обрабатывается по прерыванию и признаком его готовности является переход в лог. ноль. и если МК пропустил этот переход (по разным причинам) так устройство и будет висеть не обработанное вечно, а при прерывании по нулю зависа не будет т.к. прерывание будет висеть до тех пор пока устройство не будет обработано.

Вот этот ответ самый близкий. Если в подпрограмме обработки прерываний сделан запрет на обработку прерываний более низкого уровня (неважно как сделан - аппаратно или программно), то фронт поступающий на запрос прерывания низкого уровня может быть пропущен. А вот уровень - нет.
Поэтому, для медленных систем, т.е в которых мало запросов и их пропуск не критичен, можно делать обработку по фронту, а для систем, где пропуск запроса критичен - только по уровню...
Но при этом, запрос по уровню может быть обслужен позже, чем по фронту из-за того, что он может быть задержен обработкой запросов более верхнего уровня.
Вот и вся разница. Такая система работает с первых интеловских контроллеров и до сих пор. Про DEC (Электроника 60) не пишу, там распределенный арбитр и пропустить прерывание в принципе невозможно....
Удачи!
rv3dll(lex)
Цитата(iosifk @ Sep 25 2008, 09:13) *
Вот этот ответ самый близкий. Если в подпрограмме обработки прерываний сделан запрет на обработку прерываний более низкого уровня (неважно как сделан - аппаратно или программно), то фронт поступающий на запрос прерывания низкого уровня может быть пропущен. А вот уровень - нет.
Поэтому, для медленных систем, т.е в которых мало запросов и их пропуск не критичен, можно делать обработку по фронту, а для систем, где пропуск запроса критичен - только по уровню...
Но при этом, запрос по уровню может быть обслужен позже, чем по фронту из-за того, что он может быть задержен обработкой запросов более верхнего уровня.
Вот и вся разница. Такая система работает с первых интеловских контроллеров и до сих пор. Про DEC (Электроника 60) не пишу, там распределенный арбитр и пропустить прерывание в принципе невозможно....
Удачи!


ха если придёт несколько фронтов от одного устройства то и так потеряется несколько прерываний.

кстати если на один фход несколько прерываний то следующее может забить предыдущее. я в сигнальниках с этим сталкивался
Евгений Германович
А у вас тут весело.Фронт,спад,уровень......Просто красота.А если взглянуть на процесс на осциллографе,а не в описании?Любому уровню ВСЕГДА предшествует перепад.Те говорить об срабатывании по низкому уровню и не вспомнить о предшествующему ему,уровню,срезу(спаду) сигнала неправильно. smile.gif Кстати высказывание тов БОИНГа о переходе из спячки по НИЗКОМУ уровню не совсем справедливо,можно также сказать о пробуждении по срезу и будет тоже правильно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.