2019年6月16日日曜日

Arduino+74HC595+8×8nマトリクスLED(6.4)

「行側制御にシフトレジスタ使うのもったいなくね?」問題の第四回です。


前回はデコーダとシンクドライバの間にNORゲートを挟む方向で実装しようかな、というところまででした。

それはそうと、きちんとロジックおよびIC間の連携をチェックしていないので、簡単にシフトレジスタ+カウンタ+デコーダを接続し、シフトレジスタとデコーダの出力にLEDバーをつないで出力の様子をチェックすることにしました。




【実験回路】



Arduinoからブレッドボード左上の74HC595(シフトレジスタ)にデータを入力。ラッチクロックを分岐して、ブレッドボード右下部の左にある74HC4040(カウンタ)へ入力、出力Q1~Q3を右にある74HC138(カウンタ)の入力A~Cに接続して、デコードという流れでスキャン部の制御を自動化、というイメージです。

表示部については左LEDバーが74HC595の出力確認用、右LEDバーが74HC138の出力確認用、左の中ほどにある3つのLEDは74HC595の入力確認用で、それぞれSER、SRCLK、RCLKにつないであります。

スケッチは適当なデータを74HC595に送って8bit毎にラッチするというだけのものです。動作を確認しやすいようにループの最中に長めのdelayを入れてあります。

【動作の観察】


実際に動かしてみると、おおかねそれっぽく動いていて使えそうなのですが、問題があります。
リセットボタンを押下後しばらくして左のLEDバーが全消灯になります。このタイミングが74HC595のクリアです。その後SRCLKとRCLKが点滅してSERが光りはじめます。右のLEDバーは一旦左端(つまりカウンタがリセットされた状態)が点灯した後74HC595クリアを受けて次のセグメントが点灯しています。

何が起きているかざっくり説明しますと、起動時および74HC595のSRCLRピンをLOWにして内容をクリアした後、ラッチする必要があります。SRCLRはあくまでシフトレジスタのみをクリアし、ストレージレジスタはそのまま保持していますので、ラッチしてシフトレジスタの内容を反映(全ビットLOWのデータで上書きすることになります)しなければいけません。
しかしながら、自分の回路ではこのクリア時のラッチを忘れていたので、74HC595をクリアすると次段にある74HC4040がこのラッチを拾い強制的に一段カウントしてしまうので、74HC595のクリア後は0ではなく1から始まってしまいます。しかも、初回データのシフトが終わっていざ反映、というタイミングのラッチも拾うので、結局一行目に表示すべき初回データを3行目に表示することになってしまいます。
クリア時のラッチクロックと初回データ反映のラッチクロックを捨てたいので、74HC4040のCLRをHIGHに保持したまま74HC595をクリアすればラッチクロックを無視できそうな気がしたのですが、うまくいきませんでした。なにかいい方法を考えなければいけません。

現状のシフトレジスタのみの行制御部と比較すると回路設計ははるかにややこしいので、新方式に振り替えるメリットがあるのか自信が持てなくなってきました(^^;;

次回は自動スキャン回路のクリア処理について考えてみたいと思います。

【参考情報】
「74HC595」の解説ーしなぷすのハード製作記
74HC595についてはリンク先の解説が非常に参考になります。

0 件のコメント:

コメントを投稿

ESP32 Devkit C での疑問点

 前回の投稿から放置状態にあった当ブログですが、再び何かしら作ろうということで、スマートコンセントもどきに取り組んでいます。 回路なども一応動作するものができたのですが、ブレッドボードから移行するために基板に用意しておいたピンソケットにESP32を取り付けたところ、なぜか動作しま...