Arduinoで遊ぶページ

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

digitalPinToPort()

概要

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

ソースコード

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

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

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

digital_pin_to_port_PGMは、以下に示す配列です。この配列はPROGMEMが指定されているため、SRAMではなくフラッシュメモリに配置されます。

const 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が入っているアドレスということになります。

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

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

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

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