AKI-H8/3052fのCクロスコンパイラ環境でのはじめてのプログラミング
TNCTマザーボード
hitachiコンパイラVer2利用版

Copyright(C)12Nov004
coskx

1.はじめに
この文書は,Windows2000/XPパソコンにAKI-H8/300hのC言語クロスコンパイル環境での,コンパイル作業のための方法を記述しています。あらかじめ指導者あるいはパソコン管理者が構築したC言語クロスコンパイラ環境(秋月のセットで配布されている日立の評価コンパイラを利用します。)で,C言語によるH8プログラミングを学ぼうとする方がプログラミングを行ない,AKI-H8/3052fでプログラムが動作するまでを解説します。C言語のプログラミングについては別の文書で学んでください。


図1.1 TNCTマザーボードとAKI-H8/3052f

2.本文書で記述してある作業の特徴
Cプログラムソースファイルが出来上がったら,ドラッグアンドドロップを1回行なうだけです。他に何もすることはありません。簡単コマンドを用いるので,作業が効率的です。

サンプルファイルのダウンロード

DownLoad

前提
(1)「トランジスタ技術2002年3月号付録CDROM」より入手した,アセンブラ,Cコンパイラ関係ファイルおよびインクルードファイル,ライブラリファイルは,すべて「C:\Program Files\h8V2」( 「参考2」参照 )に入っているものとします。
(2)スタートアップルーチン「start3052.OBJ」も適当なフォルダ( 「参考3」参照 )に入っているものとします。
(3)コンパイル用コマンド「h8_3052.cmd」は「各作業ファイル」に入っているものとします。
(4)転送ソフト「h8w.exe」を利用します。h8w.exeの入っているフォルダ「H8W」は「C:\Program Files\h8v2\WRITER\H8W」を想定しています。

転送ソフト「h8w.exe」はyamasan氏のオープンツールです。次の場所から入手できます。
http://ym3.plala.jp/yamasan/

注意
この文書で扱っているh8_3052.cmdはWindows2000,WindowsXP,WindowsVista,Windows7で使用可能です。

3.プログラムの作成から実行まで
シングルボードマイコンAKI-H8/3052内で動作するプログラムはパソコン上で開発され、シングルボードマイコンAKI-H8/3052のフラッシュメモリに書き込まれます。パソコンで開発されるソースプログラムはC言語で記述され、クロスコンパイラにより、オブジェクトプログラムに変換され、最後はフラッシュメモリ書き込み形式(XXXX.MOT)になります。
シングルボードマイコンAKI-H8/3052を動作させるまでの大きな流れは以下のようになります。
(1)パソコン上で作業用のフォルダの用意
(2)パソコン上でCソースプログラムの作成
(3) パソコン上でダウンロード形式ファイル(実行プログラム)の作成(クロスコンパイル、コード変換)
(4)パソコン上の転送ソフトによる,ダウンロード形式ファイル(実行プログラム)のAKI-H8/3052への書き込み操作
これら四つの作業によりシングルボードマイコン内で動作させることが出来ます。

4.テンプレートフォルダの実行
(1)図3.1に示すテンプレートフォルダでの実行の様子を確かめてみよう。テンプレートフォルダは ここ に含まれています。


図3.1 小坂のテンプレートフォルダ

(2)テンプレートフォルダがダウンロードできたら,解凍し,「xxxxxx.c」の内容をエディタで確かめてみてください。
プログラムは,AKI-H8/3052マザーボード上のLEDを点滅させるものです。プログラムの内容には深入りしないことにしましょう。

リスト プログラムソースファイル"xxxxxx.c"

/*  マザーボード上のLEDの1秒ごとのON-OFFを行う  */

#include <3052f.h>
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<4156;j++);    /*4156は実測によって求めた値 25MHz駆動*/
    }
}
main()
{
    /*P5の下位2ビットを出力に設定*/
    /* P5のDDRの下位2ビットに1を与えるとこの設定になる*/
    /*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
    P5.DDR =  0x3;     /*0x3 = 00000011(二進数)*/
    while(1) {/*これは無限ループ*/
        /*LED0をONにする  P5のDRの第0ビットを1にする*/
        /*DRとはDataRegister(データレジスタ)*/
        P5.DR.BIT.B0=1;
        /*LED1をOFFにする  P5のDRの第1ビットを0にする*/
        P5.DR.BIT.B1=0;
        msecwait(1000);/*1000msecの間なにもしない*/
        /*LED0をOFFにする  P5のDRの第0ビットを0にする*/
        P5.DR.BIT.B0=0;
        /*LED1をONにする  P5のDRの第1ビットを1にする*/
        P5.DR.BIT.B1=1;
        msecwait(1000);
    }
}


(3)この後の作業は次のようになります。
ただし,図3.1のテンプレートフォルダは「デスクトップ」あるいは「マイドキュメント」の中にあるとします。

表3.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順

 

パソコン側

マイコンH8側

(1)  

H8/3052のTNCTマザーボード上のモードスイッチを「Prog」側に倒してから電源スイッチをONにします。
電源LEDが点灯します。

重要 電源をONしてからモードスイッチを切り替えるという逆手順では動作しません。


奥側が「Prog」,手前側が「Run」

(2)

ソースファイル(xxxxxx.c)のアイコンを「h8_3052.cmd」のアイコン上にドラッグアンドドロップします。
「コンパイル」—「リンク」—「コンバート」が行なわれた後に,H8のフラッシュメモリへ,実行プログラムの書き込みが行なわれます。

コンパイルの時の画面例(Windowsxp)

Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 23Jan2004 coskx
Copyright(c) 28Jun2002 coskx

H8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.

H8S,H8/300 SERIES CROSS ASSEMBLER Ver. 2.0A Evaluation software
Copyright (C) Hitachi, Ltd. 1994,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1994,1998
Licensed Material of Hitachi, Ltd.
  *****TOTAL ERRORS       0
  *****TOTAL WARNINGS     0
H SERIES LINKAGE EDITOR Ver. 5.3B Evaluation software
Copyright (C) Hitachi, Ltd.1989,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1990,1998
Licensed Material of Hitachi, Ltd.

: ROM (D,X)
:
: ;ROMエリア=00000-07fff
: ;RAMエリア=fdf10-fff0f
: START P,C,D(100),X,B(0FFDF10)
: EXIT

LINKAGE EDITOR COMPLETED

H SERIES SYSROF STYPE OBJECT CONVERTER Ver. 1.5B Evaluation software
Copyright (C) Hitachi, Ltd. 1988,1997
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1988,1997
Licensed Material of Hitachi, Ltd.


OBJECT CONVERTER COMPLETED

h8w.exe
MOT file writing completed
Pushing any key leads the exit.

 
(3)  

<1>転送が終了したら、TNCTマザーボード上の電源スイッチをOFFにします。
<2>モードスイッチをラン(Run)にしてから電源スイッチをONにします。
電源LEDが点灯します。

重要 電源をONしてからモードスイッチを切り替えるという逆手順では動作しません。

(4)ここまでの作業が順調に出来ていたら,AKI-H8/3052マザーボード上の2つのLEDが点滅して動作が確認できるはずです。

5.新規プログラムの開発手順

5.1 パソコン上で作業用のフォルダの用意
作業準備は作業用フォルダを適当な場所に作る作業です。
作業用のフォルダを用意します。ここではled00という名前のフォルダを使用することにします。
その中には以下のファイルを用意しておきます。
(1)h8_3052.cmd 小坂作成
(2)h8_3052.h 小坂作成
(3)h8_3052.sub 小坂作成
これ以外に
(4)to_H8.ht ハイパーターミナル設定ファイル
     (RS232C設定が終わっているもの 38400baud, Async, 8bit , NoParity, stop1)
が入っていると便利です。
これ以降の作業はすべてこのフォルダ内で行われます。

テンプレートフォルダの複製を作ってフォルダ名をled00としてもよいでしょう)

5.2 プログラムの作成
Windowsマシン上のエディタ上で、C言語で記述されているソースプログラムを作成します。
例えばled00.cを作るという仮定で以下の説明にはいります。リストにあるファイルを作成してください。
このリストをコピー&ペーストするとよいでしょう。

リスト プログラムソースファイル"led00.c"

/*  マザーボード上のLEDの1秒ごとのON-OFFを行う  */

#include <3052f.h>
void msecwait(int msec)
/*msec間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<4156;j++);    /*4156は実測によって求めた値 25MHz駆動*/
    }
}
main()
{
    /*P5の下位2ビットを出力に設定*/
    /* P5のDDRの下位2ビットに1を与えるとこの設定になる*/
    /*DDRとはDataDirectionRegister(データ方向設定レジスタ)*/
    P5.DDR =  0x3;     /*0x3 = 00000011(二進数)*/
    while(1) {/*これは無限ループ*/
        /*LED0をONにする  P5のDRの第0ビットを1にする*/
        /*DRとはDataRegister(データレジスタ)*/
        P5.DR.BIT.B0=1;
        /*LED1をOFFにする  P5のDRの第1ビットを0にする*/
        P5.DR.BIT.B1=0;
        msecwait(1000);/*1000msecの間なにもしない*/
        /*LED0をOFFにする  P5のDRの第0ビットを0にする*/
        P5.DR.BIT.B0=0;
        /*LED1をONにする  P5のDRの第1ビットを1にする*/
        P5.DR.BIT.B1=1;
        msecwait(1000);
    }
}

ここまでの作業でフォルダled00の中には

(1)h8_3052.cmd
(2)h8_3052.h
(3)to_H8.ht ハイパーターミナル設定ファイル
(4)h8_3052.sub 小坂作成
(5)led00.c

ができているはずです。

5.3 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作
Cプログラムソースファイル「led00.c」が出来ましたら,次の手順で実行してください。

表4.1 フラッシュメモリ書き込み形式ファイルの作成とROMライター書き込み操作から実行までの手順

 

パソコン側

マイコンH8側

(1) もしハイパーターミナルなどCOMポートを使用しているソフトがパソコン上で動作している時はそれらのソフトを中止します。  
(2)  

H8/3052のTNCTマザーボード上のモードスイッチを「Prog」側に倒してから電源スイッチをONにします。
電源LEDが点灯します。

重要 電源をONしてからモードスイッチを切り替えるという逆手順では動作しません。


奥側が「Prog」,手前側が「Run」

(3)

出来上がったソースファイル(led00.c)のアイコンを「h83052.cmd」のアイコン上にドラッグアンドドロップします。
「コンパイル」—「リンク」—「コンバート」が行なわれた後に,H8/3052のフラッシュメモリへ,実行プログラムの書き込みが行なわれます。

 
(4)  

転送が終了したら、TNCTマザーボード上の電源スイッチをセンタに戻し,OFFにします。

(5) 必要ならパソコン側で「to_H8.ht」をダブルクリックしてターミナルアプリケーション「ハイパーターミナル」を立ち上げます。  
(6)  

<1>転送が終了したら、TNCTマザーボード上の電源スイッチをOFFにします。
<2>モードスイッチをラン(Run)にしてから電源スイッチをONにします。
電源LEDが点灯します。

重要 電源をONしてからモードスイッチを切り替えるという逆手順では動作しません。

注意(1) ネットワーク上のフォルダを利用する場合はネットワークドライブを割り当ててから実行する。ただし,動作が遅いので勧めません。自分のHD上で作業しましょう。
注意(2) もしマルチソースファイルでのプログラミングの時は必要なソースファイルすべてを同時にドラッグアンドドロップしてください。5個まで対応しています。

このWebページの最後の参考リスト1にh8_3052.cmdのソースを示します。自分の環境に合うように設定を変えても結構です。

ここまでの作業でフォルダled00の中には

(1)h8_3052.cmd
(2)h8_3052.h
(3)to_H8.ht    ハイパーターミナル設定ファイル
(4)h8_3052.sub 
(5)led00.c
(6)led00.MOT  フラッシュメモリ書き込み形式ファイル(実行プログラム)
ができているはずです。

なお「コンパイル−リンク−コンバート−転送」作業における失敗時の画面例を以下に示します。

失敗例1 Cソースプログラムで文法エラーがあった時
(led01.cの20行目に宣言されていない変数iがある)
(エラーメッセージでファイル名の次はエラー行番号!)

Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 23Jan2004 coskx
Copyright(c) 28Jun2002 coskx

H8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.

led01.c(20) : 2225 (E) UNDECLARED NAME: "i"
led01.c(20) : 2220 (E) MODIFIABLE LVALUE REQUIRED
*** error *** コンパイルエラーがありました。
Pushing any key leads the exit.

失敗例2 リンクエラーがあった時
関数名「SCIA_printf」が見つからない(関数名のミスタイプのことが多い)

Compile, link and convert command for H8 C-programing with V2 ver1.00
Copyright(c) 23Jan2004 coskx
Copyright(c) 28Jun2002 coskx

H8S,H8/300 SERIES C Compiler Ver. 2.0D Evaluation software
Copyright (C) 1994,1996 Hitachi,Ltd.
Licensed Material of Hitachi,Ltd.
Licensed Material of Hitachi Engineering Co.,Ltd.

H8S,H8/300 SERIES CROSS ASSEMBLER Ver. 2.0A Evaluation software
Copyright (C) Hitachi, Ltd. 1994,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1994,1998
Licensed Material of Hitachi, Ltd.
  *****TOTAL ERRORS       0
  *****TOTAL WARNINGS     0
H SERIES LINKAGE EDITOR Ver. 5.3B Evaluation software
Copyright (C) Hitachi, Ltd.1989,1998
Copyright (C) HITACHI MICROCOMPUTER SYSTEM LTD. 1990,1998
Licensed Material of Hitachi, Ltd.

: ROM (D,X)
:
: ;ROMエリア=00000-07fff
: ;RAMエリア=fdf10-fff0f
: START P,C,D(100),X,B(0FFDF10)
: EXIT
** 105 UNDEFINED EXTERNAL SYMBOL(axxxxxx._SCIA_printf)

LINKAGE EDITOR COMPLETED

*** error *** リンクエラーです。
Pushing any key leads the exit.

失敗例3 AKI-H8/3052のフラッシュメモリ書き込み受け入れ態勢が完全でない時
(AKI-H8/3052の電源が入っていない時)
(ライタモードになっていない時)

失敗例4 「ハイパーターミナル」などのシリアルポートを
利用しているソフトが動いていてフラッシュメモリ書き込みソフトが
シリアルポート(COMポート)を取得できない時

.

5.4 プログラムの実行
「led00.MOT」がマイコンにフラッシュメモリ書き込みされて,実行します。正常に作業が終えていれば,マザーボード上の2つのLEDが点滅します。


参考1 h8_3052.cmdの内容

h8_3052.cmdの内容を参考リスト1に示します。

参考リスト1 motファイル作成用のコマンドファイル「h8_3052.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 TNCT

rem 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\start3052.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 %~p1

rem コンパイラのパスの設定
path=%path%;%mypath%
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8lib=%HOMEDRIVE%\Progra~1\h8v2\lib

rem もしMOTファイルがドラッグ&ドロップされたら,フラッシュメモリ書き込みだけ行なう
if %~x1==.mot goto DOWNLOAD
if %~x1==.MOT goto DOWNLOAD

rem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
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_3052.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=3052_F25M_P384.MOT >>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」であり,内容は次のとおりです。フォルダ名,ファイルの配置が異なる場合は「h83052.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
│      30652_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
│      start3052.OBJ 小坂追加
│         
└─WRITER
    └─H8W
         この内容はダウンロードしたフォルダそのままなので省略

 

参考3 「start3052.obj」の利用の利点

 

(1)初期化されたグローバル変数,および関数内の初期化されたstatic変数はRAM領域で使えるようにします。const修飾子を持つ初期化されたグローバル変数,およびconst修飾子を持つ関数内の初期化されたstatic変数はROM領域に割り当てられるようにします。

ファイルstart3052.src,start3052.objのダウンロード

DownLoad

参考4 「h8_3052.h」の利用の利点

(1)マザーボード上のスイッチ・LEDの制御関数をインクルードファイルで提供します。

(2)プログラムをフラッシュメモリ書き込みに用いた通信回線とWindowsマシンのハイパーターミナルを用いた表示環境を提供し,printf()に似た整数変数出力ルーチン,整数入力ルーチンをインクルードファイルで提供します。

(3)LCDへの出力関数を提供します。