H8/3664FでEthernetに接続する

H8/3664Fは32kB Flash ROMと2kB RAMを搭載する小規模なマイコンで、その入手性の良さと、ベンダーから純正の統合開発環境HEWが提供されている事など数々の魅力があります。
今回、このマイコンとISAバス接続のLANカードを接続し、インターネットの世界に接続してみましたので製作記事を書いてみます。

TCP/IPミドルウェア T2-Tinyライブラリを入手する

ライブラリ自体は個人での入手が可能です。
ルネサスのT2紹介ページ
このページの下の方に入手方法が書いてありますのでそのまま申し込んで下さい。
個人でも可能です。(私がそうでしたから...)

既に申し込んで入手済みの方には注意ですが、Release 1.0以前のものは、H8/tinyでEthernetを使用できません。再度もらいなおしてください。

準備するもの

以下のものを準備します。
・H8/3664F マイコンボード(秋月電子通商・1600円)
・RTL8019ASを使用したISA LANカード(多分1000円以下で買えます)

結構探さないとないかも。コレガダイレクトショッピングで840円でした

・ISAバスコネクタ
・ルネサス T2-Tinyライブラリ

H8/3664Fと市販のISA LANカードを汎用ポート接続する

御存知のとおり、H8/3664FをはじめとするH8/tinyファミリのマイコンには外部バスは用意されていません。ISAのLANカードを接続する場合、外部バスに接続するのが通常だと思いますが、ここでは汎用ポートを外部バスのように見立てて使用します。
T2-Tinyライブラリには、H8/3684F bbetherライブラリというのがついているので、これをH8/3664Fに組み込みます。
H8/tinyのフリー開発環境のHEW2にそのままライブラリを登録して下さい。
今回、H8のボードは秋月のH8/3664Fを使用しました。このボードでの今回のポート表を置いておきます。
エクセル形式のポート表

RAMはHEWの標準では1kBしか使えるようになっていませんので、2kBにして下さい。

外部バスもどきの実現

LANカードとのやりとりに汎用ポートを使用しますので、外バスのあるマイコンのようにメモリーのように周辺デバイスのレジスタを読んだりすることは出来ません。
ここでは、外バスのようなふるまいをする処理を作成してISAバスカードとのやりとりを行います。

unsigned char LANC_READ(unsigned char address){
	unsigned char data;
	IO.PDR5.FUNC.ADDRESS = address;
	IO.PDR1.BIT.B1 = 0;
	IO.PCR8 = 0x00;
	data = IO.PDR8.BYTE;
	IO.PDR1.BIT.B1 = 1;
	return(data);
}

void LANC_WRITE(unsigned char address,unsigned char data){
	IO.PDR5.FUNC.ADDRESS = address;
	IO.PDR1.BIT.B0 = 0;
	IO.PCR8 = 0xff;
	IO.PDR8.BYTE = data;
	IO.PDR1.BIT.B0 = 1;
}

周期処理の実行

このライブラリでは、標準で10ms毎にサイクリックに呼び出す必要があります。関数はlan_cyclic_handlerというものです。ここでは、簡単なサイクリック実行処理(Timer V使用)を作成して実行しましょう。
通常であれば直接タイマー割り込みでコールするのがもっともリーズナブルだと思いますが、遊びで作った関数をそのまま利用してます。

void InitCyclicHandler(void){
	bCycHndEnable = 0;
}

void SetCyclicHandler(void (* func)(void)){
	fp_cycfunc = func;
	bCycHndEnable = 1;
}

void KillCyclicHandler(void){
	bCycHndEnable = 0;
}

// vector 22 Timer V
__interrupt(vect=22) void INT_TimerV(void) {
    static int i,j;
    TV.TCSRV.BIT.CMFA = 0;		// 割り込み要因クリア
    if (bCycHndEnable == 1){	// サイクリックハンドラ処理呼び出し
        (*fp_cycfunc)();
    }
    TV.TCORA = 0xff;			// 次の処理のインターバル設定(intv=2[ms])
}

この関数ではTimer Vを使用して、SetCyclicHandler()を使用して設定したvoid(*foo)(void)型の関数をコールします。

つづく。。。

Author: projectc3@gmail.com
Last modified: Sat Aug 06 11:16:08 JST 2005