digitalPinToPort()

概要

digitalPinToPort()は、指定したピンに対応するポートを返すマクロです。

ソースコード

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

1
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
digital_pin_to_port_PGMconst uint8_t PROGMEM digital_pin_to_port_PGM[] = {
    PD, /* 0 */
    PD,
    PD,
    PD,
    PD,
    PD,
    PD,
    PD,
    PB, /* 8 */
    PB,
    PB,
    PB,
    PB,
    PB,
    PC, /* 14 */
    PC,
    PC,
    PC,
    PC,
    PC,
};

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

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

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

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 AVR Boards 1.8.6

最終更新日

March 21, 2023

inserted by FC2 system