AVR 49# Кнопка. Алгоритм подавления дребезга.
Vložit
- čas přidán 7. 09. 2021
- Подключаем кнопку к микроконтроллеру и программно подавляем дребезг. Разбираем простой алгоритм с опросом кнопки в прерывании таймера.
Проект из ролика disk.yandex.ru/d/BdKG_m9PVhohMA
На развитие канала yoomoney.ru/to/4100115257108062
все ролики серии • Программируем микрокон... - Věda a technologie
Очень приятно, что вы нас не бросаете. Спасибо Вам, что делаете материалы для развития.
стараемся
Огромнешее спасибо,ваши уроки очень радуют,для меня это праздник
спасибо за высокую оценку :)
Отличное видео. Всё объяснено без суеты.
Спасибо большое! Весь дребезг контактов действительно сошел на нет (проверял на "железе").
Бомба вообще
Шикарно❤
Отличный урок и хороший пример. Это не баг, это фича)). А следующим уроком можно сделать реакцию на длинное и короткое нажатие, а после него - усовершенствование программы где, к примеру 8 кнопок и микроконтроллер будет отслеживать их длинное и короткое нажатие. Получится такой небольшой цикл уроков по работе с кнопкой, думаю это будет многим интересно. Спасибо за уроки и примеры.
про кнопки можно пару лет ролики снимать :)
@@andreyfrolov301 Да, а всё потому что тема до конца не раскрыта. В подавляющем большинстве "обучающих" видео, опрос кнопки в основном цикле с использованием delay, некоторые уникумы вешают кнопку на INT0 или INT1 (прерывания с наивысшим приоритетом использовать для кнопок это жесть) и в прерывании используют delay (вообще мрак). Еще нет ни одного видео где тема кнопок раскрыта полностью, а именно: варианты обработки в основном цикле с использованием и без delay, варианты с использованием if-else и swich-case, варианты с прерываниями по таймеру, варианты с использованием АЦП. Длинне и короткие нажатия. Да, это все давным давно реализовано и описано, но одного большого гайда по вариантам реализации я еще не встречал.
@@user-tu8hk1iz6s по сути вы все и описали. ну и где 2 года? еще матрицу кнопок можно добавить к сказанному
@@user-tu8hk1iz6s в заметках ардуинщика есть видео о обработке нажатия кнопок с помощью флажков, без прерывания и в основном цикле.
Спасибо за познавательное видео!
на здоровье :)
Ваш канал это находка! Жаль у ютуба в России непонятное будущее. Попробую скачать. По моему неудобно систематизированы видео по плейлистам. Огромное спасибо!
Все, нашел нужный плейлист)) как то он затерялся с длинным названием)
Спасибо за труд.
Excellent
А вот интересно хватит ли прерываний от вачдог (16ms) ? В аттини 13 таймер всего один. Это вроде 62 Гц...
А в схеме симуляции дребезга контакта какие настройки у генератора модулированного синуса?
спасибо ролик понравился .у меня вопрос как написать программу что бы при нажатии кнопки свето диод горел, а при отпускании не горел .с решением подавления дребезгом контакта ,как в ролике, спасибо
Смотрите кнопка постоянно зажата, button_clk мы взвели и инкремент не делается, значит при каждом срабатывании прерывания у нас будет button_clk устанавливаться в единицу так как у нас счетчик button_count будет постоянно пять мы больше увеличить не можем и на данном числе все остановится. У нас в button_clk единица и мы будем каждый рвз при переполнении счетчика устанавливать button_clk в единицу хотя там и так единица, лишняя операция каждую итерацию. Я бы сделал проверку такую, если у нас button_clk в единице то мы не делаем никаких действий даже если кнопка нажата, короче проще и в итоге быстрее, и логика проверок не нарушена и каждый раз присвоения button_clk в единицу не будет (если там и так единица) и количество условий не поменяется, убрать одно лишнее условие и поставить одно правильно сформированное.
Данный алгоритм можно усовершенствовать, сравнивая состояние пина не с 1 или 0, а
с его предыдущем состоянием
при этом появится возможность
фиксировать не только нажатие,
но и отпускание кнопки. Я использую так.
Ребята подскажите, как писать коментарии на русском в Atmel Studio. Заранее благодарен
Спасибо большое за уроки.Просто и доступно объяснили.Про volatile можно было напомнить,как применяется.Вопрос как в AVR обойтись без delay?Какие есть варианты?Если воможно Вас просить,то сделайте пожалуйста это в видеоуроке.
было и про без делей и про волатайл
Интересный имитатор дребезга контактов, это готовый модуль или его ручками собрать надо?
Есть универсальное решение. Возле порта МК конденсатор на землю 470-1000пФ, между МК и кнопкой резистор 10-100 Ом. И никакого дребезга! Не надо усложнять себе жизнь!
Спасибо.
Скажите пожалуйста 🙏 где или как правильно искать 🔍 инструкция или книга по изучению программирование AVR . я пробовала искать 🔍 (Язык Си для микроконтроллеров - AVR) нашёл инфо PDF формат язык про С.
Но я читал и нечего не понял 🤷 .
Там не встречал DDRB = 0b00000000;
Pinb или Port . нет примеров . как найти Manual ? Спасибо .
DDRB = 0b00000000; это тоже самое что и a=0;
для С
книг не подскажу, но они точно есть и много странно что вы не нашли. поищите еще.
@@andreyfrolov301
Нашёл но я не понял там нечего 😀
Значит переименовать
Int DDRD | = (1
@@jone2409 инт убрать если то - да можно
Если ещё актуально, то поищите: DI HALT. AVR - Учебный курс. Это лучшая обучающая книга по асму на AVR.
А не было бы интересным заняться FM приемником RDA5807FP (дешевый) и подключение к ATtiny13?
есть у меня такие :) уже с пару лет лежат ждут своего часа
@@andreyfrolov301 Спасибо!
Добрый день, не могу не где найти как решить такую задачу, мне надо по нажатию на кнопку подать импульс 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
А интересно как в STM32 настроить по переполнению?
точно также только по другому :)
Спасибо! Мне понравился ваш алгоритм. Только вот не пойму для чего button_count сделали volatile ? У меня и без них работает.
знаете анекдот?
если работает ничего не трогай
@@andreyfrolov301 знаю ))
В данном случае не понятно - для чего волатил, вот и спросил. Я их почти никогда не ставлю. Но видел безумные проекты в которых каждая(!) переменная имеет волатил.
Но ваш алгоритм мне очень понравился и без сомнения я буду использовать его везде! Еще раз спасибо!
@@cnccontroller волатайл - указывает компилятору не оптимизировать переменную
по правилам любая переменная используемая в прерывании должна быть волатайл иначе могут быть проблемы
@@andreyfrolov301 что не оптимизировать - это понятно. Но вот что для прерывания нужно волатил, это не знал, буду иметь ввиду, хотя вроде не натыкался на проблемы. А те проекты, про которые я сказал, где все на волатилах, там вообще нет ни одного прерывания, в 1000 строк кода (ШИМ, которая работает сама по себе - не в счет).
А если это attiny13, и таймер занят шимом?
если у мк недостаточно ресурсов для реализации вашего проекта, мк меняется на другой более "мощный"
@@andreyfrolov301 спасибо, я уже разобрался, шим в данном случае не мешает работает и так, только делитель на 64 не желателен для шима, думаю убрать его, а button инкримитировать не до 5, а до 5*64 соответственно
У меня много счётчиков запускается - один во время единички считает миллисекунды, нулём сбрасывается, другой во время нуля считает миллисекунды, единичкой сбрасывается, таким образом формируются два события - нажато, отжато, третий удержание считает миллисекунды после формирования события нажато, или отжато - появляется событие удержание.