sanguisorba が 2021年09月17日18時24分12秒 に編集
コメント無し
本文の変更
約15年前に遊んでいた秋月のH8ボードを押し入れから出して遊んでみました。 **今から始めるのは絶対にやめたほうがいいです。** デバッガを使うのでデバッガを知らない人のための簡単な使い方も書いてあります。 ## 今回用意したもの * AKI-H8/3048 開発キット (終売品・公式HPから削除済) * USB-シリアル変換 本当は3052Fでやりたかったんですが、デバッガのコンパイルについて解説しなければならなくなるため今回は3048でやります。3052Fはまた別の機会に。 ## Windows 10で動くか動かないか ### H8/3048F用BASICコンパイラ 実質、**AKI-H8マイコン用マザーボード専用**BASICコンパイラです。(主にLCDのPRINT) 日立ではなく秋月オリジナルのようです。ROMのバイナリが吐かれるのでリンカなどは不要。 3048F用となっている原因はどうやらBASICランタイムがクロック周波数に依存するものだかららしい。 https://akizukidenshi.com/download/kairo/%E3%83%87%E3%83%BC%E3%82%BF/SOFT%E9%96%A2%E4%BF%82/B002_BASIC%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9.pdf マニュアル p.9に0000 3E80 -> 0000 4CCC とすると 19.6608MHzに対応できるとあります。 H8 3052Fは25MHzなので0000 61A8とすれば3052Fでも動きます。 (参考ページ。昔はもっとこういう解説ページがあったと思うんですが、いつの間にか消えています) http://jr2hap.com/BASIC_Patch.html Windows 10でサンプルファイルのコンパイルを確認しました。 **AKI-H8-USBには使えません(LCDのPRINTが使えない)** あと、COM通信のエンコードはSJISです。 ### AKI-H8シリーズ用Cコンパイラ 日立のCコンパイラの評価版。 H8/300H C COMPILER(Evaluation software) Ver.1.0 アセンブラ・リンカ・オブジェクトコンバータが別途必要。 H8 3052F開発ソフトCDにあるCコンパイラとは別物。 Windows 10でサンプルファイルのコンパイルを確認しました。 ### AKI-H8 3048開発キット CD 日立のアセンブラの評価版(日立のCコンパイラで使う)と3048専用ライタープログラムF-ZTATが入ってます アセンブラキットは全部バージョン1.0。Windows 10でサンプルファイルのコンパイルを確認しました。 F-ZTATはWindows 10非対応です。16ビットアプリケーションなので動きません。ライタープログラムは他にもあるので代替が効きます。 ### Hterm (H8のデバッガ用プログラム) https://www.renesas.com/jp/ja/document/swr/1403891?r=721346 私の環境では正常に動きません。 vmware上のWindows meから動かす事にしました。 ## 何も知らない人が陥りやすいポイント 製作マニュアルをよく読もうねっていう話。 ### AKI-H8マイコン専用マザーボード https://akizukidenshi.com/catalog/g/gK-00140/ Dサブ25ピンのポートはライター回路に接続されていますが**Dサブ9ピンのポートはどこにも繋がっていません**。いまどき(H8で遊んでいたおよそ15年前)のPCには25ピンシリアルポートなんて付いてる訳なく、殆どは9ピンです。注意したいのは、**いまどきのPCについているDサブ25ピンはパラレルポート**でシリアルポートではないです。パラレルポートに接続しても動作しません。Dサブ9ピンで接続を確立させるためには自分で配線する必要があります。 参考 https://www.japansensor.co.jp/faq/942/index.html 具体的にどうつなげればいいかはパターンを追ってください。マザーボード説明書3ページ目の回路図にもそれっぽい事が書いてあります。 https://akizukidenshi.com/download/kairo/%E3%83%87%E3%83%BC%E3%82%BF/%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E9%96%A2%E4%BF%82/A018_H8%E3%83%9E%E3%82%B6%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89.pdf 後期のマザーボード(現行品)は3052F用に改造する際に必要なホールが空いていません。初期のものはユニバーサル基板のように全て空いていたので簡単に改造できました。 あと、3048に書き込む際はモード7で動作させます。MD0/1/2のピンは全てオープンです。 個人的メモ:ライターモードに切り替わらない時はトランジスタA1015-GRが生きているか確認してみよう ## H8 3048でLチカ 秋月H8用マザーボードと3048の組み合わせでやりました。 ![画像はH8BASICのサンプルプログラム"Timer"を動かしている様子](https://camo.elchika.com/183aab60389918fa2bd3b43dc7c22c17f65f5c56/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f65343237643233322d313039632d343837392d623861392d376138616539326638383166/) BASICやらCやらで書いてもインパクトに欠けるのでアセンブラで書きます。
### LEDを点灯させる
高級言語ならピンをHIGHにする記述とWAITの命令を書いて終わりですが、WAITの命令がありません。 まずはLEDを点灯させる事から始めます。次のスクリプトは秋月のウェブページで公開しているAE-H8MB用のLED点灯プログラムを改変したものです。 ``` ;---------------------------------- ; AE-H8MB用LED点灯プログラム ;---------------------------------- ; ;-----CPUの指定----- .CPU 300HA ;-----アドレス指定/リセットベクトル----- .SECTION RESET0,DATA,LOCATE=H'000000 .DATA.L INIT ;リセットベクトル ;-----シンボル----- P5DR .EQU H'FFFFCA ;ポート5データレジスタ LED1 .BEQU 0,P5DR ;LED1(P5-0) LED2 .BEQU 1,P5DR ;LED2(P5-1) ;-----I/Oの初期設定----- INIT: MOV.L #H'FFF10,ER7 ;スタックポインタ設定 MOV.B #H'FF,R0L ;出力設定... MOV.B R0L,@H'FFFFC8 ;...ポート5に ;-----MAIN----- MAIN: BSET LED1 ;LED1のビットをセット(ON) BSET LED2 ;LED2のビットをセット(ON) AAA: JMP @AAA ;無限ループ ;-----MAIN終了----- .END ``` CPUの指定・リセットベクトル・スタックポインタについては#include <stdio.h>みたいなものと思ってください。アセンブラではほぼ必ず最初に書くコードです。
### デバッガ用にアレンジする
ただし今回はデバッガ上で実行したいのでコードを変更します。具体的にはリセットベクトルとスタックポインタの記述を削り、ROMアドレスではなくRAMアドレスを指定します。今回使用しているデバッガの場合、ユーザRAM領域はFF030 - FF12Fです。 ``` ;---------------------------------- ; AE-H8MB用LED点灯プログラム デバッガ用 ;---------------------------------- ; ;-----CPUの指定----- .CPU 300HA ;----- アドレス指定----- .SECTION P,CODE,LOCATE=H'0FF030 ;-----シンボル----- P5DR .EQU H'FFFFCA ;ポート5データレジスタ LED1 .BEQU 0,P5DR ;LED1(P5-0) LED2 .BEQU 1,P5DR ;LED2(P5-1) ;-----I/Oの初期設定----- INIT: MOV.B #H'FF,R0L ;出力設定... MOV.B R0L,@H'FFFFC8 ;...ポート5に ;-----MAIN----- MAIN: BSET LED1 ;LED1のビットをセット(ON) BSET LED2 ;LED2のビットをセット(ON) AAA: JMP @AAA ;無限ループ ;-----MAIN終了----- .END ``` これを付属のA38Hでオブジェクトに吐き出し、L38Hでアブソリュートロードモジュールに吐き出します。ROMに書き込む場合はC38HでモトローラSコードに吐き出しますが、デバッガ用コードではアブソリュートロードモジュールをRAMに転送します。 3048のROMには予めデバッガを入れておきます。書き換え耐久性が悪く、100回しか保証されていない(とはいえ通常の使用環境では1万回耐えると仕様書には書いてある)ので昔はROMにデバッガを入れてRAMにプログラムを転送して実行するのが主流でした。 入れたデバッガ https://www.vector.co.jp/soft/other/h8/se299983.html Hterm (Windows 10 非対応?) https://www.renesas.com/jp/ja/document/swr/1403891?r=721346 vmware上のWindows Meから操作しました。これならHtermだけでなくF-ZTATを用いて3048にプログラムを書き込む事も可能です。 プログラムを転送するにはコマンド(M) > Load を選択して転送する.ABSファイルを指定し、転送後にコマンド(M) > Go を選択するとRAMに転送されたプログラムが実行されます。違うプログラムを入れたくなったら電源を切って入れなおすだけです。 ![作業風景](https://camo.elchika.com/d4a2cff3269f3495bf59e819c8384f6ea4b82fb1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f31323939646662302d366339352d346134382d396331382d333733386662386131306436/) ![LEDが光っています。それだけです。](https://camo.elchika.com/1391c4b74f11994368750057d3288e1af3022008/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f66353938393063642d393530332d346636302d383937332d653933376334363533323865/)
ただこれだとLEDがついただけで点滅しないので、点滅させるためにウェイトを導入します ちゃんと1秒の精度を求めたいなら例えばサンプルプログラムのTIMERみたいな方法があるらしいですが、今回はなるべく簡潔にコードを書きたかったので以下の方法を採用しました。
### ウェイトを入れてLEDを点滅させる
これだとLEDがついただけで点滅しないので、点滅させるためにウェイトを導入します ちゃんと1秒の精度を求めたいなら例えばサンプルプログラムのTIMERみたいな割込みを使った方法があるらしいですが、今回はなるべく簡潔にコードを書きたかったので以下の方法を採用しました。
参考動画 https://www.youtube.com/watch?v=h2Vg49zRKfQ ``` ;---------------------------------- ; AE-H8MB用Lチカプログラム デバッガ用 ;---------------------------------- ; ;-----CPUの指定----- .CPU 300HA ;----- アドレス指定----- .SECTION P,CODE,LOCATE=H'0FF030 ;-----シンボル----- P5DR .EQU H'FFFFCA ;ポート5データレジスタ LED1 .BEQU 0,P5DR ;LED1(P5-0) LED2 .BEQU 1,P5DR ;LED2(P5-1) ;-----I/Oの初期設定----- INIT: MOV.B #H'FF,R0L ;出力設定... MOV.B R0L,@H'FFFFC8 ;...ポート5に ;-----MAIN----- BSET LED2 ;LED2のビットをセット(ON) MAIN: BNOT LED1 ;LED1のビットを反転 BNOT LED2 ;LED2のビットを反転 JSR @WAIT ;ウェイトサブルーチンの呼び出し JMP @MAIN ;無限ループ ;-----MAIN終了----- ;-----ウェイト----- WAIT: MOV.L #D'2000000,ER6 ;約1秒のウェイトサブルーチン AAA: DEC.L #1,ER6 ;ER6を1デクリメント.いわゆるFORループです NOP ;なにもしない BNE AAA ;FORループ RTS ;メインルーチンへ復帰 ;-----ウェイト終了----- .END ``` 先にLED2を点滅させておくことで1秒間隔でLEDが交互に点滅するプログラムとしました。 ## Webarchiveのリンク集 トランジスタ技術 1998年9月号 AKI-H8マイコン・ボードにモニタを移植する http://web.archive.org/web/20020602235642/http://www.cqpub.co.jp/toragi/DLF/TR9809M1.htm 日立半導体セミナー (旧バージョンの秋月H8モニタプログラムと旧バージョンのHterm) http://web.archive.org/web/20010617160642/http://www.hitachi.co.jp/Sicd/Japanese/Seminar/top.htm H8/300H, H8/300H Tiny 用 サンプルプログラム (HEW/HEW2用) http://web.archive.org/web/20050208165856/http://www.renesas.com/jpn/support/seminar/sample/index.html HEW3/HEW4用 300hhew3.exeのアーカイブがどこにもないようです。 自分は保存済なので無くても困らないのですが、欲しい方はRenesasに聞いてみるといいかもしれません(今更始める人もいないと思いますが…)