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

Sdílet
Vložit
  • čas přidán 25. 12. 2018
  • Пример использования прерываний от любых пинов Arduino UNO.
    Ссылка на код: drive.google.com/file/d/1BtWq...
    Пример обработки кнопок через прерывания по изменению пинов: drive.google.com/file/d/1blII...
  • Věda a technologie

Komentáře • 57

  • @user-jv6pb8fd7d
    @user-jv6pb8fd7d Před 5 lety +5

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

  • @Gold-Gold
    @Gold-Gold Před 5 lety +1

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

  • @menxxx1
    @menxxx1 Před 3 lety

    Спасибо, большое.

  • @SMV1972
    @SMV1972 Před 3 měsíci

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

  • @vadimbudnik
    @vadimbudnik Před 4 lety

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

  • @esofonov
    @esofonov Před 5 lety +1

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

    • @AlexeyBukreev
      @AlexeyBukreev Před 5 lety +1

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety

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

  • @andyshevchenko5616
    @andyshevchenko5616 Před 4 lety

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

  • @user-vy9os4lz3v
    @user-vy9os4lz3v Před 5 lety

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

  • @user-yu5ml5ks6r
    @user-yu5ml5ks6r Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety +1

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

    • @user-yu5ml5ks6r
      @user-yu5ml5ks6r Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety

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

    • @user-yu5ml5ks6r
      @user-yu5ml5ks6r Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety +1

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

  • @stalker72
    @stalker72 Před 4 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 4 lety +3

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

  • @user-xe1vv6xc4c
    @user-xe1vv6xc4c Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety

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

  • @MrKostyamat
    @MrKostyamat Před 4 lety

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

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

    • @yuryfull5136
      @yuryfull5136 Před 4 lety

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

  • @egoregorow9457
    @egoregorow9457 Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety +1

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

    • @MrKostyamat
      @MrKostyamat Před 4 lety +1

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

  • @yuryfull5136
    @yuryfull5136 Před 4 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 4 lety +1

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

    • @yuryfull5136
      @yuryfull5136 Před 4 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 4 lety +1

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

  • @user-il7ub4jq8q
    @user-il7ub4jq8q Před 5 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 5 lety

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

    • @avazart614
      @avazart614 Před 5 lety

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

  • @hagenh3365
    @hagenh3365 Před 4 lety

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

    • @alexmorozov73
      @alexmorozov73  Před 4 lety

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

  • @LEVV2008
    @LEVV2008 Před 5 lety

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

    • @user-xe1vv6xc4c
      @user-xe1vv6xc4c Před 5 lety

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

    • @LEVV2008
      @LEVV2008 Před 5 lety

      @@user-xe1vv6xc4c Видео классное и очень полезное. Я даже добавил в закладки его!

  • @StoneTL
    @StoneTL Před 4 lety

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

  • @ivanrusev2270
    @ivanrusev2270 Před 3 lety

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

    • @dima_dmitrenok
      @dima_dmitrenok Před rokem

      Есть

    • @ivanrusev2270
      @ivanrusev2270 Před rokem

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

    • @dima_dmitrenok
      @dima_dmitrenok Před rokem

      @@ivanrusev2270 Microchip studio, avr-gcc.

    • @dima_dmitrenok
      @dima_dmitrenok Před rokem

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

    • @ivanrusev2270
      @ivanrusev2270 Před rokem

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