AVR 49# Кнопка. Алгоритм подавления дребезга.

Sdílet
Vložit
  • čas přidán 7. 09. 2021
  • Подключаем кнопку к микроконтроллеру и программно подавляем дребезг. Разбираем простой алгоритм с опросом кнопки в прерывании таймера.
    Проект из ролика disk.yandex.ru/d/BdKG_m9PVhohMA
    На развитие канала yoomoney.ru/to/4100115257108062
    все ролики серии • Программируем микрокон...
  • Věda a technologie

Komentáře • 49

  • @iqubik
    @iqubik Před 2 lety +12

    Очень приятно, что вы нас не бросаете. Спасибо Вам, что делаете материалы для развития.

  • @user-ex8ml1wy6d
    @user-ex8ml1wy6d Před 2 lety +6

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

  • @B5U8
    @B5U8 Před rokem +2

    Отличное видео. Всё объяснено без суеты.

  • @user-lw6bu9ws8v
    @user-lw6bu9ws8v Před rokem +1

    Спасибо большое! Весь дребезг контактов действительно сошел на нет (проверял на "железе").

  • @user-qo5mn6rq3y
    @user-qo5mn6rq3y Před 2 měsíci

    Бомба вообще

  • @maratonmaratonov28
    @maratonmaratonov28 Před rokem +1

    Шикарно❤

  • @user-tu8hk1iz6s
    @user-tu8hk1iz6s Před 2 lety +5

    Отличный урок и хороший пример. Это не баг, это фича)). А следующим уроком можно сделать реакцию на длинное и короткое нажатие, а после него - усовершенствование программы где, к примеру 8 кнопок и микроконтроллер будет отслеживать их длинное и короткое нажатие. Получится такой небольшой цикл уроков по работе с кнопкой, думаю это будет многим интересно. Спасибо за уроки и примеры.

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +2

      про кнопки можно пару лет ролики снимать :)

    • @user-tu8hk1iz6s
      @user-tu8hk1iz6s Před 2 lety +3

      @@andreyfrolov301 Да, а всё потому что тема до конца не раскрыта. В подавляющем большинстве "обучающих" видео, опрос кнопки в основном цикле с использованием delay, некоторые уникумы вешают кнопку на INT0 или INT1 (прерывания с наивысшим приоритетом использовать для кнопок это жесть) и в прерывании используют delay (вообще мрак). Еще нет ни одного видео где тема кнопок раскрыта полностью, а именно: варианты обработки в основном цикле с использованием и без delay, варианты с использованием if-else и swich-case, варианты с прерываниями по таймеру, варианты с использованием АЦП. Длинне и короткие нажатия. Да, это все давным давно реализовано и описано, но одного большого гайда по вариантам реализации я еще не встречал.

    • @lexxkrt
      @lexxkrt Před 2 lety +1

      @@user-tu8hk1iz6s по сути вы все и описали. ну и где 2 года? еще матрицу кнопок можно добавить к сказанному

    • @aleksandrbengard5195
      @aleksandrbengard5195 Před 2 lety +1

      @@user-tu8hk1iz6s в заметках ардуинщика есть видео о обработке нажатия кнопок с помощью флажков, без прерывания и в основном цикле.

  • @andreyace8768
    @andreyace8768 Před 2 lety +1

    Спасибо за познавательное видео!

  • @valovik
    @valovik Před 2 lety +1

    Ваш канал это находка! Жаль у ютуба в России непонятное будущее. Попробую скачать. По моему неудобно систематизированы видео по плейлистам. Огромное спасибо!

    • @valovik
      @valovik Před 2 lety +1

      Все, нашел нужный плейлист)) как то он затерялся с длинным названием)

  • @cpaeko9085
    @cpaeko9085 Před 7 měsíci

    Спасибо за труд.

  • @user-ws8lx5ji8z
    @user-ws8lx5ji8z Před 2 lety +1

    Excellent

  • @user-ws8lx5ji8z
    @user-ws8lx5ji8z Před rokem +1

    А вот интересно хватит ли прерываний от вачдог (16ms) ? В аттини 13 таймер всего один. Это вроде 62 Гц...

  • @user-cv6hi1mm7z
    @user-cv6hi1mm7z Před rokem +1

    А в схеме симуляции дребезга контакта какие настройки у генератора модулированного синуса?

  • @borisfet215
    @borisfet215 Před rokem +1

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

  • @user-xn3ez3hf2i
    @user-xn3ez3hf2i Před 2 lety +1

    Смотрите кнопка постоянно зажата, button_clk мы взвели и инкремент не делается, значит при каждом срабатывании прерывания у нас будет button_clk устанавливаться в единицу так как у нас счетчик button_count будет постоянно пять мы больше увеличить не можем и на данном числе все остановится. У нас в button_clk единица и мы будем каждый рвз при переполнении счетчика устанавливать button_clk в единицу хотя там и так единица, лишняя операция каждую итерацию. Я бы сделал проверку такую, если у нас button_clk в единице то мы не делаем никаких действий даже если кнопка нажата, короче проще и в итоге быстрее, и логика проверок не нарушена и каждый раз присвоения button_clk в единицу не будет (если там и так единица) и количество условий не поменяется, убрать одно лишнее условие и поставить одно правильно сформированное.

    • @dreamer4104
      @dreamer4104 Před 2 lety +2

      Данный алгоритм можно усовершенствовать, сравнивая состояние пина не с 1 или 0, а
      с его предыдущем состоянием
      при этом появится возможность
      фиксировать не только нажатие,
      но и отпускание кнопки. Я использую так.

  • @kumelektronik340
    @kumelektronik340 Před rokem +1

    Ребята подскажите, как писать коментарии на русском в Atmel Studio. Заранее благодарен

  • @aleksivanov9137
    @aleksivanov9137 Před 2 lety +1

    Спасибо большое за уроки.Просто и доступно объяснили.Про volatile можно было напомнить,как применяется.Вопрос как в AVR обойтись без delay?Какие есть варианты?Если воможно Вас просить,то сделайте пожалуйста это в видеоуроке.

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +1

      было и про без делей и про волатайл

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

    Интересный имитатор дребезга контактов, это готовый модуль или его ручками собрать надо?

  • @NoName-dj6bd
    @NoName-dj6bd Před měsícem

    Есть универсальное решение. Возле порта МК конденсатор на землю 470-1000пФ, между МК и кнопкой резистор 10-100 Ом. И никакого дребезга! Не надо усложнять себе жизнь!

  • @jone2409
    @jone2409 Před rokem +2

    Спасибо.
    Скажите пожалуйста 🙏 где или как правильно искать 🔍 инструкция или книга по изучению программирование AVR . я пробовала искать 🔍 (Язык Си для микроконтроллеров - AVR) нашёл инфо PDF формат язык про С.
    Но я читал и нечего не понял 🤷 .
    Там не встречал DDRB = 0b00000000;
    Pinb или Port . нет примеров . как найти Manual ? Спасибо .

    • @andreyfrolov301
      @andreyfrolov301  Před rokem

      DDRB = 0b00000000; это тоже самое что и a=0;
      для С
      книг не подскажу, но они точно есть и много странно что вы не нашли. поищите еще.

    • @jone2409
      @jone2409 Před rokem

      @@andreyfrolov301
      Нашёл но я не понял там нечего 😀
      Значит переименовать
      Int DDRD | = (1

    • @andreyfrolov301
      @andreyfrolov301  Před rokem

      @@jone2409 инт убрать если то - да можно

    • @mslq
      @mslq Před 4 měsíci

      Если ещё актуально, то поищите: DI HALT. AVR - Учебный курс. Это лучшая обучающая книга по асму на AVR.

  • @user-lt3jf7kq5g
    @user-lt3jf7kq5g Před 2 lety +2

    А не было бы интересным заняться FM приемником RDA5807FP (дешевый) и подключение к ATtiny13?

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +2

      есть у меня такие :) уже с пару лет лежат ждут своего часа

    • @user-lt3jf7kq5g
      @user-lt3jf7kq5g Před 2 lety +1

      @@andreyfrolov301 Спасибо!

  • @fate07078811
    @fate07078811 Před 7 měsíci

    Добрый день, не могу не где найти как решить такую задачу, мне надо по нажатию на кнопку подать импульс 200мс но если кнопка отается нажатой нечего не делать пока ее не отпустят и нажмут заного. У меня пока такой код так как я знаю время нажати до 7сек но хочется сделать что-бы было универсально для любого времени нажатия
    #define F_CPU 1000000L
    #include
    #include
    int main(void)
    {
    DDRD = 0x00; // порт D на вход
    PORTD = 0xFF; // подключаем внутренние подтяг. резисторы
    DDRB = 0xFF; // порт B на выход
    PORTB = 0x00; // устанавливаем нули на выходе
    while(1)
    {
    if(!(PIND&(1

  • @ivanrusev2270
    @ivanrusev2270 Před 2 lety +1

    А интересно как в STM32 настроить по переполнению?

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +1

      точно также только по другому :)

  • @cnccontroller
    @cnccontroller Před 2 lety +1

    Спасибо! Мне понравился ваш алгоритм. Только вот не пойму для чего button_count сделали volatile ? У меня и без них работает.

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +2

      знаете анекдот?
      если работает ничего не трогай

    • @cnccontroller
      @cnccontroller Před 2 lety +1

      @@andreyfrolov301 знаю ))
      В данном случае не понятно - для чего волатил, вот и спросил. Я их почти никогда не ставлю. Но видел безумные проекты в которых каждая(!) переменная имеет волатил.
      Но ваш алгоритм мне очень понравился и без сомнения я буду использовать его везде! Еще раз спасибо!

    • @andreyfrolov301
      @andreyfrolov301  Před 2 lety +1

      @@cnccontroller волатайл - указывает компилятору не оптимизировать переменную
      по правилам любая переменная используемая в прерывании должна быть волатайл иначе могут быть проблемы

    • @cnccontroller
      @cnccontroller Před 2 lety +1

      @@andreyfrolov301 что не оптимизировать - это понятно. Но вот что для прерывания нужно волатил, это не знал, буду иметь ввиду, хотя вроде не натыкался на проблемы. А те проекты, про которые я сказал, где все на волатилах, там вообще нет ни одного прерывания, в 1000 строк кода (ШИМ, которая работает сама по себе - не в счет).

  • @user-ef5hg5qy3m
    @user-ef5hg5qy3m Před rokem +1

    А если это attiny13, и таймер занят шимом?

    • @andreyfrolov301
      @andreyfrolov301  Před rokem +1

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

    • @user-ef5hg5qy3m
      @user-ef5hg5qy3m Před rokem +1

      @@andreyfrolov301 спасибо, я уже разобрался, шим в данном случае не мешает работает и так, только делитель на 64 не желателен для шима, думаю убрать его, а button инкримитировать не до 5, а до 5*64 соответственно

  • @mslq
    @mslq Před 4 měsíci

    У меня много счётчиков запускается - один во время единички считает миллисекунды, нулём сбрасывается, другой во время нуля считает миллисекунды, единичкой сбрасывается, таким образом формируются два события - нажато, отжато, третий удержание считает миллисекунды после формирования события нажато, или отжато - появляется событие удержание.