I/O (PIO:Parallel I/O)

ライブラリ

ライブラリはports.hをインクルードします。ただしライブラリが必要とされるのは割り込みなどの一部の機能だけで、I/Oの処理だけならば必要ありません。

レジスタ (Register)

I/Oには次の3つのレジスタが関与しています。

  • TRISx (Direction Control)
  • PORTx (Port)
  • LATx (Latch)
xには、A~Fなどのアルファベットが入ります。
区分 SFR名 アドレス Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 リセット後の値
TRISx TRISB 02C6 - - - - - - - - - - TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 0000 0000 0011 1111
TRISC 02CC TRISC15 TRISC14 TRISC13 - - - - - - - - - - - - - 1110 0000 0000 0000
TRISD 02D2 - - - - - - - - - - - - - - TRISD1 TRISD0 0000 0000 0000 0011
TRISE 02D8 - - - - - - - TRISE8 - - TRISE5 TRISE4 TRISE3 TRISE2 TRISE1 TRISE0 0000 0001 0011 1111
TRISF 02EE - - - - - - - - - - - - TRISF3 TRISF2 - - 0000 0000 0000 1100
PORTx PORTB 02C8 - - - - - - - - - - RB5 RB4 RB3 RB2 RB1 RB0 0000 0000 0000 0000
PORTC 02CE RC15 RC14 RC13 - - - - - - - - - - - - - 0000 0000 0000 0000
PORTD 02D4 - - - - - - - - - - - - - - RD1 RD0 0000 0000 0000 0000
PORTE 02DA - - - - - - - RE8 - - RE5 RE4 RE3 RE2 RE1 RE0 0000 0000 0000 0000
PORTF 02E0 - - - - - - - - - - - - RF3 RF2 - - 0000 0000 0000 0000
LATx LATB 02CB - - - - - - - - - - LATB5 LATB4 LATB3 LATB2 LATB1 LATB0 0000 0000 0000 0000
LATC 02D0 LATC15 LATC14 LATC13 - - - - - - - - - - - - - 0000 0000 0000 0000
LATD 02D6 - - - - - - - - - - - - - - LATD1 LATD0 0000 0000 0000 0000
LATE 02DC - - - - - - - LATE8 - - LATE5 LATE4 LATE3 LATE2 LATE1 LATE0 0000 0000 0000 0000
LATF 02E2 - - - - - - - - - - - - LATF3 LATF2 - - 0000 0000 0000 0000
TABLE 8-2: dsPIC30F4012 PORT REGISTER MAP (DS70135C)
区分 SFR名 アドレス Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 リセット後の値
CN CNEN1 00C0 CN7IE CN6IE CN5IE CN4IE CN3IE CN2IE CN1IE CN0IE 0000 0000 0000 0000
CNEN2 00C2 - - - - - CN18IE CN17IE - 0000 0000 0000 0000
  CNPU1 00C4 CN7PUE CN6PUE CN5PUE CN4PUE CN3PUE CN2PUE CN1PUE CN0PUE 0000 0000 0000 0000
CNPU2 00C6 - - - - - CN18PUE CN17PUE - 0000 0000 0000 0000
TABLE 8-3: INPUT CHANGE NOTIFICATION REGISTER MAP (BITS 7-0) (DS70135C)

ブロック図

ポートへのアクセス

プロセッサ ヘッダファイルでは、レジスタに関して次のように定義されています。

/* PORTB: Port B Pin Register */
extern volatile unsigned int PORTB __attribute__((__sfr__));

typedef struct tagPORTBBITS {
        unsigned RB0    :1;
        unsigned RB1    :1;
        unsigned RB2    :1;
        unsigned RB3    :1;
        unsigned RB4    :1;
        unsigned RB5    :1;
        unsigned        :10;
} PORTBBITS;

extern volatile PORTBBITS PORTBbits __attribute__((__sfr__));

よってPortBのすべてのピンに対して出力する場合は、

PORTB = 0x003f;

のように記述します。また、レジスタ内の情報が構造体のビットフィールド (bit field) で宣言されていますので、特定のピンにだけ出力するには

PORTBbits.RB0 = 1;

のようにします。一方、次のようにマクロが定義されているので、

/* PORTB */
#define _RB0 PORTBbits.RB0
#define _RB1 PORTBbits.RB1
#define _RB2 PORTBbits.RB2
#define _RB3 PORTBbits.RB3
#define _RB4 PORTBbits.RB4
#define _RB5 PORTBbits.RB5

上記の例は、

_RB0 = 1;

のようにも記述できます。

各レジスタの変数の定義
レジスタ レジスタの変数名 レジスタの構造体 マクロ
変数名 メンバ
TRISx TRISx TRISxbits TRISxn _TRISxn
PORTx PORTx PORTxbits Rxn _Rxn
LATx LATx LATxbits LATxn _LATxn
xはA、B、Cなどのポート名。nは0、1、2などのピン番号

このようにマクロは、各レジスタの構造体のメンバと対応するように定義されており、メンバ名の前にアンダーバーを付けるだけです。

入出力方向の設定 (Data Direction)

TRISxレジスタで、ピンの入出力の方向を設定します。各ビットが、

  • 1 … 入力
  • 0 … 出力

になります。なおリセット後には、すべてのピンが入力となっています。

たとえばでPortBのすべてを入力に設定するには、

TRISB = 0xffff;

と記述できますが、存在しないPortには設定が反映されないため、実際に設定されるのは0x003f (dsPIC4012の場合) となります。

Portのピンごとに設定するならば、

_TRISB0 = 1;

のようにします。

アナログ入力からデジタルI/Oへの変更

A/Dコンバータの入力ピンを兼ねたピンは、既定でアナログ信号の入力用に設定されています。これをデジタルI/Oに使用するには、A/Dコンバータの初期化で行う必要があります。

周辺モジュールによるI/Oの無効化

ほとんどのシリアル通信周辺モジュールは、有効にされることで使用する入出力ピンの制御を奪います。それによりI/Oの設定は無効となり、そのピンに対して影響を与えることが不可能となります。11.3.1.1 ソフトウェア入力ピン制御 (DS70058B_JP)

入力と出力 (Input/Output)

PORTxとLATxレジスタを使用します。

出力のときはいずれもLatchへ書き込みますが、読み込みでは振る舞いが異なります。

入出力 動作の差異
レジスタ 出力 入力
PORTx Latchへ書き込み Port Pinから読み込み
LATx Latchから読み込み

よって、

  • 出力は、LATレジスタ
  • 入力は、PORTレジスタ

で行うようにします。たとえばRA0に出力するには、

_LATA0 = 1;

とし、RA0から入力するには

int state = _RA0;

とします。

一方で出力を反転するには、

_LATA0 = !_LATA0;

として、LATレジスタから読み込んだ状態を反転して出力します。

割り込み

状態変化通知 (Change Notification : CN)

入力ピンの状態変化に応じて割り込みを発生します。ピン名としてCNxと割り当てられているのが対応するピンで、実際にどのピンで使用するかはCN制御レジスタ (CNEN1、CNEN2) で設定します。

入力ピンの状態が変化したときにはCN入力変化割り込み (CN Input change interrupt) が発生します。

関数 説明
ConfigIntCN This function configures the CN interrupts.
ConfigIntCNPortx This function configures the CN interrupts on PORTx
ConfigCNPullups This function configures the pull-up resistors for the CN pins.
ConfigCNPullupsPortx This function configures the pull-up resistors for CN pins on PORTx
CloseINTCN This function disables the CN interrupt.

外部割り込み (External Interrupt)

関数 説明
ConfigINTx This function configures the interrupt on INT pin.
CloseINTx This function disables the external interrupt on INT pin.

参考

  • dsPIC30Fファミリー リファレンスマニュアル (DS70046B_JP)
    11章「I/Oポート」
  • dsPIC30F/dsPIC33F/dsPIC33E/PIC24H/PIC24E I/O Ports Peripheral Module Library Help /Microchip/MPLAB C30/docs/periph_lib/dsPIC30F_dsPIC33F_PIC24H_dsPIC33E_PIC24E_IO_Library_Help.htm