Ошибка в коде с прерыванием
- Войдите на сайт для отправки комментариев
Чт, 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); это то же самое, только программное включение резисторов).
//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); digitalWrite(3, LOW); attachInterrupt(1, blink, RISING); //прерывание 1 (3 порт) } void loop() { //digitalWrite(pin, state); } void blink() { digitalWrite(8, HIGH); }"программное включение резисторов" - INPUT_PULLUP
Проблема в подтягивающих резисторах. 20 кОм поставил и все заработало.
Так вроде ещё почти неделю назад Вам писал
когда отжата, то висит в воздухе.
Вы не поняли фразы "висит в воздухе"?
почему не работает тогда вот такой код (ведь pinMode(3, INPUT); digitalWrite(3, LOW); это то же самое, только программное включение резисторов).
Да, неужели? А если почитать - http://arduino.ru/Tutorial/DigitalPins ?
Я по вашей ссылке и понял, что нужны конечники. Там и написано, что можно включать программно их.
Там и написано, что можно включать программно их.
И как же там написано? Неужели так, как у Вас? Вы HIGH от LOW отличаете?
Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.
Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.
программной подтяжки к земле на ардуино нет, только к +5в
Но HIGH - это подтягивание к +5В, а мне надо к земле.
Ну и где там написано, что LOW подтянет к земле?
Вы это сами выдумали, нет там такого.
В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?
int i = 10; void blink1() { digitalWrite(8, HIGH); if (i < 10) { i = i + 1; if (i == 1) { digitalWrite(4, LOW); } Serial.println(i); } else { Serial.println(i); } } void blink2() { digitalWrite(9, HIGH); if (i > 0) { i = i - 1; if (i == 0) { digitalWrite(4, HIGH); } Serial.println(i); } else { Serial.println(i); } } void setup() { Serial.begin(9600); Serial.println(i); pinMode(13, OUTPUT); digitalWrite(13, HIGH); pinMode(12, OUTPUT); digitalWrite(12, HIGH); pinMode(4, OUTPUT); //реле digitalWrite(4, LOW); pinMode(8, OUTPUT); //для светодиода digitalWrite(8, LOW); pinMode(9, OUTPUT); //для светодиода digitalWrite(9, LOW); pinMode(3, INPUT); //начальное значение для прерывания //digitalWrite(3, LOW); pinMode(2, INPUT); //начальное значение для прерывания //digitalWrite(2, LOW); attachInterrupt(1, blink1, RISING); //прерывание 1 (3 порт) attachInterrupt(0, blink2, RISING); //прерывание 0 (2 порт) } void loop() { //digitalWrite(pin, state); }В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?
Микроконтроллеру - нет.
А что будет, если они прерывания придут парралельно?
Не придут. При входе в обработчик прерывания вызов остальных запрещается.
Но!
1) Изменяемые в обработчике переменные должны быть volatile;
2) Доступ к таковым переменным должен быть атомарным;
3) Обработчик прерывания не должен содержать вызовов процедур, которые выполняются долго или внутреннего устройства которых Вы не понимаете.
Два из трёх принципов Вы нарушили
volatile, атомарным... Головоломка, однака.)