Не вяжется. По смыслу функция должна последовательно выдвигать байт
Код:
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); }
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Все там вяжется, Вам arkhnchul правильную ссылку дал. Функция digitalWrite устанавливает на выводе МК (определяемым clockPin) бит данных, равный значению второго аргумента функции. В цикле, в выражении data & 1 ? HIGH : LOW выполняется проверка состояния 0-го бита переменной data и выводится HIGH, или LOW в зависимости находится в нём 1, или 0 соответственно. После выполняется data >>= 1; что есть сдвиг в нулевой бит переменной data значения очередного бита.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Все там вяжется, Вам arkhnchul правильную ссылку дал
Понял, спасибо. Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.
...Понял, спасибо. Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.
Мучения никому не нужны. Повторюсь, arkhnchul дал Вам ссылку, где Вы найдёте ответы решительно на все вопросы, касаемо языка Си. Тогда Вы уже не будете сомневаться, чем отличаются операторы & и && к примеру. data & 1 означает побитовое И переменной data c числом 0b00000001. Чувствуете разницу? Понятие "алгебра Буля" Вам говорит о чем-то? Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Я пишу на ассемблере для MCS-51, и знаю что такое логические операции. Мне непонятно вот что: как логическая операция может становится условием. Допустим, если "А" (больше, меньше, равно, не равно и т.д) "B", тогда - что нибудь. Понятно, нет вопросов но, чего-то никак не въеду в ситуацию, когда условие: если "А" лог.И "B"... здесь затык.
Операции в Си. Побитовое И два слагаемых собираются по И. Например 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 раз(а).
...Ладно, я понял. Не стоит доискиваться, надо просто запомнить.
Так любой жизненный опыт так устроен. Есть туева хуча доказательств теоремы Пифагора. Но большинству людей достаточно получить правильный конечный результат. Цепь доказательств интересует немногих. В данном случае следует запомнить, что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )
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.
Благодаря чему, "определенности" становится больше. То ли дело строгий ассемблер.
Так "А" после лог.И с единицей никогда не будет равна нулю.
Почему? К примеру этой строке
Голимый писал(а):
digitalWrite(dataPin, data & 1 ? HIGH : LOW);
условие будет ложно (равно 0) если 0 в нулевом бите переменной data. Не путайте И и ИЛИ. Найдите учебник по С/С++ для начинающий и хорошо изучите язык чтобы не возникало путаницы. Или думали что ардуино это легко и просто и можно обойтись без знаний программирования?
Если Си кажется сложным, для ардуино можно писать в BASCOM-AVR.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения