Возник вопрос: а будет ли такой тип прерываний выводить контроллер из сна? (да, я олень, но интересно же, и задачка под это есть). Вообще задача такая - есть ардуино+nrf24L01+энкодер+3 кнопки . Очень желательно, чтобы это все спало, пока не трогаешь энкодер и кнопки. Питание не от батареи, но от слаботочки с буффером из липо-аккумулятора. Тока там мало, желательно, чтобы максимальное его количество ушло в батарею между сеансами передачи кодов кнопок, а не на нагревание МСУ. Может у Вас уже было видео по этому поводу? Тыкните, плиз UPD: Нашел такое tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html, пока малопонятно, рога мешают но ... Прерывания при изменении состояния вывода (Pin Change Interrupts, PCINT) мой случай. И похоже именно об этом Вы в этом видео речь-то и ведете. Ок! Ага, и ваш ответ ниже увидел, режим сна нужен Idle, и будить будет. Пошел точить рога.... (уходит) (на ходу оборачивается, и произносит: ) Если охота глянуть, то мой заповедник тут github.com/kostyamat/Car-china-radio-remote-control
@@alexmorozov73 Герберт Шилдт не очень хороший автор по С++. У него проблемы с константностью о забывает про нее всегда. Но для Arduino возможно и сгодится.
Даташит на 2560 в помощь. Регистры конечно же есть, векторов прерываний должно бы быть 10 штук, но их по прежнему 3, т.е. только 24 пина обслуживают. Зато внешних прерываний вместо 2 на 168/328 целых 8. Но поскольку PCINT0..PCINT24 по распиновке вряд ли совпадают с 168, код нужно менять.
Отличное видео. Как всегда. Есть ли ограничения по скорости работы прерывания? Считываю импульсы и при частоте выше 10 кГц такое ощущение что считать успеваю а код выполнить нет. Так и зависает операция
Для подсчета импульсов лучше пользоваться таймером. У меня где-то было видео на тему замера частоты таймером. Для исполнения сколь-либо сложного кода в прерываниях у AVR мегагерц маловато и битности.
@@alexmorozov73 а если я в один момент работаю с сериал (преобразователь rs485) и считаю импульсы по прерыванию. Serial ведь тоже работает по прерываниям. Так вот может мне есть смысл в момент подсчета импульсов делать разово serial.end и прекратить отвлекаться хотя бы сюда. Как думаете будет толк от этого? Конечно я понимаю что для моей задачи Ардуино слабовато но на производстве сломалась машина по производству пакетов и что бы как то сейчас запустить пришлось прикрутить ее для управления частотником в режиме шагового двигателя.
@@G13-n9q Вы в прерывании для подсчета импульсов используете сериал? Это верная дорога к повисанию, тем более вряд ли скорость UART у вас высокая. Выставляйте в прерывании признак обновления входа, а отправку данных в сериал выполняйте в главном цикле.
@@alexmorozov73 не совсем так. Я в главном цикле обрабатываю Serial. Однако я не совсем могу понять ведь serial работает по прерыванию а значит вне зависимости от того где я обрабатываю входящие данные в сериал, обработка прерывания сериал идёт всегда после того как я инициализирован serial. С той лишь только разницей что данные мне поступают лишь в момент нахождения в loop. Вот я и думаю есть ли смысл так сказать отменить инициализацию serial для того что бы вообще не обрабатывать прерывания на нем. Тоесть аппаратная часть Ардуино на serial после его инициализации отвлекается всегда а данные я обрабатываю по желанию.
@@G13-n9q Можете попробовать, конечно, но результата это скорее всего не даст. Прерывания от сериал возникают только при отправке или приеме данных, так что вреда от них немного. Видимо для 16 МГц количество команд в прерывании многовато. Выложите код прерывания, посмотрю.
Более точное и гибкое это внутреннее прерывание от таймеров,а если использовать внешнее то лучше пользоваться ватчдогом если конечно мега позволит из даташита
И какая связь вашего комментария с темой ролика? Код прерывания от произвольного пина с использованием ватчдога в студию. Или демонстрацию гибкости прерываний от таймеров для 100% реагирования на изменения состояния пинов.
@@alexmorozov73 так в чем проблема сканирования на изменения состояния пина внутренним прерыванием? Далее зубрите собаку ww1.microchip.com/downloads/en/devicedoc/doc2535.pdf
Зубрить нужно тем, кто не понимает прочитанного, остальным достаточно просто читать. И где же идеи по поводу использования сторожевого пса для контроля изменения состояния пинов? На какой частоте планируете гонять таймер, чтобы успеть 100% среагировать на факт изменения любого пина? Какова длина кода прерывания должна быть (даже если писать на ассемблере), чтобы определить изменение любого пина? И как на счет сна до прерывания, который бессмысленен при таймере с частыми прерываниями? Все еще гибче чем предназначенные именно для этого прерывания по изменению пина? Потенциальная возможность измерения с высокой точностью длины импульса с помощью MISO пина SPI интерфейса не делает этот метод лучше, потому что он для этих целей не предназначен...
Спасибо за видео! Интересует вопрос о возможности возврата из прерываний в определенную строку кода. Читал различные форумы, но так и не понял до конца - можно ли это делать? Мои познания в программировании на очень низком уровне, так что не пинайте сильно. Пытаюсь научиться с помощью создания различных произвольных проектов (приложение приглянулось и затянуло). Создал очередной проект ruclips.net/video/KvhkN3Kt-8I/видео.html (сегодня собрал макет в "железе") все вроде бы работает, если быстро по очереди кнопки местного управления не нажимать, а управление с телефона осуществляется на 100%, но в душе понимаю, что не все правильно, так как после прерывания программа возвращается на то же место (если я правильно понял), а хотелось бы чтоб после обработки переходила на строку, которая делает отправку информации на смартфон. Бужу очень признателен за Вашу помощь в этом сложном для меня вопросе.
Ничего, что само слово "прерывание" как бы намекает на поведение? :) Кто мешает в прерывании выставить флаг, а в главном цикле его регулярно проверять и выполнять необходимый код при обнаружении выставления флага? Только объявляйте переменную для флага с префиксом volatile перед типом, а то оптимизатор ее проверку может "отоптимизировать".
Алексей, тема действительно интересная. Спасибо за работу!
Отличное видео, просто нет слов. :) СПС
Очень полезная информация. Спасибо вам за проделанную работу и за то что делитесь этим с нами!
Охрененная тема! Ай молодца! Где скачать твой мозг? А то мне иногда лень вникать в C/Cpp :-(
видел на торрентах, в разделе литература.
Источник канул в Лету вместе с Советским Союзом...
А почему не используется github или gitlab для кода? Это куда удобно чем гугл драйв.
Возник вопрос: а будет ли такой тип прерываний выводить контроллер из сна? (да, я олень, но интересно же, и задачка под это есть).
Вообще задача такая - есть ардуино+nrf24L01+энкодер+3 кнопки . Очень желательно, чтобы это все спало, пока не трогаешь энкодер и кнопки. Питание не от батареи, но от слаботочки с буффером из липо-аккумулятора. Тока там мало, желательно, чтобы максимальное его количество ушло в батарею между сеансами передачи кодов кнопок, а не на нагревание МСУ.
Может у Вас уже было видео по этому поводу? Тыкните, плиз
UPD: Нашел такое tsibrov.blogspot.com/2019/06/arduino-interrupts-part2.html, пока малопонятно, рога мешают но ...
Прерывания при изменении состояния вывода (Pin Change Interrupts, PCINT) мой случай. И похоже именно об этом Вы в этом видео речь-то и ведете. Ок! Ага, и ваш ответ ниже увидел, режим сна нужен Idle, и будить будет. Пошел точить рога.... (уходит)
(на ходу оборачивается, и произносит: ) Если охота глянуть, то мой заповедник тут github.com/kostyamat/Car-china-radio-remote-control
Сам спросил, сам отвечаю - PCINT будит не только из idle но и из полного powerDown. Проверено.
к каждому микроконтролеру есть даташит, нужно обязательно смотреть там.
А от дребезга на кнопках как боретесь? Это главный враг, при прерываниях.
Реакция на кнопку только при отпускании, если удерживалась дольше 20 мс - значит не дребезг. Пример под видео есть же.
Посоветуйте литературу по нормальному программированию avr, так же интересна esp
По С++ Герберт Шилдт, по МК даташиты производителя. Возможно есть книги о программировании именно в контексте МК.
@@alexmorozov73 Герберт Шилдт не очень хороший автор по С++.
У него проблемы с константностью о забывает про нее всегда.
Но для Arduino возможно и сгодится.
Преклоняюсь!!!
Вопрос от начинающего можно ли будить ардуину таким образом с любого пина .Спасибо.
Pin change от любого пина разбудит только из режима сна Idle, а вот INT0 и INT1 из любого.
@@alexmorozov73 , нет. Как оказалось, pin charge будит даже из powerDown. В даташите неточность. Проверено.
Возможно ли сделать такое на arduino mega 2560? У неё есть такие регистры?
Даташит на 2560 в помощь. Регистры конечно же есть, векторов прерываний должно бы быть 10 штук, но их по прежнему 3, т.е. только 24 пина обслуживают. Зато внешних прерываний вместо 2 на 168/328 целых 8. Но поскольку PCINT0..PCINT24 по распиновке вряд ли совпадают с 168, код нужно менять.
Отличное видео. Как всегда. Есть ли ограничения по скорости работы прерывания? Считываю импульсы и при частоте выше 10 кГц такое ощущение что считать успеваю а код выполнить нет. Так и зависает операция
Для подсчета импульсов лучше пользоваться таймером. У меня где-то было видео на тему замера частоты таймером.
Для исполнения сколь-либо сложного кода в прерываниях у AVR мегагерц маловато и битности.
@@alexmorozov73 а если я в один момент работаю с сериал (преобразователь rs485) и считаю импульсы по прерыванию. Serial ведь тоже работает по прерываниям. Так вот может мне есть смысл в момент подсчета импульсов делать разово serial.end и прекратить отвлекаться хотя бы сюда. Как думаете будет толк от этого? Конечно я понимаю что для моей задачи Ардуино слабовато но на производстве сломалась машина по производству пакетов и что бы как то сейчас запустить пришлось прикрутить ее для управления частотником в режиме шагового двигателя.
@@G13-n9q Вы в прерывании для подсчета импульсов используете сериал? Это верная дорога к повисанию, тем более вряд ли скорость UART у вас высокая. Выставляйте в прерывании признак обновления входа, а отправку данных в сериал выполняйте в главном цикле.
@@alexmorozov73 не совсем так. Я в главном цикле обрабатываю Serial. Однако я не совсем могу понять ведь serial работает по прерыванию а значит вне зависимости от того где я обрабатываю входящие данные в сериал, обработка прерывания сериал идёт всегда после того как я инициализирован serial. С той лишь только разницей что данные мне поступают лишь в момент нахождения в loop. Вот я и думаю есть ли смысл так сказать отменить инициализацию serial для того что бы вообще не обрабатывать прерывания на нем. Тоесть аппаратная часть Ардуино на serial после его инициализации отвлекается всегда а данные я обрабатываю по желанию.
@@G13-n9q Можете попробовать, конечно, но результата это скорее всего не даст. Прерывания от сериал возникают только при отправке или приеме данных, так что вреда от них немного. Видимо для 16 МГц количество команд в прерывании многовато.
Выложите код прерывания, посмотрю.
Побежал кодить))
Откуда эти регистры.В Микрочип студии их нет?
Есть
@@dima_dmitrenok А в какой среде вы пишите?Это не Ардуино?.В микрочип студио всё по другому.
@@ivanrusev2270 Microchip studio, avr-gcc.
@@ivanrusev2270 не Ардуино
@@dima_dmitrenok А на видео не microchip studio.
Да.... Интересная тема! А как реализован антидребезг?
Смысл видео - показать как повесить прерывания на любой пин, а не рассказывать о работе с кнопками
@@РадиоТех Видео классное и очень полезное. Я даже добавил в закладки его!
Более точное и гибкое это внутреннее прерывание от таймеров,а если использовать внешнее то лучше пользоваться ватчдогом если конечно мега позволит из даташита
И какая связь вашего комментария с темой ролика?
Код прерывания от произвольного пина с использованием ватчдога в студию. Или демонстрацию гибкости прерываний от таймеров для 100% реагирования на изменения состояния пинов.
@@alexmorozov73 так в чем проблема сканирования на изменения состояния пина внутренним прерыванием? Далее зубрите собаку ww1.microchip.com/downloads/en/devicedoc/doc2535.pdf
Зубрить нужно тем, кто не понимает прочитанного, остальным достаточно просто читать.
И где же идеи по поводу использования сторожевого пса для контроля изменения состояния пинов?
На какой частоте планируете гонять таймер, чтобы успеть 100% среагировать на факт изменения любого пина? Какова длина кода прерывания должна быть (даже если писать на ассемблере), чтобы определить изменение любого пина? И как на счет сна до прерывания, который бессмысленен при таймере с частыми прерываниями? Все еще гибче чем предназначенные именно для этого прерывания по изменению пина?
Потенциальная возможность измерения с высокой точностью длины импульса с помощью MISO пина SPI интерфейса не делает этот метод лучше, потому что он для этих целей не предназначен...
Спасибо за видео! Интересует вопрос о возможности возврата из прерываний в определенную строку кода. Читал различные форумы, но так и не понял до конца - можно ли это делать? Мои познания в программировании на очень низком уровне, так что не пинайте сильно. Пытаюсь научиться с помощью создания различных произвольных проектов (приложение приглянулось и затянуло). Создал очередной проект ruclips.net/video/KvhkN3Kt-8I/видео.html (сегодня собрал макет в "железе") все вроде бы работает, если быстро по очереди кнопки местного управления не нажимать, а управление с телефона осуществляется на 100%, но в душе понимаю, что не все правильно, так как после прерывания программа возвращается на то же место (если я правильно понял), а хотелось бы чтоб после обработки переходила на строку, которая делает отправку информации на смартфон. Бужу очень признателен за Вашу помощь в этом сложном для меня вопросе.
Ничего, что само слово "прерывание" как бы намекает на поведение? :)
Кто мешает в прерывании выставить флаг, а в главном цикле его регулярно проверять и выполнять необходимый код при обнаружении выставления флага?
Только объявляйте переменную для флага с префиксом volatile перед типом, а то оптимизатор ее проверку может "отоптимизировать".
Что за программа? Буду благодарен за ответ
PlatformIO