Подскажите где я заблудился?

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Доброго времени всем. Начал изучать прерывания и написал простенькую програмку, в которой светодиод должен включаться от прерывании на 2 пину. В протеусе видно что от прерывания 7й пин активируется. Но светодиод (на 13 пине) которому дана команда не зажигается.

int ledPin=13;
int pintwo=7;

 void setup()
{
  Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(pintwo, OUTPUT);
attachInterrupt(0, stuff, FALLING);
}

void loop()
{
  Serial.println(digitalRead(pintwo));//Заносим значение пина7 в булевую переменную

   delay(1000);

 if(7==HIGH)
{
digitalWrite(ledPin, HIGH);
delay(150);
digitalWrite(ledPin, LOW);
delay(150);
}else{
  digitalWrite(ledPin, LOW);
}
 }
void stuff()
{
digitalWrite(pintwo, HIGH);//Из функции прерывания даем команду включения 7 пина
}

 

 

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Во-первых, код нужно вставлять по правилам. Во-вторых, что вы хотите от странного условия?

if(7==HIGH)

оно никогда не выполнится. И кроме того

//Заносим значение пина7 в булевую переменную

очень странная интерпретация )))))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС тебя кто то жёстко опрокинул с комментариями и условиями

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

На самом деле там if(pintwo==HIGH) Я просто от отчаянья уже поставил номер пина.

А комментарий( ..Заносим значение пина 7 в булевую переменную) я просто забыл удалить т.к. по началу писал немного по другому. Я писал  bool val=Serial.println(digitalRead(pintwo)); Но потом что бы не вносить путанницу и незная причины почему код не срабатывает, все лишнее поудалял. Но вопрос то у меня остался. Почему не зажигается на 13 пине светодиод. Ведь по логике Если условие pintwo==HIGH верно. На 13 пине должен появиться высокий уровень.

 

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

Такое условие ни по какой логике не может быть верно.

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Но я не понимаю что именно неверно. Хотя бы намекните где я туплю. Arduino IDE код пропускает. На терминале появляется 1. Получается что я задаю условие неверно. Но вот код который дается на  http://arduino.ru.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Yri7 пишет:

На самом деле там if(pintwo==HIGH) Я просто от отчаянья уже поставил номер пина.

Что в лоб, что по лбу. Переменная pintwo равна семи. Поэтому выражение pintwo==HIGH эквивалентно выражению 7==HIGH

Yri7 пишет:

Ведь по логике Если условие pintwo==HIGH верно. На 13 пине должен появиться высокий уровень.

По логике вещей условие pintwo==HIGH никогда не будет верным, потому что pintwo==7, a HIGH==1. Иными словами условие 7==1 не будет верным НИКОГДА. Хоть до морковкина заговения пытайтесь ))

Вам нужно не номер пина проверять, а значение на этом пине. А значение нужно СЧИТЫВАТЬ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yri7 пишет:

Это из какого-то справочника или учебника?

Выкиньте его и больше никогда не пользуйтесь: вместо слова "условие" на самом деле должно быть "логическое выражение". Условие - лишь частный случай логического выражения. Притом, очень частный.

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Я понимаю что pintwo==HIGH эквивалентно выражению 7==HIGH. Но в терминале мне высвечивается 1 или 0 в зависмости от состояния на пине. Поэтому я и ходил по кругу. Я писал что присваивал эначение пина булевой переменной. Но это не помогло. Ведь любое высокое значение пина должно определяться в булевой переменной как высокое.  Т.е.

bool val;

Serial.println(digitalRead(pintwo));
 val=pintwo;

   delay(1000);

 if(val==true)
{
digitalWrite(ledPin, HIGH);

Я правильно рассуждаю?

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

Неправильно как рассуждаете, так и вставляете код.

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

andriano пишет:

Yri7 пишет:

Это из какого-то справочника или учебника?

Выкиньте его и больше никогда не пользуйтесь: вместо слова "условие" на самом деле должно быть "логическое выражение". Условие - лишь частный случай логического выражения. Притом, очень частный.

http://arduino.ru/comment/reply/36786/583859?quote=1#comment-form

Я еще сильно слаб в написании кода. Поэтому подхожу примитивно. Спасибо за подсказку.

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

Yri7 пишет:

bool val;

Serial.println(digitalRead(pintwo));
 val=pintwo;
 delay(1000);

 if(val==true)
{
digitalWrite(ledPin, HIGH);
}

Я правильно рассуждаю?

ты рассуждаешь как тупица

Сколько раз надо повторить, что НОМЕР ПИНА (у тебя это -7) и значение сигнала на пине (LOW or HIGH) - ЭТО РАЗНЫЕ ВЕЩИ?!!!

В строчке

val=pintwo;

ты приравниваешь свою переменную val НОМЕРУ ПИНА, а не значению на нем!!! А чтобы получить значение, надо написать

val= digitalRead(pintwo);

дошло??

 

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

b707 пишет:

Yri7 пишет:

bool val;

Serial.println(digitalRead(pintwo));
 val=pintwo;
 delay(1000);

 if(val==true)
{
digitalWrite(ledPin, HIGH);
}

Я правильно рассуждаю?

ты рассуждаешь как тупица

Сколько раз надо повторить, что НОМЕР ПИНА (у тебя это -7) и значение сигнала на пине (LOW or HIGH) - ЭТО РАЗНЫЕ ВЕЩИ?!!!

В строчке

val=pintwo;

ты приравниваешь свою переменную val НОМЕРУ ПИНА, а не значению на нем!!! А чтобы получить значение, надо написать

val= digitalRead(pintwo);

дошло??

 


Да, дошло. Строкой val=digitalRead(pintwo) я считываются значение с пина и присваивает логическое значение булевой переменной. Так просто.:)

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

мне почему-то с пахмелья кажеца, рано тебе еще в прерывания лезть

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Возможно и так.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

мне почему-то с пахмелья кажеца, рано тебе еще в прерывания лезть

да ладно, день-два можно и за прерывания взяться, это же не парсинг строк )))

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Книжка меня ведет.Вот и взялся за прерывания. Поначалу показалось что с предыдущими темами разобрался. Ан нет. Так что глупые вопросы еще будут.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Yri7 пишет:

Я понимаю что pintwo==HIGH эквивалентно выражению 7==HIGH. Но в терминале мне высвечивается 1 или 0 в зависмости от состояния на пине. 

Потому что в терминал вы реально выводили ЗНАЧЕНИЕ пина, а не его номер - Serial.println(digitalRead(pintwo));

 

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

v258 пишет:

Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))

Нет. С этим я как ни странно разобрался. Я подставил digitalWrite(pintwo, LOW); и после разового моргания все возвращается на исходную позицию.

Но вопрос на самом деле есть.Ведь в посте #4 я писал что я делал в самом начале. Я ведь писал такой код

 bool val=Serial.println(digitalRead(pintwo)); И он у меня не заработал. Но как только я убрал Serial.println и оставил только bool val=(digitalRead(pintwo)); все заработало.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Yri7 пишет:

v258 пишет:

Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))

Нет. С этим я как ни странно разобрался. Я подставил digitalWrite(pintwo, LOW); и после разового моргания все возвращается на исходную позицию.

Зачет ))

Yri7 пишет:

Но вопрос на самом деле есть.Ведь в посте #4 я писал что я делал в самом начале. Я ведь писал такой код

 bool val=Serial.println(digitalRead(pintwo)); И он у меня не заработал. Но как только я убрал Serial.println и оставил только bool val=(digitalRead(pintwo)); все заработало.

А в чем вопрос-то? Так и не должно было работать, метод Serial.println() ничего не возвращает (а если бы и возвращал, то точно не значение на пине). Стало быть и присваивать его чему-то глупо-бессмысленно ))

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));

это сокращенное

bool val =digitalRead(pintwo) ;

Serial.println(pintwo);

И оказывается сильно заблуждался.

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Yri7 пишет:

Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));

это сокращенное

bool val =digitalRead(pintwo) ;

Serial.println(pintwo);

И оказывается сильно заблуждался.

Нет, то, что Вы хотите, записывается так:

 bool val;
 Serial.println(val = digitalRead(pintwo));

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Yri7 пишет:

Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));

это сокращенное

bool val =digitalRead(pintwo) ;

Serial.println(pintwo);

И оказывается сильно заблуждался.

Вам стоит вернуться к началу книги, где описаны основы C++. Если такого раздела там нет, то почитать какую-нибудь другую книгу. Тогда заблуждений будет сильно меньше

ЗЫ: вместо 

bool val =digitalRead(pintwo) ;

Serial.println(pintwo);

очевидно же - нужно писать

bool val =digitalRead(pintwo) ;

Serial.println(val);

если вы хотите выводить в монитор значение пина, а не его номер

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

andriano пишет:

Нет, то, что Вы хотите, записывается так:

 bool val;
 Serial.println(val = digitalRead(pintwo));

Он в простом утюгом плавает, а вы его хардкором )))

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

Yri7 пишет:

И оказывается сильно заблуждался.

И не только в этом...

Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

v258 пишет:

andriano пишет:

Нет, то, что Вы хотите, записывается так:

 bool val;
 Serial.println(val = digitalRead(pintwo));

Он в простом утюгом плавает, а вы его хардкором )))

Ну, насколько я понял, его как раз интересовала именно эта конструкция, только он ее составить не сумел.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

...любой учебник языка (не обязательно по Ардуино)...

Как показывает практика, как раз намного лучше читать "не по Ардуино", а к "Ардуино" вернуться только тогда, когда будешь владеть языком в достаточной степени, чтобы видеть ошибки, которыми изобилуют учебники "по Ардуино".

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

andriano пишет:

Ну, насколько я понял, его как раз интересовала именно эта конструкция, только он ее составить не сумел.

Не стоит поощрять тягу к извращениям у новичков. Пусть сначала построчно научится. Если сумеет, к извращениям потом сам придет. Уже с пониманием ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Причем здесь извращения - это свойство языка Си, которое все равно должен знать любой новичок. Это основы языка, а не какие-то экзотические тонкости. Или Вы искренне полагаете, что от того, что новички будут писать на Си в стиле Ассемблера - строго по одной операции на строку, их код станет более понятным?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

andriano пишет:

Или Вы искренне полагаете, что от того, что новички будут писать на Си в стиле Ассемблера - строго по одной операции на строку, их код станет более понятным?

Для них - да. Ходить нужно учиться по шагам, бегать - уже потом ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вряд ли.

Умение записать сложную формулу, не путаясь в приоритете операций, - базовый навык, один из тех, с которых следует начинать.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

andriano пишет:

Вряд ли.

Умение записать сложную формулу, не путаясь в приоритете операций, - базовый навык, один из тех, с которых следует начинать.

Имхо, конечно, но начинать нужно с самих операций. Прежде, чем изучать, что умножение имеет приоритет перед сложением, нужно разобраться, что же такое, собственно, умножение и сложение ))

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

не спорьте, ТС все равно не понимает, о чем вы

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

b707 пишет:

Yri7 пишет:

И оказывается сильно заблуждался.

И не только в этом...

Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.

Да я думаю что так и сделаю. Я жертва быстрого старта в Arduino. :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Yri7 пишет:

Я жертва быстрого старта в Arduino. :)

Ни в одной науке не бывает "быстрого старта". В любом случае это процесс от простого к сложному. Прыгать через ступеньки - терять понимание. Есть вариант при переходе от одного языка к другому, но тогда предыдущий язык Вы должны знать очень хорошо.

SLKH
Offline
Зарегистрирован: 17.08.2015

Yri7 пишет:

b707 пишет:

Yri7 пишет:

И оказывается сильно заблуждался.

И не только в этом...

Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.

Да я думаю что так и сделаю. Я жертва быстрого старта в Arduino. :)

слишком быстрого.

В комплекте ардуино IDE в меню "файлы" есть вкладка "Примеры - встроенные примеры"

Загружаешь, читаешь листинг. заглядываешь в http://arduino.ru/Reference и в умные книги. Можно попробовать аккуратно немного модифицировать чужую программу. Когда каждая строка тебе понятна - переходишь к следующей задачке.

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

Спасибо, попробую по изучать. Но если честно когда смотришь в незнакомый код и половину букв не понимаешь, трудно разобрать пример. Это надо лезть в дебри и изучать поверхностно то что еще не проходил Вот на форуме с помощью подзатыльников узнаешь намного больше чем просто  "сухое" изучение.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

v258 пишет:

Имхо, конечно, но начинать нужно с самих операций. Прежде, чем изучать, что умножение имеет приоритет перед сложением, нужно разобраться, что же такое, собственно, умножение и сложение ))

Нет, Ваша позиция понятна: чтобы сократить и облегчить начальный период обучения, следует сократить количество используемых операций до минимально возможного. При этом, естественно, выпадут все специфические для конкретного языка операции. Но такая стратегия хороша, если обучение ведется в рамках единого учебника, в котором, помимо того, содержатся и все необходимые примеры, составленные с учетом выбранной стратегии. Если же начинающему приходится разбирать чужие примеры, полученные из самых разных источников, такая стратегия не будет работать, т.к. новичок сразу столкнется с незнакомыми ему операциями и выпадет в осадок. Что мы, собственно, практически ежедневно на форуме и наблюдаем.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SLKH пишет:

В комплекте ардуино IDE в меню "файлы" есть вкладка "Примеры - встроенные примеры"

Загружаешь, читаешь листинг. заглядываешь в http://arduino.ru/Reference и в умные книги. Можно попробовать аккуратно немного модифицировать чужую программу. Когда каждая строка тебе понятна - переходишь к следующей задачке.

Это все имеет смысл только после того, как хотя бы один раз прочтешь Кернигана и Ритчи от корки до корки.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

andriano пишет:

Это все имеет смысл только после того, как хотя бы один раз прочтешь Кернигана и Ритчи от корки до корки.


Я вот начал с трупа страуса, теперь понимаю, что ничего не понимаю.
Голова только пухнет.
Написано для тех у кого уже уровень "продвинутый+"

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, Страуструп тяжело пишет. В качестве альтернативы принято рекомендовать Шилдта. Но, чтобы понимать основы синтаксиса, достаточно Кернигана и Ритчи, что невелико по объему и хорошо написано.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Тяжело пишет, это еще мягко сказано. 1300+ страниц на то, на что Виктору Петину хватило стадесяти - это графоманство )))))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну бонус Страуструпа в том, что прочитав в таком количестве разработчика языка, можно понять логику работы этого языка. :-)

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

Rumata пишет:

Тяжело пишет, это еще мягко сказано. 1300+ страниц на то, на что Виктору Петину хватило стадесяти - это графоманство )))))

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

А потом ведь - повествование от вовлечённости человека в вопрос зависит. Страуструп явно считал, что он должен донести свою мысль, в отличии от малоизвестного Петина. Помнится, я как-то в Ленинграде у бабушки на улице спросил, как пройти на Гороховую... Была бы бумага и желание - рассказ за ней бы записал.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

sadman41 пишет:
Выбрасывать страницы из книги проще, чем добавлять их туда. А потом ведь - повествование от вовлечённости человека в вопрос зависит. Страуструп явно считал, что он должен донести свою мысль, в отличии от малоизвестного Петина. Помнится, я как-то в Ленинграде у бабушки на улице спросил, как пройти на Гороховую... Была бы бумага и желание - рассказ за ней бы записал.

Это была ирония. Хотя врать не буду, Страус уже 2 года без движения лежит слегка перелистанный. Никак духу не хватит начать вдумчиво читать

Кстати, Виктор Петин - широко известный в узких кругах пейсатель про ардуину. У него книжек на озоне больше чем у Эрла Стенли Гарднера ))

Yri7
Yri7 аватар
Offline
Зарегистрирован: 16.09.2020

C++ шаг за шагом.