Arduinoで遊ぶページ

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

PIO_SetInput()

概要

PIO(Parallel Input/Output Controller)コントローラを入力モードに設定します。内蔵プルアップ抵抗とデグリッチ・デバウンスの設定もできます。

以下のレジスタを設定します。

レジスタ シンボル 意味(1を書き込んだときの動作)
Glitch Input Filter Enable レジスタ PIO_IFER グリッチフィルタを有効にする。
Glitch Input Filter Disable レジスタ PIO_IFDR グリッチフィルタを無効にする。
System Clock Glitch Input Filter Select レジスタ PIO_SCIFSR マスタークロックの2分の1未満のグリッチをフィルタリングする。
Output Disable レジスタ PIO_ODR I/Oラインの出力を無効にする。
PIO Enable レジスタ PIO_PER PIOを有効にする。

ソースコード

PIO_SetInput()は、hardware/arduino/sam/system/libsam/source/pio.c に定義されています。以下に全ソースコードを示します。ソースコードのライセンスはこちら

extern void PIO_SetInput( Pio* pPio, uint32_t dwMask, uint32_t dwAttribute )
{
    PIO_DisableInterrupt( pPio, dwMask ) ;
    PIO_PullUp( pPio, dwMask, dwAttribute & PIO_PULLUP ) ;

    /* Enable Input Filter if necessary */
    if ( dwAttribute & (PIO_DEGLITCH | PIO_DEBOUNCE) )
    {
        pPio->PIO_IFER = dwMask ;
    }
    else
    {
        pPio->PIO_IFDR = dwMask ;
    }

    /* Enable de-glitch or de-bounce if necessary */
    if ( dwAttribute & PIO_DEGLITCH )
    {
        pPio->PIO_SCIFSR = dwMask ;
    }
    else
    {
        if ( dwAttribute & PIO_DEBOUNCE )
        {
            pPio->PIO_SCIFSR = dwMask ;
        }
    }

    /* Configure pin as input */
    pPio->PIO_ODR = dwMask ;
    pPio->PIO_PER = dwMask ;
}
extern void PIO_SetInput( Pio* pPio, uint32_t dwMask, uint32_t dwAttribute )
{

引数は、ピンに対応したPIO(Parallel IO Controller)を示すPioへのポインタ型のpPio、ピンに対応するマスク(コントローラのどのビットでそのピンが制御されるかを示します)を示すconst uint32_t型のdwMask、ピンに設定する属性を示すuint32_t型のdwAttributeの3つです。

    PIO_DisableInterrupt( pPio, dwMask ) ;
    PIO_PullUp( pPio, dwMask, dwAttribute & PIO_PULLUP ) ;

PIO_DisableInterrupt()を呼び出して割り込みを禁止にします。その後、PIO_PullUp()を呼び出して、内蔵プルアップ抵抗の設定を行います。

    /* Enable Input Filter if necessary */
    if ( dwAttribute & (PIO_DEGLITCH | PIO_DEBOUNCE) )
    {
        pPio->PIO_IFER = dwMask ;
    }
    else
    {
        pPio->PIO_IFDR = dwMask ;
    }

dwAttributeにPIO_DEGLITCHもしくはPIO_DEBOUNCEが設定されている場合は、pPio->PIO_IFERにdwMaskを設定して、グリッチフィルタを有効にします。pPio->PIO_IFERは32ビットのレジスタで、ビットを1に設定すると設定したビットに対応するグリッチフィルタが有効になります。

dwAttributeにPIO_DEGLITCHもしくはPIO_DEBOUNCEが設定されていない場合は、pPio->PIO_IFDRにdwMaskを設定して、グリッチフィルタを無効にします。pPio->PIO_IFDRは32ビットのレジスタで、ビットを1に設定すると設定したビットに対応するグリッチフィルタが無効になります。

    /* Enable de-glitch or de-bounce if necessary */
    if ( dwAttribute & PIO_DEGLITCH )
    {
        pPio->PIO_SCIFSR = dwMask ;
    }
    else
    {
        if ( dwAttribute & PIO_DEBOUNCE )
        {
            pPio->PIO_SCIFSR = dwMask ;
        }
    }

dwAttributeにPIO_DEGLITCHが設定されていれば、pPio->PIO_SCIFSRにdwMaskを設定して、マスタークロックの2分の1未満のグリッチをフィルタリングすることができます。

dwAttributeにPIO_DEBOUNCEが設定されている場合は、pPio->PIO_SCIFSRにdwMaskを設定しています。ここで設定するのはPIO_SCIFSRではなく、PIO_DIFSRではないかと思います。Arduinoでは使われていないコードかもしれませんが。

    /* Configure pin as input */
    pPio->PIO_ODR = dwMask ;
    pPio->PIO_PER = dwMask ;
}

最後に、pPio->PIO_ODRとpPio->PIO_PERにdwMaskを設定して、指定したピンをI/Oラインの出力の禁止と指定したピンのPIO(Purpose I/O)を有効にします。

バージョン

Arduino 1.5



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

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