991117 ROMエミュレータ


 今、抱かれたいCPUで4位ぐらいのPICを使ったROMエミュレータです。
 ワンチップマイコンPIC(ピック)は、
・ 外付部品が少ない
・ チップの値段が安い
・ 開発環境が安い
・ 同じアーキテクチャでいろいろな品種がある
などの長所があります。欠点は、命令が非力でプログラムが面倒な点です。

 ROMエミュレータとは、文字通りROMをエミュレーションするものです。8bitマイコンのプログラムを開発するとき、
(1)開発用パソコンでプログラムを作る
(2)ROMライタを使ってプログラムをROMに書き込む
(3)ターゲットの回路にROMを刺す
(4)ターゲットの動作試験
(5)必要に応じてパソコンでプログラムを変更
(6)ROMのプログラムをROMイレーサーで消す
(7)上の(2)へ戻る
というサイクルを繰り返しますが、ROMエミュレータをターゲットの回路のROMソケットに刺して使うことによって、
(1)開発用パソコンでプログラムを作る
(2)ROMエミュレータにプログラムを転送
(3)ターゲットの動作試験
(4)必要に応じてパソコンでプログラムを変更
(5)上の(2)へ戻る
となり、プログラムの作成と動作試験に専念することができます。

 PICとROMエミュレータの両方を褒めちぎった後でおかしな話ですが、PICはROMを内蔵したワンチップマイコンですから、PICのプログラム開発のためにROMエミュレータを使うことは出来ません。ROMエミュレータは、HD64180など、マルチチップのCPUのプログラム開発のために作ったのです。

 今回使用するのは、40pinDIPパッケージで最もI/O点数が多いPIC16C74Aです。

PIC16C74A

 MCLRはリセットですが、チップ内部にちゃちなリセット回路が内蔵されているので、玩具的な用途ではMCLRを+5V固定で使用することもできます。他に、VDD、VSSに電源と、OSC1、OSC2に水晶振動子を接続するだけで、マイコンとして動作します。入出力は33bit使用できます。

 内蔵ROMは、窓付きで紫外線で消せるPIC16C74AJW(3500円ぐらい)と、窓無しワンタイムのPIC16C74A(900円ぐらい)があります。最近、EEPROMを内蔵したPIC16C877とかいう品種があって、1500円ぐらいで何回もプログラムを変更できる上にレジスタも増えているようなので、次回使ってみようと思っています。

 PICの開発には、PIC Start(3万円台)を使っています。これはパソコンのシリアルポートに接続するPICライタとアセンブラのセットで、便利とは言えませんが安価にPICをスタートできます。


ROMエミュレータの外観 (romemu.jpg)


ROMエミュレータの回路図 (romemu.gif)
ROMエミュレータの部品表 (romemu.txt)

 外観、回路図、部品表を見るには、上のそれぞれのリンクをクリックしてください。ファイルをダウンロードするには、上のリンクを右クリックして「対象をファイルに保存」してください。

 J1は2P端子台で、電源入力です。DC8V以上のACアダプタのプラグをY端子に変更して接続します。

 J2はシリアル入力ポートです。過電圧保護された5VのC-MOS入力ですが、このままRS232cに接続してしまいます。

 J3はROMソケットに差し込む38pinDIPプラグを接続します。i27256の各pinに対応します。

 IC3は256KbitのRAMです。通常はJ3側から見てROMであるかのように動作します。J2からインテルヘキサの文字列が入ると、それに応じてRAMの内容が変更されます。
 PIC16シリーズは、命令幅14bit、データ幅8bitで、データを扱うには、RAMではなくて多数の汎用レジスタを使います。命令が非力で、スタックはRAM上ではなくハードウェアスタックで浅く、i8048に近い感じです。このように特殊なアーキテクチャですが、プログラム上工夫を要する件に関しては、マニュアルにサンプルプログラムが付いているので、すぐにプログラムに取りかかることができます。

 PIC16シリーズをプログラムする際の注意点は、
・割り込みルーチン内でのレジスタ保護に工夫を要するので、マニュアルのサンプルプログラムを真似た方がよい。
・ROM上のデータテーブルを使うとき、256byte毎のページを意識する必要がある。割り込みを使用する場合、ページの保護を意識する必要がある。
・命令が低機能なので、初めにマクロを作ってから、アプリケーションに取りかかった方がよい。
・数値演算や文字列の操作が必要なときは、PIC以外のCPUを検討した方がよい。
 といったところです。

 これはCPUではなくて開発環境の話なのですが、PICスタートのアセンブラにはDB命令が無く、EQUを使って汎用レジスタ(RAMに相当)のアドレスを割り当てて行くのですが、これはデータをずらしたり増やしたりするときにとても面倒です。

 PIC16シリーズの汎用マクロ (pic.h)
 PIC16C74のレジスタ定義 (registor.h)
 ROMエミュレータのプログラム (romemu.asm)

 上のリンクは、今回作ったROMエミュレータのプログラムです。ここでは詳しく解説しませんので、ご質問、ご相談などありましたら、どなたでもメールください。

1999年11月17日作成 home pageへ