LSB/MSB и shiftOut
Вот код функции shiftOut из wireing_shift.c
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
Означает ли это, что младший значащий бит находится слева, а старший — справа? Или LSBFIRST означает, что это будет последний выведенный бит, поэтому он будет «первым» в выводимой последовательности?
Еще кое-что
вот пример кода:
shiftOut(dataPin, clockPin, LSBFIRST, B00101001);
shiftOut(dataPin, clockPin, LSBFIRST, B11010011);
Почему это
union
{
word uniform;
byte separate[2];
} state;
state.uniform = 54057; // он же 11010011 00101001
shiftOut(dataPin, clockPin, LSBFIRST, state.separate[1]);
shiftOut(dataPin, clockPin, LSBFIRST, state.separate[0]);
имеют другой вывод, но если я поменяю местами последние две строки, все будет работать правильно?
@Kekers_Dev, 👍1
Обсуждение2 ответа
Лучший ответ:
Целые значения Arduino имеют старший бит слева и младший бит справа. Функция shiftOut()
позволяет вам выбрать порядок следования по времени. Если вы укажете LSBFIRST
, функция начнет передачу с LSB (справа), а затем перейдет влево к MSB. В противном случае он начнется с MSB, а затем пойдет прямо к LSB. Таким образом, это влияет только на временной порядок битов, поскольку они передаются.
Спасибо за ответ, но есть еще одна проблема, я добавил свой вопрос, @Kekers_Dev
В двоичном числе нет слов "лево" или "право", только человеческое представление этого числа.
Для нас традиционно самый значащий бит помещается слева исключительно потому, что именно так мы представляем другие числа, например 1234 (1 – старший разряд, тысячи).
Учитывая псевдочисло 12345678
, если вы сдвинете LSBFIRST, сначала выводится 8, затем 7, затем 6 и т. д. В MSBFIRST сначала выводится 1, затем 2, затем 3 и т. д.
Я бы сказал, что в двоичном числе есть «лево» или «право». Есть даже операторы для сдвига влево или вправо. Человеческое представление связано с соединением «левого» или «правого» с LSB и MSB, так что двоичное число может быть преобразовано в другие базы или даже распечатано (поскольку выбор, где LSB/MSB изменяет представление в другой базе , но не само двоичное число)., @chrisl
@chrisl Есть только левые и правые, потому что мы, люди, решили представить их такими. Сдвиг влево и сдвиг вправо снова являются просто именами, которые мы присвоили операторам. Они должны называться «SMS» и «SLS» для сдвига наиболее значимого и сдвига наименее значимого, но мы решили придать этим вещам хиральность., @Majenko
- Как управлять выводом регистров сдвига по отдельности побитово
- Сформировать сигнал из массива битов
- Проблема не сохранения предыдущего значения при отправке по блютусу
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
Вы должны прочитать что-нибудь о порядке следования байтов. Это будет работать, как вы ожидаете, с процессором с обратным порядком байтов, но большинство использует прямой порядок байтов для представления внутренних чисел., @KIIV
хорошо, спасибо за ответ, @Kekers_Dev