HEW4モニタデバッガ  
2010/04/25

TekuRoboでは、マイコンのプログラムを作成するにあたり、試行錯誤のために何度でもプログラムの書き換えができるフラッシュメモリタイプのマイコンを利用しています。H8/3052Fもフラッシュメモリタイプのひとつです。しかし、H8/3052Fのハードウェアマニュアルには「フラッシュメモリの書き換えは、100回まで可能です。」と書かれています。つまり100回書き換えを行うとお亡くなりになるということになります。ただし、今までのTekuRoboの経験で言うと、おおよそ300回程度までは行けるように思います。(正確に数えたわけではないので、あくまで感覚的にですが...) いずれにしても試行錯誤を行うたびにマイコンの寿命は確実に縮んでいます。そこで、寿命を縮めることなくプログラムの書き換えを行いつつプログラムの試行錯誤ができる仕組みをご紹介しましょう。それがモニタデバッガです。



1.モニタデバッガとは

モニタデバッガは、私達が作るユーザープログラムのデバッグを行うためのプログラムです。通常、ユーザープログラムはROM領域(フラッシュメモリ)に書き込まれ、アドレス先頭のPowerON Resetのベクタアドレスが示す処理から順に実行されていきます。一方このモニタデバッガでは、モニタデバッガのプログラムを通常通りROM領域に書き込んで、パソコン側で実行するモニタプログラム専用通信ソフト(PC側ソフト)とペアで動作します。私達が作ったユーザープログラムは、PC側ソフトを経由してマイコンのRAM領域に書き込まれます。そして、ユーザープログラムはPC側ソフトからの実行コマンドによって、モニタデバッガ経由で動作を開始します。モニタデバッガを用いることによって、特別なデバッグ用機材を必要とせず、実際にユーザープログラムを実行させたいハードウェア環境でデバッグを行うことができます。また、モニタデバッガの管理下にあるため、PC側ソフトから各種レジスタやROM、RAMの中身を参照したり、マイコンが持つ各種周辺インターフェイスに関するレジスタの値を書き換えたりといったことが出来るようになります。ただし、本来ROM領域に書き込まれるプログラムをRAM領域に書き込んで実行させるために、HEW4でビルドする際にセクションのマッピング設定(アドレス上への配置設定)を変更する必要があったり、それに対応した仮想ベクタ関連ファイルを準備する必要があるなど、私達素人には少し敷居が高いのも現実です。しかし、ユーザープログラムがRAM領域で動作するので、何度書き換えてもフラッシュメモリの寿命を縮めない上に、モニタデバッガが提供する各種デバッグ機能が使えるというのは魅力です。

今回、モニタデバッガの環境を整備するに当たっては、ルネサスエレクトロニクス純正のモニタプログラムと、モニタプログラム専用通信ソフトHtremを利用することにします。これらはルネサスエレクトロニクスのサイトからダウンロードすることができます。しかし、単純にダウンロードして即座に使えるというわけではなく、利用者の環境に合わせてカスタマイズし、HEW4でビルドしてmotファイルを作らなければなりません。更に、モニタデバッガ上で動かすユーザープログラムをビルドするための詳細な情報は公開されておらず、私達素人にはいったいどうしたら良いやら分からない、というものです。

そこで、今回は
kaniさんのWeb「Kani-GPIB=>簡易GP-IBコントローラと電子工作のページ」で公開されている「H8/3052Fモード7用モニタデバッガ生成メモ」の記事内容と公開されているファイル類を、ほとんどそのまま利用させて頂きました。詳しくはそちらをご覧下さい。

なので、ここであえてモニタデバッガの環境構築についての記事を公開する必要もないのですが、TekuRoboが環境構築を行う際に気がついた点なども交えてご紹介することにします。なお、ここではモニタデバッガの環境構築と動作の触りだけをご紹介しますが、モニタデバッガ自体の細かな利用方法については解説できませんのでご了承下さい。



2.関連ファイルのダウンロード

それでは、先ずはルネサスエレクトロニクスのサイトから、必要なファイルをダウンロードしましょう。
今回はトップページではなく、直接モニタデバッガがダウンロードできるサイトから入ります。ここをクリックしてサイトに入ったら、左のように少し下に移動します。

ターゲットとなるマイコンに書き込むモニタプログラムは「HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H用モニタプログラム」からダウンロードします。 (300hhew3.exe)
このファイルは自己解凍形式の圧縮ファイルなので、任意の場所に解凍してください。解凍されたフォルダの中に、readme.htmlファイルがあり、モニタデバッガプログラムをビルドするための説明が書かれていますので、そちらも参照して下さい。

■PC側で動作するプログラムは、「モニタプログラム専用通信ソフト Hterm」からダウンロードします。 
htermmdi.exe
このファイルも自己解凍形式の圧縮ファイルなので、任意の場所に解凍して下さい。特にインストール作業は必要なく、解凍されたフォルダの中にHterm.exeの実行ファイルがあるのでダブルクリックで直接実行できます。
Htermの取り扱い説明は、先ほどのモニタプログラム300hhew3.exeを解凍したフォルダの中に
monitor.htmlファイルがあるので、そちらを参照して下さい。



3.モニタデバッガプログラムのカスタマイズとビルド

先ほどダウンロードした300hhew3.exeを解凍したら、HEW4上で環境に合わせたカスタマイズを行い、モニタデバッガプログラムをビルドしてmotファイルを作ります。なお、試用版のHEW4はインストールから60日間を過ぎると64Kバイトを超えるリンクサイズのビルドができなくなるため、今回のモニタデバッガもビルドできなくなります。
チャレンジはお早めに!

  先ずHEW4を起動し、プロジェクト選択のための「ようこそ!」ダイアグラムで「別のプロジェクトワークスペースを選択する」を選んで「OK」を押します。
そこで表示されるファイル選択のダイアログから、300hhew3.exeを解凍したフォルダを指定し、
monitor.hwsを指定して「選択」を押します。
HEW4で開こうとしているmonitorプロジェクトのバージョンの違いにより、いくつかのダイアログが開きますが、全て「OK」を選択すると、モニタデバッガプログラムのmonitorプロジェクトが編集可能な状態で開きます。
ここで、monitor.cのソースファイルと、monitor.subのオブジェクトファイルをカスタマイズします。
 
 ■monitor.cのカスタマイズ
オリジナルではヘッダファイルが #include "3003.h"になっていますが、これを#include "
3052s.h" に書き換えます。
  ■monitor.subのカスタマイズ
各項目について、左図の通りに修正します。
1行目 INPUTの項目に、「
,LOWER」 を追記します。
これはモニタデバッガでprintfとscanfが使えるようにるすためのものです。

8行目 LIBRARYの項目で、「3003」を「
3052」に書き換えます。
これはデバイスをH8/3052Fに対応させるためのものです。

10行目 DEFINEの項目で、$BRR=の後を「19」から「
50」に書き換えます。これはPC側ソフトとの通信速度を設定するためのパラメータです。「Kani-GPIB=>簡易GP-IBコントローラと電子工作のページ」では「13」に設定しおり、本当は「13」をお奨めします。詳細はこの後に説明します。
  12行目 STARTの項目で、
「VECTOR/0,.ROM/100,RAM/
20FF2C,USER/200000,SCI/FFFFB0」 を
「VECTOR/0,ROM
,C/100,RAM/FFDF10,USER/FFE030,SCI/FFFFB8
に書き換えます。

ここではモニタデバッガを動作させる環境(H8/3052Fモード7)のアドレスマッピングを設定しています。
ROM/100 : 内蔵ROMの開始アドレスを設定.。「
,C」はprintfとscanfを使えるようにするためのもの。
RAM/FFDF10 : 内蔵RAMの開始アドレスを設定。
USER/FFE030 : RAM領域に展開するユーザープログラムの仮想ベクタ領域の開始アドレスを設定。
SCI/FFFFB8 : PC側ソフトと通信を行うSCIポートのアドレスを設定。ここではSCI1ポートに設定。


■PC側ソフトとの通信速度の設定


先に記した通り、Kani-GPIB=>簡易GP-IBコントローラと電子工作のページ」では $BRR=13 に設定されています。この設定は動作周波数25MHzのH8/3052Fの場合、ボーレートが38400bpsとなります。しかしTekuRoboでこの設定を試してみたところ、通信がうまく行かずに不安定な動作となってしまいました。おそらく使用するPC環境などの影響があるものと思われます。色々試しましたが、不本意ながら9600bpsまで落とし、 $BRR=50 に設定しました。

ところで、このボーレート設定は少し分かりづらいので、以下に$BRRの算出方法をご紹介します。
H8/3052Fのハードウェアマニュアルには、シリアルコミュニケーションインターフェイス(SCI)の調歩同期式モードでのBRRとして、次の計算式が紹介されています。

N = (φx106/(64x22n-1xB))-1

N : ボーレートジェネレータ(BRR)への設定値
φ: 動作周波数(MHz) → 25MHz
n : ボーレートジェネレータへの分周率 → 分周しないので0 → なので64x22n-1は64x1/2で32になります。
B : ビットレートbps → 例えば9600bps

上記の条件でNの値を求めると、80.38で、近似値80(10進数)となります。ところで、モニタデバッガのmonitor.subで $BRRの値として設定できるのは16進数なので、10進数の80は16進数で50となります。したがって、 $BRR=50 としています。通信速度として9600bpsは遅過ぎるので、先ずは $BRR=13 で38400bpsでの動作を試して見てから、動作が不安定なようであれば少しずつボーレートを下げていくことをお奨めします。

 ■lower.cのプロジェクトへの追加
モニタデバッガ上でprintfとscanfを使えるようにするための低水準インターフェイスルーチンをプロジェクトに追加します。
HEW4のメニューバーから「プロジェクト」→「ファイルの追加」から、300hhew3.exeを解凍したフォルダを指定し、
lower.cを指定して「追加」を押します。
プロジェクトのツリー表示C source file の項目にlower.c が追加されます。

以上のカスタマイズをしたらプロジェクトを保存し、ビルドを実行します。プロジェクトフォルダの中のReleaseフォルダに、monitor.mot ファイルが生成されます。これをターゲットとなるH8/3052FマイコンにFDTで流し込みます。さて、試用版のHEW4をインストールしてから60日間を経過してしまった方のために、以下にmonitor.motファイルを公開します。 ただし、ボーレートは9600bpsなのでご容赦下さい。

【ダウンロード】 monitor.mot 右クリックで「対象をファイルに保存」



4.ユーザープログラム開発環境のカスタマイズ

次に、私達が作りたいユーザープログラムをモニタデバッガ上で動かすためのカスタマイズ方法についてですが、こちらはKani-GPIB=>簡易GP-IBコントローラと電子工作のページ」で公開されている「H8/3052Fモード7用モニタデバッガ生成メモ」の「*.動作確認用サンプルプログラム」の記事以上に補足できる点はありません。是非そちらをご参照下さい。仮想ベクタ用ファイルや、実際にモニタデバッガ上で動作するプログラムのサンプルプロジェクトなども公開されているのでお試し下さい。

セクションのマッピング設定の意味だけ簡単に表を記載します。詳細は、最適化リンケージエディタのマニュアル等を参照して下さい

 Address Section   説明
 0x000FE030  VECTTBL  仮想ベクタテーブルの開始アドレス
 0x000FE130  PResetPGM,PIntPGM  仮想ベクタテーブルから呼ばれる割り込み関数部の開始アドレス
 0x000FE300  P,C,C$DSEC,C$BSEC,D  (P)プログラム領域、(C)定数領域、(D)初期化データ領域などの開始アドレス
 0x000FF000  B,R  (B)RAM上の未初期化データ領域、(R)RAM上の初期化データ領域などの開始アドレス
 0x000FFD00  S  (S)スタック領域の開始アドレス

なお、セクションのマッピングを上記に設定したら、設定画面上にある「エクスポート」ボタンで設定をファイル(拡張子 hsi)として書き出しておきましょう。別のプログラムを作成するために新規のプロジェクトを作る際、ここでエクスポートしたファイルを「インポート」するだけでセクションのマッピング設定が完了して便利です。

ちなみに、HEW4のメニューバーから、「表示」→「マップ」で開くダイアログから「マップ種別」として「Map Section Information」を選択して「OK」とすると、ビルドされたプログラムのマッピング状況を確認することができます。それぞれのセクションでどれほどのメモリが消費されているのかも分かりますので、メモリを有効に利用するために、リンカのアドレスマッピングを設定しなおす場合などの参考になります。



5.モニタデバッガで動かすサンプルプログラム

詳細なモニタデバッガの使い方まではご紹介できませんが、ほんの触り程度だけご紹介します。その前にサンプルプログラムの準備をします。動かすプログラムは以下のものとし、前項で構築したユーザープログラム開発環境上でビルドして下さい。このプログラムはport1の8ビット出力から2進数のデータを一定間隔でカウントアップします。また、port2の0ビット目のポートが0になると、PC側ソフトに対して現在のport1のカウント値を返します。また、port2の1ビット目のポートが0になると、PC側ソフトから16進でカウント値を入力し、任意に設定した値から再びカウントを再開することができます。

【ダウンロード】 moni_test.c
右クリックで「対象をファイルに保存」

/***************************************/
/* C TEST PROGRAM BY RIKIYA 2010.04.23 */
/* for AKI-H8/3052F CPU BOARD          */
/* PROGRAM NAME moni_test.C            */
/***************************************/

#include "iodefine.h"
//#define printf ((int (*)(const char *,...))0x00002b34)
//#define scanf ((int (*)(const char *,...))0x00002b86)

//main***********************************

void main(void){

unsigned long i;                              // 時間稼ぎカウンタ変数
unsigned short data;                          // カウント表示用変数

P1.DDR = 0xFF;                                // port1を全て出力に設定
P2.DDR = 0x00;                                // port2を全て入力に設定
P2.PCR.BYTE = 0xFF;                           // port2のプルアップ抵抗あり

    while(1){

        P1.DR.BYTE = data;                    // 変数dataの表示

        switch (P2.DR.BIT.B1){                // port2のbit1による動作分岐

            case 1:                           // port2のbit1が1なら...
                if (P2.DR.BIT.B0 == 0){       // port2のbit0が0ならprintf実行
                    printf("0x%X\n",data);    // 変数dataの値をmonitorに出力 (0x0A)
//                  printf("0x%x\n",data);    // 変数dataの値をmonitorに出力 (0x0a)
//                  printf("%d\n",data);      // 変数dataの値をmonitorに出力 (10)
                }
                data++;                       // 変数dataのインクリメント
                for (i=0;i<0x000FFFFF;i++) {} // 時間稼ぎ
                break;

            case 0:                           // port2のbit1が0なら...
                scanf("%X",&data);            // 変数dataの値をmonitorから入力
                break;
        }
    }
}

それでは、簡単にプログラムの内容を説明します。

■ヘッダファイルのインクルード

プログラムの中に、P1.DDRや、P2.PCR.BYTEなど、H8/3052Fのレジスタに相当する記述が使えるようにするためのヘッダファイルiodefine.hを読み込むため、プログラムの先頭部分で#include "iodefine.h" を記述しています。

//#define printf ((int (*)(const char *,...))0x00002b34)
//#define scanf  ((int (*)(const char *,...))0x00002b86)

このprintf , scanf 関数の宣言については、コメント文にしてあります。「Kani-GPIB=>簡易GP-IBコントローラと電子工作のページ」で公開されている通り、std3052.hのヘッダファイルを読み込む場合にはこのままとし、読み込まない場合はコメントの//を外します。

■メイン関数

P1.DDR = 0xFF; によりport1を出力用に設定し、P2.DDR = 0x00; によりport2を入力用に設定します。また、P2.PCR.BYTE = 0xFF; によりport2のプルアップを全てONにしています。ここまでで環境の準備は完了です。次にwhile(1){ }によって無限ループを作り、その中で以下の処理を行っています。

先ずは、P1.DR.BYTE = data; によって、変数dataの値をport1に出力します。続いて、port2のbit1の状態により、switch文を使って以下のように処理を分岐します。
・port2のbit1が1の場合
 dataをインクリメント(ひとつずつ値を増や)します。また、port2のbit0が0なら、デバッグ用のprintfを使って、PC側ソフトに対してdataの値を16進数で返します。
・port2のbit1が0の場合
 dataのインクリメントをやめて、デバッグ用のscanfを使ってPC側ソフトからdataの値を入力してもらうための待ち状態になります。一旦待ち状態になったら、すぐにport2のbit1を1に戻しましょう。PC側ソフトから16進数でdataの値を入力してEnterを押すと、入力した値から再びカウントアップが開始されます。

以上でデバッグで扱えるprintfとscanfの使い方が大体分かるかと思います。上記のソースコード上にコメントとして記載してありますが、printfで指定してある書式の違いによって、PC側ソフトに表示されるdataの見え方がどのように変わるか、など試してみると楽しいかもしれません。



6.モニタデバッガとサンプルプログラムの動かし方

 FDTでモニタデバッガのプログラムmonitor.mot をターゲットとなるH8/3052Fマイコンに書き込みます。
  前項「2.関連ファイルのダウンロード」で入手したhtermmdi.exeを解凍し、そのフォルダにあるHterm.exeを実行すると、左図のような画面が開きます。  
 先ほどモニタデバッガを書き込んだH8/305FマイコンとパソコンをRS2323Cシリアルケーブルで接続し、マイコンの電源を入れます。すると、Htermに左図のようなコメントが表示されます。

もしも表示されない場合は、Htermのメニューバーから「フラッシュ」→「ビットレートの設定」を開き、ボーレートの確認をして下さい。ボーレートはモニタデバッガをビルドする際に設定したボーレート値に合わせます。
 あらかじめ作成したユーザープログラムをHEW4でビルドしたら、そのmotファイルをモニタデバッガにロードしてみましょう。
Htermのメニューバーから「コマンド」→「Load」を開き、左図のようなダイアログからロードしたいmotファイルを選択して「開く」を押します。

このダイアログでは、初期設定の拡張子がabsになっているため、「
ファイルの種類」欄を「Stype (*.mot)」にあわせてから「開く」を実行してください。

もちろん、ここで指定するmotファイルは、前項「4.ユーザープログラム開発環境のカスタマイズ」の項目で紹介したカスタマイズ環境でビルドしてある必要があります。   
 motファイルを指定して「開く」を実行すると、ロード中のファイルサイズがカウントアップして表示され、正常にロードが完了すると左図のような表示となります。
 さて、それではモニタデバッガ上でユーザープログラムを動かしてみましょう。Htermのメニューバーから「コマンド」→「Go」を実行します。または、端末画面から「G」を入力してEnterを押します。

ターゲットとなるH8/3052Fマイコンボードを見てみると、プログラムが実行されているはずです。今回のサンプルプログラムでは、port1に接続されている8bitのLEDが一定周期でカウントアップされているはずです。

 ここで、モニタデバッガのprintfの機能を確認してみましょう。

port2の0bit目を0にします。
※今回の実験回路は「AKI-H8/3052F自作マザーボード」を参照して下さい。ここではスイッチをONにするとport2の各bitがGNDに落ちて0になり、OFFだとプログラム上のPCR設定によってプルアップされ、1になります。

port2の0bit目が0の時、カウントアップのタイミングでその時々のport1でのカウント値がHtermに表示されます。

 次に、モニタデバッガのscanfの機能を確認してみましょう。

port1のLEDがカウントアップされている状態の時、port2の1bit目を0にします。するとカウントアップが停止しして、カウント値の入力待ちになります。
ここでport2の1bit目を1に戻しましょう。
次に、Htermに16進数の任意の値を入力してEnterを押します。ここでは「aa」と入力してEnterを押しました。すると、port1のLEDはaa (●○●○ ●○●○)から再びカウントアップを開始します。

 ユーザープログラムを中断させるには、H8/3052FマイコンのNMI(ノンマスカブル割り込み)をONにして、ABORTさせます。左図がその状態です。

※ABORTさせるには、NMI端子にスイッチを接続してGNDに落とす回路が必要です。ただし、スイッチにチャタリングがあると何度もNMI端子がGNDに落ちて、何度か連続してABORTが掛ってしまうことになります。 うまくABORTできると、プログラムの中断状態からGOコマンドで動作を再開させることができますが、うまく行かないと、再びLoadからやり直さなければいけないようです。

NMIのスイッチ回路にはチャタリング除去を入れておくことをお奨めします。

モニタデバッガ(Hterm)には、デバッガ機能としてその他色々な機能があります。メニューバーの「表示」から、それらのデバッグ機能についての窓を開くことが出来ますので、マニュアルを参照しながらお試し下さい。

今回はフラッシュメモリを書き換える回数を減らしてマイコンの寿命を延ばし、更に各種のデバッグ機能が利用できるモニタデバッガについてご紹介しました。非常に便利であり、節約にもなるため、使わない手はないですね。しかし、RAM領域にユーザープログラムを書き込むという性質から、H8/3052Fのモード7で使う時などは特に、大きなプログラムには対応できないという弱点もあります。TekuRoboで扱うような学習目的のプログラムには十分かもしれませんが、腕に覚えのある方は、外部RAMを接続して利用できるモード6でのモニタデバッガなどにも挑戦してみて下さい。今回お世話になったkaniさんの「Kani-GPIB=>簡易GP-IBコントローラと電子工作のページ」でも、「H8/3052F外部RAM対応モード6用モニタデバッガ生成メモ」として紹介されていますので、是非ご参照下さい。

先頭に戻る

 

【表紙に戻る】