arduinoでパラレルEEPROMリーダ・ライターもどきを作ってみた

今回作ったマシンはこちら。相変わらずのスパゲッティ。

z80コンピューターを作るうえでSRAMとEEPROMは用意できましたが、肝心のプログラムをEEPROMに書き込まなくては自分の思うように動いてもらえません。しかし、UVEPROMにしろEEPROMにしろ書き込み装置はどうやら手ごろな値段で売ってはいないようなので「ひとまず何か書き込める装置をつくろう」と思いarduinoにやらせてみることにしました。
 今回書き込むROMはAT28C256という32KBのEEPROMです。(UVタイプは書き直すのに殺菌灯とかいうおっそろしいものを使わないといけないそうなのでやめておきました。)

 まず書き込み・読み込みアドレス指定のために74HC595を二つつないで16ビットアドレス書き込みを可能にます。データバス読み込みに74HC165、74HC595を使います。そして、ROMの読み込み・書き込みモード切替用に3本のピンを別で直接arduinoにつなぎます。(基本的に5Vのみで動かしており、アンペアの許容範囲を考えていないので下手をすると壊れてしまうかも…)
 アドレスバスの指定はすべて入力のみなので特に問題はないのですが、データバスは入出力両方ともおこなうためこのままでは595から入力したデータが165に流れてしまいうまく書き込めない、または逆も起こってデータが読み込めないということが起こりえますというか起こりました。なので、書き込み側の回路にはLEDを整流ダイオードの代わりに挟み、読み込み側には1.5kΩの抵抗を挟むことによりこれを防止しています。(しかし完全ではないようで、時々書き込みに失敗します。)

■ROMを読み込む際の74HC165の処理

ROM内に書き込んだ内容を読み取る際には74HC165を使いますが、既存のarduinoにあるshiftin関数を使うと1ビット目を飛ばして読み込みを開始してしまうため、まず1ビット目を強制的に読み込むプログラムを作る必要がありましたが、こちらのサイトのプログラムをベースに最下位ビットから順番に読み込むプログラムを作成しました。(大変参考になるサイトで、今回の計画もこのサイトがなければもっと難しいものになったと思います。)読み込んだビットを変数の中に書き込む方法としては、「ビット演算子」を使うというものでした。まず、読み込んだ情報を00000001(HIGH)か00000000(LOW)かで読み込みます。そしてこの読み込んだビットを読み込んだ順番に合わせて正しい位置にずらすためにビットシフト演算子(<<)というものを使います。これで例えば三番目に読み込んだのなら、右に1を3つずらして00000100という風にします。これをOR演算子(|)で書き込む変数と比較させ、どんどん書き込んでいきます。(例えば変数が00000011、ビットをずらしたものが00000100であったら、比較すると下から3番目のビットが変数の場合0になっているので、読み込んだデータに合わせて00000111と書き換えられます。)こうすることによって、読み込んだデータを正しい順番で変数に書き込んでいくことができます。

■ROMに書き込む際の74HC595のタイミング

AT28C256の書き込みタイミング

書き込みの時にはSRAMのように入力モードにしていれば書き込めるわけではなく、こちらのEEPROMのデータシートAT28C256に書いてあるタイミングチャートをもとに書き出しタイミングを指定していきます。ここで重要なのは、データバスからの出力を行う前にアドレスバス出力を止めることです。そうしないと誤ったデータが書き込まれうまく動作しなくなります。また、読み込みと書き込みを切り替える際にきちんと74HCをすべて0にしておかないとデータが残ってしまい書き込み失敗の原因になります。
 こうして動作させたシリアルモニタがこちらです。
正直、アドレス番地と横に文字を表示するのが一番難しかった。

ひとまず読み込み、書き込みができるようになったので一段階進んだかなと。しかし、HEXファイルは直接書き込めないし、読み込んだデータをASCIIコードに変換しようとしましたがどうにもこうにもうまくいきません。というわけで実用的ではないということで今回は「もどき」とさせていただきました(´・ω・`)想像以上に難しいですよこれ…
次の記事:
z80がリセットされない問題
前の記事:
「ロボットID-01」という10万越えのロボットがあったので、引っ張り出してみた

コメント

このブログの人気の投稿

ファミコンの完全自作ROM&カセットを作ろう!!その1~立ちはだかるコンパイラの壁~

ファミコンの完全自作ROM&カセット作ろう!〜cc65で起動ROMをつくる〜

74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた