投稿

2月, 2017の投稿を表示しています

SRAMにDIPで直接データを書き込む装置をarduinoを使って作ってみた

イメージ
今回も今回でスパゲッティ。 ちなみに横のZ80にはワイヤーが足りず繋げませんでした(´・ω・`) 先日、EEPROMにデータを書き込む装置をArduinoで作りましたが、まだROMをつないであれこれできるほどZ80について理解しているわけではありませんし、どんどんプログラムを書き込んでは実験して…というのを繰り返すにはあの装置は(主にワイヤーが邪魔で)非常に不便です。そんな時、SRAMに毎回DIPで書き込んでそのたびに実験するという装置をyoutubeで見かけたのでこれだと思い作ってみたのですが、思ったように書き込むまで手間取ったのでメモがてら装置について説明しようと思います。 ■SRAMに書き込む動作と読み出す動作  SRAMに書き込む動作はROMに比べれば非常にシンプルです。まず、今回使ったSRAMの TC55257DPL-85L のピン配列を見てみます。 DIPtypeのピン配列。 この中で動作切り替えに使うのはCE、OE、R/Wのたった3ピン。各ピンの機能は、 CE : SRAMを使用可能か否かを切り替える。 OE : SRAMからデータを読み出す R/W : 読み出し・書き出しをコントロールする。クロックに近い? といった感じになっています。ちなみにI/Oはデータバスで、Aがアドレスバスを指しています。+5V駆動なので、Arduinoの5Vピンにつなげば動かせるという手軽さ。ステキ!  では、データを書き込むときにはこれらのピンをどういう風に動かせばいいかといいますと、 アドレスピンにアドレスデータを入力 OEピンはHIGH(動かさない)に CEピンをLOWにし、SRAMを起動する R/WをLOWにし、データを受け付ける状態に I/Oピンにデータを出力(ここでデータが書き込まれる) CEピンをHIGHにし、SRAMを止める R/WをHIGHに I/Oへのデータ出力をOFF アドレスピンへの出力をOFF といった手順で書き込めるようです。EEPROMと大きく違うところは、データを書き込んでいる間もアドレスバスからの出力をやめないというところでしょうか。  では、読み出しはどうするかというと アドレスピンにアドレスデータを出力 R/WピンをHIGHに CEピンを

z80がリセットされない問題

イメージ
先日、Z80の動きをArduinoで見れるようにする装置というものを作りましたがあの装置に問題がありました。それは、CPUをリセットできないというものでして… ■CPUのリセットとはどういうことか  Z80やその他さまざまなCPUは、電源が入るとメモリの1番地、要は一番最初のデータから順番に読み込んでいきます。その命令をCPUの中にあるレジスタという記憶部分にしまったり、ジャンプ命令などでアドレスバスの出力やらデータの入出力を行います。そしてその途中でクロックを止めたり電源を切ったとしても、その時のデータがCPUの中に残っていると次に電源を入れた時に前回の途中から始めてしまうことがあるわけです。  そこでこのZ80にはRESET端子というものが備わっていて、この端子を0V(アクティブ状態、)にするとCPUの中のデータやらもろもろが初期状態に戻り、また一から作動できる・・・というようになっています。 が、 今回自分の作った回路では何回もRESET端子に入力しても信号がうまく伝わってくれません。これでは思うように実験ができない。そこで、腹をくくってZ80のマニュアルを読み直してみました。全部英語。日本語版がほしい…(´・ω・`) ■リセット信号とクロック入力  Z80のマニュアルを読んでみると、リセット信号をZ80が読み込んで理解し、リセットするにはリセット信号とは別で クロック信号を3クロック以上入力しなくてはならない ということが書いてありました。インターネット上には様々なZ80のピン配列や命令表はありますが、それは見かけなかったなぁ…(あ、でも某ホームページを隅から隅まで読めばきっと書いてあったかも…)  というわけで、もう一度今回はリセット信号をきちんと認識するかどうかのチェックだけなので簡単な実験装置を作りました。 RESET実験後に3Mhzの水晶発振器を取り付けました。 リセット信号は5Vラインにつながっている線をGNDにつなぐだけでいいので、動いているアドレス信号がまた0番地から始まれば成功というわけでして。リセット端子をアクティブモード(0V)にし、そのまま3クロック入力するとアドレス信号やM1信号などがすべて初期状態に戻りました。これでプログラムの実験などもまともにできるように!  やはり、説明書はきちんと読む

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ビット目を強制的に読み込むプログラムを作る必要がありましたが、 こちらのサイト のプログラムをベースに最下位ビットから順番に読み込むプログラムを作成しました。(大変参考になるサイトで、今回の計画もこのサイトがなければもっと難しいものになったと思います。)読み込んだビットを変数の中に書き込む方法としては、「ビット演算子」を使

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

イメージ
今回の実験台、74HC595さんです。 前回、EEPROMとSRAMを手に入れたお話をしましたがこのICを使うには中にデータを書き込まないといけません。となると、各ピンにそれぞれデータを送らないといけないのでarduino unoさんではピンが足りません。  そこで、この74HC595というICを使うと本来一本一本つながないといけないところが3本で済み、しかもIC同士をつなげることによって8ピン出力から16、24と増やしていけるそうなので、これだと思い手を出してみたのですが予想どおりになかなか動いてくれなかったのでその動くまでとどうしたら動かせるのかを記載しておきたいと思います。 ■74HC595とはどういったICなのか  まず 74HC595の取扱説明書 を見てみますと、「8ビットのシリアル入力データをパラレル出力にする」と書いてあります。つまり、一本のピンから出力された例えば「00110100」というデータを各ピンに数字を一個ずつ(0か1か、つまりONかOFFか)割り当てる機能を持っているということで、1ビットずつ読み込んでいったデータを並べて一気に出力してくれるというわけです。まさに今の状況にうってつけです。  アドレスバスはz80の最大本数16本でも、このICを二つ使えば事足りるというわけ。(データバスは別ですが・・・)  また、このICは出力のみなのでもしz80のアドレスデータをarduinoに読み込むのであれば別の読み込み用のパラレル⇒シリアルICを用意しなくてはなりません。それでも、IC同士をつなげることができるので3本で事足りるというわけなのですが…ここが曲者でした。 ■74HC595のピンの役割 Texas Instruments社のデータシート より74HC595のピン配置 上の画像はこの74HC595のピン配置図なのですが、Vccは5V電源をつなぐ部分、GNDは電源のマイナス部分につなぐところです。そしてQA~QHがそれぞれA0(アドレスバスPIN1番)~A7(アドレスバスPIN7番)になります。それ以外のピンの役割についてはこのようになっています。 SRCLK  : クロック信号入力ピン。1ビット読み込むごとに、このピンの HIGH 、 LOW を切り替える。 RCLK  : ラッチ動

arduinoにz80の疑似ROMとRAMを担当させてみようとしたら、DIPタイプのパラレルSRAMとEEPROMを入手したお話

イメージ
右の本、超良書です。 前回、クロック入力と電源をarduinoにさせることによってz80の動作を見ることができる装置を作りましたが、あのままでは単純に「動くところ」だけしか見ることができません。そこで、まだ余っているarduinoのピンにメモリアドレスのピンと、アドレスバスのピンをつなげようとしたのですが、 ピンがどうやっても足りません。(見ればわかるか・・・) そこでひとまず余っているアナログピンを(たったの三本!)arduinoとつないであげます。3本しかないので、A0~A2の3ビット、つまりアドレスの7番地までしか確保できません。 まあすごく短いプログラムなら何とかなるだろうと考え、 こちらのサイト を参考にしまして、実行したい命令を見よう見まねでハンドアセンブルしようとしたのですが、何が何だかわかりませんでした。 そこでひとまず意味の分かるアセンブラ命令を機械語と配置まで決めてくれるソフトを探していたのですが、みんな古くて今のパソコンで動いてくれません。なので、開発ソフトはないのかと探していたらもろもろを解決してくれる最高のサイトを見つけました。 アセンブラでソフトを開発しよう というサイトです。 本当に助かりました。このなかに古いウインドウズをエミュレートする部分があるのですが、そのexeファイルをコンパイラとかの入っているフォルダに入れるのを忘れないでください。動きませんから。 さて、いざ書いたプログラムも本当に動いているのか確かめたいけど、まずはこのPC6001エミュレーターとやらの使い方をわからないといけない。それはちょっとしんどいです。すごく面白そうだし、そちらにはまってしまって抜け出せない可能性もあるし。 と、ここでとあるサイトのことを思い出しました。TK80というコンピューターが昔あったのですがそのコンピューターをWEB上で再現してしまったというものです。それが こちら 。すごい人がいるんですね…。こうなってみたいものです。 それから、操作方法は こちらのサイト と、 こちらの動画 を見ていただくとお分かりいただけると思います。 では、これをどうするかというと、先ほどのアセンブラソフトで出力された16進数を指定された番地にエミュレーター上で書き込んでいって、実行。その結果が思い通りだったらプログラミングは成