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

Поділитися
Вставка
  • Опубліковано 7 вер 2021
  • Подключаем кнопку к микроконтроллеру и программно подавляем дребезг. Разбираем простой алгоритм с опросом кнопки в прерывании таймера.
    Проект из ролика disk.yandex.ru/d/BdKG_m9PVhohMA
    На развитие канала yoomoney.ru/to/4100115257108062
    все ролики серии • Программируем микрокон...
  • Наука та технологія

КОМЕНТАРІ • 49

  • @iqubik
    @iqubik 2 роки тому +12

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

  • @user-ex8ml1wy6d
    @user-ex8ml1wy6d 2 роки тому +6

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +1

      спасибо за высокую оценку :)

  • @B5U8
    @B5U8 Рік тому +2

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

  • @user-lw6bu9ws8v
    @user-lw6bu9ws8v 2 роки тому +1

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

  • @user-tu8hk1iz6s
    @user-tu8hk1iz6s 2 роки тому +5

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +2

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

    • @user-tu8hk1iz6s
      @user-tu8hk1iz6s 2 роки тому +3

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

    • @lexxkrt
      @lexxkrt 2 роки тому +1

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

    • @aleksandrbengard5195
      @aleksandrbengard5195 2 роки тому +1

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

  • @maratonmaratonov28
    @maratonmaratonov28 Рік тому +1

    Шикарно❤

  • @user-qo5mn6rq3y
    @user-qo5mn6rq3y 3 місяці тому

    Бомба вообще

  • @andreyace8768
    @andreyace8768 2 роки тому +1

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

  • @valovik
    @valovik 2 роки тому +1

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

    • @valovik
      @valovik 2 роки тому +1

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

  • @cpaeko9085
    @cpaeko9085 8 місяців тому

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

  • @user-ws8lx5ji8z
    @user-ws8lx5ji8z 2 роки тому +1

    Excellent

  • @borisfet215
    @borisfet215 Рік тому +1

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

  • @user-ws8lx5ji8z
    @user-ws8lx5ji8z Рік тому +1

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

  • @aleksivanov9137
    @aleksivanov9137 2 роки тому +1

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +1

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

  • @user-cv6hi1mm7z
    @user-cv6hi1mm7z Рік тому +1

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

  • @sssh1505
    @sssh1505 3 місяці тому

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

  • @kumelektronik340
    @kumelektronik340 Рік тому +1

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

  • @user-xn3ez3hf2i
    @user-xn3ez3hf2i 2 роки тому +1

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

    • @dreamer4104
      @dreamer4104 2 роки тому +2

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

  • @user-lt3jf7kq5g
    @user-lt3jf7kq5g 2 роки тому +2

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +2

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

    • @user-lt3jf7kq5g
      @user-lt3jf7kq5g 2 роки тому +1

      @@andreyfrolov301 Спасибо!

  • @cnccontroller
    @cnccontroller 2 роки тому +1

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +2

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

    • @cnccontroller
      @cnccontroller 2 роки тому +1

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +1

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

    • @cnccontroller
      @cnccontroller 2 роки тому +1

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

  • @fate07078811
    @fate07078811 8 місяців тому

    Добрый день, не могу не где найти как решить такую задачу, мне надо по нажатию на кнопку подать импульс 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

  • @jone2409
    @jone2409 Рік тому +2

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

    • @andreyfrolov301
      @andreyfrolov301  Рік тому

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

    • @jone2409
      @jone2409 Рік тому

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

    • @andreyfrolov301
      @andreyfrolov301  Рік тому

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

    • @mslq
      @mslq 4 місяці тому

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

  • @ivanrusev2270
    @ivanrusev2270 2 роки тому +1

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

    • @andreyfrolov301
      @andreyfrolov301  2 роки тому +1

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

  • @NoName-dj6bd
    @NoName-dj6bd 2 місяці тому

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

  • @user-ef5hg5qy3m
    @user-ef5hg5qy3m Рік тому +1

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

    • @andreyfrolov301
      @andreyfrolov301  Рік тому +1

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

    • @user-ef5hg5qy3m
      @user-ef5hg5qy3m Рік тому +1

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

  • @mslq
    @mslq 4 місяці тому

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