ロボット工作研究室Wiki - SH-Tiny テクニック/テストプログラムの書き込み
SH-Tiny テクニック


 開発環境とテストボードができたので、さっそく自作したプログラムを動かしてみます。

テストプログラムの作成


 まずは、HEWを立ち上げます。ようこそダイアログが表示される場合もありますが、ここでは使わないのでキャンセルしてください。筆者は表示しないように設定しています。

 メニューから、[ファイル] -> [新規ワークスペース]を選ぶと、新しいワークスペースの作成が始まります。

 ワークスペースというのプロジェクトをまとめるもので、プロジェクトは色々な設定やプログラムファイルをまとめるもの、と思っておけば問題ないです。個人でそのへんの概念を駆使することはまずないと思いますので。

新規ワークスペースの作成




 とりあえず、ワークスペースの名前を入力します。適当でいいです。プロジェクト名も同じでいいでしょう。ディレクトリもどこでも構いません。日本語名の混じったディレクトリでも大丈夫でした。OKを選ぶと新規プロジェクトの作成に移ります。




ツールチェインバージョンが9.0.3.0以上になっていることを確認してください。それ以前ではSH7125に対応していません。CPUシリーズはSH-2、CPUタイプはSH7125です。




 ここはデフォルトのままで。





 I/Oライブラリはとりあえず使用しません。というか何なのか筆者にはわかりません。ヒープメモリもよく分からないのでデフォルトのままです。
 main()関数生成はCのファイルで行ないます。C++で開発したいときは[C++ source file]を選べます(今回はCを選んでください)。I/Oレジスタ定義ファイルは必要です。ハードウェアセットアップ関数生成はなしでよいです。




 あとはデフォルトのまま[次へ]を選び続ければよいでしょう。最後に自動生成されるファイルの一覧が表示されるので、[完了]をクリックして終わりです。

 

プログラムの記述


 とりあえず、何もしないプログラムを作成してみます。
 左側にファイルのリストが表示されていると思いますが(表示されていないときは[表示] > [ワークスペース])、"C source file" カテゴリ中の<プロジェクト名>.cファイルをダブルクリックしてください。そうすると、そのファイルが開かれてエディタが表示され、編集できるようになります。

#ifdef __cplusplus
 で囲まれたよく分からないコードがごちゃごちゃと書いてありますが、これはC++で開発するときに必要な構文が自動生成されているもので、今回は必要ありません。今回必要なのは以下の文だけです。

void main(void)
{
    
}
 他は残しておいても構いませんが、消しても構いません。
 とりあえず、明示的に無限ループに入るよう少しコードを書いてみます。

void main(void)
{
    while(1);
}
 これで最低限のプログラムが完成したので、コンパイルおよびビルドをしてみましょう。
 [ビルド] > [ビルド] メニューを選択すると、変更されたファイルを自動的にコンパイルして、その後ビルドしてくれます。F7キーを押しても、ツールバー上の「ビルド」ボタンをクリックしても同じです。
 初回は少し時間がかかりますが、ウインドウ下部に進行状況が表示されるので気長に待ちましょう。
L1100 (W) Cannot find "C" specified in option "start"
 というようなWarningが表示されることがありますが、これは定数領域に入れるべきものがないという意味で、一個も定数を使っていないときに表示されます。ためしにmain()関数の前に

const int i = 0;

void main(void)
{
    while(1);
}
 と入れてみると、Warningは表示されなくなります。
 なにはともあれ、"Build Finished"と表示されたなら、ビルドは成功です。これで何もしないプログラムが完成しました。






 しかし何もしないプログラムでは、正常に動いているかどうかが分からないので、LEDを点滅させるプログラムを作成してみましょう。
 まずは、IOレジスタ定義ファイルをインクルードします。以下のように記述します。

#include "iodefine.h"

void main(void){
    while(1);
}
 一度この状態でビルドしてみましょう。すると、左側のリストの"Dependencies"カテゴリに、"iodefine.h"ファイルが追加されるはずです。ここには、インクルードしたファイルが自動的に追加されるので、ヘッダファイルなどの内容はここから編集できます。
 一度、"iodefine.h"ファイルの中身ものぞいてみましょう。よくわからないコードがずらずら並んでいますが、マイコンの各種レジスタを可読な形に置き換えたものです。
 詳しいことはひとまず置いておいて、とりあえず必要最小限の機能だけ使ってみましょう。
 LEDを点滅させるプログラムは以下のようになります。

#include "iodefine.h"

void main(void){
    int i;
    
    CPG.FRQCR.WORD = 0x16db;   // Iφ=48MHz
    
    PFC.PECRL1.BIT.PE1MD=0x00; //IO端子に設定
    PFC.PEIORL.BIT.B0 = 1;     //出力端子に設定
    
    while(1){
        for(i=0;i<1000000;i++); //100万回 空ループでウェイト
        PE.DRL.BIT.B0 ^= 1;    //出力を反転
    }
}
 順を追って説明します。

    CPG.FRQCR.WORD = 0x16db;   // Iφ=48MHz
 ますはこれですが、いきなりですが詳細は省きます。クロック発振器の設定を変更して、CPUのクロック周波数を48MHzに変更しています。

    PFC.PECRL1.BIT.PE1MD=0x00; //IO端子に設定
 つぎにこれは、ポートEのビット0(PE0)をIOピンとして設定しています。マイコンでは1つのピンに複数の機能が割り当てられているので(マルチプレクス)、どの機能を使うか選択する必要があります。実はデフォルトがIOピンなので設定の必要はないのですが、IOピンであることを明示するためにわざと書きました。詳細はハードウェアマニュアルの15章を参照してください。

    PFC.PEIORL.BIT.B0 = 1;     //出力端子に設定
 次に、ポートEのビット0のIO端子の入出力方向を出力に設定しています。"0"で入力、"1"で出力です。これも詳細はハードウェアマニュアルの15章を参照してください。

        for(i=0;i<1000000;i++); //100万回 空ループでウェイト
 つぎにこれですが、10万回無駄にループすることで時間をかせいでいます。これによって点滅の周期が決まります。SHは処理速度が速いので、ループ回数が少なすぎると人間の目で認識できなくなります。32ビットCPUなのでint型は32ビット整数になり、32767を超えても問題ありません。

        PE.DRL.BIT.B0 ^= 1;    //出力を反転
 最後にこれですが、もとの出力と"1"の否定論理積をとることで出力を反転させています。分かりにくければ、次のように変えてもいいです。

        for(i=0;i<1000000;i++); //100万回 空ループでウェイト
        PE.DRL.BIT.B0 = 1;      //1を出力
        for(i=0;i<1000000;i++); //100万回 空ループでウェイト
        PE.DRL.BIT.B0 = 0;      //0を出力
 PE0を出力端子にしてPE.DRL.BIT.B0に値を書き込むと"1"で5V出力、"0"で0V出力されます。PE.DRL.BIT.B0を読み込むと端子の出力の状態が調べられます。
 
 これをビルドして、LED点滅プログラムの完成です。

テストプログラムの書き込み


 それでは作成したプログラムを書き込んでみましょう。
 まずは、テストボードとシリアルポートに接続します。シリアルポートのポート番号を確認しておきましょう。コントロールパネルのシステムのプロパティからデバイスマネージャを起動し、"ポート(COMとLPT)"の項目を確認すると存在するシリアルポートが調べられます。(XPの場合)
 それから、FDTを起動します。
 [ファイル] > [新規ワークスペース]メニューをクリックすると、新しいプロジェクトの作成が始まります。HEWのワークスペースとは別物なので注意してください。



 ワークスペース名はHEWのワークスペースと同じ名前でいいでしょう。適当な保存場所を選択し、OKをクリックします。




 CPUの種類を選択します。SH/7125F(Generic)を選択しましょう。




 通信に使うシリアルポートを指定します。さて、ここで[次へ]をクリックすると、英文のメッセージボックスが表示されると思います。意味はここでデバイスの接続のチェックをするというような感じです。テストボードの書き込みモード切替スイッチを書き込み側に(MD1端子がGNDにショートするように)入れて、電源を入れ、[OK]をクリックしてみましょう。
 接続が上手くいったときは途中で"Select Device"というダイアログが表示され、SH7125を選択して[OK]をクリックすればチェックが完了します。



 途中で×が出てしまったら、接続は失敗です。一旦キャンセルして、次のような確認をしてください。
 ・本当に電源は入っているか → マイコンボード上のLEDをチェック
 ・書き込みモード切替スイッチのセットは正しいか → 逆に入れて試してみよう
 ・シリアル通信の配線がどこか断線していないか → テスターなどでチェック
 ・本当に配線は正しいか → 回路図と比較してチェック
 ・シリアルポートは機能しているか → なんとかしてチェック




 接続が上手くいったなら、次にクロック周波数を設定します。マイコンボード上の発振子は12MHzなので、12MHzと入力。メインクロックは48MHzとなるよう4逓倍、周辺クロックは24MHzとなるよう2逓倍に設定します。
 あとはデフォルトのまま次へ進んでいき、完了をクリックします。
 改めてマイコンとの接続が行なわれ、ウインドウ下部に"Connection complete"と表示されれば接続成功です。
 ここで一旦接続を切りましょう。[デバイス] > [デバイスとの切断]メニューをクリックしてください。その後、テストボードの電源を切ってしまいましょう。
 
 次に、書き込みたいプログラムをFDT上に読み込んでみましょう。[プロジェクト] > [ファイルの追加]メニューをクリックしてください。ファイルダイアログが表示されますので、HEWのワークスペースを保存した場所から、"<プロジェクト名>.mot"というファイルを開きます。デフォルトでは"Debug"というフォルダに入っていると思います。
 さて、ここで一旦ワークスペースを保存して、FDTを終了しましょう。ここまでの作業は一度だけ行なえばよいですが、次からの作業は何度も行なうことになります。
 

 
 あらためてFDTを起動し、先ほどの(FDTの)ワークスペースを開きます。
 モード切替スイッチが書き込み側になっていることを確認して、電源を入れます。



 次に、"<プロジェクト名>.mot"ファイルが追加されていることを確認してください。これを右クリックして、"Download File"をクリックしてください。先ほど決めた設定で自動的に接続が行なわれ、プログラムが書き込まれます。最後に"Image successfully written to device"と表示されれば、書き込み成功です。テストボードの電源を切りましょう。
 書き込みが完了しても接続が自動的に切断されないので、かならず切断しておきます。切断しないと、他のシリアル通信ソフトが使えなかったり、次回の書き込みが開始できなかったりします。

 テストボードのモード切替スイッチをユーザモード側に戻して、電源を入れてみましょう。LEDが点滅すれば、プログラムが正常に動作していることが確認できます。