AVR 168/328 и прерывания от любого пина

Поделиться
HTML-код
  • Опубликовано: 17 ноя 2024

Комментарии • 57

  • @юрийяковлев-ь4ю
    @юрийяковлев-ь4ю 5 лет назад +5

    Алексей, тема действительно интересная. Спасибо за работу!

  • @Gold-Gold
    @Gold-Gold 5 лет назад +1

    Отличное видео, просто нет слов. :) СПС

  • @SMV1972
    @SMV1972 7 месяцев назад

    Очень полезная информация. Спасибо вам за проделанную работу и за то что делитесь этим с нами!

  • @esofonov
    @esofonov 5 лет назад +1

    Охрененная тема! Ай молодца! Где скачать твой мозг? А то мне иногда лень вникать в C/Cpp :-(

    • @AlexeyBukreev
      @AlexeyBukreev 5 лет назад +1

      видел на торрентах, в разделе литература.

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Источник канул в Лету вместе с Советским Союзом...

  • @andyshevchenko5616
    @andyshevchenko5616 5 лет назад

    А почему не используется github или gitlab для кода? Это куда удобно чем гугл драйв.

  • @MrKostyamat
    @MrKostyamat 4 года назад

    Возник вопрос: а будет ли такой тип прерываний выводить контроллер из сна? (да, я олень, но интересно же, и задачка под это есть).
    Вообще задача такая - есть ардуино+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

    • @MrKostyamat
      @MrKostyamat 4 года назад

      Сам спросил, сам отвечаю - PCINT будит не только из idle но и из полного powerDown. Проверено.

    • @yuryfull5136
      @yuryfull5136 4 года назад

      к каждому микроконтролеру есть даташит, нужно обязательно смотреть там.

  • @hagenh3365
    @hagenh3365 5 лет назад

    А от дребезга на кнопках как боретесь? Это главный враг, при прерываниях.

    • @alexmorozov73
      @alexmorozov73  5 лет назад

      Реакция на кнопку только при отпускании, если удерживалась дольше 20 мс - значит не дребезг. Пример под видео есть же.

  • @ИгорьСоболев-п4й
    @ИгорьСоболев-п4й 5 лет назад

    Посоветуйте литературу по нормальному программированию avr, так же интересна esp

    • @alexmorozov73
      @alexmorozov73  5 лет назад

      По С++ Герберт Шилдт, по МК даташиты производителя. Возможно есть книги о программировании именно в контексте МК.

    • @avazart614
      @avazart614 5 лет назад

      @@alexmorozov73 Герберт Шилдт не очень хороший автор по С++.
      У него проблемы с константностью о забывает про нее всегда.
      Но для Arduino возможно и сгодится.

  • @vadimbudnik
    @vadimbudnik 4 года назад

    Преклоняюсь!!!

  • @egoregorow9457
    @egoregorow9457 5 лет назад

    Вопрос от начинающего можно ли будить ардуину таким образом с любого пина .Спасибо.

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Pin change от любого пина разбудит только из режима сна Idle, а вот INT0 и INT1 из любого.

    • @MrKostyamat
      @MrKostyamat 4 года назад +1

      @@alexmorozov73 , нет. Как оказалось, pin charge будит даже из powerDown. В даташите неточность. Проверено.

  • @РадиоТех
    @РадиоТех 5 лет назад

    Возможно ли сделать такое на arduino mega 2560? У неё есть такие регистры?

    • @alexmorozov73
      @alexmorozov73  5 лет назад

      Даташит на 2560 в помощь. Регистры конечно же есть, векторов прерываний должно бы быть 10 штук, но их по прежнему 3, т.е. только 24 пина обслуживают. Зато внешних прерываний вместо 2 на 168/328 целых 8. Но поскольку PCINT0..PCINT24 по распиновке вряд ли совпадают с 168, код нужно менять.

  • @G13-n9q
    @G13-n9q 5 лет назад

    Отличное видео. Как всегда. Есть ли ограничения по скорости работы прерывания? Считываю импульсы и при частоте выше 10 кГц такое ощущение что считать успеваю а код выполнить нет. Так и зависает операция

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      Для подсчета импульсов лучше пользоваться таймером. У меня где-то было видео на тему замера частоты таймером.
      Для исполнения сколь-либо сложного кода в прерываниях у AVR мегагерц маловато и битности.

    • @G13-n9q
      @G13-n9q 5 лет назад

      @@alexmorozov73 а если я в один момент работаю с сериал (преобразователь rs485) и считаю импульсы по прерыванию. Serial ведь тоже работает по прерываниям. Так вот может мне есть смысл в момент подсчета импульсов делать разово serial.end и прекратить отвлекаться хотя бы сюда. Как думаете будет толк от этого? Конечно я понимаю что для моей задачи Ардуино слабовато но на производстве сломалась машина по производству пакетов и что бы как то сейчас запустить пришлось прикрутить ее для управления частотником в режиме шагового двигателя.

    • @alexmorozov73
      @alexmorozov73  5 лет назад

      @@G13-n9q Вы в прерывании для подсчета импульсов используете сериал? Это верная дорога к повисанию, тем более вряд ли скорость UART у вас высокая. Выставляйте в прерывании признак обновления входа, а отправку данных в сериал выполняйте в главном цикле.

    • @G13-n9q
      @G13-n9q 5 лет назад

      @@alexmorozov73 не совсем так. Я в главном цикле обрабатываю Serial. Однако я не совсем могу понять ведь serial работает по прерыванию а значит вне зависимости от того где я обрабатываю входящие данные в сериал, обработка прерывания сериал идёт всегда после того как я инициализирован serial. С той лишь только разницей что данные мне поступают лишь в момент нахождения в loop. Вот я и думаю есть ли смысл так сказать отменить инициализацию serial для того что бы вообще не обрабатывать прерывания на нем. Тоесть аппаратная часть Ардуино на serial после его инициализации отвлекается всегда а данные я обрабатываю по желанию.

    • @alexmorozov73
      @alexmorozov73  5 лет назад +1

      @@G13-n9q Можете попробовать, конечно, но результата это скорее всего не даст. Прерывания от сериал возникают только при отправке или приеме данных, так что вреда от них немного. Видимо для 16 МГц количество команд в прерывании многовато.
      Выложите код прерывания, посмотрю.

  • @МихаилПетров-т3е8у

    Побежал кодить))

  • @ivanrusev2270
    @ivanrusev2270 3 года назад

    Откуда эти регистры.В Микрочип студии их нет?

    • @dima_dmitrenok
      @dima_dmitrenok 2 года назад

      Есть

    • @ivanrusev2270
      @ivanrusev2270 2 года назад

      @@dima_dmitrenok А в какой среде вы пишите?Это не Ардуино?.В микрочип студио всё по другому.

    • @dima_dmitrenok
      @dima_dmitrenok 2 года назад

      @@ivanrusev2270 Microchip studio, avr-gcc.

    • @dima_dmitrenok
      @dima_dmitrenok 2 года назад

      @@ivanrusev2270 не Ардуино

    • @ivanrusev2270
      @ivanrusev2270 2 года назад

      @@dima_dmitrenok А на видео не microchip studio.

  • @LEVV2008
    @LEVV2008 5 лет назад

    Да.... Интересная тема! А как реализован антидребезг?

    • @РадиоТех
      @РадиоТех 5 лет назад

      Смысл видео - показать как повесить прерывания на любой пин, а не рассказывать о работе с кнопками

    • @LEVV2008
      @LEVV2008 5 лет назад

      @@РадиоТех Видео классное и очень полезное. Я даже добавил в закладки его!

  • @yuryfull5136
    @yuryfull5136 4 года назад

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

    • @alexmorozov73
      @alexmorozov73  4 года назад +1

      И какая связь вашего комментария с темой ролика?
      Код прерывания от произвольного пина с использованием ватчдога в студию. Или демонстрацию гибкости прерываний от таймеров для 100% реагирования на изменения состояния пинов.

    • @yuryfull5136
      @yuryfull5136 4 года назад

      @@alexmorozov73 так в чем проблема сканирования на изменения состояния пина внутренним прерыванием? Далее зубрите собаку ww1.microchip.com/downloads/en/devicedoc/doc2535.pdf

    • @alexmorozov73
      @alexmorozov73  4 года назад +1

      Зубрить нужно тем, кто не понимает прочитанного, остальным достаточно просто читать.
      И где же идеи по поводу использования сторожевого пса для контроля изменения состояния пинов?
      На какой частоте планируете гонять таймер, чтобы успеть 100% среагировать на факт изменения любого пина? Какова длина кода прерывания должна быть (даже если писать на ассемблере), чтобы определить изменение любого пина? И как на счет сна до прерывания, который бессмысленен при таймере с частыми прерываниями? Все еще гибче чем предназначенные именно для этого прерывания по изменению пина?
      Потенциальная возможность измерения с высокой точностью длины импульса с помощью MISO пина SPI интерфейса не делает этот метод лучше, потому что он для этих целей не предназначен...

  • @stalker72
    @stalker72 5 лет назад

    Спасибо за видео! Интересует вопрос о возможности возврата из прерываний в определенную строку кода. Читал различные форумы, но так и не понял до конца - можно ли это делать? Мои познания в программировании на очень низком уровне, так что не пинайте сильно. Пытаюсь научиться с помощью создания различных произвольных проектов (приложение приглянулось и затянуло). Создал очередной проект ruclips.net/video/KvhkN3Kt-8I/видео.html (сегодня собрал макет в "железе") все вроде бы работает, если быстро по очереди кнопки местного управления не нажимать, а управление с телефона осуществляется на 100%, но в душе понимаю, что не все правильно, так как после прерывания программа возвращается на то же место (если я правильно понял), а хотелось бы чтоб после обработки переходила на строку, которая делает отправку информации на смартфон. Бужу очень признателен за Вашу помощь в этом сложном для меня вопросе.

    • @alexmorozov73
      @alexmorozov73  5 лет назад +3

      Ничего, что само слово "прерывание" как бы намекает на поведение? :)
      Кто мешает в прерывании выставить флаг, а в главном цикле его регулярно проверять и выполнять необходимый код при обнаружении выставления флага?
      Только объявляйте переменную для флага с префиксом volatile перед типом, а то оптимизатор ее проверку может "отоптимизировать".

  • @StoneTL
    @StoneTL 4 года назад

    Что за программа? Буду благодарен за ответ