Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
shiftIn()

shiftIn()

概要

shiftIn()は、1ビットずつ送られてくるデータを取りこみ、1バイトのデータを作成します。概念図を以下に示します。

shiftIn()のリファレンスはこちらをご覧ください。

ソースコード

shiftIn()は、hardware/arduino/avr/cores/arduino/wiring_shift.c に定義されています。以下に全ソースコードを示します。

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
	uint8_t value = 0;
	uint8_t i;

	for (i = 0; i < 8; ++i) {
		digitalWrite(clockPin, HIGH);
		if (bitOrder == LSBFIRST)
			value |= digitalRead(dataPin) << i;
		else
			value |= digitalRead(dataPin) << (7 - i);
		digitalWrite(clockPin, LOW);
	}
	return value;
}

入力はdataPin、clockPin、bitOrderで、すべてuint8_tです。uint8_tを返します。

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
	uint8_t value = 0;
	uint8_t i;

8ビット分のデータを読み取るためループします。最初に、digitalWrite()で、clockPinにHIGHを出力します。

	for (i = 0; i < 8; ++i) {
		digitalWrite(clockPin, HIGH);

次に、digitalRead()で読み取った値を、valueに詰めていきます。

		if (bitOrder == LSBFIRST)
			value |= digitalRead(dataPin) << i;
		else
			value |= digitalRead(dataPin) << (7 - i);
		digitalWrite(clockPin, LOW);
	}

bitOrderがLSBFIRSTの場合は最下位ビットから詰めていきます。このため、i番目のループで、valueの第iビットに読み取った値を代入します。bitOrderがLSBFIRSTでない場合は、最上位ビットから詰めていきます。このため、i番目のループで、valueの第(7-i)ビットに読み取った値を代入します。

その後、clockPinにLOWを出力します。

最後に、valueを返却します。

	return value;
}

shiftIn()は、8ビット固定で読み取るので、異なるビット数の読み取りを行う場合には、このソースを参考にすればいいと思います。8ビットを超える値を読み取りたい場合は、変数の型などに注意する必要がありそうですが。

バージョン

Arduino 1.8.3



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2017 garretlab all rights reserved.
inserted by FC2 system