Официальный сайт компании Arduino по адресу arduino.cc
Генерация ШИМ-сигнала при срабатывании прерывания.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 30/09/2019 - 08:17
Доброго времени суток. Продолжится ли генерация ШИМ-сигнала при переходе в функцию, которую вызывает прерывание?
И второй вопрос: Возможно ли как-то обойти ограничение по применению команды millis() или micros() при работе функции, вызванной прерыванием (например перейти из функции по прерыванию в иную функцю)?
1. Да.
2. Это не нужно.
О каких именно ограничениях речь и для чего их нужно обходить?
Логика работы вкратце:
1. Считываю напряжение с потенциометра - задание скважности. Не суть.
2. Вывожу ШИМ сигнал с заданной скважностью (порт 9).
3. Порт прерывания подключен к выходу ШИМ сигнала (проводом напрямую порт 2 к 9). Ибо я не знаю можно ли это как то иначе считать.
4. Функция к которой происходит переход по прерыванию должна генерировать сигнал на порте 13 в виде импульса. Длительность импульса я задаю сам паузой через while и millis по типу этого http://arduino.ru/tutorials/BlinkWithoutDelay . НО...
"Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются"... ( http://arduino.ru/Reference/AttachInterrupt )
... Вот я и спрашиваю, как это ограничение обойти можно.
Надеюсь более - менее понятно написал=)
а можно узнать, зачем генерить импульс на порту 13 через считывание ШИМа прерыванием? - это какое-то прерывание беременности через Ж получается
имхо, у вас таким образом происходит не "Генерация ШИМ-сигнала при срабатывании прерывания" , а наоборот. Генерация прерывания от ШИМ сигнала.
... Вот я и спрашиваю, как это ограничение обойти можно.
Надеюсь более - менее понятно написал=)
Лезь к таймеру напрямую. С него типа миллис получиш для коротких импульсов. Если импульс на 13 нужен достаточно длинный то стартуй еще один таймер для того чтоб отмерить длину. Или если при этом и точность не критична - стартуй в прерывании, а в лупе завершай импульс по миллису.
4. Функция к которой происходит переход по прерыванию должна генерировать сигнал на порте 13 в виде импульса. Длительность импульса я задаю сам паузой через while и millis по типу этого http://arduino.ru/tutorials/BlinkWithoutDelay . НО...
О каких длительностях речь?Очевидно, что длительности маленькие, т.к. он всяко меньше периода ШИМ. Иначе Ваши имульсы начнут друг на друга накладываться.
Если речь о коротких импульсах, там вполне можно аппаратно всё сделать и вообще не париться.
Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается. ШИМ около 4кГ, чуть меньше, что составляет 250 микросекунд. Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием. Может перенаправить из этой функции в иную, где считывание millis()/micros() будет доступно(этакий двойной переход).
ответы читаем?
только по микросу
это называется не перенаправить, а завершить обработчик прерывания и вернуться в луп, где "считывание millis()/micros() будет доступно"
Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием.
1. "Это" при том, что все написанное тобой - чушь собачья.
2. Нет никаких ограничений, "считывай" сколько хочешь, просто в прерывании они не будут меняться.
а какой шаг подстройки 20 микросекундного импульса планируется?
Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается.
Тогда Вам просто нужно сделать аппаратный импульс. Вот здесь готовый код, а там "до и после" небольшое обсуждение что как и к чему.
Да и при чём это вообще? Я ведь спрашивал только про то, как можно обойти ограничение по считыванию millis()/micros() при работе функции, вызванной прерыванием.
У Вас синдром "трясти надо". Вы придумали неправильное решение и теперь ничего больше не слушаете, вот вынь Вам и положь "обход ограничений". А ведь они не зря там существуют! Вы об этом не думали? Если Вы не знаете как их обойти, значит Вы также не знаете как сделать это безопасно, чтобы всё вразнос не пошло.
Ну, раз так настаиваете - держите - чтобы напрочь снять все ограничения, первой командой в функции обработчике поставьте sei(); и забудьте
о перхотиоб ограничениях.Только это безграмотно. То, что я написал выше - на порядок грамотнее.
Может перенаправить из этой функции в иную, где считывание millis()/micros() будет доступно(этакий двойной переход).
Это, простите, бред. Сколько бы Вы ни вызывали функций, если прерывания запрещены, то они запрещены. sei() их разрешает.
Сигнал длительностью около 20 микросекунд, возможность подстройки подразумевается. ШИМ около 4кГ, чуть меньше, что составляет 250 микросекунд. Да и при чём это вообще?
При том что провисеть внутри обработчика прерывания 20мксек хоть и не хорошо, но еще допустимо, а вот 200 - уже черевато, т.к. в это время и луп и др. прерывания станут хером и не шелохнутся. Вобщем получаете значение с таймера 0. Оно меняется каждые 4мксек, соответственно в обработчике прерывания начинаете формировать импульс и ждете пока значение таймера0 увеличится на 5. Помним про переполнение ;). Вариант с использованием таймера1 также вполне годный, но сложней и из пушки по воробьям. Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.
С длительностью 20 мкс наверное нужно напрямую работать с таймером.
В прерывании не рекомендуется вообще ни чего делать.
Самое лучшее решение установить флаг и быстро покинуть обработчик.
И уже в основном цикле обработать событие.
Самое лучшее решение установить флаг и быстро покинуть обработчик.
И уже в основном цикле обработать событие.
Зачем? Пример от dimax на который я сослался в #13 не намного больше, чем установить флаг и свинтить, зато он уже всё сам сделает.
Пропустил ссылку ;) дык оно и есть напрямую с таймером.
а то что в прерываниях, что то делать так это я обобщенно, был у меня проход по граблям )
Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.
это ты про испытание системы спасения корабля от Илона Маска ???
Хотя если эти 20мксек надо точно регулировать, для управлением стержнями реактора или отсечкой движка ракеты например (ща такие специ пошли - страшно жить и умирать, могут и тут консультироватся )))), то он предпочтительней будет.
это ты про испытание системы спасения корабля от Илона Маска ???
Не. Ближе.
Изложение сути проблем обращающихся на форум с вопросами заставляет думать что все под присмотром первого отдела. Вот ты скажи, зачем в 13 порт 20мксек выводить, да еще и регулируемой длительности? Там же светодиод, использовать его для чего кроме как поморгать светодиодом желающих мало. Ну и кто эти 20мксек рассмотрит там? Только Федор.