本連載で作成するプログラムの流れは、以下のようになっています。
マイコンおよび開発環境の種類にもよりますが、本連載で使用するH8マイコンとHEWを使えば、大部分の初期化プログラムは、C言語で記述できます。C言語で記述できないリセットベクタのアドレスとスタックポインタは、アセンブリ言語で記述します。リスト1は最低限必要なアセンブリ言語による初期化プログラムの例です。
.CPU 300HA .SECTION A,DATA,LOCATE=H'000000 .IMPORT _main .DATA.L H'00100 ;リセットベクタ .ORG H'000100 MOV.L #H'FFF10,ER7 ;スタックポインタ設定 jmp @_main .END
ターゲットボードの電源をONにすると、プログラムカウンタ(PC)はリセットベクタの先頭アドレスを指します。これを行っているのが「.DATA.L H'00100」と「.ORG H'000100」です。これによりCPUリセット番地が、100H番地に決まります。
次に「MOV.L #H'FFF10,ER7」によってスタック領域の先頭アドレス(スタックポインタ:ER7レジスタ)を設定しています。アセンブリ言語でしか記述できない初期設定を行った後、jmp命令でmain関数へ分岐します。これ以降はC言語により、そのほかの初期化を行います。
H8/3048F-ONEには、10本の入出力ポートと1本の入力専用ポートがあります。各ポートは兼用端子となっていますので、I/Oポートを初期化するプログラムでは、各端子の入出力方向や格納データの初期化を行います。具体的には以下のポートを初期化します(表2)。
上記以外にも以下の初期設定を行います。
これらの初期化プログラムは、すべてC言語で記述できます。以下では、ポート2に接続されたLEDを例題として、初期化プログラムとLED点灯プログラムを解説します。
ターゲットボードには、LEDが8個搭載されています。各LED(LED1〜8)は、ポート2の各端子(P20〜P27)に接続されています。ポートから0を出力するとLEDは点灯、1を出力するとLEDは消灯します。
ポート2は、アドレス出力とポートを兼用した8ビット入出力ポートです。ポート2をアドレス出力として使うか、入出力ポートとして使うかは、CPU動作モードにより異なります。
モード1〜4(内蔵ROM無効拡張モード)の場合、ポート2はアドレスバス(A15〜A8)の出力端子となります。モード5および6(内蔵ROM有効拡張モード)の場合は、ポート2データディレクションレジスタ(P2DDR)の設定により、アドレスバス(A15〜A8)または入力ポートとなります。
本連載で使用しているターゲットボード(モード7:シングルチップモード)の場合、ポート2は入出力ポートとなります。ここでポート2は、以下のレジスタにより制御されます。
P2DDRは、8ビットのライト専用のレジスタです。ポート2の各端子の入出力(ポート2を入力ポートとして使うか、出力ポートとして使うか)をビットごとに指定することができます。以下はモード7の場合のP2DDRの仕様です。
P2DDRの各ビットに1をセットすると対応するポート2の端子は出力ポートとなり、0にクリアすると入力ポートとなります。ターゲットボードでポート2はLEDに接続されていますので、P2DDRの各ビットには1をセットします。
P2DRは、8ビットのリード/ライト可能なレジスタです。ポート2の出力データを格納します。ポート2が出力ポートとして機能する場合、本レジスタの値がポートに接続された端子に出力されます。
P2PCRは8ビットのリード/ライト可能なレジスタです。ポート2に内蔵した入力プルアップMOSをビットごとに制御します。
Copyright © ITmedia, Inc. All Rights Reserved.