Как работает shiftOut

BOND
Offline
Зарегистрирован: 21.08.2016

Доброго времени суток всем. У меня возник вопрос: как работает функция shiftOut. То есть, меня интересует алгоритм отправки данных (т.е. что происходит на контактах синхронизации и данных, во время совершения данного действа, в какой последовательности и т.п.), а не всякая х. про параметры и тп. .  Кто знает - пожалуйста, напишите.

P.S Меня интересует инфа со всеми подробгностями, из расчёта написания данной функции и функции приёма.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOND пишет:

У меня возник вопрос: как работает функция shiftOut. То есть, меня интересует алгоритм отправки данных (т.е. что происходит на контактах синхронизации и данных, во время совершения данного действа, в какой последовательности и т.п.), а не всякая х. про параметры и тп. .  Кто знает - пожалуйста, напишите.

Вы какую религию исповедуете, что она не позволила Вам самому посмотреть?

Давайте, я посмотрю вместо Вас. Итак, лезем в директорию

<корень Ардуино>\hardware\arduino\avr\cores\arduino

и открываем там файл wiring_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);		
	}
}

Надеюсь, больше Вам ничего не нужно? То, что там написано Вы понимаете?

Ксатти, то, что Вы называете "функция приёма", там тоже есть, в том же самом файле. shiftIn называется.

mr.remlux
Offline
Зарегистрирован: 06.10.2020

Здравствуйте! Подскажите пжл .... !- это инверсия на сколько я знаю. А что означает !! в выражении !!(val & (1 << i)) ?

rkit
Offline
Зарегистрирован: 23.11.2016

А !! это два раза !.

sadman41
Offline
Зарегистрирован: 19.10.2016

Двойная инверсия. Приведение результата любого вычисления к 1 или 0.
!!(9-3) => !!6 => !0 => 1
!!0 => !1 => 0

mr.remlux
Offline
Зарегистрирован: 06.10.2020

Привет!

Не совсем понял.... Есть ссылка на материал об этом чтоб получше ознакомиться?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

mr.remlux пишет:

Привет!

Не совсем понял.... Есть ссылка на материал об этом чтоб получше ознакомиться?

О чем? Как двойная инверсия работает?

mr.remlux
Offline
Зарегистрирован: 06.10.2020

Зачем два раза инвертировать?

Допустим некое выражение true, после одной инверсии false, а после двойного- cнова true?

Для чего?

Ну или я чего то не понимаю..... Поэтому и ознакомиться хочу

b707
Offline
Зарегистрирован: 26.05.2017

mr.remlux пишет:

Зачем два раза инвертировать?


сообщение #4 читай и перечитывай, пока не дойдет смысл

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

digitalWrite(dataPin, !!(val & (1 << i)));
digitalWrite(dataPin, !!(val & (1 << (7 - i))));

Такой вывод приводит к тому что длина посылки одного бита разная !

Для shiftOut это не важно конечно (вывод синхронизируется), но для так информации надо это понимать ...

rkit
Offline
Зарегистрирован: 23.11.2016

mr.remlux пишет:

Зачем два раза инвертировать?

Допустим некое выражение true, после одной инверсии false, а после двойного- cнова true?

Для чего?

Ну или я чего то не понимаю..... Поэтому и ознакомиться хочу

Для того, чтобы превратить любое значение больше нуля в 1. (Что в данной ситуации совершенно ни к чему. (И когда нужно, делается не так)).

SLKH
Offline
Зарегистрирован: 17.08.2015

rkit пишет:

mr.remlux пишет:

Зачем два раза инвертировать?

Допустим некое выражение true, после одной инверсии false, а после двойного- cнова true?

Для чего?

Ну или я чего то не понимаю..... Поэтому и ознакомиться хочу

Для того, чтобы превратить любое значение больше нуля в 1. (Что в данной ситуации совершенно ни к чему. (И когда нужно, делается не так)).

В другом релизе библиотеки IDE 1.8.13) это извращение выглядит иначе:

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);
			val >>= 1;
		} else {	
			digitalWrite(dataPin, (val & 128) != 0);
			val <<= 1;
		}
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

А !! это два раза !.

...ты отказала мне два раза вот такая вот зараза... )))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Означает ли "Да" два раза подряд "Нет"? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ДА - не является логической операцией, а НЕТ - является

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Верно. "Да" - это результат логической операции. Потому вопрос #13 в силе )))