Arduino EPROM リーダー・ライターを作ってみた
図書館で借りてきた本にUV-EPROMに関する記述があり、興味を持ったのでEPROMリーダー・ライターをArduinoをベースで作ってみた。
UV-EPROMとは
UV-EPROMとはUltra-Violet Erasable Programmable Read Only Memoryの略で「紫外線でのみデータを消去できるメモリ」と考えて良いかと思います。そのため、UV-EPROMには紫外線をIC内まで通すために天窓のようなものがついています。何もプログラムしていない状態のEPROMはデータがすべて「1」です。そこに「0」を書き込んでいく形でEPROMはプログラムされます。一定時間の間、UV-EPROMに特殊な紫外線(波長が短い紫外線)を当てると内容はすべて「1」にリセットされます。
今回、作ったEPROMライターは手元にあったEPROM、27C64、27C128、27C256、27C1001(27C010)を対象にしたリーダー・ライターです。27C512を入れなかったのは27C512だけVppがなく、単純に面倒くさそうだったからです。
制作過程
これらのUV-EPROMは今、多く出回っているEEPROM(シリアルEEPROM)とは違い、パラレル通信でアドレスやデータのやり取りをします。このため、ピン数が多く、Arduino DuemilanoveなどでつかわれているATMEGA328などではピン数が足りません。そこで、シフトレジスターを使うことにしました。
シフトレジスタを使うことにより、あまりピンを使わないシリアル通信でシフトレジスタに命令を送り、UV-EPROMとやり取りさせるようにできます。シフトアウトレジスタの場合、図で簡単に示すとこんな感じです。
Arduino→(シリアル通信)→シフトアウトレジスタ→(パラレル通信)→EPROM
しかし、これだけではEPROMからデータを読み取れないのでシフトインレジスタも使う必要があります。シフトインレジスタだとこんな感じです。
EPROM→(パラレル通信)→シフトイントレジスタ→(シリアル通信)→Arduino
これら2種類のICだけでリーダー・ライターができちゃいます。今回使ったICは74HC595シフトアウトレジスタと74HC597シフトインレジスタです。もちろん、同じような機能を持つICでも回路は簡単に作れると思いますが、NJU3711(8ビット、シリアル-パラレル変換IC)などのICの場合、出力をディセーブル(高インピーダンスに切り替える)する機能がないため、EPROMのデータピン(D0~D7)でつかう場合は74HC541などの出力ディセーブル機能のあるバスバッファを介さないとデータ読み取りの際に支障が出るかもしれません。これは上記したEPROM(27c~)の性質上で同じデータピンが入力と出力両方に使われるためが原因です。
M27C1001/010の場合、アドレスピンが17つもあるため、8-ビットのシフトレジスタ(74HC595)二つでは足りないという問題がありましたが、Arduino側で余っていたI/Oピンで対処しました。今回使うEPROMはすべてデータは8ビットで記録されているため、データ用のシフトインレジスタ(74HC597)とシフトアウトレジスタ(74HC595)はそれぞれ一つで済ませることができました。万が一、書き込み時にデータ用のシフトアウトレジスタの出力がディセーブルされた場合(この場合、データに00000000が書き込まれてしまう)に備えて、データピンはすべて+5Vにプルアップされています。
ブレッドボードで試作機を製作した後、TinyCadで回路図を作り、ユニバーサル基板で実際のリーダー・ライターの制作に取り掛かりました。PCBにしてもいいか迷いましたが、設計では4種のEPROMしか扱えないことやリーダーライターは一台で足りる(PCBを頼むと複数枚頼まないといけないところが多い)ということで断念しました。
配線はかなり面倒でしたが、短期間で終えることができました。
しかし、本番はここからでArduino用のプログラムを作成しなくてはなりませんでした。最初に作ったプログラムはアドレスごとにデータをバイナリで読み取るもので、そこから、右の図のような16進数でアドレスとデータ16組をまとめて一行に表示し、一番右にASCIIキャラクタを出力するプログラムを作りました。この表示形式はEPROMリーダーでは一般的のようです。
ArduinoはEPROMからのデータを読み取った後に毎回パソコンへそのデータをUSBを介して送るため、ボーレートの値を上げることで読み取り速度および書き込み速度(Verifyモードを使うとき)が上がります。今回は250000ボーに設定しました。TeraTermなどのソフトを使えばそれ以上の値を設定可能ですが、Arduinoのクロック(16MHz)のせいか、250000以上の値ではうまくいきませんでした。
Vppの問題
Vppは20V代のものもあれば今回使ったEPROMのように12V位に設定されているものもあります。しかし、USBでは+5Vしか供給されないため、それをVpp電圧まで昇圧して使うか、ほかのところから電源を引っ張ってこなくてはなりません。今回は予算や手間も考慮して、私が持っていたATX電源の+12VをVppとして使いました。(使う前に必ずGND間に電圧差がないか確認してください)
最後に
簡単な自作CPUの制作を視野に入れているので今回このEPROMリーダーライターを作りました。今日のEEPROMやFlashメモリを見ると、UV-EPROMの時代からどれだけ技術が進歩したか実感できますね。