H8/3069FのCクロスコンパイラ環境でのはじめてのプログラミング
Copyright(C)7Oct2009
coskx
1.はじめに
この文書は,WindowsXP,WindowsVista,Windows7パソコンにH8/300hのC言語クロスコンパイル環境での,コンパイル作業のための方法を記述しています。あらかじめ指導者あるいはパソコン管理者が構築したC言語クロスコンパイラ環境(日立の評価コンパイラVer2を利用します。)で,C言語によるH8プログラミングを学ぼうとする方がプログラミングを行ない,「AKI-H8/3069フラッシュマイコンLANボード」(CPUカードAE-3069-LAN-BOARD-C,マザーボードAE-H8/3068)でプログラムが動作するまでを解説します。C言語のプログラミングについては別の文書で学んでください。
左上:Dsub9 シリアルコネクタ | |
図1.1 AKI-H8/3069 AKI-マザーボード |
図1.2 AKI-H8/3069 LAN+CPU Card |
|
|
図1.3 AKI-H8/3069, TNCT試作マザーボード |
図1.4 AKI-H8/3069, TNCTマザーボード |
2.マザーボード追加加工
購入したばかりのマザーボードでは,LEDが2つと4ビットのディップスイッチが付いているだけなので,プッシュスイッチを5つ追加しました。
使用していないポートとして,ポート2のビット3から7までを割り当てました。プルアップはport2の機能を用います。
図1.1における上部の5つの黒いボタンが追加したプッシュスイッチです。
P2-3 CN2-32 PushSW1
P2-4 CN2-33 PushSW1
P2-5 CN2-34 PushSW2
P2-6 CN2-35 PushSW3
P2-7 CN2-36 PushSW4図2.1 プッシュスイッチ増設
その結果,各デバイスは次のようにIOポートが割り当てられている。
LED
CPU コネクタ デバイス P4-bit6 CN2-11 LED1 P4-bit7 CN2-12 LED2 4bitディップスイッチ
CPU コネクタ デバイス P5-bit0 CN2-37 4bitSW-1 P5-bit1 CN2-38 4bitSW-2 P5-bit2 CN2-39 4bitSW-3 P5-bit3 CN2-40 4bitSW-4 LCD
CPU コネクタ デバイス P4-bit0 CN2-5 LCD-11 DB4 P4-bit1 CN2-6 LCD-12 DB5 P4-bit2 CN2-7 LCD-13 DB6 P4-bit3 CN2-8 LCD-14 DB7 P4-bit4 CN2-9 LCD-4 RS P4-bit5 CN2-10 LCD-6 ES プッシュスイッチ
P2-bit3 CN2-32 PushSW1 P2-bit4 CN2-33 PushSW2 P2-bit5 CN2-34 PushSW3 P2-bit6 CN2-35 PushSW4 P2-bit7 CN2-36 PushSW5
3.本文書で記述してある作業の特徴
Cプログラムソースファイルが出来上がったら,ドラッグアンドドロップを1回行なうだけです。他に何もすることはありません。簡単コマンドを用いるので,作業が効率的です。
サンプルファイルのダウンロード | |
|
前提
(1)「トランジスタ技術2002年3月号付録CDROM」より入手した,アセンブラ,Cコンパイラ関係ファイルおよびインクルードファイル,ライブラリファイルは,すべて「C:\Program
Files\h8V2」( 「参考2」参照
)に入っているものとします。
(2)スタートアップルーチン「start3069.OBJ」も適当なフォルダ(
「参考3」参照
)に入っているものとします。
(3)コンパイル用コマンド[h8_3069.cmd]は「各作業ファイル」に入っているものとします。
(4)転送ソフト「h8w.exe」を利用します。h8w.exeの入っているフォルダ「H8W」は「C:\Program
Files\h8v2\WRITER\H8W」を想定しています。
転送ソフト「h8w.exe」はyamasan氏のオープンツールです。次の場所から入手できます。
http://ym3.plala.jp/yamasan/
注意
この文書で扱っているh8_3069.cmdはWindows2000,WindowsXP,WindowsVista,Windows7で使用可能です。
4.プログラムの作成から実行まで
シングルボードマイコン「AKI-H8/3069フラッシュマイコンLANボード」内で動作するプログラムは,パソコン上で開発され,シングルボードマイコンAKI-H8/3069のフラッシュメモリに書き込みされます。パソコンで開発されるソースプログラムはC言語で記述され,クロスコンパイラにより,オブジェクトプログラムに変換され、最後はフラッシュメモリ書き込み形式(XXXX.MOT)になった,H8/3069に書き込まれます。
シングルボードマイコンH8/3069を動作させるまでの大きな流れは以下のようになります。
(1)パソコン上で作業用のフォルダの用意
(2)パソコン上でCソースプログラムの作成
(3) パソコン上でダウンロード形式ファイル(実行プログラム)の作成(クロスコンパイル、コード変換)
(4)パソコン上の転送ソフトによる,ダウンロード形式ファイル(実行プログラム)のAKI-H8/3069への書き込み操作
これら四つの作業によりシングルボードマイコン内で動作させることが出来ます。
5.テンプレートフォルダの実行
(1)図5.1に示すテンプレートフォルダでの実行の様子を確かめてみます。
図5.1 小坂のテンプレートフォルダ
(2)テンプレートフォルダがダウンロードできたら,解凍し,「xxxxxx.c」の内容をエディタで確かめてみてください。
プログラムは,H8/3069マザーボード上のLEDを点滅させるものです。プログラムの内容には深入りしないことにしましょう。
リスト プログラムソースファイル"xxxxxx.c"
/* マザーボード上のLEDの1秒ごとのON-OFFを行う */
#include <3069s.h>
void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<3352;j++); /*3352は実測によって求めた値 20MHz駆動*/
}
}main()
{
/*P4の上位2ビットを出力に設定*/
/* P4のDDRの上位2ビットに1を与えるとこの設定になる*/
/*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
P4DDR = 0xc0; /*0xc0 = 11000000(二進数)*/
while(1) {/*これは無限ループ*/
/*LED0をONにする P4のDRの第6ビットを1にする*/
/*DRとはDataRegister(データレジスタ)*/
P4DR.BIT.B6=1;
/*LED1をOFFにする P4のDRの第7ビットを0にする*/
P4DR.BIT.B7=0;
msecwait(1000);/*1000msecの間なにもしない*/
/*LED0をOFFにする P4のDRの第6ビットを0にする*/
P4DR.BIT.B6=0;
/*LED1をONにする P4のDRの第7ビットを1にする*/
P4DR.BIT.B7=1;
msecwait(1000);
}
}
(3)この後の作業は次のようになります。
ただし,図3.1のテンプレートフォルダは「デスクトップ」あるいは「マイドキュメント」の中にあるとします。
表3.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |||
(1) |
<1>H8/3069のCPUカードに5V電源を接続します。接続した瞬間に青いLED3がピカッと一瞬光ります。 <2>H8/3069のCPUカード上の状態選択スイッチをライト(Write)モードにします。(下の写真参照) ライトモードとはマイコンH8/3069がパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>H8/3069のCPUカード上のリセットスイッチ。(下の写真参照) を押してプログラムを読み込めるようにします。(この時は,なにも起こりません)
| |||
(2) |
ソースファイル(xxxxxx.c)のアイコンを「h8_3069.cmd」のアイコン上にドラッグアンドドロップします。
|
|||
(3) |
<1>転送が終了したら、H8/3069のCPUカード上の状態選択スイッチをラン(Run)モードにします。(下の写真参照) <2>H8/3069のCPUカード上のリセットスイッチ(下の写真参照) を押して,書きこんだプログラムを起動します。 <3>電源を抜くのはすべての作業が終わってからでOKです。電源を抜かなくても次のプログラムの作業ができます。
|
(4)ここまでの作業が順調に出来ていたら,H8/3069マザーボード上の2つのLEDが点滅して動作が確認できるはずです。
6.新規プログラムの開発手順
6.1 パソコン上で作業用のフォルダの用意
作業準備は作業用フォルダを適当な場所に作る作業です。
作業用のフォルダを用意します。ここではled00という名前のフォルダを使用することにします。
その中には以下のファイルをテンプレートからコピーして用意しておきます。
(1)h8_3069.cmd 小坂作成
(2)h8_3069.h 小坂作成
(3)h8_3069.sub 小坂作成
これ以外に
(4)to_H8.ht
ハイパーターミナル設定ファイル
(RS232C設定が終わっているもの 38400baud, Async, 8bit , NoParity,
stop1)
が入っていると便利です。
これ以降の作業はすべてこのフォルダ内で行われます。
(テンプレートフォルダの複製を作ってフォルダ名をled00としてもよいでしょう)
6.2 プログラムの作成
Windowsマシン上のエディタ上で、C言語で記述されているソースプログラムを作成します。
例えばled00.cを作るという仮定で以下の説明にはいります。リストにあるファイルを作成してください。
このリストをコピー&ペーストするとよいでしょう。
リスト プログラムソースファイル"led00.c"
/* マザーボード上のLEDの1秒ごとのON-OFFを行う */
#include <3069s.h>
void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i<msec;i++) {
for (j=0;j<3352;j++); /*3352は実測によって求めた値 20MHz駆動*/
}
}main()
{
/*P4の上位2ビットを出力に設定*/
/* P4のDDRの上位2ビットに1を与えるとこの設定になる*/
/*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
P4DDR = 0xc0; /*0xc0 = 11000000(二進数)*/
while(1) {/*これは無限ループ*/
/*LED0をONにする P4のDRの第6ビットを1にする*/
/*DRとはDataRegister(データレジスタ)*/
P4DR.BIT.B6=1;
/*LED1をOFFにする P4のDRの第7ビットを0にする*/
P4DR.BIT.B7=0;
msecwait(1000);/*1000msecの間なにもしない*/
/*LED0をOFFにする P4のDRの第6ビットを0にする*/
P4DR.BIT.B6=0;
/*LED1をONにする P4のDRの第7ビットを1にする*/
P4DR.BIT.B7=1;
msecwait(1000);
}
}
ここまでの作業でフォルダled00の中には
(1)h8_3069.cmd
(2)h8_3069.h
(3)to_H8.ht ハイパーターミナル設定ファイル
(4)led00.c
ができているはずです。
6.3 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作
Cプログラムソースファイル「led00.c」が出来ましたら,次の手順で実行してください。
表6.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順
パソコン側 |
マイコンH8側 | |
(1) | もしハイパーターミナルなどCOMポートを使用しているソフトがパソコン上で動作している時はそれらのソフトを中止します。 | |
(2) |
<1>H8/3069のCPUカードに5V電源が接続されていない場合は5V電源を接続します。接続した瞬間に青いLED3がピカッと一瞬光ります。 <2>H8/3069のCPU上の状態選択スイッチをライト(Write)モードにします。(下の写真参照) ライトモードとはマイコンH8/3069がパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。 <3>H8/3069のCPUカード上のリセットスイッチ。(下の写真参照) を押してプログラムを読み込めるようにします。(この時は,なにも起こりません)
| |
(3) |
出来上がったソースファイル(led00.c)のアイコンを「h8_3069.cmd」のアイコン上にドラッグアンドドロップします。 |
|
(4) | 必要ならパソコン側で「to_H8.ht」をダブルクリックしてターミナルアプリケーション「ハイパーターミナル」を立ち上げます。 | |
(5) |
<1>転送が終了したら、H8/3069のCPUカード上の状態選択スイッチをラン(Run)モードにします。(下の写真参照) <2>H8/3069のCPUカード上のリセットスイッチ(下の写真参照) を押して,書きこんだプログラムを起動します。
| |
(6) | 電源を抜くのはすべての作業が終わってからでOKです。電源を抜かなくても次のプログラムの作業ができます。 |
注意(1) ネットワーク上のフォルダを利用する場合はネットワークドライブを割り当ててから実行する。ただし,動作が遅いので勧めません。自分のHD上で作業しましょう。
注意(2) もしマルチソースファイルでのプログラミングの時は必要なソースファイルすべてを同時にドラッグアンドドロップしてください。5個まで対応しています。
このWebページの最後の参考リスト1にh8_3069.cmdのソースを示します。自分の環境に合うように設定を変えても結構です。
なお「コンパイル−リンク−コンバート−転送」作業における失敗時の画面例を以下に示します。
失敗例1 Cソースプログラムで文法エラーがあった時
(led01.cの7行目に宣言されていない変数iとjがある)
(エラーメッセージでファイル名の次はエラー行番号!)
led01.C 7 2225 (E) UNDECLARED NAME: "i"
led01.C 7 2220 (E) MODIFIABLE LVALUE REQUIRED
led01.C 7 2225 (E) UNDECLARED NAME: "j"
led01.C 7 2220 (E) MODIFIABLE LVALUE REQUIRED
*** error *** コンパイルエラーがありました。
Pushing any key leads the exit.
失敗例2 リンクエラーがあった時
関数名が見つからない(関数名のミスタイプのことが多い)
** 105 UNDEFINED EXTERNAL SYMBOL(led02._wait)LINKAGE EDITOR COMPLETED
*** error *** リンクエラーです。
Pushing any key leads the exit.
失敗例3 H8/3069のフラッシュメモリ書き込み受け入れ態勢が完全でない時
(H8/3069の電源が入っていない時)
(ライタモードになっていない時)
このようなダイアログが出ます
失敗例4 「ハイパーターミナル」などのシリアルポートを
利用しているソフトが動いていてフラッシュメモリ書き込みソフトが
シリアルポート(COMポート)を取得できない時
このようなダイアログが出ます
6.4 プログラムの実行
「led00.MOT」がマイコンにフラッシュメモリ書き込みされて,実行します。正常に作業が終えていれば,マザーボード上の2つのLEDが点滅します。
参考1 h8_3069.cmdの内容
h8_3069.cmdの内容を参考リスト1に示します。
参考リスト1 motファイル作成用のコマンドファイル「h8_3069.cmd」
@echo off
echo Compile, link and convert command for H8 C-programing with V2 ver1.00
echo Copyright(c) 23Jan2004 coskx
echo Copyright(c) 28Jun2002 coskx TNCTrem H8Cコンパイラver2のセットに対応しています。
rem Cのソースファイルおよびobjファイルは最大で5個までドラッグ&ドロップに対応
rem 複数ファイルのドロップの場合は次のことに気をつけること
rem 選択されているファイルのうちフォルダ表示で最も上の列(この列に複数のファイルがある場合は左端)
rem にあるファイル名でフラッシュメモリ書き込み形式ファイルの名前が決まる。そのためmain()を持つファイルをその
rem 位置に置くと良い。
rem MOTファイルをドラッグ&ドロップするとすぐフラッシュメモリ書き込みが始まる。rem *************** カスタマイズ領域 begin *******************
rem コンパイル作業に必要なパスの追加を行います。
set mypath=%HOMEDRIVE%\Program Files\h8v2\bin
rem スタートアップルーチンを記述します。
set startuproutine=%HOMEDRIVE%\Progra~1\h8v2\lib\start3069.obj
rem H8のライブラリを指定します。
set h8library=%HOMEDRIVE%\Progra~1\h8v2\lib\c38ha.lib
rem フラッシュメモリ書き込み直前にポーズしてそのままフラッシュメモリ書き込みするかどうか問い合わせします
rem YES:問い合わせる NO:問い合わせない
set downloadready=NO
rem 正常にフラッシュメモリ書き込みが終了した場合はそのまま終了する
rem YES:そのまま終了する NO:そのまま終了せず停止
set downloadquit=NO
rem *************** カスタマイズ領域 end *******************rem ----------------------------------------------------------------------------
rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1rem コンパイラのパスの設定
path=%path%;%mypath%
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8lib=%HOMEDRIVE%\Progra~1\h8v2\librem もしMOTファイルがドラッグ&ドロップされたら,フラッシュメモリ書き込みだけ行なう
if %~x1==.mot goto DOWNLOAD
if %~x1==.MOT goto DOWNLOADrem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
if exist %~n1.obj goto COMPILE
if not exist %~n1.c goto NO_SOURCE_ERROR:COMPILE
rem ----------------------------------------------------------------------------
rem コンパイル 〜.objの作成 5個のファイル入力に対応
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c ch38 -cpu=300ha -include=%h8inc% -OUTCODE=SJIS -CODE=ASMCODE %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.src del %%p.lst
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if not exist %%p.src goto COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c asm38 %%p
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if not exist %%p.obj goto COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.src del %%p.src:LINK
rem リンク 〜.absの作成
lnk %startuproutine% %~n1 %~n2 %~n3 %~n4 %~n5 -subcommand=h8_3069.sub -LIB=%h8library% -O=%~n1 -P=%~n1 >q9j2h5c4k6b1.txt
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
type q9j2h5c4k6b1.txt
find "**" q9j2h5c4k6b1.txt >nul
echo;
if errorlevel 1 goto CONVERT
del q9j2h5c4k6b1.txt
del %~n1.abs
goto LINK_ERROR:CONVERT
del q9j2h5c4k6b1.txt
rem ----------------------------------------------------------------------------
rem Sフォーマットに変換 〜.motの作成
cnvs %~n1.abs
del %~n1.abs
echo;rem motファイルの転送
if %downloadready%==NO goto DOWNLOAD
echo Please set AKI-H8 ready and hit any key / push 'Ctrl+C' if you want
pause >nul
:DOWNLOAD
echo h8w.exe
echo [AutoPgm] >myAutoPgm.ini
echo AutoStart=1 >>myAutoPgm.ini
echo AutoExit=1 >>myAutoPgm.ini
echo CtrlProgam=3069_F20M_P576.INF >>myAutoPgm.ini
echo UserMotPath=%~n1.mot >>myAutoPgm.ini
"C:\Program Files\h8v2\WRITER\H8W\h8w.exe" -GO .\myAutoPgm.ini
del myAutoPgm.ini
if ERRORLEVEL 0 echo MOT file writing completed
del %~n1.map
if %downloadquit%==YES exit
goto TERMINAL:NO_SOURCE_ERROR
echo *** error *** Cのソースファイルが指定されていません。
goto TERMINAL:COMPILE_ERROR
for %%p in (%~n1 %~n2 %~n3 %~n4 %~n5 ) do if exist %%p.c if exist %%p.obj del %%p.obj
echo *** error *** コンパイルエラーがありました。
goto TERMINAL:LINK_ERROR
echo *** error *** リンクエラーです。
goto TERMINAL:TERMINAL
echo Pushing any key leads the exit.
pause >nul
exit
補足1 フラッシュメモリ書き込み形式ファイル(.MOTファイル)をドラッグ&ドロップすると直ちに転送が始まります
補足2 「〜.c」のみでなく「〜.obj」も同時にドラッグ&ドロップが可能です
参考2 「%HOMEDRIVE%\Program Files\h8v2」の内容
Cコンパイラ類のあるフォルダは「c:\Program Files\h8v2」であり,内容は次のとおりです。フォルダ名,ファイルの配置が異なる場合は「h8_3069.cmd」中の必要なところを直してください。
C:\PROGRA~1\H8V2
├─BIN
│ ASM38.EXE
│ C38ASM.EXE
│ C38CGN.EXE
│ C38FRNT.EXE
│ C38MID.EXE
│ C38PEP.EXE
│ CH38.EXE
│ CNVS.EXE
│ LNK.EXE
│ OPT38.EXE
│ OPTLNK38.EXE
│
├─INCLUDE
│ 3048F.H
│ 3048FONE.H
│ 3048S.H
│ 3052f.h
│ 3069S.H 名無しのビットフィールド変数にダミー名をつけたもの
│ 3069S_org.H オリジナル
│ 3664S.H
│ ASSERT.H
│ CTYPE.H
│ ERRNO.H
│ FLOAT.H
│ INDIRECT.H
│ LIMITS.H
│ MACHINE.H
│ MATH.H
│ NO_FLOAT.H
│ SETJMP.H
│ STDARG.H
│ STDDEF.H
│ STDIO.H
│ STDLIB.H
│ STRING.H
│
├─LIB
│ C38HA.LIB
│ C38HAS.LIB
│ C38HN.LIB
│ C38HNS.LIB
│ C38REG.LIB
│ C38REGS.LIB
│ C8S26A.LIB
│ C8S26AS.LIB
│ C8S26N.LIB
│ C8S26NS.LIB
│ start3069.OBJ 小坂追加
│
└─WRITER
└─H8W
この内容はダウンロードしたフォルダそのままなので省略
参考3 「start3069.OBJ」について
(1)初期化されたグローバル変数,および関数内の初期化されたstatic変数はRAM領域で使えるようにします。const修飾子を持つ初期化されたグローバル変数,およびconst修飾子を持つ関数内の初期化されたstatic変数はROM領域に割り当てられるようにします。
(2)2MbyteDRAMを使うための初期化が行われています。
ファイルstart3069.src,start3069.objのダウンロード
DownLoad
参考4 「h8_3069.h」の利用の利点
(1)マザーボード上のスイッチ・LEDの制御関数をインクルードファイルで提供します。
(2)プログラムをフラッシュメモリ書き込みに用いた通信回線と,Windowsマシンのハイパーターミナルを用いた表示環境を提供し,printf()に似た整数変数出力ルーチン,整数入力ルーチンをインクルードファイルで提供します。
(3)LCDへの出力関数を提供します。