Подскажите где я заблудился?
- Войдите на сайт для отправки комментариев
Доброго времени всем. Начал изучать прерывания и написал простенькую програмку, в которой светодиод должен включаться от прерывании на 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 пина
}
Во-первых, код нужно вставлять по правилам. Во-вторых, что вы хотите от странного условия?
оно никогда не выполнится. И кроме того
очень странная интерпретация )))))
ТС тебя кто то жёстко опрокинул с комментариями и условиями
На самом деле там if(pintwo==HIGH) Я просто от отчаянья уже поставил номер пина.
А комментарий( ..Заносим значение пина 7 в булевую переменную) я просто забыл удалить т.к. по началу писал немного по другому. Я писал bool val=Serial.println(digitalRead(pintwo)); Но потом что бы не вносить путанницу и незная причины почему код не срабатывает, все лишнее поудалял. Но вопрос то у меня остался. Почему не зажигается на 13 пине светодиод. Ведь по логике Если условие pintwo==HIGH верно. На 13 пине должен появиться высокий уровень.
Такое условие ни по какой логике не может быть верно.
Но я не понимаю что именно неверно. Хотя бы намекните где я туплю. Arduino IDE код пропускает. На терминале появляется 1. Получается что я задаю условие неверно. Но вот код который дается на http://arduino.ru.
На самом деле там if(pintwo==HIGH) Я просто от отчаянья уже поставил номер пина.
Что в лоб, что по лбу. Переменная pintwo равна семи. Поэтому выражение pintwo==HIGH эквивалентно выражению 7==HIGH
Ведь по логике Если условие pintwo==HIGH верно. На 13 пине должен появиться высокий уровень.
По логике вещей условие pintwo==HIGH никогда не будет верным, потому что pintwo==7, a HIGH==1. Иными словами условие 7==1 не будет верным НИКОГДА. Хоть до морковкина заговения пытайтесь ))
Вам нужно не номер пина проверять, а значение на этом пине. А значение нужно СЧИТЫВАТЬ
Выкиньте его и больше никогда не пользуйтесь: вместо слова "условие" на самом деле должно быть "логическое выражение". Условие - лишь частный случай логического выражения. Притом, очень частный.
Я понимаю что pintwo==HIGH эквивалентно выражению 7==HIGH. Но в терминале мне высвечивается 1 или 0 в зависмости от состояния на пине. Поэтому я и ходил по кругу. Я писал что присваивал эначение пина булевой переменной. Но это не помогло. Ведь любое высокое значение пина должно определяться в булевой переменной как высокое. Т.е.
bool val;
Serial.println(digitalRead(pintwo));
val=pintwo;
delay(1000);
if(val==true)
{
digitalWrite(ledPin, HIGH);
Я правильно рассуждаю?
Неправильно как рассуждаете, так и вставляете код.
Выкиньте его и больше никогда не пользуйтесь: вместо слова "условие" на самом деле должно быть "логическое выражение". Условие - лишь частный случай логического выражения. Притом, очень частный.
http://arduino.ru/comment/reply/36786/583859?quote=1#comment-form
Я еще сильно слаб в написании кода. Поэтому подхожу примитивно. Спасибо за подсказку.
Я правильно рассуждаю?
ты рассуждаешь как тупица
Сколько раз надо повторить, что НОМЕР ПИНА (у тебя это -7) и значение сигнала на пине (LOW or HIGH) - ЭТО РАЗНЫЕ ВЕЩИ?!!!
В строчке
ты приравниваешь свою переменную val НОМЕРУ ПИНА, а не значению на нем!!! А чтобы получить значение, надо написать
дошло??
Я правильно рассуждаю?
ты рассуждаешь как тупица
Сколько раз надо повторить, что НОМЕР ПИНА (у тебя это -7) и значение сигнала на пине (LOW or HIGH) - ЭТО РАЗНЫЕ ВЕЩИ?!!!
В строчке
ты приравниваешь свою переменную val НОМЕРУ ПИНА, а не значению на нем!!! А чтобы получить значение, надо написать
дошло??
Да, дошло. Строкой val=digitalRead(pintwo) я считываются значение с пина и присваивает логическое значение булевой переменной. Так просто.:)
мне почему-то с пахмелья кажеца, рано тебе еще в прерывания лезть
Возможно и так.
мне почему-то с пахмелья кажеца, рано тебе еще в прерывания лезть
да ладно, день-два можно и за прерывания взяться, это же не парсинг строк )))
Книжка меня ведет.Вот и взялся за прерывания. Поначалу показалось что с предыдущими темами разобрался. Ан нет. Так что глупые вопросы еще будут.
Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))
Я понимаю что pintwo==HIGH эквивалентно выражению 7==HIGH. Но в терминале мне высвечивается 1 или 0 в зависмости от состояния на пине.
Потому что в терминал вы реально выводили ЗНАЧЕНИЕ пина, а не его номер - Serial.println(digitalRead(pintwo));
Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))
Нет. С этим я как ни странно разобрался. Я подставил digitalWrite(pintwo, LOW); и после разового моргания все возвращается на исходную позицию.
Но вопрос на самом деле есть.Ведь в посте #4 я писал что я делал в самом начале. Я ведь писал такой код
bool val=Serial.println(digitalRead(pintwo)); И он у меня не заработал. Но как только я убрал Serial.println и оставил только bool val=(digitalRead(pintwo)); все заработало.
Подождите, следующим вопросом будет: "все сделал, заработало, но почему теперь светодиод мигает без остановки?" )))
Нет. С этим я как ни странно разобрался. Я подставил digitalWrite(pintwo, LOW); и после разового моргания все возвращается на исходную позицию.
Зачет ))
Но вопрос на самом деле есть.Ведь в посте #4 я писал что я делал в самом начале. Я ведь писал такой код
bool val=Serial.println(digitalRead(pintwo)); И он у меня не заработал. Но как только я убрал Serial.println и оставил только bool val=(digitalRead(pintwo)); все заработало.
А в чем вопрос-то? Так и не должно было работать, метод Serial.println() ничего не возвращает (а если бы и возвращал, то точно не значение на пине). Стало быть и присваивать его чему-то глупо-бессмысленно ))
Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));
это сокращенное
bool val =digitalRead(pintwo) ;
Serial.println(pintwo);
И оказывается сильно заблуждался.
Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));
это сокращенное
bool val =digitalRead(pintwo) ;
Serial.println(pintwo);
И оказывается сильно заблуждался.
Нет, то, что Вы хотите, записывается так:
Я просто считал что запись bool val=Serial.println(digitalRead(pintwo));
это сокращенное
bool val =digitalRead(pintwo) ;
Serial.println(pintwo);
И оказывается сильно заблуждался.
Вам стоит вернуться к началу книги, где описаны основы C++. Если такого раздела там нет, то почитать какую-нибудь другую книгу. Тогда заблуждений будет сильно меньше
ЗЫ: вместо
очевидно же - нужно писать
если вы хотите выводить в монитор значение пина, а не его номер
Нет, то, что Вы хотите, записывается так:
Он в простом утюгом плавает, а вы его хардкором )))
И оказывается сильно заблуждался.
И не только в этом...
Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.
Нет, то, что Вы хотите, записывается так:
Он в простом утюгом плавает, а вы его хардкором )))
Ну, насколько я понял, его как раз интересовала именно эта конструкция, только он ее составить не сумел.
...любой учебник языка (не обязательно по Ардуино)...
Как показывает практика, как раз намного лучше читать "не по Ардуино", а к "Ардуино" вернуться только тогда, когда будешь владеть языком в достаточной степени, чтобы видеть ошибки, которыми изобилуют учебники "по Ардуино".
Ну, насколько я понял, его как раз интересовала именно эта конструкция, только он ее составить не сумел.
Не стоит поощрять тягу к извращениям у новичков. Пусть сначала построчно научится. Если сумеет, к извращениям потом сам придет. Уже с пониманием ))
Причем здесь извращения - это свойство языка Си, которое все равно должен знать любой новичок. Это основы языка, а не какие-то экзотические тонкости. Или Вы искренне полагаете, что от того, что новички будут писать на Си в стиле Ассемблера - строго по одной операции на строку, их код станет более понятным?
Или Вы искренне полагаете, что от того, что новички будут писать на Си в стиле Ассемблера - строго по одной операции на строку, их код станет более понятным?
Для них - да. Ходить нужно учиться по шагам, бегать - уже потом ))
Вряд ли.
Умение записать сложную формулу, не путаясь в приоритете операций, - базовый навык, один из тех, с которых следует начинать.
Вряд ли.
Умение записать сложную формулу, не путаясь в приоритете операций, - базовый навык, один из тех, с которых следует начинать.
Имхо, конечно, но начинать нужно с самих операций. Прежде, чем изучать, что умножение имеет приоритет перед сложением, нужно разобраться, что же такое, собственно, умножение и сложение ))
не спорьте, ТС все равно не понимает, о чем вы
И оказывается сильно заблуждался.
И не только в этом...
Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.
Да я думаю что так и сделаю. Я жертва быстрого старта в Arduino. :)
Я жертва быстрого старта в Arduino. :)
Ни в одной науке не бывает "быстрого старта". В любом случае это процесс от простого к сложному. Прыгать через ступеньки - терять понимание. Есть вариант при переходе от одного языка к другому, но тогда предыдущий язык Вы должны знать очень хорошо.
И оказывается сильно заблуждался.
И не только в этом...
Если вы думаете, что знаете хотя бы основы С/С++ - это тоже заблуждение. Начните читать любой учебник языка (не обязательно по Ардуино) с самого начала.
Да я думаю что так и сделаю. Я жертва быстрого старта в Arduino. :)
В комплекте ардуино IDE в меню "файлы" есть вкладка "Примеры - встроенные примеры"
Загружаешь, читаешь листинг. заглядываешь в http://arduino.ru/Reference и в умные книги. Можно попробовать аккуратно немного модифицировать чужую программу. Когда каждая строка тебе понятна - переходишь к следующей задачке.
Спасибо, попробую по изучать. Но если честно когда смотришь в незнакомый код и половину букв не понимаешь, трудно разобрать пример. Это надо лезть в дебри и изучать поверхностно то что еще не проходил Вот на форуме с помощью подзатыльников узнаешь намного больше чем просто "сухое" изучение.
Имхо, конечно, но начинать нужно с самих операций. Прежде, чем изучать, что умножение имеет приоритет перед сложением, нужно разобраться, что же такое, собственно, умножение и сложение ))
Нет, Ваша позиция понятна: чтобы сократить и облегчить начальный период обучения, следует сократить количество используемых операций до минимально возможного. При этом, естественно, выпадут все специфические для конкретного языка операции. Но такая стратегия хороша, если обучение ведется в рамках единого учебника, в котором, помимо того, содержатся и все необходимые примеры, составленные с учетом выбранной стратегии. Если же начинающему приходится разбирать чужие примеры, полученные из самых разных источников, такая стратегия не будет работать, т.к. новичок сразу столкнется с незнакомыми ему операциями и выпадет в осадок. Что мы, собственно, практически ежедневно на форуме и наблюдаем.
В комплекте ардуино IDE в меню "файлы" есть вкладка "Примеры - встроенные примеры"
Загружаешь, читаешь листинг. заглядываешь в http://arduino.ru/Reference и в умные книги. Можно попробовать аккуратно немного модифицировать чужую программу. Когда каждая строка тебе понятна - переходишь к следующей задачке.
Это все имеет смысл только после того, как хотя бы один раз прочтешь Кернигана и Ритчи от корки до корки.
Это все имеет смысл только после того, как хотя бы один раз прочтешь Кернигана и Ритчи от корки до корки.
Я вот начал с трупа страуса, теперь понимаю, что ничего не понимаю.
Голова только пухнет.
Написано для тех у кого уже уровень "продвинутый+"
Да, Страуструп тяжело пишет. В качестве альтернативы принято рекомендовать Шилдта. Но, чтобы понимать основы синтаксиса, достаточно Кернигана и Ритчи, что невелико по объему и хорошо написано.
Тяжело пишет, это еще мягко сказано. 1300+ страниц на то, на что Виктору Петину хватило стадесяти - это графоманство )))))
Ну бонус Страуструпа в том, что прочитав в таком количестве разработчика языка, можно понять логику работы этого языка. :-)
Тяжело пишет, это еще мягко сказано. 1300+ страниц на то, на что Виктору Петину хватило стадесяти - это графоманство )))))
Выбрасывать страницы из книги проще, чем добавлять их туда.
А потом ведь - повествование от вовлечённости человека в вопрос зависит. Страуструп явно считал, что он должен донести свою мысль, в отличии от малоизвестного Петина. Помнится, я как-то в Ленинграде у бабушки на улице спросил, как пройти на Гороховую... Была бы бумага и желание - рассказ за ней бы записал.
Это была ирония. Хотя врать не буду, Страус уже 2 года без движения лежит слегка перелистанный. Никак духу не хватит начать вдумчиво читать
Кстати, Виктор Петин - широко известный в узких кругах пейсатель про ардуину. У него книжек на озоне больше чем у Эрла Стенли Гарднера ))
C++ шаг за шагом.