Ошибка в коде с прерыванием

boobo
Offline
Зарегистрирован: 13.03.2019

Здравствуйте, прошу найти ошибку в коде с прерыванием. Нет никакой реакции на нажатие кнопки. Все моделирую в 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);
}

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

blink() у тебя как зажог светлодиодик, так он и горит пастаянно, нигде в LOW не переключаясь

boobo
Offline
Зарегистрирован: 13.03.2019

проблема в том, что он вообще не зажигается. 

заметил, что если в TINЛERСAD  замерять напряжение на светодиоде, то все работает идеально. как так...

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак может светодиод перевернуть?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ваша кнопка соединяет 3 пин с 13-м. О когда отжата, то висит в воздухе. И чего Вы от всего этого ждёте?

Значит, так, вот в эту тему, глубоко забуриться, и не вылазить и не плодить тем до полного просветвления.

Хоть бы уж в Песочнице!

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

а у меня всё работает )))

boobo
Offline
Зарегистрирован: 13.03.2019

Проблема в подтягивающих резисторах. 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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

"программное включение резисторов" - INPUT_PULLUP

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

boobo пишет:

Проблема в подтягивающих резисторах. 20 кОм поставил и все заработало. 

Так вроде ещё почти неделю назад Вам писал

ЕвгенийП пишет:

когда отжата, то висит в воздухе. 

Вы не поняли фразы "висит в воздухе"?

boobo пишет:

почему не работает тогда вот такой код (ведь pinMode(3, INPUT); digitalWrite(3, LOW); это то же самое, только программное включение резисторов).

Да, неужели? А если почитать - http://arduino.ru/Tutorial/DigitalPins ?

boobo
Offline
Зарегистрирован: 13.03.2019

Я по вашей ссылке и понял, что нужны конечники. Там и написано, что можно включать программно их.

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

boobo пишет:

Там и написано, что можно включать программно их.

И как же там написано? Неужели так, как у Вас? Вы HIGH от LOW отличаете?

boobo
Offline
Зарегистрирован: 13.03.2019

Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.

b707
Offline
Зарегистрирован: 26.05.2017

boobo пишет:

Но HIGH - это подтягивание к +5В, а мне надо к земле. Ведь у меня начальным состоянием должен быть логической ноль.

программной подтяжки к земле на ардуино нет, только к +5в

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

boobo пишет:

Но HIGH - это подтягивание к +5В, а мне надо к земле. 

Ну и где там написано, что LOW подтянет к земле? 

Вы это сами выдумали, нет там такого.

boobo
Offline
Зарегистрирован: 13.03.2019

В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?

 

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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

boobo пишет:

В итоге получил рабочий код. Но у меня два прерывания обращаются к одному и тому же счетчику. Это критично?

Микроконтроллеру - нет.

boobo
Offline
Зарегистрирован: 13.03.2019

А что будет, если они прерывания придут парралельно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Не придут. При входе в обработчик прерывания вызов остальных запрещается.

Но!
1) Изменяемые в обработчике переменные должны быть volatile;
2) Доступ к таковым переменным должен быть атомарным;
3) Обработчик прерывания не должен содержать вызовов процедур, которые выполняются долго или внутреннего устройства которых Вы не понимаете.

Два из трёх принципов Вы нарушили

Green
Offline
Зарегистрирован: 01.10.2015

volatile, атомарным... Головоломка, однака.)