Arduinoで遊ぶページ

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

digitalPinToBitMask()

概要

digitalPinToBitMask()は、指定したピンが対応するピンのビットマスクを返すマクロです。

ソースコード

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

#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )

入力はPで、digital_pin_to_bit_mask_PGMにPを足した値をpgm_read_byte()に渡しています。

digital_pin_to_bit_mask_PGMは、(Arduino Unoの場合)hardware/arduino/variants/standard/pins_arduino.hで定義されていて、以下に示す配列です。この配列はPROGMEMが指定されているため、SRAMではなくフラッシュメモリに配置されます。

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
        _BV(0), /* 0, port D */
        _BV(1),
        _BV(2),
        _BV(3),
        _BV(4),
        _BV(5),
        _BV(6),
        _BV(7),
        _BV(0), /* 8, port B */
        _BV(1),
        _BV(2),
        _BV(3),
        _BV(4),
        _BV(5),
        _BV(0), /* 14, port C */
        _BV(1),
        _BV(2),
        _BV(3),
        _BV(4),
        _BV(5),
};

digital_pin_to_bit_mask_PGMは配列なので、digital_pin_to_bit_mask_PGM + (P)というのは、足し算は足し算ですが、配列digital_pin_tobit_mask_PGMのP+1番目の要素が入っているアドレスを表すことになります。C言語では、配列x[i]は、*(x + i)という形でアクセスすることができます。例えば、Pが13のときは、14番目(配列は0番から始まります)の要素である_BV(5)が入っているアドレスということになります。

_BV()は、hardware/tools/avr/avr/include/avr/sfr_defs.hで定義されているマクロで、1を引数で示したビットだけ左シフトした数値を返します。_BV(5)は、0b00100000となります。

pgm_read_byte()は、PROGMEM指定した変数を読み出すためのマクロで、hardware/tools/avr/avr/include/avr/pgmspace.hに定義されています。

結果としてdigitalPinToBitMask()は、フラッシュメモリに配置したdigital_pin_to_bit_mask_PGMのP+1番目の要素を返却することになります。

以下に、ピンとポート、ビットの関連を示します。例えば、D0(デジタルピンの0番)は、PORTDの0ビット目というように読んでください。dititalPintPort()の説明と合わせてみるとわかりやすいかもしれません。

PORTB(PB) PORTC(PC) PORTD(PD)
D0 0
D1 1
D2 2
D3 3
D4 4
D5 5
D6 6
D7 7
D8 0
D9 1
D10 2
D11 3
D12 4
D13 5
A0 0
A1 1
A2 2
A3 3
A4 4
A5 5

バージョン

Arduino 1.0.5



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

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