ライブラリはports.hをインクルードします。ただしライブラリが必要とされるのは割り込みなどの一部の機能だけで、I/Oの処理だけならば必要ありません。
I/Oには次の3つのレジスタが関与しています。
区分 | 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 |
区分 | 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 |
プロセッサ ヘッダファイルでは、レジスタに関して次のように定義されています。
/* 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 |
このようにマクロは、各レジスタの構造体のメンバと対応するように定義されており、メンバ名の前にアンダーバーを付けるだけです。
TRISxレジスタで、ピンの入出力の方向を設定します。各ビットが、
になります。なおリセット後には、すべてのピンが入力となっています。
たとえばでPortBのすべてを入力に設定するには、
TRISB = 0xffff;
と記述できますが、存在しないPortには設定が反映されないため、実際に設定されるのは0x003f (dsPIC4012の場合) となります。
Portのピンごとに設定するならば、
_TRISB0 = 1;
のようにします。
A/Dコンバータの入力ピンを兼ねたピンは、既定でアナログ信号の入力用に設定されています。これをデジタルI/Oに使用するには、A/Dコンバータの初期化で行う必要があります。
ほとんどのシリアル通信周辺モジュールは、有効にされることで使用する入出力ピンの制御を奪います。それによりI/Oの設定は無効となり、そのピンに対して影響を与えることが不可能となります。11.3.1.1 ソフトウェア入力ピン制御 (DS70058B_JP)
PORTxとLATxレジスタを使用します。
出力のときはいずれもLatchへ書き込みますが、読み込みでは振る舞いが異なります。
レジスタ | 出力 | 入力 |
---|---|---|
PORTx | Latchへ書き込み | Port Pinから読み込み |
LATx | Latchから読み込み |
よって、
で行うようにします。たとえばRA0に出力するには、
_LATA0 = 1;
とし、RA0から入力するには
int state = _RA0;
とします。
一方で出力を反転するには、
_LATA0 = !_LATA0;
として、LATレジスタから読み込んだ状態を反転して出力します。
入力ピンの状態変化に応じて割り込みを発生します。ピン名として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. |
関数 | 説明 |
---|---|
ConfigINTx | This function configures the interrupt on INT pin. |
CloseINTx | This function disables the external interrupt on INT pin. |