小さなAVRマイコンのATtinyシリーズはArduinoでも使いやすく,最近14PinのATtiny404を手に入れたのでいろいろと試しています。

今は IKEAのデジタル時計の大きめの7セグLEDを表示器に使ってみようと画策中で,LED表示のコントロールにシフトレジスタ74HC595Aを使い,ATtiny404からはArduinoの"shiftOut()"関数でシリアルにデータを送ってみたのでそのメモです。



IKEAの7セグLED74HC595AATtiny404をつなぎ,ロジアナで出力を見ました。





配線図です。





送信部のプログラムです。
セグメントデータをshiftOut()で送っています。

void disp7seg(){
for (byte i=0; i < digN; i++){
digitalWrite(clockPin,LOW); // Send seg_data (reverse)
shiftOut(dataPin, clockPin,MSBFIRST, ~dispData[i]);
}
digitalWrite(latchPin,LOW); // Latch and disp
digitalWrite(latchPin,HIGH);
}





ATtiny404からシフトレジスタへの出力波形です。




シリアルのクロックはdigitalWrite()より少し速い4us程度のパルスで1bitの送信は約12us,だいたい80KHzというところでしょうか。8bit を送ってラッチまでは約100usでした。




シリアルデータ通信にはSPIが速くて使ってもいるのですが,8pinとかの小さなマイコンにはPin数が負担です。

SPIではTx,Rx,Clock,SSの4本が必要で,送信のみでもRxPinは普通はつぶれます,,。8-2(電源)-4(SPI)=2,でI2CのPinもよく重なっていて使えないのでつなぐセンサなども限られてしまいます,,。

ということで遅くても良ければI2CやPinを選ばないLEDドライバIC,またshiftOut()などの出番になるわけです。

ちなみに,今回のシフトレジスタはラッチつきで少々上品です。データ線とクロックの2本でも動く74HC164を使うのもこの程度の数のLEDならアリではと思っています。表示の変化時に少々チラつくかもしれませんが,,,。



[74HC595Aのメモ]

この8ビットシフトレジスタはフリップフロップ回路が2段になっています。
下図の上段がデータを入力してシフトするシフトレジスタ,下段が出力用ストレージレジスタです。

ストレージレジスタのクロック(RCLK)はデータのシフトには関与せず,シフトレジスタの出力を受け取って外部出力に回すラッチの働きと考えると私には分かりやすいですね。
(図の赤い線がデータの流れです)





このICのデータシートで私が最初混乱したのは次のタイミングダイアグラムです。
ちょっと見るとまるでRCLKもデータのシフトに働いているように見えるのです(^^;;;;;

あくまでデータをシフトさせているのはシフトレジスタ側のSRCLKで,その変化毎にRCLKがすぐ後を追ってストレージレジスタに入れて外部出力している図,と考えながら見ないと混乱します。





どうしてこういう図にしたのか,,そういう用途があるのか,,機能を1枚の図に全部描きたかったのか,ストレージレジスタを動かさないと出力しないことを強調したかったのか,,,上の構造の図と見比べると分かることではあるのですが,,,素人オヤジを悩ませたのは確かです(^^;;;;;;;。


ま,ストレージレジスタは次のデータがシフトレジスタ内で揃うまで,前のデータを出力し続けてくれるバッファにもなるので,なかなか強力で便利な物ではありますね。