Генерация ШИМ-сигнала при срабатывании прерывания.

morfgan
Offline
Зарегистрирован: 30.09.2019

Доброго времени суток. Продолжится ли генерация ШИМ-сигнала при переходе в функцию, которую вызывает прерывание?

И второй вопрос: Возможно ли как-то обойти ограничение по применению команды millis() или micros() при работе функции, вызванной прерыванием (например перейти из функции по прерыванию в иную функцю)?

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

1. Да.

2. Это не нужно.

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

morfgan пишет:
Возможно ли как-то обойти ограничение по применению команды millis() или micros() при работе функции, вызванной прерыванием (например перейти из функции по прерыванию в иную функцю)?

О каких именно ограничениях речь и для чего их нужно обходить?

morfgan
Offline
Зарегистрирован: 30.09.2019

 

Логика работы вкратце:

1. Считываю напряжение с потенциометра - задание скважности. Не суть.

2. Вывожу ШИМ сигнал с заданной скважностью (порт 9).

3. Порт прерывания подключен к выходу ШИМ сигнала (проводом напрямую порт 2 к 9). Ибо я не знаю можно ли это как то иначе считать.

4. Функция к которой происходит переход по прерыванию должна генерировать сигнал на порте 13 в виде импульса. Длительность импульса я задаю сам паузой через while и millis по типу этого http://arduino.ru/tutorials/BlinkWithoutDelay . НО... 

"Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются"...  http://arduino.ru/Reference/AttachInterrupt )

... Вот я и спрашиваю, как это ограничение обойти можно.

Надеюсь более - менее понятно написал=)

b707
Онлайн
Зарегистрирован: 26.05.2017

а можно узнать, зачем генерить импульс на порту 13 через считывание ШИМа прерыванием? - это какое-то прерывание беременности через Ж получается

MaksVV
Offline
Зарегистрирован: 06.08.2015

имхо,  у вас таким образом происходит не "Генерация ШИМ-сигнала при срабатывании прерывания" , а наоборот. Генерация прерывания от ШИМ сигнала. 

Logik
Offline
Зарегистрирован: 05.08.2014

morfgan пишет:

 

... Вот я и спрашиваю, как это ограничение обойти можно.

Надеюсь более - менее понятно написал=)

Лезь к таймеру напрямую.  С него типа миллис получиш для коротких импульсов. Если импульс на 13 нужен достаточно длинный то стартуй еще один таймер для того чтоб отмерить длину. Или если при этом и точность не критична - стартуй в прерывании, а в лупе завершай импульс по миллису.

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

morfgan пишет:

4. Функция к которой происходит переход по прерыванию должна генерировать сигнал на порте 13 в виде импульса. Длительность импульса я задаю сам паузой через while и millis по типу этого http://arduino.ru/tutorials/BlinkWithoutDelay . НО... 

О каких длительностях речь?Очевидно, что длительности маленькие, т.к. он всяко меньше периода ШИМ. Иначе Ваши имульсы начнут друг на друга накладываться. 

Если речь о коротких импульсах, там вполне можно аппаратно всё сделать и вообще не париться.

morfgan
Offline
Зарегистрирован: 30.09.2019

Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается. ШИМ около 4кГ, чуть меньше, что составляет 250 микросекунд. Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием. Может перенаправить из этой функции в иную, где считывание millis()/micros() будет доступно(этакий двойной переход). 

MaksVV
Offline
Зарегистрирован: 06.08.2015

ответы читаем? 

Logik пишет:
Лезь к таймеру напрямую. .......Или если при этом и точность не критична - стартуй в прерывании, а в лупе завершай импульс по миллису.

только по микросу

MaksVV
Offline
Зарегистрирован: 06.08.2015

morfgan пишет:
Может перенаправить из этой функции в иную, где считывание millis()/micros() будет доступно(этакий двойной переход).

это называется не перенаправить, а завершить обработчик прерывания и вернуться в луп, где "считывание millis()/micros() будет доступно"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

morfgan пишет:

 Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием.

1. "Это" при том, что все написанное тобой - чушь собачья.

2. Нет никаких ограничений, "считывай" сколько хочешь, просто в прерывании они не будут меняться.

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

а какой шаг подстройки 20 микросекундного импульса планируется?

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

morfgan пишет:

Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается.

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

morfgan пишет:

Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием. 

У Вас синдром "трясти надо". Вы придумали неправильное решение и теперь ничего больше не слушаете, вот вынь Вам и положь "обход ограничений". А ведь они не зря там существуют! Вы об этом не думали? Если Вы не знаете как их обойти, значит Вы также не знаете как сделать это безопасно, чтобы всё вразнос не пошло.

Ну, раз так настаиваете - держите - чтобы напрочь снять все ограничения, первой командой в функции обработчике поставьте sei(); и забудьте о перхоти об ограничениях.

Только это безграмотно. То, что я написал выше - на порядок грамотнее.

morfgan пишет:

Может перенаправить из этой функции в иную, где считывание millis()/micros() будет доступно(этакий двойной переход). 

Это, простите, бред. Сколько бы Вы ни вызывали функций, если прерывания запрещены, то они запрещены. sei() их разрешает.

Logik
Offline
Зарегистрирован: 05.08.2014

morfgan пишет:

Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается. ШИМ около 4кГ, чуть меньше, что составляет 250 микросекунд. Да и при чём это вообще? 

При том что провисеть внутри обработчика прерывания 20мксек хоть и не хорошо, но еще допустимо, а вот 200 - уже черевато, т.к. в это время и луп и др. прерывания станут хером и не шелохнутся. Вобщем получаете значение с таймера 0. Оно меняется каждые 4мксек, соответственно в обработчике прерывания начинаете формировать импульс и ждете пока значение таймера0 увеличится на 5. Помним про переполнение ;). Вариант с использованием таймера1 также вполне годный, но сложней и из пушки по воробьям. Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.

anarch
Offline
Зарегистрирован: 10.09.2017

С длительностью 20 мкс наверное нужно напрямую работать с таймером.

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

Самое лучшее решение установить флаг и быстро покинуть обработчик. 

И уже в основном цикле обработать событие.

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

anarch пишет:

Самое лучшее решение установить флаг и быстро покинуть обработчик. 

И уже в основном цикле обработать событие.

Зачем? Пример от dimax на который я сослался в #13 не намного больше, чем установить флаг и свинтить, зато он уже всё сам сделает.

anarch
Offline
Зарегистрирован: 10.09.2017

Пропустил ссылку ;) дык оно и есть напрямую с таймером.

а то что в прерываниях, что то делать так это я обобщенно, был у меня проход по граблям ) 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Logik пишет:

 Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.

это ты про испытание системы спасения корабля от Илона Маска ???

Logik
Offline
Зарегистрирован: 05.08.2014

ua6em пишет:

Logik пишет:

 Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.

это ты про испытание системы спасения корабля от Илона Маска ???

Не. Ближе.

Изложение сути проблем обращающихся на форум с вопросами заставляет думать что все под присмотром первого отдела. Вот ты скажи, зачем в 13 порт 20мксек выводить, да еще и регулируемой длительности? Там же светодиод, использовать его для чего кроме как поморгать светодиодом желающих мало. Ну и кто эти 20мксек рассмотрит там? Только Федор.