HEW(ルネサス統合開発環境)でH8プログラミング
H8シリーズには、広く使われていたZ80系に換わって普及したCPUです。日立が開発しましたが現在はルネサスが継承し、H8/300H、H8/300H-Tinyシリーズなどがあります。
Cコンパイラの無償評価版は上のリンクから「H8SX,H8S,H8コンパイラパッケージ」をインストールします。リンクサイズは64Kに限定されていますが、通常の機器制御プログラム開発用として十分実用になるのではないでしょうか。
なお、HEW正価版は¥198,000のようです。
◆ここでは H8TinyシリーズのH8/3672を使ったHEWの使い方を取り上げます。
H8/3672の基本スペック
メモリ
フラッシュROM:16Kバイト (0000H〜3FFFH)
内蔵RAM:2Kバイト (F780H〜FF7FH)
A/D:10ビット×4
I/O: 入出力×26本 入力×4本 16ビット×タイマ1 シリアルポート×1 他
◆新しいプロジェクトを作る
「新規プロジェクトワークスペース」をチェックします。
「Application」を選択します。 (アッセンブラなし、C言語のみ)
注)一般的には、割り込みベクトルテーブル、スタートプログラム、スタックポインタセット等のプログラムは
アセンブラ記述されますが、HEWでは全てCで書くことができます。
ワークスペース名つけます(例 TEST)
ディレクトリは参照を押して作成するフォルダを選択して OK
CPUシリーズは 300H
CPUタイプ=Other (表中にあっても Other でかまいません)
次へ
動作モード=Normal (CPUがタイニーでない場合はAvenced)
次へ
ライブラリもヒープメモリも使わないにします。
maian() は C sourse file
次へ
ライブラリは変更なし
次へ
スタックポインタ、アドレスは変更なし
ベクタテーブル定義をチェック
次へ
次へ、 完了 、OK
以上で、
absct.c → 外部変数、テーブルデータ用
resetprg.c → 初期化プログラム
プロジェクト.c → メインプログラム
stacksct.h → 後で削除
ができあがります。
◆HEW画面が開いたら
プログラム編集画面の上部枠に「Debug」が表示されたら、「Release」に変更します。
ここで一旦HEWを終了します。
◆不要なファイルを消す
ファイルstacksct.h を削除します。
Resetprg.c を開き #include "stacksct.h" の行を消します。(スタックはプログラムの中で指定するから不要)
◆ヘッダーファイルを指定
CPUのレジスタアドレスを規定するヘッダーファイル (参照添付 3774.h) をプロジェクトのフォルダにコピーし、
プロジェクトは .hws ファイルをクリックして再開します。
プロジェクト → ファイルの追加 で組み込みます。
そして、各Cファイルの先頭に
#include “3774.h”
のように入れます。
注)IOレジスタのアドレス表をもとに、参照例 3672.h のようなヘッダーファイルを作ることができます。
ルネサスが公開しているヘッダーファイルはビット定義もできるかなり複雑なヘッダーファイルですが、
ポート単位に定義するヘッダーファイルの方がシンプルで実用的です。(特にCPU変更移植などの際は)
◆セクションの指定
ビルド → Hitachi H8S →Libk/library の sectionタブ を選択して
400 PReset (リセットスタート)
800 P (プログラム領域)
C (定数領域)
C$DSEC (定数領域)
C$BSEC (定数領域)
D (初期化データ領域)
FB80
B (未初期化データ領域:内蔵RAM)
R
はそのまま残し、S(スタックセクション)をRemove します。
なお、RAMを増設する場合は dbsrct.cに
#pragma section C1RAM
のように入れ
0x00200000 BC1RAM
のようにaddします。(Bの後にsection名)
◆resetprg.c にリセットスタートプログラム、割り込みプログラムを書く
割込みベクタアドレスおよび、スタックポインタのアドレスを指定することができます。
#include "3672.h"
#include "TEST.H"
#pragma section
ResetPRG
// リセットプログラム
__entry(vect=0,sp=0xffff00) void PowerON_Reset(void)
{
set_imask_ccr(1); /* 割り込み禁止 */
_INITSCT();
set_imask_ccr(0); /* 割り込み許可*/
main();
}
// 割込みプログラム
__interrupt(vect=7) void Intr_Nmi(void)
{
}
__interrupt(vect=22) void Intr_TimerV(void)
{
if( TCSRV & 0x40) // CFMA割込みの確認
TCSRV &= ~0x40; //
CMFA割込み要求フラグクリア
Tmfnc(); // TimerV割込制御する割込みプログラム
}
__interrupt(vect=36) void Intr_Cmia0(void)
{
int_cmia0(); /* 16ビットタイマー割込み */
/* 関数int_cmia0();で実行*/
}
//注)割込みプログラム
__entry(vect=0,sp=0xffff00)
スタートプログラムベクタとスタックポインタの設定
スタックポインタは通常、I/Oレジスタの先頭番地を指定
__interrupt (vect=割込みアドレス)
割込みプログラムベクタは、割り込みアドレスのみが重要で、関数名は参照されない。
◆空セクションの警告を消すために
const char rom[] = "
DUMMY"; // ダミー ROM データ
unsigned int ddd;
// ダミー RAM データ
を、absct.cの先頭に追加します。(必須ではない)
テーブルデータはmain等に記載してもよいが、ROM,RAM領域専用のabsct.cに通常記載する。
◆ ビルドでコンパイル実行
ビルドのすべてをビルドするとrelease フォルダに.motができます。
エラーのコメントが出たら、エラー内容の行をクリックすると、エディター画面が問題個所にジャンプします。
リンカーのエラーはエディター画面では判別できないため、build画面の表示内容から推測します。
検索は、 編集 → ファイルから検索 で全ファイル中から検索できます。
初回のbuildは ビルド → hitachi tool c、、、→ Standard Library → mode を build a library
file にして ビルドし、2回目からは use an existing library でビルド します。
エラーでないWorningは2回目のビルドで消えます。
また、プログラムを一旦終了して、再開すると消える場合もあります。
CPU基板上の切り替えSWで、プログラミングモードにして立ち上げ、
RS-232C接続し、完成したmotファイルをh8w 等のライタプログラムで書き込み、通常モードで再立ち上げます。