Arduinoで遊ぶページ

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

shiftIn()

概要

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

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

ソースコード

shiftIn()は、hardware/arduino/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.0.5



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

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