74HC595を使ってarduinoの16ビットパラレル出力に挑んでみた
今回の実験台、74HC595さんです。 |
そこで、この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のピン配置 |
SRCLK : クロック信号入力ピン。1ビット読み込むごとに、このピンのHIGH、LOWを切り替える。
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にはSRCLKとRCLK、SERにつなげばいいということです。そして、二つ目の74HC595にはSRCLKとRCLKピンから分岐させた線と、一つ目の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に書き込んでみようと思います。(まだシリアルモニタでいろいろ問題があるから、果たしてうまくいくか…)
shiftOut(データを入力するピン,クロックを入れるピン,MSBFIRST,入力したい数字);
と書けばいいはずです。shiftOut関数を書いた前にRCLKピンをLOWに、書いた後にHIGHにすると書き出せるはずです。
digitalWrite(RCLK,LOW);
shiftOut(データを入力するピン,クロックを入れるピン,MSBFIRST,入力したい数字);
digitalWrite(RCLK,HIGH);
という風になるはずです。
ちなみに、0xFFという風に書けば16ビット数字も簡単に出力できました。(当然か)
それでは次回はSRAMかEEPROMに書き込んでみようと思います。(まだシリアルモニタでいろいろ問題があるから、果たしてうまくいくか…)
コメント
コメントを投稿