ไม่สามารถเล่นวิดีโอนี้
ขออภัยในความไม่สะดวก
🚩Аппаратные или внешние прерывания в Arduino (AVR). Прерывание по кнопке и дребезг контактов
ฝัง
- เผยแพร่เมื่อ 25 ต.ค. 2019
- В этом выпуске образовательной рубрики продолжаем говорить о прерываниях - на этот раз, внутренних или аппаратных.
Содержание видео:
- Что такое аппаратные прерывания и как они работают
- Смотрим информацию о прерываниях в datasheet на микроконтроллер ATmega328p
- Пишем программу для внешнего прерывания по кнопке
- Наблюдаем дребезг контактов на графике осциллографа
- Пишем простую программу для борьбы с дребезгом контактов
- Получаем домашнее задание
------------------------------------------------------------------------------------
Розыгрыш, о котором говорится в видео, проведен 16.11.2019:
lrazum?...
------------------------------------------------------------------------------------
Группа ВК: lrazum
Страница автора в Instagram: / viktor_osin_
Программа, позволяющая обойти дребезг контактов кнопки:
drive.google.com/drive/folders/1Km0pM3WdDM947XMnONF4SkD8ls-V4UeB?usp=sharing
Краткая выжимка из видео:
- Что такое аппаратные прерывания и как они работают (0:33)
- Смотрим информацию о прерываниях в datasheet на микроконтроллер ATmega328p (2:38)
- Пишем программу для внешнего прерывания по кнопке (6:24)
- Наблюдаем дребезг контактов на графике осциллографа (14:47)
- Пишем простую программу для борьбы с дребезгом контактов (16:00)
- Получаем домашнее задание (22:30)
ИМХО лучше выкладывать на гитхаб
Там можно просто посмотреть код
А с диска обязательно скачивать надо
19:53
void button(){
if (millis() - timerPrew >= 200){
timerPrew = millis();
countInterrupt++;
}
}
countOn тут незачем... Если нужный интервал пройден, то сразу считаем количество нажатий. Я могу ошибаться, так как пришёл сюда узнать, как сделать прерывание по кнопке, но при этом показалось, что флажок тут избыточен. Если я заблуждаюсь, буду признателен за критику.
Мне кажется это лучшее объяснение прерываний на ардуино в ютубе
Вам не кажется. Так оно и есть.
23 минуты пролетели как мгновение. Очень увлекательно!
Особенно на скорости 2х.
Большое спасибо за хороший урок.
Познавательно. Доходчиво объясняешь. Приятно послушать.
Спасибо. Приятно и полезно смотреть твои видео!
Многое узнал, до чего самостоятельно трудно догадаться, спасибо!
Сложные темы, а как просто и доходчиво объясняются. Здорово!
Прекрасно, образцово подготовлен материал, четкая подача и прекрасная русская речь. Спасибо. Репект!
Спасибо. Просто о сложном. Замечательная подача информации.
20:48 по мне так лучше бы приучил зрителей объявлять переменные через вот такую форму записи " int16_t " так сразу видно какое количество бит и бай в числе.
А какое количество бит в long нужно запомнить. и иногда они могут отличаться.
в разных микроконтроллерах или языках.
да и увеличить(переименовать) переменную int8_t до int16_t гораздо чем менять bute в int
Ты вернулся, ура!)
Спасибо, подкинул хорошие идейки👍
Узнал много нового. Спасибо
Спасибо большое за вашу проделанную огромную работу.Все понятно,легко и доступно объясняете.Есть просьба к Вам,сделайте пожалуйста разные курсы.Как примерно в школе,первый класс это азбука а здесь знакомство с ардуино ну а далее по нарастающей в средних классах хотелось бы увидеть уже письменность на C++ ну там и дальше.Спасибо удачных Вам проектов.
Хороший обучащий канал жаль перестали выходить новые видео
Отлично объясняешь. Еще бы урок по работе и выбору осцилографа. По каким параметрам выбирать, чтобы можно было прицениться по соотношению цена/качество/функции. Ну и первичный урок как пользоваться и как не нужно подключать устройства к нему.
Отличная подача учебного материала ! именно в связке millis() и прерывания ! материал можно сказать уникальный (именно в связке больше не нашёл ни у кого). Автору огромный респект !!! На хейтеров не обращай внимания они сейчас есть везде . Многие пишут просто откровенную ерунду сами не понимая что. Люди, разберитесь для начала с более простыми вещами . Сам в своё время убил уйму времени на разбор как работать с millis(). А какой резистор поставил автор и как его подтянул ... не об этом тема была =) В функции прерывания не работает delay() ибо задействован один и тот же таймер и нужно работать с millis() , а вы пишете про форму записи и прочую ерунду, он АВТОР и ОН ТАК ВИДИТ =) кому не нравится сами свой контент делайте =)
Хорошие уроки. Можно сделать еще один урок с акцентом на приоритет прерываний. Допустим собрать часы на ардуино и семисегментнике. На второй счетчик повесить часики, на первый счетчик динамическую индикацию, на нулевой счетчик опрос кнопок. Заметили что мало уроков по ардуино о том как сделать простые часы с будильником, а все потому что милис сидит на нулевом прерывании, а звук сидит на первом прерывании. Тоесть пока играет будильник, часы отстают. Пояснить что на внешнее прерывание желательно вешать только сверхсрочное, какой ни будь датчик аварии, но никак не кнопки. Ну и понятное дело, если тикают часы на таймере, глобально запрещать прерывания нельзя.
Так держать, побольши вапускай сваи ролики очень помогают. СПОСИБА
Для обучалки все ок. Хорошо бы в обучении обращать внимание на переполнение таймера. Скажем, если кто-то делает для себя девайс с долгим включением, то через 70 дней пользователь получит мертвый функционал. И также если значение разницы выходит за int 32768, то на конце числа нужно ставить латинскую Л нижнего регистра, обозначающую сравнение в long
Хорошо подготовился. Спасибо за старание.
Спокойное и познавательное видео! Класс!
Дуже сподобалось дякую
Спасибо за интересное и полезное видео.
Спасибо!!! Очень познавательно.
Я с этим Delay проект бросил вполне рабочий, т.к. не знал как используются в Ардуино прерывания!!!
А если мне нужно 3-5 датчиков удара подключить? Как переинициализировать всего 2 пина для прерываний на 5 пинов аналоговых ?
Я делал интерактивный тир, где использовал библиотеки чтения SD карт и воспроизведения аудио:
#include // Библиотека для SD Card.
#include // Библиотека TMRpcm audio 1.6.1 ).
При попадании по панели с приклеенным сзади пьзо-элементом воспроизводится Wav-файл звуковой.
Настроил аналоговые А0-А4 входы как сенсоры, подключив к ним пьезоэлементы через подтягивающие резисторы каждый около 1МОм (пьезы для ударного воздействия пульки NERF).
И в цикле это всё использовал просто проверяя условия, когда произойдет на том или ином датчике.
После срабатывания датчика, звук мишени естественно звучит некоторое время, которое я и задавал через Delay (и ещё, толи библиотека дебильная, толи у меня лыжи не едут - если звук воспроизводился, его действие не прекращалось даже после того, как он проиграет и другой звуковой файл по другому действию не воспроизводится). Кое как нарыл в описании, что надо делать audio.disable() после выдержки времени по delay - расчитывал время звучания каждого звука):
void loop()
{
int val0= analogRead(sensorPin0);
int val1= analogRead(sensorPin1);
int val2= analogRead(sensorPin2);
int val3= analogRead(sensorPin3);
int val4= analogRead(sensorPin4);
if (val1 > 200) // попадание в тело мишени1
{
audio.play("hit1.wav"); // издаём истошные звуки погибели первой мишени
delay(3000);
audio.disable(); // выключить таймер на выводе и остановить воспроизведение
}
if (val2 > 200) // попадание в тело мишени2
{
audio.play("hit2.wav"); // издаём истошные звуки погибели второй мишени
delay(3000);
audio.disable(); // выключить таймер на выводе и остановить воспроизведение
}
// и т.д. по остальные 3 мишеням
}
Дак вот, во время работы по второй мишени после попадания в первую - вторая мишень не срабатывала именно из-за Delay по воспроизведению звука по первой :( приходится долго ждать пока она пробубнит свою траурную бубню. Возможно ещё и срабатывал "дребезг" контактов, т.к. пьезо полюбому должен дребежжать :)
Потом я искал как это обойти, понял что нужны прерывания - но к тому времени не нашел подобное видео и забросил.
Сейчас можно продолжать :) Спасибо!
А то сын поиграл и всё понравилось, но мне не понравилось такая работа и я разобрал дальше ковырять - в результате забросил.
Очень хорошие уроки. Спасибо
Спасибо, очень полезно.
Спасибо.
Зачем подключать подтягивающий резистор внешне, если можно использовать внутренний подтягивающий резистор функцией pinMode(1, INPUT_PULLUP)?
Это правила "хорошего тона" для схемотехников.
Плохая обработка дребезка. Если много кликать, то работа кода по включению и выключению LED по CHANGE периодически инвертируется.
31 led13State: 1
32 led13State: 0
33 led13State: 1
34 led13State: 0
34 led13State: 0
35 led13State: 1
35 led13State: 1
Какие есть рекомендации - прерывание, или опрос в loop?
спасибо
Добрый день.
Подскажите пожалуйста решение задачи.
Esp8266 подключается к локальной сети, проверяет PING устройства в сети, когда не получает ответ ЭХО , перепроверяет еща 3 раза, и если ответа нет, передергивает питание.
Но в это же время веб страница с возможностью в ручную вкл/выкл. Реле.... кончно жэ тормозит.
Подскажите как можно решить эту проблему?
Круто 👍
Слишком много переменных. Не проще по прерыванию отключить само прерывание, и через n мелисикунд снова опросить кнопку? Если на кнопке логический 0 - включить заново прерывание.
Под timerPrew имелось в виду previous timer?)
Здравствуйте. Подскажите пожалуйста как сделать прерывания больше чем с двумя кнопками в моем случае надо 4 кнопки?
на сколько функция attachinterrupt медленнее, чем настройка таймеров регистрами
Не пойму, почему millis - timerPrew всегда точно будет больше 200 через 200мс, а если в момент включения прерывания в миллис набежало уже много часов? Или при срабатывании прерывания миллис начинает тикать с нуля?
Добрый день или вечер!!! Уважаемый, Вы можете в другом скетче, доработать еще два канала, ролики Ваши просто чудо, но программирование для меня пенсионера очень сложно, спаять схему нет проблем. Заранее спасибо.
Извините я читал что функции времени таких как millis, delay, micros не работают в обработчике прерываний.
Немного не так! 😲 millis и micros ничего *особенного* не делают, они лишь выдают значение счётчиков в мс и мкс, прошедшее с начала работы МК, вот только во время работы подпрограммы прерывания счётчик-то не будут изменяться! 😳 И delay тоже будет работать, но какбэ необычно... Он может подвесить МК «навсегда» так как, опять же, счётчик времени у нас не меняется... 🤔 И вообще делать что-то долговременное в обработчике прерываний - это тяжкий моветон! Основная задача там - взвести какой-нить флаг, что бы основная программа узнала - у нас произошло какое-то событие, и уже там производить всякие долговременные «операции», иначе логика работы проца и остальной периферии может основательно покоситься и мы можем получить совсем не тот результат, на который рассчитывали! В начале своего «програмно/аппаратного пути» я долго не мог понять, почему моя прога делает совсем не то, что я «замыслил»?!? 🤔 И лишь доскональное заучивание мануала, да ещё пошаговая «пробежка» в отладчике «вправляли» моск на своё законное место! 👍😁🤪
@@user-dq2ci5ln5g во первых, с чего бы в прерывании не работали функции времени? Во вторых, выполнение основного кода в прерывании - стандарт для систем жёсткого реального времени, особенно в тех МК, где есть приоритеты прерываний
@@micromaster4405 Во первых, а с чего им там работать, если в п/п обработки каких-то прерываний обычно выставляется флаг запрета прерываний! Каждая статья в эту тему, да и все, скажем так, гуру от Ардуины на каждом шагу говорят - функции времени в прерывании не работают! Об этом уже столько баталий было, столько копий переломано в сражениях, типа: «а почему у меня в прерывании не работает то-то и это?»! А, во вторых, в *Ардуине стоит ATmega328* , и мы щаз, какбэ, про него говорим... В других МК, да и неМК тоже, может быть всё по другому! Поэтому, я ещё раз повторюсь, что только «заучивание наизусть» руководства пользователя по программированию позволит получить от МК именно той реакции, которую мы «задумали», вернее «заставить» делать то, что мы хотим! Тщательно читаем и «запоминаем» все доки и маны от «нашего» МК, чтобы не было потом «дурацких» вопросов: - а почему это моя Ардуинка считает неправильно, не видит кнопки, таймер не обрабатывает, АЦП не считает?! Вы вот зайдите на профильные форумы по STM32, там такие вопросы всплывают, что мама не горюй, а всё из-за того, что кто-то что-то не дочитал, а маны там в разы больше чем по Ардуне, или разработчики не подправили доки или софт по разработке, при выпуске новой версии МК! И да, что такое «выполнение основного кода в прерывании» я не понял, от слова - никак! 🤔 Это что, выполнение двух разных команд, в одно и то же время, одним ядром процессора?! 😲
👍
Какой смысл писать если вы ни кому не отвечаете
Спасибо
Если резистор ставят для поддтяжки к минусу его называют "стягивающим"
То есть прошло 1.5 месяца и прерывания перестали работать :-) Хакер? Для МК 1.5 месяца, как мгновение, особенно если он в каком-нибудь девайсе с постоянным питанием.
Здравствуйте, подскажите а как сделать что бы после нажатия кнопки светодиод загорался с нужной мне задержкой ну допустим с опаданием в 1.5сек? но при отпускании что б срабатывало без задержек уже.
При нажатии на кнопку ставишь(включаешь) флаг и начинаешь отсчёт, по завешению отсчёта выключаешь флаг и запускаешь программу (ну твой диод загорелся), и как дополнительное условие, если флаг включен и кнопка отпущена, программа выполняется сразу, в момент отпускания кнопки.
Спасибо, много чего узнал о прерываниях, но столкнулся с проблемкой, помогите её решить, думаю много кому поможет. В проекте есть кнопка (на внешнее прерывание), модуль приёмника 433мгц (на внешнее прерывание), шаговый двигатель с драйвером DIR-STEP и другие датчики для опроса, желательно на внешнее прерывание. Как решить такую задачу, на что смотреть для написания скетча? Ведь у NANO только 2 и 3 нога для прерывания. Только ардуино UNO в помощь? или есть библиотеки какие. Жаль нет видео отличия int от pcint
Я бы задействовал дополнительные пины для каждого датчика, и так же направил бы их на один пин прерывания. То есть прерывание на 3 пине регистрируется и обработчик начинает проверять три пина датчиков, которые выдают сигнал. Вот нашёл подобное обсуждение (goo-gl.me/4jiNM ), почитайте, может будет полезным. А вообще я бы не увлекался прерываниями и старался делать быструю программу, в цикле которой успевают отслеживаться все ваши события.
@@LabRazum Спасибо, я тут почитал чем отличается PCINT* от INT* на ногах, получается как у Вас на видео графики, INT на 2 и 3 ноге, остальные подчти все грубо на кнопки можно сажать для прерывания. Неувлекаясь конечно же.
Или автор дает очень упрощённое понятие volatile, или сам не до конца понимает его использование. Например, если переменная используется только в прерывании, то volatile не нужно ставить.
Зачем подтягивающий резистор, если у ардуино есть встроенный резистор?
Посмотрите на размеры и мощность выводного резистора и подумайте о надежности встроенного в микроконтроллер микро-резистора - они очень любят выгорать при наводках и не надежны, поэтому я в любых проектах использую только внешнюю подтяжку.
@@zhuk462 ну дак вы подтверждайте доказательствами, что это ерунда :) Например, здесь в разделе о подключении кнопок об этом тоже говорят: easyelectronics.ru/podklyuchenie-mikrokontrollera-likbez.html
и здесь тоже: www.radiokot.ru/forum/viewtopic.php?p=1431616
@@zhuk462 как только понимаешь, что ляпнул "ерунду" начинаешь переобувается на ходу)))) тебе же автор ясно и понятно объяснил, что предпочитает надежность, а ты флудить начинаешь и тут же говоришь о предпочтениях. Если не нравиться не грузи автора глупостями у него не так много времени чтобы тратить его на таких как ты.
@@zhuk462 что значит "спалиш порт что так что эдак"? Если в твоей схеме резистор подобран соответствующего номинала как же ты порт спалиш))) или опять переобуваться будешь на ходу)))
@@user-rw9od8yx1g тоже заметил))) крутится как уж на сковородке. сначала шлепнет языком, потом оправдывается. и дизлайк единственный он и поставил )))
Артикул лампы на струбцине скажи пожалуйста.
Покупал у местного магазина здесь: danomsk.ru/shop/12-gotovye-izdeliya/22-payalnoe-oborudovanie/141-vspomogatelnoe-oborudovanie/163560-lupa-nastolnaya-ma-1503i-3d-s-podsvetkoy-kh1-75-190kh155-mm-dve-energosberegyushchie-lampy-moshchnos/
Насколько я знаю, современные компьютеры не используют прерывания для работы с мышью
17:59 Если countOn, можно было сбросить вместе с countInterrupt, то зачем нужна вся это возня с таймером?
Дребезг длится где-то 5мс.
Если я правильно понял, вы предлагаете сделать следующее:
...
void button() {
if(countOn == 0) {
countIpt++;
countOn = 1;
} } ...
void loop() { ...
cli()
int countButton = countIpt;
countIpt = 0; countOn = 0;
sei()
... }
Впринципе это может сработать, но тогда вы привязываете сброс кнопки к скорости, с которой у вас будет повторяться этот сброс. Если loop будет повторяться достаточно часто (например если убрать из этой программы delay), то переменная countOn будет сбрасываться всё ещё чаще, чем надо. Даже чаще 5 мс.
Дребезг длится не 5мс) чаще всего надо ставить 50мс, но есть и такие хреновые кнопки которым и 200мс мало.
@@Fil0sOFF
Странно у меня не больше 10 мс. Ну а с 200мс это уже перебор! Там не кнопка дребезжит, а руки трясутся!
🤣🤣
Спасибо понятно, но проще было бы INPUT PULLUP или же резистором вручную подтянуть и дребезг уйдет
Нет, дребезг останется, т.к. происходит он из-за контактов, которые несколько раз замыкаются между собой. А подтяжка всего лишь делает стабильным 0 или 1 - нажато/отпущено, без помех.
@@LabRazum все этим пользуются, а вы пытаетесь опровергнуть, говорю же работает
@@Relevantium я с такой логикой спорить не буду, но вы бы хоть загуглили для чего нужна подтяжка :)
@@LabRazum я знаю для чего она нужна, но с дребезгом тоже помогает, иначе бы не советовал
@@Relevantium если вы так настаиваете, тогда можете коротко пояснить, как это происходит? Или дать ссылку хоть на одну статью или пример где об этом рассказано?)
Ну и почему под роликом нет ссылки на первое видео про прерывания, раз уж его рекомендуете. Несерьёзно относитесь к своей работе :(
Потому что научитесь пользоваться подсказками/рекомендуемыми видео, там я специально в момент, когда говорю об этой части, закрепил видео на первую часть.
@@LabRazum Ура, в этот раз я смогу вам кое что интересное и новое рассказать! :) То что вы назвали «подсказки/рекомендованные видео» можно увидеть только на стационарном компьютере, и то только в том случае если у вас в настройке включена опция «Аннотации». И в этом случае подсказка выскочит лишь на секунду. Стоило тебе отвернуться и ты уже не знаешь о том что там что-то было. А если опция «Аннотации» выключена - то я и не узнаю что были какие-то подсказки. Но я смотрю ютьюб с планшета iPad (он рекламу только 1 раз показывает перед видео, а не каждые 5-7 минут как на стационарном компе), и там в мобильной версии вообще никогда не выпадают подсказки, а в настройках даже раздела «Аннотации» не усуществует. В общем ни пользователи компьютеров, ни планшетов/смартфонов ваши подсказки не видят (за исключением тех кто включит эту опцию на ПК). Гораздо логичней если вы на что-то ссылаетесь - прописать это в ссылках под видео, как это делают все остальные...
@@user-rd3lj4gn4s хорошо, спасибо, буду прописывать! Есть еще раздел «другие видео», если нажать на шестеренку, в самом низу. Там я обычно смотрю все предложенные видео автором. Это и с ipad и с телефона работает.
А можешь конечно не бесплатно проверить скетч.
+