Объясните как для чайника
- Войдите на сайт для отправки комментариев
Пт, 24/07/2020 - 19:03
Добрый день!
Товарищи, помогите - объясните для чайника кусок кода ниже. Этот код обрабатывает поворот энкодера, но тут задействованы байтовые операции. Совершенно не могу понять как он работает.
#define CLK 4
#define DT 2 // Тут мы объявили пины энкодера;
long pos = 0;
byte lastState = 0; // Ввели переменные
const int8_t increment[16] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0}; // Зачем нужен этот странный массив?
void setup() {
Serial.begin(9600); // подключаем порт.
}
void loop() {
byte state = digitalRead(CLK)| (digitalRead(DT) << 1); // что происходит в этих байтовых опреациях?
if (state != lastState) {
pos += increment[state | (lastState << 2)]; // опять таки ,что тут происходит?
lastState = state;
Serial.println(pos);
}
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
тут задействованы байтовые операции.
Какие?
Сравнение байтовое вижу я.
тут задействованы байтовые операции.
Какие?
Cдвиг влево. 2 штуки.
За такую обработку сигналов энкодера, да ещё и в общий доступ выложенную, карать нужно анально.
У энкодера весь код:
Если изменился сигнал на одном из выводов, то смотрим:
Сигналы стали равны - одно направление
Сигналы разноименные-другое направление.
А тут очень сложный, избыточный код, не факт что правильный и рабочий
Может какой-то энкодер нестандартный, мало-ли. А так в массиве записаны все варианты состояния ног, вернее соответствующие им действия. Но разбираться с этим в пятницу, если честно лень просчитывать шестнадцать вариантов. Если все работает, то и хорошо. Если нет пробуйте другие алгоритмы.
и здесь радужные отметились )))
Cдвиг влево. 2 штуки.
Это теперь "байтовые операции". Буду знать.
Cдвиг влево. 2 штуки.
Это теперь "байтовые операции". Буду знать.
Вот же глаз замылился, прочитал у ТС как "битовые"
Битовые, байтовые. Проще сначала код из «сокращённого» в «развёрнутый» переписать, тогда и понятен будет и нагляднее.
Энкодер самый что ни на есть обычный.
Код избыточный просто.
Считывание состояния входов, сравнение с предыдущими, если изменилось, то тогда битовый сдвиг предыдущих, сложение с текущими, и полученное значение используется как элемент массива с направлением движения.
Можно записать это как то так, если не знаком с битовыми операциями: