Официальный сайт компании Arduino по адресу arduino.cc
Проблемный код счётчика нажатия тактовой кнопки.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 18/01/2016 - 15:56
Есть ардуино Уно, в ней такой код
int razrab; //светодиод 1 int i=0; const int r=0; int Lamp=5; void buttoncontrol() { i=i+1; //увеличивает счетчик кнопки на 1, можно так ledState++ , но мне не удобно. if (i==2){i=0;}//если счетчик достиг предела положений то его надо обнулить. } //функция все светодиоды выключены void OFF() {delay(40); razrab=0; } //функция все светодиоды включены void ON() {delay(40); razrab=1; } void setup() { pinMode(Lamp, OUTPUT); attachInterrupt(0, buttoncontrol, RISING); } void loop() { switch (i) { case 0: OFF();//выключено break; case 1: ON();//включено break; case 2: OFF();//включено break; } if(razrab==0){ delay(40); digitalWrite(Lamp,0); } if(razrab==1){ delay(40); digitalWrite(Lamp,1); } }
Нажал на тактовую кнопку первый раз появилась на 5 выводе ардуины 1, нажал второй раз на 5 выводе0, оно то всё хорошо работает но вот проблема в том что этот счётчик срабатывает при разряде пьезо зажигалки в воздухе, либо когда снимаешь свитр на выходе появляется лог.1, и это при том что вход прерывания(2 нога Ардуины Уно притянута к земле через 10кОм). Нужно код что ли другой применить?
Мне помогло 5К к питанию и экранированный провод (экран на землю).
Только вот код у Вас странный. В строке 32 "case 2". А из строки 11 следует, что i никогда не может быть равной 2. Вас это не смущает?
То есть убрать строку 38 и 39? Мне нужно 1 раз нажал на выходе 1 второй раз нажал на выходе 0. 5кОм на +5В, а с какого пина? Экранированный провод это на кнопку на вход?
Убрал в коде 38 и 39 строку не помогло, попробую откинуть кнопку и рядом зажигалкой поклацать
Нет, не 0.5К, а 5К! Да, на тот же второй пин. Сама жила провода соединяет кнопку и пин, а экран припаян к Gnd.
У меня было 5К на плюс, а прерывание я соответсвенно по Falling ловил.
Да и ещё, не забывайте про дребезг. Так, как у Вас сейчас Вы при нажатии кнопки будете несколько нажатий ловить. Поставьте хотя бы конденсатор 100nf между пином 2 и Gnd. Это должно немного помочь. Хотя я делал это (борьбу с дребезгом) программно.
Убрал кнопку на втором пине ардуины( прерывание 0 мой вход), всёравно клацая зажигалку меняется состояние выхода.
Так тут же программно и так есть от дребезга в условиях If в конце кода. Ну у меня вместо 5кило 10кило стоит, ну поставлю вообще кила 2 и посмотрю, по току 2кила со второго пина на землю будет нормально если +5В подать на вход. Кондёр добавлю конечно. А какой у вас код можно посмотреть?
Т.е., пин притянут к питанию резистором в 5К, к нему ничего не подключено и всё равно срабатывает?
1. Поставьте конденсатор и попробуйте. Если не поможет, то
2. Подключите осциллограф и замерьте время "срабатывания" помехи. Наверняка оно маленькое - микросекунды.
3. Отрабатывайте помеху программно. Возьмите интервал раза в два больше того. что намеряли в п.2 и отсекайте помеху типа "если нажатие короче интервала, - то не считается". так Вы избавитесь от помех.
Притунял вход на землю вообще через 400Ом, а тоже самое
Да у меня-то код простой. Я же говорю, что мне помогли 5К и экраинрованный провод и никаких проблем у меня нет.
В setup я его (PIN_WAND) ставлю в режим INPUT и назначаю прерывание. В обработчике изменяю состояние системы (всё заточено на состояния - это конечный автомат).
Кстати, а Вы-то в режим INPUT не поставили. Врядли поможет (они по умолчанию в INPUT), но поставьте, чем чёрт не шутит.
Притунял вход на землю вообще через 400Ом, а тоже самое
Тогда программно, п.п. 2 и 3
Притянут вход к земле потому как я же в условии сравниваю если 1 то включаю выход. А помеху я же сам создаю зажигалкой с пьезой, так как до этого срабатывало на снятие свитера. Сейчас кнопка припаяна, но не в экране, но провод 20см.
Roman2344, прерывание INT0 может сработать от наводки на любой вход, от наводки на шину питания и землю. Я не вижу что и как у вас включено, так что можно давать только теоритические советы. Попробуйте все свободные ноги перевести в режим OUTPUT.
Есть такое понятие- дребезг контактов, избежать можно как программно, так и аппаратно. Вы и заметить не успеете сколько раз сработает прерывание. В функции обработки прерывания должен быть минимум.
а, какой вообще сакральный смысл в прерывании на тактовой механической кнопке с дребезгом?
А такой что нужна маленькая тактовая кнопка, на которую раз нажал включил, второй раз нажал выключил.
А такой что нужна маленькая тактовая кнопка, на которую раз нажал включил, второй раз нажал выключил.
раз нажал и словил 14 тиков дребезга по прерыванию - в результате: выключил. :D
*продолжай пользовать прерывание там, где оно не нужно абсолютно.
Перевёл все ноги в режим выхода ничего не дало
Дребезг как раз таки не влияет,ак всё нормально срабатывает, а вот прерывание срабатывает при разрядах в воздухе, либо как свитер снял что тоже разряд.
Дребезг как раз таки не влияет,ак всё нормально срабатывает, а вот прерывание срабатывает при разрядах в воздухе, либо как свитер снял что тоже разряд.
ну, ок.
так, зачем прерывание на тактовой механической кнопке?
Roman2344, попробуйте поменять БП на другой.
так, зачем прерывание на тактовой механической кнопке?
А как тогда?
так, зачем прерывание на тактовой механической кнопке?
А как тогда?
#61
так, зачем прерывание на тактовой механической кнопке?
А как тогда?
Что значит "зачем", может быть миллион причин. У меня, например, ардуина в нормальной ситуации уходила в режим SLEEP_MODE_PWR_DOWN и тихонько спала, а по прерыванию (по нажатии кнопки) просыпалась. Чем не причина повесить кнопку на прерывание?
Вы измерили длительность помехи, как я Вам советовал. У меня помехи были микросекундные - можно просто такие микросекундные "нажатия" игнорировать.
Что значит "зачем", может быть миллион причин. У меня, например, ардуина в нормальной ситуации уходила в режим SLEEP_MODE_PWR_DOWN и тихонько спала, а по прерыванию (по нажатии кнопки) просыпалась. Чем не причина повесить кнопку на прерывание?
я не спрашивал, зачем ты используешь прерывание для выхода из спящего режима.
если бы ты, будил-усыплял контроллер одной кнопкой по прерыванию, то спросил бы.
это вам не это pinMode(b00, INPUT);
возможно это pinMode(pin, !b00); если хочется
Спасибо
При таком коде всё нормально работает ничего не перезагружается
При таком коде всё нормально работает ничего не перезагружается
всё можно исправить, прицепив на пин кнопки прерывание. :D
Хотя тоже самое, жаль нет сейчас экранированого провода, завтра куплю, а осциллограф розряжен.
И эта проблема между прочем только когда ардуина запитана от БП, как от ЮСБ всё нормально, нужно будет глянуть уровень пульсаций БП, хотя вроде солидный комповский БП.
Проверил БП как нажимаю кнопку на ардуине так напряжение то поднимается до 12,34В, то опускается до 11,8В. Вот она основная проблема, не зря dimax о БП говорил. Спасибо ему