meyon230のアイコン画像
meyon230 2023年09月17日作成 (2023年11月01日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 406
meyon230 2023年09月17日作成 (2023年11月01日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 406

Arduino で シフトレジスタ 74HC597 を制御する

Arduino で シフトレジスタ 74HC597 を制御する

シフトレジスタ 74HC597 (PISO) を使って、8ビットのデータを shiftIn() 関数で Arduino へ読み込む動作の実験をしてみました。

この記事は「meyon's STUDY」に投稿した記事の抜粋です。

74HC597 の概要

74HC597 はパラレル入力シリアル出力 (Parallel-In, Serial-Out, PISO) タイプのシフトレジスタです。入力側にストレージレジスタを内蔵しています。

基本的な制御方法は、

  1. ストレージクロック STCP\text{ST}_\text{CP} を送り、パラレルデータをストレージレジスタに読み込む
  2. パラレルロード PL\overline\text{PL} でストレージレジスタのデータをシフトレジスタへ移す
  3. シフトクロック SHCP\text{SH}_\text{CP} によりデータを順次シフトし、シリアル信号 Q7\text{Q7} としてに出力する

Arduinoでは、STCP\text{ST}_\text{CP}PL\overline\text{PL} を送信した後、shiftIn() 関数で SHCP\text{SH}_\text{CP} を送ってシリアルデータを受け取ります。

74HC597 からデータを受信する回路図

Dipスイッチで 8ビットのデータを作り、それを 74HC597 のパラレル入力に渡します。
ストレージクロック STCP\text{ST}_\text{CP}、シフトクロック SHCP\text{SH}_\text{CP}、マスタリセット MR\overline\text{MR} は、それぞれ Arduino より制御します。MR\overline\text{MR} は抵抗でプルダウンし、Arduino の起動前に LOW にしておくことでシフトレジスタを初期化します。
シリアル出力 Q7\text{Q7} は Arduino へ送ります。Arduino では shiftIn() 関数を使用してデータを読み込みます。

JKフリップフロップ CD4027 を利用した RSラッチは、パラレルロード PL\overline\text{PL} の制御を行なっています。Arduino からのパラレルロード制御信号 PARL\text{PARL} で RSラッチをセットし、シフトクロック SHCP\text{SH}_\text{CP} でリセットします。

74HC597 からデータを受信する回路図

RSラッチの働き – 8ビットすべてを読み込む

PL\overline\text{PL} が送られたときに Q7\text{Q7} にはビットデータ D7 が出力されますから、shiftIn() 関数が SHCP\text{SH}_\text{CP} を HIGH にするとデータがシフトしてしまいます。shiftIn() 関数は SHCP\text{SH}_\text{CP} を HIGH にしてからデータを読み込むので、結果的に D7 を読み落としてしまいます。

この不具合を改善するために、SHCP\text{SH}_\text{CP} が入るまで RSラッチで PL\overline\text{PL} を保持するようにしました。PL\overline\text{PL} は RSラッチの遅延時間の後に HIGH になりますから、データのシフトは 2つ目の SHCP\text{SH}_\text{CP} が入ったときから始まり、8ビットすべてのビットを読み込めるようになります。

Arduino Nano Every スケッチ

setup() で、マスターリセット MR\overline\text{MR} を HIGH にしてシフトレジスタを初期化しています。
loop() で、Arduino よりストレージクロック STCP\text{ST}_\text{CP} 、パラレルロード PARL\text{PARL} を送り、次に shiftIn() 関数でデータを読み込みます。読み込んだデータはシリアルモニタへ出力します。

74hc597.ino

// Shift Register 74HC597 Test Sketch 2023.9.6 meyon230 const byte STcp_Pin = 9; // Storage Clock const byte SHcp_Pin = 13; // Shift Clock const byte PARL_Pin = 10; // Parallel Load const byte MR_Pin = 8; // Master Reset const byte Q7_Pin = 12; // Serial Data void setup() { pinMode(STcp_Pin, OUTPUT); pinMode(SHcp_Pin, OUTPUT); pinMode(PARL_Pin, OUTPUT); pinMode(MR_Pin, OUTPUT); Serial.begin(9600); digitalWrite(MR_Pin, HIGH); } void loop() { static byte serialData = 0; digitalWrite(STcp_Pin, HIGH); digitalWrite(STcp_Pin, LOW); digitalWrite(PARL_Pin, HIGH); digitalWrite(PARL_Pin, LOW); serialData = shiftIn(Q7_Pin, SHcp_Pin, MSBFIRST); Serial.println(serialData, BIN); delay(100); }
meyon230のアイコン画像
電子工作とかパソコンとかネットワークとかプログラミングとか、いろいろ。
ログインしてコメントを投稿する