Официальный сайт компании Arduino по адресу arduino.cc
Ошибка в коде с прерыванием
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 14/03/2019 - 19:13
Здравствуйте, прошу найти ошибку в коде с прерыванием. Нет никакой реакции на нажатие кнопки. Все моделирую в TINЛERСAD.
И еще два вопросы:
1) в какой части кода положено задавать начальное состояние выходов/входов?
2) какой должна быть разность между начальным состоянием входа и его конечным, чттобы сработало прерывание?
//int loop_in = 13; //Петля на въезд //volatile int state = LOW; void setup() { pinMode(13, OUTPUT); digitalWrite(13, HIGH); pinMode(8, OUTPUT); digitalWrite(8, LOW); pinMode(3, INPUT); attachInterrupt(1, blink, RISING); //прерывание 1 (3 порт) } void loop() { //digitalWrite(pin, state); } void blink() { digitalWrite(8, HIGH); }
blink() у тебя как зажог светлодиодик, так он и горит пастаянно, нигде в LOW не переключаясь
проблема в том, что он вообще не зажигается.
заметил, что если в TINЛERСAD замерять напряжение на светодиоде, то все работает идеально. как так...
Дак может светодиод перевернуть?
Ваша кнопка соединяет 3 пин с 13-м. О когда отжата, то висит в воздухе. И чего Вы от всего этого ждёте?
Значит, так, вот в эту тему, глубоко забуриться, и не вылазить и не плодить тем до полного просветвления.
Хоть бы уж в Песочнице!
а у меня всё работает )))
Проблема в подтягивающих резисторах. 20 кОм поставил и все заработало. Но почему не работает тогда вот такой код (ведь pinMode(3, INPUT); digitalWrite(3, LOW); это то же самое, только программное включение резисторов).
"программное включение резисторов" - INPUT_PULLUP
Проблема в подтягивающих резисторах. 20 кОм поставил и все заработало.
Так вроде ещё почти неделю назад Вам писал
когда отжата, то висит в воздухе.
Вы не поняли фразы "висит в воздухе"?
почему не работает тогда вот такой код (ведь pinMode(3, INPUT); digitalWrite(3, LOW); это то же самое, только программное включение резисторов).
Да, неужели? А если почитать - http://arduino.ru/Tutorial/DigitalPins ?
Я по вашей ссылке и понял, что нужны конечники. Там и написано, что можно включать программно их.
Там и написано, что можно включать программно их.
И как же там написано? Неужели так, как у Вас? Вы HIGH от LOW отличаете?
Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.
Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.
программной подтяжки к земле на ардуино нет, только к +5в
Но HIGH - это подтягивание к +5В, а мне надо к земле.
Ну и где там написано, что LOW подтянет к земле?
Вы это сами выдумали, нет там такого.
В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?
В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?
Микроконтроллеру - нет.
А что будет, если они прерывания придут парралельно?
Не придут. При входе в обработчик прерывания вызов остальных запрещается.
Но!
1) Изменяемые в обработчике переменные должны быть volatile;
2) Доступ к таковым переменным должен быть атомарным;
3) Обработчик прерывания не должен содержать вызовов процедур, которые выполняются долго или внутреннего устройства которых Вы не понимаете.
Два из трёх принципов Вы нарушили
volatile, атомарным... Головоломка, однака.)