Arduinoで遊ぶページ

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

pinMode()

概要

指定したピンを、入力に利用するのか出力に利用するのかを設定する。Atmel社提供のライブラリ群を呼び出すことで実現しています。

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

ソースコード

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

extern void pinMode( uint32_t ulPin, uint32_t ulMode )
{
        if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
    {
        return ;
    }

        switch ( ulMode )
    {
        case INPUT:
            /* Enable peripheral for clocking input */
            pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_INPUT,
                g_APinDescription[ulPin].ulPin,
                0 ) ;
        break ;

        case INPUT_PULLUP:
            /* Enable peripheral for clocking input */
            pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_INPUT,
                g_APinDescription[ulPin].ulPin,
                PIO_PULLUP ) ;
        break ;

        case OUTPUT:
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_OUTPUT_1,
                g_APinDescription[ulPin].ulPin,
                g_APinDescription[ulPin].ulPinConfiguration ) ;

            /* if all pins are output, disable PIO Controller clocking, reduce power consumption */
            if ( g_APinDescription[ulPin].pPort->PIO_OSR == 0xffffffff )
            {
                pmc_disable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            }
        break ;

        default:
        break ;
    }
}
extern void pinMode( uint32_t ulPin, uint32_t ulMode )
{

入力は、ピン番号(ulPin)とそのピンに設定するモード(ulMode)です。

        if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
    {
        return ;
    }

入力されたピン番号に対応するピンタイプ(g_APinDescription[ulPin].ulPinType)がPIO_NOT_A_PINであれば、何もせずに終了します。g_APinDescriptionにはArduinoの全てのピンの情報が定義されています。g_APinDescription[ulPin].ulPinTypeにPIO_NOT_A_PINが設定されているのは番兵だけです。

        switch ( ulMode )
    {

ulModeの値によって分岐します。有効なulModeの値は、INPUTとINPUT_PULLUP、OUTPUTです。

        case INPUT:
            /* Enable peripheral for clocking input */
            pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_INPUT,
                g_APinDescription[ulPin].ulPin,
                0 ) ;
        break ;

ulModeがINPUTの場合は、pmc_enable_periph_clk()を呼び出しペリフェラルクロックを有効にします。その後、PIO_Configure()を呼び出し、入力モードに設定します。

        case INPUT_PULLUP:
            /* Enable peripheral for clocking input */
            pmc_enable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_INPUT,
                g_APinDescription[ulPin].ulPin,
                PIO_PULLUP ) ;
        break ;

ulModeがINPUTの場合は、pmc_enable_periph_clk()を呼び出しペリフェラルクロックを有効にした後、PIO_Configure()を呼び出し、入力モードに設定します。PIO_Configure()の4番目の引数にPIO_PULLUPを指定して、内蔵プルアップ抵抗を有効にします。

        case OUTPUT:
            PIO_Configure(
                g_APinDescription[ulPin].pPort,
                PIO_OUTPUT_1,
                g_APinDescription[ulPin].ulPin,
                g_APinDescription[ulPin].ulPinConfiguration ) ;

ulModeがOUTPUTの場合は、PIO_Configure()を呼び出し出力モードに設定します。設定するモードはPIO_OUTPUT_1なので、ピンを出力モードに設定するとデフォルトでHIGHが出力されるのではないかと思います。Arduino Dueを持っていないので試せていません。Arduino Dueを入手したので試してみたところ、やはりそうでした。

            /* if all pins are output, disable PIO Controller clocking, reduce power consumption */
            if ( g_APinDescription[ulPin].pPort->PIO_OSR == 0xffffffff )
            {
                pmc_disable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ;
            }
        break ;

        default:
        break ;
    }
}

g_APinDescription[ulPin].pPort->PIO_OSRが0xffffffffのときは、当該ポートに関連するすべてのピンが出力モードなので、pmc_disable_periph_clk()を呼び出してPIOコントローラにクロックの供給を停止して消費電力を削減します。

バージョン

Arduino 1.5



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

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