XC32コンパイラのライブラリを見てみると各ペリフェラルに対し
便利?なマクロが準備されている。
Port関係にも当然手厚く準備されている。ports.h参照。
ただ,レジスタで制御した方が明示的で分かりやす。気がするので,
ここではレジスタ制御での設定方法を記載しておく。
PIC32MX2xx 28-pin SPDIPに存在するI/Oは以下。
RAとRB系のPortが存在するが,途中歯抜けもあるので注意。
8bit連続して取れるI/Oがないのか・・・
ちなみに,パッケージ違いや,PIC32MX1xxでもアサインが異なるので注意。
RA0 | 2 |
RA1 | 3 |
RA2 | 9 |
RA3 | 10 |
RA4 | 12 |
RA7 | – |
RA8 | – |
RA9 | – |
RA10 | – |
RB0 | 4 |
RB1 | 5 |
RB2 | 6 |
RB3 | 7 |
RB4 | 11 |
RB5 | 14 |
RB6 | – |
RB7 | 16 |
RB8 | 17 |
RB9 | 18 |
RB10 | 21 |
RB11 | 22 |
RB12 | – |
RB13 | 24 |
RB14 | 25 |
RB15 | 26 |
Port Diagramは以下の構成。
関係するレジスタは以下の通り。
TRISx | ピンの入出力モード設定 | 1:Input | 0:Output |
LATx
|
ピンの出力用 | 1:High | 0:Low |
PORTx
|
ピンの入出力用 | 1:High | 0:Low |
ODCx
|
オープンドレイン設定 | 1:OpenDrain | 1:CMOS |
ANSELx | Analog,Digital設定 | 1:Analog, | 0:Digital |
CNPUx | プルアップ設定 | 1:ON | 1:OFF |
CNPDx | プルダウン設定 | 1:ON | 1:OFF |
ex)
レジスタ制御と言いながら,bitアクセスのマクロは使っていますが・・・
PB14のPort情報でPB13を1/0切り替えを行う例。
PB14とPB15をショートするとPB13のLEDが点灯します。
ANSELBbits.ANSB13 = 0; // digital
ANSELBbits.ANSB14 = 0; // digital
ANSELBbits.ANSB15 = 0; // digital
TRISBbits.TRISB13 = 0; // output
TRISBbits.TRISB14 = 1; // input
TRISBbits.TRISB15 = 0; // output
LATBbits.LATB15 = 1; // high output
CNPDBbits.CNPDB14 = 1; // pull-down
for(;;)
{
if(PORTBbits.RB14)
LATBbits.LATB13 = 1; // high output
else
LATBbits.LATB13 = 0; // low output
}
PIC32MXではペリフェラルのピンアサインを下記表に従って選択することができる。
コメント