部品屋根性(7) 中華キット、74HC595の闇?

Joseph Halfmoon

前回、怪しいところ満載だけれど、結構便利につかえるじゃん、という感じだった中華部品キット Kuman K4であります。今回はその箱の中から標準ロジックデバイス、74HC595を取り上げさせていただきます。標準ロジックなんて分かってらい、と思ったら、やっぱりというべきかそこには闇が隠れとるのでありますよ。

※「部品屋根性」投稿順Indexはこちら

なぜに74HC595、8ビット・シフトレジスタかと言えば、上のアイキャッチ画像を御覧ください。「初心者向けキット」という性格上、LEDは色々(本当に)入っておるのであります。7セグLEDとLEDマトリックスの隙間に595が居るのに気づきました。もともとAxxxxxx Uno互換機で入門するためのキットなので、IO端子数を多くとれないATMEGA 328Pのために、シフトレジスタで端子数を増やしてLEDを駆動すべし、という意図だと了解しました。老眼の目には、上のアイキャッチ画像の状態では、74シリーズご本家のTIのデバイスに見えました。型番は、

SN74HC595

SNで始まっているし。。。

キット付属のCDの中に格納されているデータシートはPhillips印でした。Phillipsセミコンダクター、懐かしいかも。勿論、現在はNXP社になっとります。さすればかなり昔のデータシートですな。しかしね、老眼の目を擦っているうちに

ロゴマークに違和感

を感じてしまいました。手元に74HC595はなかったのですが、TI社のSN74HC04があったので、比べてみた写真を掲げます。

74HC marking ??ほらね、なんか変。よく見るとテキサス州の形もt型の切れ込みもiの文字も無い!TIじゃない。とはいえ、昔見知っていたPhillips社のマークとも違うように思います。勿論NXPのマークじゃないし。ちょっと調べていると秋月電子通商殿の通販サイトのQ&Aのページを見つけました。

8ビットシフトレジスタ SN74HC595Nの質問と回答

上記のページには2件の質疑が掲載されているのですが、その2件目(2020年の夏のご質問)に、TIのSN74HC595Nがディスコンでもないのに在庫限りになってしまった理由を尋ねる質問がありました。1文引用させていただきます。

メーカーの方針によりエンドユーザーを特定できない流通経路での販売が禁止されたため、今後の入荷の予定はございません。

そういうことですか。TI系列の半導体商社へ連絡し、身分と用途を明かして注文最低数量xxケー(1ケ、2ケのケではなく、K=1000個のケーですな。)を発注しないと売ってくれなくなったのでしょう。別に日本だけじゃないと想像するので、全世界的にでありましょう。秋月通商殿も困ったみたいですが、流石しぶとい秋月通商、現在は互換品を販売しているようです。互換品と言えどもSNではない型番で、ちゃんと会社名あり、です。

別に互換品が悪いとは言いません。半導体産業の黎明期には、

セカンドソース

といわれ、業界の発展に大きく寄与したのが互換品であります。当時は、セカンドソースが無いデバイスは買わない、というようなお客も居たと記憶。私も胸に手をあてて考えると、世間的には互換品を手掛けていた時代もあり、互換品自体はOKです。ただ、

  1. 製造会社が分かるマーキングであること
  2. 互換品と言えどもデータシートがあること

くらいは最低必要じゃないかと思います。互換といっても、同じ工場、同じ工程でマーキングだけ変えたというような場合以外は、仕様など微妙に違いがある筈なので、それを記したデータシートがあり、また、責任の所在が分かるマーキングであることが必須。私が知らないだけで、見る人が見ればメーカ分かるのかもしれないでしょうが、私的にはチト怪しい感じがしました。

でもね、標準ロジックICだし、きっと動くし。。。

まあ、ブレッドボードにその74HC595を差し込み、テスト用の回路を組みました。使用したブレッドボードは、K4キットに付属のものです。ちょっと表面の印刷が掠れて使い込んだ感がありますが、先週到着したばかりのもの。しかし、これには良い点があり、

DIPの足が楽に刺さる

のであります。私の個人的な経験では、ブレッドボードには2つのグループあり。

  • DIPの足が楽に刺さるもの
  • DIPの足を刺そうとすると力がかかり過ぎて曲がる危険のあるもの

後者の方が多い気がします。そのため、DIPを使うときはピン(細ピン)のICソケットにDIPを刺してから使うことが多いです。ただ、今回は16ピンのソケットの在庫なく、どうしようかと思ったら、K4キットのブレッドボードは楽に刺さるものだったので、そのまま使ってしまいました。(もしかすると中のコンタクトのバネが緩いだけなのかもしれない。。。)

ブレッドボード上の回路はこんな感じ。74HC595とブレッドボード以外のLEDやら抵抗、線材等はすべて手持ちのもの。問題を複雑にしたくなかったので。

74HC595 DUTさて、これを駆動するのに使ったのはキット付属の「互換機」ではなく、Seeed社製、RISC-V搭載GD32VF103マイコンを搭載した開発ボードです。このボードについては以下を御覧ください。

鳥なき里のマイコン屋(96) GD32VF103VBT6開発ボード

このボードにもArduino環境がある筈なのですが、ま、諸般の事情を鑑み、GD32のSDKを使ってプログラムは書いています。

今回は、すべてソフト制御で74HC595を動かしてます。このボードは使えるIOポートが潤沢にあるのですが、たまたまピンヘッダから取り出しやすい位置にならんでいたPortCから4本を制御線として使うことにいたしました。GPIOの初期化なので簡単ですが、念のため以下に初期化コードを置いておきます。

rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
gpio_bit_set(GPIOC, GPIO_PIN_10);   //DATA
gpio_bit_reset(GPIOC, GPIO_PIN_11); //CLK
gpio_bit_set(GPIOC, GPIO_PIN_8);   //OE#
gpio_bit_reset(GPIOC, GPIO_PIN_9);   //ST

あとは、8ビットシフトレジスタにデータを送るのですが、クロック幅の時間を確保するのに、以下の記事で作った「何もしない(時間は使う)」関数を使いました。

ぐだぐだ低レベルプログラミング(22) GD32VF103、サイクルカウンタ実測例

「データシート」上は、もう一桁早い(幅の狭い)クロックでも十分動く筈なのですが、波形を観測するのに使えるのは、Digilent社Analog Discovery2、100Mspsなので、あまり速くするとよく見えない可能性があるためです。全ソフトウエア制御の転送ルーチンはこちら。こんなコードでも十μ秒くらいで転送がおわるので、ま、ソフト転送でもOKか。

void sendShiftRegister(uint8_t dat) {
    gpio_bit_set(GPIOC, GPIO_PIN_10);   //DATA
    gpio_bit_reset(GPIOC, GPIO_PIN_11); //CLK
    for (int i=0; i<8; i++) {
        if ( (dat & 1) == 0) {
            gpio_bit_reset(GPIOC, GPIO_PIN_10);
        } else {
            gpio_bit_set(GPIOC, GPIO_PIN_10);
        }
        dat >>= 1;
        cycNop20();
        gpio_bit_set(GPIOC, GPIO_PIN_11); //CLK
        cycNop20();
        gpio_bit_reset(GPIOC, GPIO_PIN_11); //CLK
    }
    cycNop20();
    gpio_bit_set(GPIOC, GPIO_PIN_9); //ST
    cycNop20();
    gpio_bit_reset(GPIOC, GPIO_PIN_9); //ST
}

さて、メインルーチンはこんな感じ。8個のLEDを変数loopCountの値で点灯させていきます。ただし以下はご注意を。

  • 出力ロウの時に点灯。だから最初loopCount=0のとき全点灯から始まる。
  • 上のコードはLSBファーストで転送しているので、loopCountのビット0が74HC595のQ7に、ビット7がQ0へと順序が逆転
while(1) {
    printf("LOOP  : %d\n",loopCount++);
    sendShiftRegister((uint8_t)(loopCount & 0xFF)); 
    gpio_bit_reset(GPIOC, GPIO_PIN_8); //OE#
    delay_1ms(1500);
    gpio_bit_set(GPIOC, GPIO_PIN_8); //OE#
    delay_1ms(500);
}

プログラムを書きこんで走らせれば、ちゃんと意図通りに動きました。

74HC595 TEST BB

SN74HC595(のちょっと怪しい互換品)も基本的な動作はOKです。

部品屋根性(6) 中華入門キット、KUMAN K4 購入! に戻る

部品屋根性(8) 困った時のAnalog Discovery2 に進む