Arduino. Непонятное выражение в скетче

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Arduino. Непонятное выражение в скетче

Сообщение Голимый »

Иногда в скетчах попадается вот такое:

Код: Выделить всё

digitalWrite(dataPin, data & 1 ? HIGH : LOW);
Что это значит, как этим пользоваться?
Трудное детство, стальные игрушки.
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Arduino. Непонятное выражение в скетче

Сообщение arkhnchul »

Реклама
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3364564#p3364564"]C ternary operator[/uquote]
Не вяжется. По смыслу функция должна последовательно выдвигать байт

Код: Выделить всё

void t_send(byte data)
{
  for (int i = 0; i < 8; i++) {
    digitalWrite(clockPin, LOW);
    digitalWrite(dataPin, data & 1 ? HIGH : LOW);
    data >>= 1;
    digitalWrite(clockPin, HIGH);
  }
Трудное детство, стальные игрушки.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Arduino. Непонятное выражение в скетче

Сообщение arkhnchul »

тогда вопрос у вас в чем? Что делает digitalWrite()?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Arduino. Непонятное выражение в скетче

Сообщение shindax »

[uquote="Голимый",url="/forum/viewtopic.php?p=3364567#p3364567"]...Не вяжется...[/uquote]

Все там вяжется, Вам arkhnchul правильную ссылку дал. Функция digitalWrite устанавливает на выводе МК (определяемым clockPin) бит данных, равный значению второго аргумента функции. В цикле, в выражении data & 1 ? HIGH : LOW выполняется проверка состояния 0-го бита переменной data и выводится HIGH, или LOW в зависимости находится в нём 1, или 0 соответственно. После выполняется data >>= 1; что есть сдвиг в нулевой бит переменной data значения очередного бита.
Реклама
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

shindax писал(а):Все там вяжется, Вам arkhnchul правильную ссылку дал
Понял, спасибо.
Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.
Трудное детство, стальные игрушки.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Arduino. Непонятное выражение в скетче

Сообщение Мурик »

Голимый писал(а):В описании языка ардуины как бы и нет такого вообще.
Разве есть язык ардуино? Еще скажите что разработчики ардуины написали свой компилятор? :)))
В ардуине язык C++ и компилятор GCC. :)

По теме. http://cppstudio.com/post/304/
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Arduino. Непонятное выражение в скетче

Сообщение shindax »

[uquote="Голимый",url="/forum/viewtopic.php?p=3364797#p3364797"]...Понял, спасибо.
Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.[/uquote]
Мучения никому не нужны. Повторюсь, arkhnchul дал Вам ссылку, где Вы найдёте ответы решительно на все вопросы, касаемо языка Си. Тогда Вы уже не будете сомневаться, чем отличаются операторы & и && к примеру. data & 1 означает побитовое И переменной data c числом 0b00000001. Чувствуете разницу? Понятие "алгебра Буля" Вам говорит о чем-то? Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

shindax писал(а):Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Я пишу на ассемблере для MCS-51, и знаю что такое логические операции. Мне непонятно вот что: как логическая операция может становится условием.
Допустим,
если "А" (больше, меньше, равно, не равно и т.д) "B", тогда - что нибудь.
Понятно, нет вопросов
но, чего-то никак не въеду в ситуацию, когда условие: если "А" лог.И "B"... здесь затык.
Трудное детство, стальные игрушки.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Arduino. Непонятное выражение в скетче

Сообщение shindax »

Операции в Си.
Побитовое И два слагаемых собираются по И. Например 0b000000001 & 0b00000011 на выходе будет 0b00000001, что есть побитовое И. Логическое И. Будет единица, при любом ненулевом значении. Т.Е. 0 && 1 будет 0, 0b00000001 && 0b00000010 будет 1. То же самое касается побитовом и логическом ИЛИ (| и ||), инверсии (~), отрицании (!). Для простоты картины запишите один операнд сверху, второй снизу, сложите их по И ( по ИЛИ ). В результате получите искомую величину. Либо логического характера, либо числового, если Вам это будет нужно. Для экономии памяти и логической определенности часто делается так:

Код: Выделить всё

#define STAGE ONE  0b00000001
#define STAGE TWO  0b00000010
#define STAGE THREE 0b00000100
...
unsigned char state;
...
if( state & STAGE_ONE )
{
... // действия на уровне ONE
state = 0b00000010;
...
}
if( state & STAGE_TWO )
{
... // действия на уровне TWO
state = 0b00000100;
}
if( state & STAGE_THREE )
{
... // действия на уровне THREE
state = 0;
}
много "конечных автоматов" на данном принципе устроено.
Последний раз редактировалось shindax Сб апр 28, 2018 14:32:37, всего редактировалось 6 раз.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Arduino. Непонятное выражение в скетче

Сообщение Мурик »

Голимый писал(а):если "А" лог.И "B"
если "А" лог.И "B" не равно нулю.
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

Мурик писал(а):если "А" лог.И "B" не равно нулю.
Так "А" после лог.И с единицей никогда не будет равна нулю.
Ладно, я понял. Не стоит доискиваться, надо просто запомнить.
Трудное детство, стальные игрушки.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Arduino. Непонятное выражение в скетче

Сообщение shindax »

[uquote="Голимый",url="/forum/viewtopic.php?p=3364908#p3364908"]...Ладно, я понял. Не стоит доискиваться, надо просто запомнить.[/uquote]
Так любой жизненный опыт так устроен. Есть туева хуча доказательств теоремы Пифагора. Но большинству людей достаточно получить правильный конечный результат. Цепь доказательств интересует немногих. :) В данном случае следует запомнить, что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

shindax писал(а): что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )
Кстати, вот тут ( https://www.arduino.cc/reference/en/lan ... reference/
про "&" в языке Arduino пишут что:
&
[Pointer Access Operators]
Description

Referencing is one of the features specifically for use with pointers. The ampersand operator & is used for this purpose. If x is a variable, then &x represents the address of the variable x.
Благодаря чему, "определенности" становится больше. :))
То ли дело строгий ассемблер.
Трудное детство, стальные игрушки.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Arduino. Непонятное выражение в скетче

Сообщение shindax »

[uquote="Голимый",url="/forum/viewtopic.php?p=3364931#p3364931"]...То ли дело строгий ассемблер.[/uquote]

Не бывает плохих ЯП, бывают плохие программисты. :) В холиуорах С_Vs_asm я давно уже не участвую, потому, как в теме. :)
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Arduino. Непонятное выражение в скетче

Сообщение arkhnchul »

[uquote="Голимый",url="/forum/viewtopic.php?p=3364908#p3364908"]Так "А" после лог.И с единицей никогда не будет равна нулю.[/uquote]A и не меняется, вычисляется результат операции.
Голимый писал(а):Благодаря чему, "определенности" становится больше. :))
ну да, в С/С++ местами есть зависимость от контекста.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Arduino. Непонятное выражение в скетче

Сообщение Мурик »

Голимый писал(а):Так "А" после лог.И с единицей никогда не будет равна нулю.
Почему?
К примеру этой строке
Голимый писал(а):digitalWrite(dataPin, data & 1 ? HIGH : LOW);
условие будет ложно (равно 0) если 0 в нулевом бите переменной data. Не путайте И и ИЛИ.
Найдите учебник по С/С++ для начинающий и хорошо изучите язык чтобы не возникало путаницы. Или думали что ардуино это легко и просто и можно обойтись без знаний программирования?

Если Си кажется сложным, для ардуино можно писать в BASCOM-AVR.
Голимый
Встал на лапы
Сообщения: 117
Зарегистрирован: Пн дек 08, 2014 19:45:24
Откуда: Воронеж

Re: Arduino. Непонятное выражение в скетче

Сообщение Голимый »

Мурик писал(а):Не путайте И и ИЛИ
Виноват, бес попутал.
Спасибо, вопрос закрыт.
Трудное детство, стальные игрушки.
Ответить

Вернуться в «Разные вопросы по МК»