работа прерываний

ddr2
Offline
Зарегистрирован: 27.12.2020

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

ddr2
Offline
Зарегистрирован: 27.12.2020

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

nik182
Offline
Зарегистрирован: 04.05.2015

Одно в момент подачи напряжения.

ddr2
Offline
Зарегистрирован: 27.12.2020

nik182 пишет:
Одно в момент подачи напряжения.
а если напряжение не падает, то это не считается как прерываение? а можно ардуине сказать чтобы оно это считала как прерывания с максимальной частотой? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ddr2 пишет:

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

Хороший вопрос. Сами-то как думаете?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

ddr2
Offline
Зарегистрирован: 27.12.2020

ЕвгенийП пишет:

ddr2 пишет:

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

Хороший вопрос. Сами-то как думаете?

Проверил, +3,3V на int0, молчит. Да плохо. А можно ли сказать ардуине чтобы она считала это прерывания с максимально возможной частотой? 

ddr2
Offline
Зарегистрирован: 27.12.2020

ЕвгенийП пишет:

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

И как это сделать? 

nik182
Offline
Зарегистрирован: 04.05.2015

Откройте даташит на МК, в разделе прерывания таблица условий срабатывания прерываний. В ваших условиях самый простой путь запустить таймер 1 или 2 на максимальную скорость и его выход соединить с ногой прерывания.

ddr2
Offline
Зарегистрирован: 27.12.2020

nik182 пишет:
Откройте даташит на МК, в разделе прерывания таблица условий срабатывания прерываний. В ваших условиях самый простой путь запустить таймер 1 или 2 на максимальную скорость и его выход соединить с ногой прерывания.
то есть, таймер включал поддяжку порта прерывания к нулю, тем самым вызывал срабатывания прерывания? А с какой скорость работает АЦП, не будет ли АЦП быстрей чем прерывание + таймер? 

b707
Offline
Зарегистрирован: 26.05.2017

ddr2 пишет:

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

нет. Прерывание должно только запускать генератор с нужной частотой. А прерывание все равно будет одно.

Вообще, совет такой же как в соседней ветке - отложить пока ардуину в сторону и проштудировать учебник.

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 пишет:

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

нет. Прерывание должно только запускать генератор с нужной частотой. А прерывание все равно будет одно.

То есть устанавливает прерывание в CHANGE, по первому вызову запускаем таймер и считаем, по второму вызову останавливаем таймер. А CHANGE по какому уровню работает? Или лучше переустанавливать с RISING на FALLING ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Бессмыслица какая-то. В чем суть этого жонглирования?

ddr2
Offline
Зарегистрирован: 27.12.2020

sadman41 пишет:
Бессмыслица какая-то. В чем суть этого жонглирования?
чтобы прерывание беспрерывно срабатывало, пока на пине прерывания высокий уровень сигнала.

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем? Сущность механизма прерывания вообще осознаёте?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ddr2 пишет:

sadman41 пишет:
Бессмыслица какая-то. В чем суть этого жонглирования?
чтобы прерывание беспрерывно срабатывало, пока на пине прерывания высокий уровень сигнала.

Прерывание для этого не предназначено. 

Если Вам кажется, что это нужно, значит, Вы что-то неверно спроектировали.

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

ddr2
Offline
Зарегистрирован: 27.12.2020

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

b707
Offline
Зарегистрирован: 26.05.2017

ddr2 пишет:

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

 

вы совсем тупой?  вас спрашивают, ЗАЧЕМ это нужно

Задачу формулируйте. "Нужен беспрерывный вызов обработчика прерывания" - это не задача. Задача - это например " при уровне HIGH на входе Х формировать на выходе У сигнал частотой 1 МГц"

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 пишет:

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

 

вы совсем тупой?  вас спрашивают, ЗАЧЕМ это нужно

"Нужен беспрерывный вызов обработчика прерывания" - это не задача. Задача - это например " при уровне HIGH на входе Х формировать на выходе У сигнал частотой 1 МГц"

оу оу, полегче. не надо меня шатать как сосуд с водой ;) 

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

 

b707
Offline
Зарегистрирован: 26.05.2017

ddr2 пишет:

что я пытаюсь реализовать). 

конечная цель этого - тайна?

sadman41
Offline
Зарегистрирован: 19.10.2016

ddr2 пишет:

я повторяю одно и тоже в разных интерпретациях, но до некоторых не доходит. 

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

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

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 пишет:

что я пытаюсь реализовать). 

конечная цель этого - тайна?

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

b707
Offline
Зарегистрирован: 26.05.2017

ddr2 пишет:

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

тогда вам не нужно генерить кучу прерываний во время входного сигнала. вместо этого нужно просто измерять его (сигнала) длительность.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ddr2 пишет:

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

Не, ардуинка не прокатит. Смотрите в сторону stm32, а лучше малинки.

ddr2
Offline
Зарегистрирован: 27.12.2020

b707 пишет:

ddr2 пишет:

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

тогда вам не нужно генерить кучу прерываний во время входного сигнала. вместо этого нужно просто измерять его (сигнала) длительность.

да Вы и nik182, и посоветовали выше, за что спасибо.

 

mykaida пишет:
Не, ардуинка не прокатит. Смотрите в сторону stm32, а лучше малинки.
да stm32 это круто, но пока это просто тесты

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А чем, кстати, считываете - ФЭУ? Так у него есть время выхода на режим и чаще него опрашивать не имеет смысла.

ddr2
Offline
Зарегистрирован: 27.12.2020

mykaida пишет:

А чем, кстати, считываете - ФЭУ? Так у него есть время выхода на режим и чаще него опрашивать не имеет смысла. 

Пока считаю на СГМ, а дальше как пойдёт. По звуку пьезоизлучателя я различаю импульсы и протяжённость, теперь пытаюсь ардуинку научить делать тоже самое.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ddr2 пишет:

Пока считаю на СГМ, а дальше как пойдёт. По звуку пьезоизлучателя я различаю импульсы и протяжённость, теперь пытаюсь ардуинку научить делать тоже самое.

СГМ и мюоны. Какая-то херня.

Пьезоизлучатель (это для чего?). Какие импульсы?

Короче - пишите параметры "импульсов", а там может и прерывания не понадобятся.

SLKH
Offline
Зарегистрирован: 17.08.2015

ddr2 пишет:

mykaida пишет:

А чем, кстати, считываете - ФЭУ? Так у него есть время выхода на режим и чаще него опрашивать не имеет смысла. 

Пока считаю на СГМ, а дальше как пойдёт. По звуку пьезоизлучателя я различаю импульсы и протяжённость, теперь пытаюсь ардуинку научить делать тоже самое.

"На вход устройства приходят сформированные импульсы с напряжением лог. "1", длительность импульса от t1 до t2 (приставка)секунд, интервалы между импульсами от T1 до T2 (приставка)секунд.

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

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

Прошу прогрессивную общественность... " ит.д.

Как-то так...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

SLKH пишет:

 

"На вход устройства приходят сформированные импульсы с напряжением ...

Как-то так...

Восхищен, сэр!

nik182
Offline
Зарегистрирован: 04.05.2015

Всё давно придумано. Действительно в данном случае лучше всего использовать плату блюпил с stm32f103t8. Она тоже програмируется в ардуино ИДЕ. Делается это так. На вход ставиться прерывание. По восходящему фронту запускается таймер. По нисходяшему фронту прерывание таймер останавливает, считывается и записывается в память, обнуляется, ждет следующего импульса. Если таймер тактовать 36 МГц то можно различать минимальный импульс около 30 нс. Максимальный окло 500 мс. Диапазоны можно двигать изменяя такт таймера. Объем буфера около 9 кБ. Можно сделать два по 4 и пока набирается один второй передавать для обработки.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

nik182 пишет:
Всё давно придумано. Действительно в данном случае лучше всего использовать плату блюпил

Непонятно, а нужно ли это. Параметры сигналов неизвестны.

nik182
Offline
Зарегистрирован: 04.05.2015

Это тебе не известны, а мне известны. Я тоже с подобной аппаратурой работаю.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ddr2 пишет:

разве я тупой? :)

Судя по Вашим сообщениям - да.

А никаких других источноков информации о Вас у нас нет (.

Цитата:

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

А повторять не нужно. Нужно сделать то, что Вам посоветовали: сформулировать задачу без использования слова "прерывание". Неужели надо быть семи пядей во лбу, чтобы последовать такому простому совету?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
Это тебе не известны, а мне известны. Я тоже с подобной аппаратурой работаю.

Ну тогда я вижу только 2 варианта:

1. Вам и ТС (т.е. тем, кому известны конкретные цифры) перенести обсуждение в личную почту.

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

Иначе это тема не для форума.

ddr2
Offline
Зарегистрирован: 27.12.2020

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ddr2 пишет:

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

по какому признаку хотелось бы разделить?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ddr2 пишет:

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

Чего разделить?  50 мкс? или больше? Типа до  50 мкс - тру, а до 70мкс - не тру. Как - пишите алгоритм. Или Вас только стёбу в интернете учили?

ddr2
Offline
Зарегистрирован: 27.12.2020

ua6em пишет:

по какому признаку хотелось бы разделить?

пока только по временному. 

b707
Offline
Зарегистрирован: 26.05.2017

ddr2 пишет:

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


тогда можно и на Авр. Алгоритм тот же, что изложил nik182

ddr2
Offline
Зарегистрирован: 27.12.2020

да, я понял алгоритм, в процессе..

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ddr2 пишет:

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

Ну хоть какие цифры... Правда, хотелось бы еще знать хотя бы минимальный интервал между импульсами. 

А что значит "сливаются"?

То есть на вход вместо двух сигналов приходит один длинный? Ну так тогда самый прямой путь - перестраивать входные цепи, а не пытаться заштопать дефекты аппаратного решения при помощи программных заплаток.

ddr2
Offline
Зарегистрирован: 27.12.2020

andriano пишет:

ddr2 пишет:

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

Ну хоть какие цифры... Правда, хотелось бы еще знать хотя бы минимальный интервал между импульсами. 

А что значит "сливаются"?

Примерно так.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

То есть на вход вместо двух сигналов приходит один длинный? Ну так тогда самый прямой путь - перестраивать входные цепи, а не пытаться заштопать дефекты аппаратного решения при помощи программных заплаток.

Вот как сейчас помню - как мой научный руководитель после таких экпериментов начинал рассуждать про "двугорбого верблюда! 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ddr2 пишет:

Оси - это о чём?

Ты физик - или где?

ddr2
Offline
Зарегистрирован: 27.12.2020

mykaida пишет:

Оси - это о чём?

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ddr2 пишет:

[ это не мой рисунок, самому лень было рисовать  

Иди плитку клади, если лень. Тебе не только лень было рисовать, а даже экспиримент провести.  Так нахера ты нужен как физик?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ddr2 пишет:

mykaida пишет:

Оси - это о чём?

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

Ошибаешься.

Непонятно, какой масштаб.

Ну а если лень - не стоило и тему создавать. Размещать на этом форуме "рисунки из Интернета" - mauvais ton.

ddr2
Offline
Зарегистрирован: 27.12.2020

nik182 пишет:
Всё давно придумано. Действительно в данном случае лучше всего использовать плату блюпил с stm32f103t8. Она тоже програмируется в ардуино ИДЕ. Делается это так. На вход ставиться прерывание. По восходящему фронту запускается таймер. По нисходяшему фронту прерывание таймер останавливает, считывается и записывается в память, обнуляется, ждет следующего импульса. Если таймер тактовать 36 МГц то можно различать минимальный импульс около 30 нс. Максимальный окло 500 мс. Диапазоны можно двигать изменяя такт таймера. Объем буфера около 9 кБ. Можно сделать два по 4 и пока набирается один второй передавать для обработки.

Почему-то у меня не всегда вызывается прерывание нисходящего фронта, из-за чего таймер не выключается. Может ли это быть из-за того что у меня в main'e() в основном цикле выводится (через printf()) число прерываний и отправка в uart блокирует прерывание по нисходящему фронту, а ардуина его потом сама сбрасывает/пропускает?  

anatoli_nik
Offline
Зарегистрирован: 17.01.2019
nik182
Offline
Зарегистрирован: 04.05.2015

У таймера STM32 есть режим ворота - считает импульсы только когда на входе таймера 1. По закрытию ворот можно взять прерывание и считать данные. И тогда прерывание по ноге вообще не понадобится.