マイコンRX220は、RX621/RX62Nなどと比べ、クロックとI/Oポートの初期化が少々厄介です。
ルネサスエレクトロニクスで公開している資料を基に、クロックとI/Oポートの初期化について説明します。
7-1.前提とするファイル構成
ここでは統合開発環境CS+を使用してC言語でプロジェクトを作成し、下表に示すひな型ファイルがプロジェクト・フォルダにあるものとして説明します。
初期設定はファイル“hwsetup.c”で行いますが、初期状態ではプロジェクトに入っていないので、CS+のメニューから、「プロジェクト」→「追加」→「既存のファイルを追加」を選択して、“hwsetup.c”をプロジェクトに加えます。
「プロジェクト・ツリー登録」欄が“-”となっているファイルで、“hwsetup.c”以外にも必要なものがあれば同様に登録する必要があります。
ただし、“lowlvl.src”,“lowsrc.c”,“lowsrc.h”は、標準入出力注4を使用しない場合は追加する必要ありません。また、ヒープメモリ注5を使用しない場合は、“sbrk.c”,“sbrk.h”は無くてもかまいません。
参考:マイコンRX621/RX62Nにおいても、下表と同様のひな型ファイルが作成されます。
ファイル名 | 説 明 | プロジェクト ・ツリー登録 |
補 足 |
プロジェクト名.c | main関数の定義 | ○ | メイン関数のファイル。“プロジェクト名”はプロジェクト作成時に指定したものです。 |
dbsct.c | 標準セクションの設定 | ○ | セクションを初期化するために必要なセクション名のリストです。 |
hwsetup.c | ハードウェア初期化用ファイル | - | マイコンおよび周辺回路の初期化を行います。 |
intprg.c | 割り込み関数の定義 | ○ | |
iodefine.h | I/Oレジスタの定義 | ○ | マイコンのI/Oレジスタをアクセスするための定義ファイルです。 |
lowlvl.src | I/O入出力用低レベル関数の定義(アセンブラ用) | - | 標準入出力用の低水準インタフェースルーチン(アセンブリ言語部分) |
lowsrc.c | I/O入出力用低レベル関数の定義 | - | 標準入出力用の低水準インタフェースルーチン(C言語部分)。 |
lowsrc.h | I/O入出力用低レベル関数のプロトタイプ | - | 〃 のヘッダファイル |
resetprg.c | C言語用初期化の定義 | ○ | エントリー関数PowerON_Reset_PCが定義されているファイルです。 |
sbrk.c | ヒープ・メモリ確保用関数の定義 | ○ | |
sbrk.h | ヒープ・サイズの定義 | ○ | |
stacksct.h | スタック用pragmaの定義 | ○ | スタックサイズを定義しているだけです。 |
typedefine.h | sbrk.cなどで使用する型のtypedefineの定義 | ○ | |
vect.h | 割り込みベクタ関数のプロトタイプ | ○ | |
vecttbl.c | 割り込みベクタ・テーブルの定義 | ○ |
注4.標準入出力とは、標準入力(stdin),標準出力(stdout),標準エラー出力(stderr)など、ファイルのオープン等の準備を行わずに標準的に使用できるファイルを指します。あらかじめ、標準入出力ライブラリから呼ばれるopen,close,read,write,lseekなどのインタフェースルーチンを作成して用意しておかなければなりません。詳しくは、「RXファミリ C/C++コンパイラユーザーズマニュアル」を参照してください。
注5.ヒープとは、ライブラリ関数malloc、realloc、calloc、new で使用するメモリ領域のことです。
注5.ヒープとは、ライブラリ関数malloc、realloc、calloc、new で使用するメモリ領域のことです。
7-2.RX220のクロックについて
参考に、RX220のクロックの仕様概略を示します。
■内部クロックの種類
名称 | 説 明 | 最大動作周波数注6 |
ICLK | CPU,DMAC,DTC,ROM,RAMの動作クロック(システムクロック) | 32MHz(max) |
PCLKD | 周辺モジュール(S12AD)用の動作クロック | 32MHz(max) |
PCLKB | 周辺モジュール(S12AD以外)用の動作クロック | 32MHz(max) |
FCLK | FlashIFの動作クロック | 4MHz~32MHz |
CACCLK | CACモジュール用の動作クロック | 各クロックと同じ |
RTCSCLK | RTCモジュール専用の動作クロック | 32.768kHz |
IWDTCLK | IWDTモジュール専用の動作クロック | 125kHz |
注6.最大動作周波数は中速動作モード1Aでの値です。その他の動作電力モードでは変わる場合があります。
■メインクロック発振器の仕様
発振子周波数 | 1MHz~20MHz |
外部クロック入力周波数 | 20MHz (max) |
接続できる発振子、または付加回路 | セラミック共振子、水晶振動子 |
接続端子 | EXTAL、 XTAL |
発振停止検出機能 | メインクロックの発振停止検出時、LOCOに切り替える MTUの端子をハイインピーダンスにする |
メインクロックとは、端子EXTAL,XTALに接続された1MHz~20MHzのセラミック共振子または水晶振動子によるクロック、あるいは端子EXTALに入力された20MHz以下の外部クロックです。
メインクロック発振器コントロールレジスタ(MOSCCR)のMOSTPビットによって、メインクロック発振器の動作'0' /停止'1' を設定できます。
リセット後のMOSTPビットは'1' で、メインクロックは発振停止状態です。
■サブクロック発振器の仕様
発振子周波数 | 32.768kHz |
接続できる発振子、または付加回路 | 水晶振動子 |
接続端子 | XCIN、XCOUT |
サブクロックとは、端子XCIN,XCOUTに接続された32.768KHzの水晶発振子によるクロックで、リアルタイムクロック(RTC)にも使用されるものです。
サブクロック発振器コントロールレジスタ(SOSCCR)のSOSTPビットによって、サブクロック発振器の動作'0' /停止'1' を設定できます。
リセット後のSOSTPビットは'0' で、サブクロックは発振動作状態です。
■高速オンチップオシレータ(HOCO) の仕様
発振周波数 | 32MHz / 36.864MHz / 40MHz / 50MHz | |
周波数精度 (-40℃~105℃) |
32MHz | 31.520MHz~32.480MHz |
36.864MHz | 36.311MHz~37.417MHz | |
40MHz | 39.400MHz~40.600MHz | |
50MHz | 49.250MHz~50.750MHz |
高速オンチップオシレータコントロールレジスタ(HOCOCR)のHCSTPビットによって、HOCOの動作'0' /停止'1' を設定できます。
リセット後のHCSTPビットは、ROM中0xFFFFFF88番地のオプション機能選択レジスタ1(OFS1)のHOCOEN(b8)ビットと同じになります。
ROM初期化後のHOCOENビットは'1' であるため、HOCOENビットを'0' にしない限り、リセット後のHOCOは発振停止となります。
■低速オンチップオシレータ(LOCO)の仕様
発振周波数 | 125kHz |
周波数精度 | 112.5kHz~137.5kHz |
低速オンチップオシレータコントロールレジスタ(LOCOCR)のLCSTPビットによって、LOCOの動作'0' /停止'1' を設定できます。
リセット後のLCSTPビットは'0' で、発振動作しています。
リセット後、システムクロックはLOCOになっています。従って、他のクロック(HOCO,メインクロック,サブクロック)で動作するよう設定するまでLOCOで動きます。
■独立ウォッチドッグタイマ(IWDT)専用オンチップオシレータ
発振周波数 | 125kHz |
IWDT専用オンチップオシレータコントロールレジスタ(ILOCOCR)のILCSTPビットによって、IWDT用オシレータの動作'0' /停止'1' を設定できます。
リセット後のILCSTPビットは'1' で、IWDT用オシレータは発振停止しています。
7-3.エントリー関数PowerON_Reset_PCの例
ファイル“resetprg.c”にある関数PowerON_Reset_PCの例を下記に示します。この関数は、マイコンがリセットすると実行する、プログラムの入り口部分です。
下記のように、ここから関数HardwareSetupを呼び出します。
関数PowerON_Reset_PCのアドレスは、リセットベクタ0xFFFFFFFC番地に格納しておきます。固定ベクタテーブルの作成方法はRX621/RX62Nと同じなので、こちら を参照してください。
void PowerON_Reset_PC(void)
{
/* 割り込みテーブルレジスタ(INTB)のセット */
set_intb(__sectop("C$VECT"));
/* CPUクロック,周辺機能の初期設定 */
HardwareSetup(); // →関数HardwareSetupを呼び出す
nop();
/* 各セクションを初期化 */
_INITSCT(); // Initialize Sections
main(); // →ファイル“プロジェクト名.c”のメイン関数へ
}
{
/* 割り込みテーブルレジスタ(INTB)のセット */
set_intb(__sectop("C$VECT"));
/* CPUクロック,周辺機能の初期設定 */
HardwareSetup(); // →関数HardwareSetupを呼び出す
nop();
/* 各セクションを初期化 */
_INITSCT(); // Initialize Sections
main(); // →ファイル“プロジェクト名.c”のメイン関数へ
}
この関数PowerON_Reset_PCは、統合開発環境CS+で生成された時点では関数mainを呼ぶ前にset_psw(PSW_init) を実行して割り込みを許可するようになっています。しかしこの例の場合、関数mainの冒頭で割り込みマスク状態で行う初期化処理が存在することを想定しているので、割り込みマスク状態のまま関数mainを呼んでいます。
7-4.初期化関数HardwareSetupの例
マイコンを初期化する関数HardwareSetupは、ファイル“hwsetup.c”にあります。ただし、初期状態では空なので、中身を作成しないと何の機能もありません。
下記に、関数HardwareSetupの作成例を示します。関数HardwareSetupから呼んでいる各関数の中身については、次項のサンプルプログラムを参照してください。
void HardwareSetup(void)
{
/* 全てモジュールストップ状態にする */
Stop_AllModule();
/* クロック初期設定 */
Init_SystemClock();
/* 全てのI/Oポートを汎用入出力ポートに初期化 */
Init_PortModeReg();
/* 存在しないI/Oポートの初期化 */
Init_NonExistPort();
/* I/Oポートの初期化例 */
/* I/Oポート1(PORT1.P17~P14を出力ポートにする例) */
// PORT1.ODR0.BYTE = 0x00; /* オープンドレイン制御レジスタ0(初期状態:P13~P10 CMOS出力) */
PORT1.ODR1.BYTE = 0x00; /* オープンドレイン制御レジスタ1(初期状態:P17~P14 CMOS出力) */
PORT1.PODR.BYTE = 0x00; /* ポート出力データレジスタ(出力データの初期状態) */
PORT1.PDR.BYTE |= 0xF0; /* ポート方向レジスタ(出力にするポート追加) */
// PORT1.PCR.BYTE = 0x00; /* プルアップ制御レジスタ(初期状態:プルアップなし) */
PORT1.DSCR.BYTE = 0x00; /* 駆動能力制御レジスタ(初期状態:通常出力) */
/* ~他にも初期化するものがあれば記述~ */
}
{
/* 全てモジュールストップ状態にする */
Stop_AllModule();
/* クロック初期設定 */
Init_SystemClock();
/* 全てのI/Oポートを汎用入出力ポートに初期化 */
Init_PortModeReg();
/* 存在しないI/Oポートの初期化 */
Init_NonExistPort();
/* I/Oポートの初期化例 */
/* I/Oポート1(PORT1.P17~P14を出力ポートにする例) */
// PORT1.ODR0.BYTE = 0x00; /* オープンドレイン制御レジスタ0(初期状態:P13~P10 CMOS出力) */
PORT1.ODR1.BYTE = 0x00; /* オープンドレイン制御レジスタ1(初期状態:P17~P14 CMOS出力) */
PORT1.PODR.BYTE = 0x00; /* ポート出力データレジスタ(出力データの初期状態) */
PORT1.PDR.BYTE |= 0xF0; /* ポート方向レジスタ(出力にするポート追加) */
// PORT1.PCR.BYTE = 0x00; /* プルアップ制御レジスタ(初期状態:プルアップなし) */
PORT1.DSCR.BYTE = 0x00; /* 駆動能力制御レジスタ(初期状態:通常出力) */
/* ~他にも初期化するものがあれば記述~ */
}
ファイル“hwsetup.c”と関連ヘッダファイルのサンプル
■システムクロック設定用の設定値定義ファイル例(InitSystemClock.h)
■存在しないI/OポートのPDR設定値ファイル例(NonExistPort.h)
■マイコンの初期化プログラム例(hwsetup.c)
この“hwsetup.c”サンプルには、電圧検出回路(LVDAa)を使いVCC < 3.10V になったとき、NMI割り込みを発生する関数init_voltage_detectが用意されています。
注7.
・純正のC/C++コンパイラ使用で、統合開発環境CS+が生成するファイル“iodefine.h”によってI/Oレジスタが定義されているものとします。
・この例では、ファイル"iodefine.h"に定義されたマクロを使用しています。
・純正のC/C++コンパイラ使用で、統合開発環境CS+が生成するファイル“iodefine.h”によってI/Oレジスタが定義されているものとします。
・この例では、ファイル"iodefine.h"に定義されたマクロを使用しています。
7-5.リセット後に動作している周辺機能の停止
関数Stop_AllModuleについて説明します。
周辺機能(周辺モジュール)のうちDMAC、DTC、RAM0は、マイコンをリセットしてもモジュールストップにならないため、起動直後から動作している可能性があります。
この例では、起動直後にRAM0を除く全ての周辺機能をモジュールストップ機能によって停止させます。
もし、RAM0をモジュールストップにより動作停止すると、RAMにアクセスできなくなってしまうので注意が必要です。
7-6.クロックの初期設定
関数Init_SystemClockでは、次のクロック設定を行っています。
- サブクロック設定
- リアルタイムクロック(RTC)のモード設定
- メインクロック設定
- 高速オンチップオシレータ(HOCO)設定
- システムクロックの切り替え
- 動作電力制御モードを選択
なお、前出のサンプルプログラムは秋月電子通商のRX220マイコンボード用に、20MHz水晶発振子によるメインクロックで動作するように設定しています。 異なるクロックを使用する場合は、該当するマクロの設定値を変更してファイル“hwsetup.c”をコンパイルします。
参考:マクロの設定値、B_NOT_USEは「使わない」、B_USEは「使う」です。
マクロ名 | 設定値 | 説 明 | サンプルでの設定値 |
SEL_MAIN | B_NOT_USE / B_USE |
システムクロックにメインクロックを使用するかどうかを選択 | B_USE |
MAIN_CLOCK_Hz | 1000000L~ 20000000L |
メインクロックの周波数(実装されている水晶の周波数[Hz]) | 20000000L |
REG_MOFCR | 0x10 / 0x20 / 0x30 |
メインクロック発振器ドライブ能力を選択 0x10=1MHz~8MHz 0x20=8.1MHz~15.9MHz 0x30=16MHz~20MHz (端子EXTAL,XTALに水晶発振子を接続するものとしています) |
0x30 |
SEL_SUB | B_NOT_USE / B_USE |
システムクロックにサブクロックを使用するかどうかを選択 | B_NOT_USE |
SEL_RTC | B_NOT_USE / B_USE |
RTCカウントソースとしてサブクロックを使用するかどうかを選択 | B_NOT_USE |
SUB_CLOCK_Hz | 32768L | サブクロックの周波数[Hz] | 32768L |
SEL_HOCO | B_NOT_USE / B_USE |
システムクロックに高速オンチップオシレータ(HOCO)を使用するかどうかを選択 | B_NOT_USE |
REG_OPCCR | OPCM_MID_1A / OPCM_MID_1B / OPCM_LOW_1 / OPCM_LOW_2 |
動作電源制御モードを選択 OPCM_MID_1A=中速動作モード1A OPCM_MID_1B=中速動作モード1B OPCM_LOW_1=低速動作モード1 OPCM_LOW_2=低速動作モード2 |
OPCM_MID_1A |
SEL_SYSCLK | CLK_MAIN CLK_HOCO CLK_SUB |
システムクロックとして使用するクロックを選択 CLK_MAIN=メインクロックを使う CLK_HOCO=高速オンチップオシレータを使う CLK_SUB=サブクロックを使う |
CLK_MAIN |
7-7.I/Oポートの初期化
1)全てのI/Oポートを汎用入出力ポートにする
関数Init_PortModeRegについて説明します。
リセット後全てのI/Oポートは、各ポートモードレジスタ(PMR)の全ビットが'0' なので、汎用入出力ポートとして使用できるようになっています。
しかしこのサンプルでは、明示的に全I/OポートのPMRを'0' にし汎用入出力ポートとなるよう再設定しています。
2)存在しないI/Oポートの初期化
関数Init_NonExistPortについて説明します。
RX220は、端子数が100ピン未満の製品では、存在していてもピン数の関係で端子に接続されていないポートがあり、それらを出力に設定しておく必要があります。また、存在自体していないポートは入力に設定しておく必要があります。
関数Init_NonExistPortは、ファイル“NonExistPort.h”にあるマクロPIN_SIZEに定義されたピン数(100,64,48のどれか)に従って、端子に接続されていないポートを出力に設定します。
秋月電子通商のRX220マイコンボードの場合は64ピンなので、PIN_SIZEは64にします。
なお、この関数を実行する時点で全てのポートが入力に設定されている必要があります(リセット直後は全て入力です)。
3)I/Oポートとして使用する設定
下記は、関数HardwareSetupの例にもあった、I/Oポート1のP17~P14を出力ポートにする設定例です。
オープンドレイン制御レジスタ(ODR1)を0x00にしていますが、リセット直後は元々0x00なのでCMOS出力で使用するなら省略してもかまいません。
プルアップ制御レジスタ(PCR)でポートの端子にプルアップ抵抗を入れることができますが、出力ポートでプルアップは無効なので設定しても無意味です。
駆動能力制御レジスタ(DSCR)で高駆動出力を設定するとLOWレベル出力電流がmax16mA注8となります。下の例は通常出力なのでmax4mA注8。
■ I/Oポート1設定例(PORT1のP17~P14)
PORT1.ODR1.BYTE = 0x00;
PORT1.PODR.BYTE = 0x00;
PORT1.PDR.BYTE |= 0xF0;
PORT1.DSCR.BYTE = 0x00;
PORT1.PODR.BYTE = 0x00;
PORT1.PDR.BYTE |= 0xF0;
PORT1.DSCR.BYTE = 0x00;
64ピンおよび48ピンパッケージでは、I/Oポート1のP13~P10は使用できません。
同様に、下表のようにRX220のパッケージによって使用できないI/Oポートが異なるので注意が必要です。
パッケージ別のI/Oポート一覧表(RX220グループユーザーズマニュアル ハードウェア編より)
ポート | パッケージ | パッケージ | パッケージ | |||
100ピン | 本数 | 64ピン | 本数 | 48ピン | 本数 | |
PORT0 | P03、P05、P07 | 3 | P03、P05 | 2 | なし | 0 |
PORT1 | P12~P17 | 6 | P14~P17 | 4 | P14~P17 | 4 |
PORT2 | P20~P27 | 8 | P26、P27 | 2 | P26、P27 | 2 |
PORT3 | P30~P37 | 8 | P30~P32、P35~P37 | 6 | P30、P31、P35~P37 | 5 |
PORT4 | P40~P47 | 8 | P40~P44、P46 | 6 | P40~P42、P46 | 4 |
PORT5 | P50~P55 | 6 | P54、P55 | 2 | なし | 0 |
PORTA | PA0~PA7 | 8 | PA0、PA1、PA3、PA4、PA6 | 5 | PA1、PA3、PA4、PA6 | 4 |
PORTB | PB0~PB7 | 8 | PB0、PB1、PB3、PB5~PB7 | 6 | PB0、PB1、PB3、PB5 | 4 |
PORTC | PC0~PC7 | 8 | PC2~PC7 | 6 | PC4~PC7 | 4 |
PORTD | PD0~PD7 | 8 | なし | 0 | なし | 0 |
PORTE | PE0~PE7 | 8 | PE0~PE5 | 6 | PE1~PE4 | 4 |
PORTH | PH0~PH3 | 4 | PH0~PH3 | 4 | PH0~PH3 | 4 |
PORTJ | PJ1、PJ3 | 2 | なし | 0 | なし | 0 |
ポートの合計 | 85 | ポートの合計 | 49 | ポートの合計 | 35 |
注8.全出力端子の総和はmax80mA。ただし、総電力(チップ全体の電力)と使用温度により異なります。
4)I/Oポートの端子を周辺機能の入出力として使う
リセット後または関数Init_PortModeRegを実行後は、全てのI/Oポートが汎用入出力ポートに設定されます。
I/Oポートの端子は、周辺機能(周辺モジュール)の入出力としても割り当てられています注9。周辺機能の入出力として使う場合は、マルチファンクションピンコントローラ(MPC)を使い、次の手順で設定が必要です。
- ポートモードレジスタ(PMR)を'0' にして汎用入出力ポートに設定します(リセットまたは関数Init_PortModeRegで設定済み)。
- 書き込みプロテクトレジスタ(PWPR)注10のPFSWEビットを'1' に設定して、目的の端子の機能制御レジスタ(PmnPFS注11)への書き込みを有効にします。
- 機能制御レジスタ(PmnPFS)注11のPSEL[3:0] ビットにより端子入出力機能を設定します。
- 書き込みプロテクトレジスタ(PWPR)のPFSWEビットを'0' に設定し、機能制御レジスタ(PmnPFS)への書き込み禁止にします。
- ポートモードレジスタ(PMR)を'1' に設定し、選択された周辺機能の入出力に切り替えます。
注9.I/Oポートの端子と周辺機能の入出力の対応表は『RX220グループユーザーズマニュアル ハードウェア編』にあります。
注10.書き込みプロテクトレジスタ(PWPR),能制御レジスタ(PmnPFS)は、マルチファンクションピンコントローラ(MPC)のレジスタです。
注11.“m”はポート番号(0~5,A~E,H,J)、“n”はポートのビット番号(0~7)。
注10.書き込みプロテクトレジスタ(PWPR),能制御レジスタ(PmnPFS)は、マルチファンクションピンコントローラ(MPC)のレジスタです。
注11.“m”はポート番号(0~5,A~E,H,J)、“n”はポートのビット番号(0~7)。
■PORTBのB3(PB3)端子からMTU0のMTIOC0Aを出力、PORTBのB5(PB5)端子からMTU2のMTIOC2Aを出力する設定例。
/* MTIOC2A(PB5),MTIOC0A(PB3)端子のモード設定 */
PORTB.PMR.BIT.B5 = 0;
PORTB.PMR.BIT.B3 = 0;
PORTB.PMR.BIT.B3 = 0;
/* PB5をI/Oポートとして使う設定 */
/* PB3をI/Oポートとして使う設定 */
/* マルチファンクションピンコントローラ(MPC) *//* PB3をI/Oポートとして使う設定 */
MPC.PWPR.BYTE = 0x00;
MPC.PWPR.BYTE = 0x40;
MPC.PWPR.BYTE = 0x40;
/* 書き込みプロテクトレジスタ(先にBOWI=0にすること) */
/* PFSWE=1:PFSレジスタ書き込みを許可 */
/* PB5,PB3端子機能制御レジスタ *//* PFSWE=1:PFSレジスタ書き込みを許可 */
MPC.PB5PFS.BYTE = 0x01;
MPC.PB3PFS.BYTE = 0x01;
MPC.PB3PFS.BYTE = 0x01;
/* PB5端子をMTIOC2A出力として使用する */
/* PB3端子をMTIOC0A出力として使用する */
/* マルチファンクションピンコントローラ(MPC) *//* PB3端子をMTIOC0A出力として使用する */
MPC.PWPR.BYTE = 0x80;
/* 書き込みプロテクトレジスタ(POWI=1にして書込み保護) */
/* PFSWE=0:PFSレジスタへの書き込みを禁止 */
/* MTIOC2A(PB5),MTIOC0A(PB3)端子のモード設定 *//* PFSWE=0:PFSレジスタへの書き込みを禁止 */
PORTB.PMR.BIT.B5 = 1;
PORTB.PMR.BIT.B3 = 1;
PORTB.PMR.BIT.B3 = 1;
/* PB5を周辺機能として使う設定 */
/* PB3を周辺機能として使う設定 */
/* PB3を周辺機能として使う設定 */
5)8ビットのI/Oポートを確保
64ピンおよび48ピンパッケージでは、8ビットそろったI/Oポートがありません。
マイコンの外部に周辺デバイスや周辺回路を接続するときに、8ビットそろっていた方が都合が良い場合があります。
そのような時に、I/Oポートの一部の端子(兼用になっている端子)を切り替えて8ビットポートにする機能があります。
ポート切り替えレジスタA(PSRA)は64ピンパッケージ用で、I/OポートBのPB7,PB6端子をI/OポートCのPC1,PC0に切り換えることができます。
ポート切り替えレジスタB(PSRB)は48ピンパッケージ用で、I/OポートBのPB5,PB3,PB1,PB0端子をI/OポートCのPC3,PC2,PC1,PC0に切り換えることができます。
この機能を使っても、8ビットのポートにできるのはI/OポートCのみです。
PSRA,PSRBによるポートの切り替えは全ビット一括ではないので、必ずしも8ビットでなくても設定可能です。
/* ポート出力データレジスタ(出力データの初期状態) */
/* ポート方向レジスタ(出力にするポート追加) */
/* 駆動能力制御レジスタ(初期状態:通常出力) */