編集履歴一覧に戻る
meyon230のアイコン画像

meyon230 が 2023年11月01日01時14分00秒 に編集

リンク先URL変更

メイン画像の変更

メイン画像が変更されました

本文の変更

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

-

この記事は「[meyon's STUDY](http://meyon.gonna.jp/study/electronic/9682/ "Arduinoで 74HC597 (PISOシフトレジスタ) を制御する")」に投稿した記事の抜粋です。

+

この記事は「[meyon's STUDY](https://meyon.gonna.jp/study/electronic/9682/ "Arduinoで 74HC597 (PISOシフトレジスタ) を制御する")」に投稿した記事の抜粋です。

## 74HC597 の概要 74HC597 はパラレル入力シリアル出力 (Parallel-In, Serial-Out, PISO) タイプのシフトレジスタです。入力側にストレージレジスタを内蔵しています。 基本的な制御方法は、 1. ストレージクロック $\text{ST}_\text{CP}$ を送り、パラレルデータをストレージレジスタに読み込む 2. パラレルロード $\overline\text{PL}$ でストレージレジスタのデータをシフトレジスタへ移す 3. シフトクロック $\text{SH}_\text{CP}$ によりデータを順次シフトし、シリアル信号 $\text{Q7}$ としてに出力する Arduinoでは、$\text{ST}_\text{CP}$ と $\overline\text{PL}$ を送信した後、shiftIn() 関数で $\text{SH}_\text{CP}$ を送ってシリアルデータを受け取ります。 ## 74HC597 からデータを受信する回路図 Dipスイッチで 8ビットのデータを作り、それを 74HC597 のパラレル入力に渡します。 ストレージクロック $\text{ST}_\text{CP}$、シフトクロック $\text{SH}_\text{CP}$、マスタリセット $\overline\text{MR}$ は、それぞれ Arduino より制御します。$\overline\text{MR}$ は抵抗でプルダウンし、Arduino の起動前に LOW にしておくことでシフトレジスタを初期化します。 シリアル出力 $\text{Q7}$ は Arduino へ送ります。Arduino では shiftIn() 関数を使用してデータを読み込みます。 JKフリップフロップ CD4027 を利用した RSラッチは、パラレルロード $\overline\text{PL}$ の制御を行なっています。Arduino からのパラレルロード制御信号 $\text{PARL}$ で RSラッチをセットし、シフトクロック $\text{SH}_\text{CP}$ でリセットします。

-

![74HC597 からデータを受信する回路図](http://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_schematic_928723.png)

+

![74HC597 からデータを受信する回路図](https://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_schematic_928723.png)

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

-

![](http://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_timingDiagram_928723.png)

+

![](https://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_timingDiagram_928723.png)

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

-

![](http://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_timingDiagram-improvement_928723.png)

+

![](https://meyon.gonna.jp/study/wp-content/uploads/shiftRegister_74HC597_timingDiagram-improvement_928723.png)

## Arduino Nano Every スケッチ setup() で、マスターリセット $\overline\text{MR}$ を HIGH にしてシフトレジスタを初期化しています。 loop() で、Arduino よりストレージクロック $\text{ST}_\text{CP}$ 、パラレルロード $\text{PARL}$ を送り、次に shiftIn() 関数でデータを読み込みます。読み込んだデータはシリアルモニタへ出力します。 ```C++: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); } ```