シフトレジスタ 74HC597 (PISO) を使って、8ビットのデータを shiftIn() 関数で Arduino へ読み込む動作の実験をしてみました。
この記事は「meyon's STUDY」に投稿した記事の抜粋です。
74HC597 の概要
74HC597 はパラレル入力シリアル出力 (Parallel-In, Serial-Out, PISO) タイプのシフトレジスタです。入力側にストレージレジスタを内蔵しています。
基本的な制御方法は、
- ストレージクロック を送り、パラレルデータをストレージレジスタに読み込む
- パラレルロード でストレージレジスタのデータをシフトレジスタへ移す
- シフトクロック によりデータを順次シフトし、シリアル信号 としてに出力する
Arduinoでは、 と を送信した後、shiftIn() 関数で を送ってシリアルデータを受け取ります。
74HC597 からデータを受信する回路図
Dipスイッチで 8ビットのデータを作り、それを 74HC597 のパラレル入力に渡します。
ストレージクロック 、シフトクロック 、マスタリセット は、それぞれ Arduino より制御します。 は抵抗でプルダウンし、Arduino の起動前に LOW にしておくことでシフトレジスタを初期化します。
シリアル出力 は Arduino へ送ります。Arduino では shiftIn() 関数を使用してデータを読み込みます。
JKフリップフロップ CD4027 を利用した RSラッチは、パラレルロード の制御を行なっています。Arduino からのパラレルロード制御信号 で RSラッチをセットし、シフトクロック でリセットします。
RSラッチの働き – 8ビットすべてを読み込む
が送られたときに にはビットデータ D7 が出力されますから、shiftIn() 関数が を HIGH にするとデータがシフトしてしまいます。shiftIn() 関数は を HIGH にしてからデータを読み込むので、結果的に D7 を読み落としてしまいます。
この不具合を改善するために、 が入るまで RSラッチで を保持するようにしました。 は RSラッチの遅延時間の後に HIGH になりますから、データのシフトは 2つ目の が入ったときから始まり、8ビットすべてのビットを読み込めるようになります。
Arduino Nano Every スケッチ
setup() で、マスターリセット を HIGH にしてシフトレジスタを初期化しています。
loop() で、Arduino よりストレージクロック 、パラレルロード を送り、次に 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
さんが
2023/09/17
に
編集
をしました。
(メッセージ: 初版)
-
meyon230
さんが
2023/09/17
に
編集
をしました。
-
meyon230
さんが
2023/11/01
に
編集
をしました。
(メッセージ: リンク先URL変更)
ログインしてコメントを投稿する