6503がようやく動いた報告

イメージ
  回路図まで載っけて作りましたと宣言した前回。 いざ色々動かそうとしたものの、 プログラムがまともに動かないので試行錯誤してたら何年たってたんですかねこれ 。月日が経つのは怖いですね。 今回ようやく6503と6532が無事に動きました。 何につまづいたのかというと、多分アセンブラの文法です。 6502系のアセンブラって結構豊富で、 いろんなところから出てるんですがそれぞれアドレスの表記とか微 妙に違うんですね。 で、 今回久しぶりにca65というアセンブラを使用してみたのがつま づいた原因でした。 一度設定すれば大体の6502系には対応できるのが魅力ですが、 本当よくわからないmakeファイルの設定とかで地獄を見ました 。 以下何やってたのか簡単にまとめていきます。 新しい道具も作ったよ! ■:まず動かない いや、電気は通ってるしクロックは走ってるんですよ。 なのに6532の挙動がおかしくてIRQはでっぱなしだしcpu は止まるし訳がわかりません。 そこで今一度6532のデータシートを読むと、 「 NMIとIRQはオープンコレクタなので 必ずプルアップすること 」 ってあるんですね。何その罠。 というわけでプルアップ抵抗を追加しました。 これでcpuがすぐに止まる事故は解決… と思いきやまだ止まります。というか出力がよくわからない。 そこで大昔に作りかけてやめた出力確認用LEDパネルを作成する ことにしました。 ■:めちゃくちゃ便利なLEDパネル 5年くらい前にこんなの作ったら便利やろってLEDだけ並べて、 回路に不備があることに気がついてなげたもの。 今ならなんとかできそうってことで抵抗とトランジスタ をばーっと取り付けて、 カードエッジからも表のポートからも入力できるようにしました。 これまでは毎回ブレッドボードでled回路組んでたんでクソめん どくさいし抜けるしで散々だったのですが、 これで見やすい簡単出力もicに負担がなく万々歳になりました。 やったぜ。 まあ回路図書かずにえいやっと作ったので裏はすごいことになって ます。ちゃんと整えて、 入力スイッチもつけて体裁整えたら普通に便利道具になりそう。 クロックパルスも出せるようにしたいですね。 ledドライブのために2sc1815を贅沢に使用してます。 意外と高いですがいつ買ったのか結構あったので奮発...

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ビット読み込むごとに、このピンのHIGHLOWを切り替える。

RCLK : ラッチ動作(パラレルデータ出力)ピン。各ピンに割り当てられるビットデータをすべて出力し終えたら、このピンをHIGHにする。またシリアルデータを読み込むときにはLOWにする。

SER  : データ信号入力ピン。シリアルデータを出力するピンは、ここにつなぐ。
__
O E  : このピンがHIGH(入力)になっているとQA~QHに書き込まれたデータは出力できない。なので、基本的にLOWにしておく。
___
SRCLR : このピンがLOWになっているとシフトレジスター、つまりデータが消されてしまう。74HC595の中に書き込んだデータを消したいときにはここをHIGHLOWにすればいい。ただ、基本的にHIGHにしておかないといくら書き込んでもデータは消えてしまう。なので、5Vにつないでおこう。

QH’ : 74HC595に入力できるデータは基本的に1byte(8bit)まで。なので、それ以上いれてしまうとあふれてしまう。そこで、次の74HC595にデータを受け渡すのがこのピンのようです。ここに次の74HC595のSERピンをつないでおけば、データは書き込まれていきます。

というようになっているようです。なので、arduinoからつなぐ3本の線は一つ目の74HC595にはSRCLKRCLKSERにつなげばいいということです。そして、二つ目の74HC595にはSRCLKRCLKピンから分岐させた線と、一つ目の74HC595のICのQH’ピンを二つ目のSERにつなげばOKということになります。以下にその配線図を書いておきます。(抵抗を本来挟んだほうがいいのですが、どこに何Ωを挟めばいいのかいまいち計算ができない電子工作ど素人ですごめんなさい)

 こちら74HC595のQA~QH以外の配線図です。こういう風につなげば動くはずです。
ちなみにLEDに出力するとこんな感じになります。
出力する際はshiftOut関数で出力すると簡単です。
shiftOut(データを入力するピン,クロックを入れるピン,MSBFIRST,入力したい数字);
と書けばいいはずです。shiftOut関数を書いた前にRCLKピンをLOWに、書いた後にHIGHにすると書き出せるはずです。

digitalWrite(RCLK,LOW);
shiftOut(データを入力するピン,クロックを入れるピン,MSBFIRST,入力したい数字);
digitalWrite(RCLK,HIGH);

という風になるはずです。
ちなみに、0xFFという風に書けば16ビット数字も簡単に出力できました。(当然か)
それでは次回はSRAMかEEPROMに書き込んでみようと思います。(まだシリアルモニタでいろいろ問題があるから、果たしてうまくいくか…)



コメント

このブログの人気の投稿

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

ファミリーベーシックでゲームプログラミング

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