Всем привет! Собственно что за код? Впервые я столкнулся с необходимостью пообщаться Ардуинкой с неким устройством, которое передает только по битам (импульсы HIGH (1) и LOW (0)), т.е нету готового протокола общения, все пришлось делать ручками: копание даташитов, впервые увидел термины как тайм-слот, зона ввода/зона вывода и др. Так вот, к примеру, устройство посылает 8 бит которые я должен поймать и понять что за команду оно мне прислало (на пример оно прислало мне 10000011, что в 16ой системе (HEX) - 0x83). Но сам прикол в том, что мне это нужно получить в одну byte переменную для следующих действий, а не в массив... Код: Код (Text): byte x=B0; //В которую будем сохранять команду byte mas[8] = { B1,B0,B0,B0,B0,B0,B1,B1}; // это эмуляция 8 бит, которое нам передает на цифровой пин "некое устройство" void setup(){ Serial.begin(9600); //Чтобы видели данные через СОМ порт :) } void loop(){ for(int i=0; i<8; i++){ x = x << 1; //Сдвигаем влево на 1 разряд всю переменную, последний разряд равен 0 x += mas[i]; //Прибавляем полученный бит с освободившимся разрядом по "правилу сложения битов" } Serial.println(); Serial.print(x, BIN); Serial.print(" = "); // выводим на экран что получили в 2ом виде Serial.println(x, HEX); //Выводим на экран что получили в 16ом виде (для удобства) x=B0; //Обнуляем переменную delay(1000); //Ждем 1 сек и начинаем всё сначала. } Если есть вариант ещё проще и правильнее - поправьте меня, буду рад. Спасибо за внимание!)
Код (Text): byte receiveByte() { byte data = 0; while(!digitalRead(PIN_STROBE)); // начало цикла приема: ждем "0" на тактовой линии for(byte i=8; i>0; i--) { while(digitalRead(PIN_STROBE)); // ждем "1" на тактовой линии byte x = digitalRead(PIN_DATA); // данные пришли, считываем data = (data << 1) | x; while(!digitalRead(PIN_STROBE)); // ждем "0", чтобы не считать тот же бит повторно } return data; // собрали байт - вернули }
Код (Text): data = (data << 1) | x; Не могли бы вы разжевать мне эту строчку? Был бы очень признателен. P.S Про битовые операции и как их юзать знаю только второй день Естественно, я просто сам "механизм" выложил, который написал.
X | Y - поразрядное логические сложение. 11111110 | 00000001 == 11111111 Сперва сдвинули переменную на разряд влево, затем прибавили новый разряд и результат записали в ту же переменную.
Самое смешное, что термин "логическое сложение" применяется именно к дизъюнкции, и в логике иногда для ее обозначения используется символ +. | - логическое сложение (или, дизъюнкция) & - логическое умножение (и, коньюнкция) ^ - сложение по модулю 2 (исключающее «или»)
Привык говорить "логическое сложение" и "сложение по модулю 2". Обычно так все понимают, а вот дизъюнкцию почти никто не знает или не помнит. Или путают с конъюнкцией.
Точно. Мой словарь в этом отношении ближе к C-шной терминологии, т.е. "логическое/побитовое И/ИЛИ/исключающее ИЛИ" если речь про слова, и "логическое ~" если про отдельные биты или логические переменные. К тому же при обсуждении кода нет терминологического разлада. А по страницам книжек еще всякая бяка ползает типа стрелок Пирса и штрихов Шеффера, про которые еще меньше людей помнят.
Раз уж пошла такая пьянка... Может, кто знает способ посчитать количество единичек в байте без использования цикла? Давным давно на одном далеком форуме вроде видел что-то подобное, но найти уже не получается. Там вроде был метод с наложением хитрых масок и сдвигами, что-то нетривиальное, но вроде как работало быстрее цикла.
8 или 9 разрядов. Таблица хороша, но памяти часто впритык бывает. Как, впрочем, и производительности. И другой камень взять нельзя
Нашел. Hamming widht называется. Вечером добавлю код, авось кому пригодится. Спасибо за наводку. Нашел