↑ 袋の中にはこれだけです・・・
説明書等はありません。
秋月電子にDFROBOT社のSPI LED Module (Arduino用?)が発売されています。
面白そうなので、ちょっくら弄って遊んでみる事にしました。

さて、もっと高機能で低価格な液晶表示モジュールがあります。
しかし、当局はあまり好きではありません。
何よりも、液晶モジュールは「表示文字が見難い」からです。
その点、7セグLEDは見易いです、文字自ら光りますのでね。
所が、7セグ表示基板の作製は、配線数が多く面倒臭いのが難点です。

このモジュールは3線で制御するSPIとほぼ同じとHPに記してあります。
ならばPICでも対応できるのでは、と思い購入してみました。
で購入してみると、袋にモジュールが入っているだけで、何の説明書もありません・・・
秋月のHP商品欄にある、参考資料を勝手に読めと言う事と思われます。
それも英語だし・・・

参考文献
 DFR0090説明書 DFROBOT社
 TC74HC565AP データシート TOSHIBA
 改訂版電子工作のためのPIC16F活用ガイドブック 技術評論社

↑ DFR0090背面ピンレイアウト
左右同じコネクタがあるので注意!



↑ モジュール背面
左右に2列のピンヘッダがあります。
秋月の2列ピンソケットが接続に使えます。



↑ 接続用コードを付けました
コードは1列のピンソケットを利用しています
接続は「INPUT」側ですので注意。
「OUTPUT」側は無接続となります



このモジュールの概要

DFROBOT社の説明書を見ても何だかさっぱりです・・・ (-_-;)
とりあえず左記のピンレイアウトは必要ですが。
そこで、TC74HC595のデータシートでこのモジュールの構造を考えた方が得策の様です。
となると、下記の様な接続と思われます。
ちなみに装着されているICは、TC74HC595では無く、同等品です。

モジュール側      内部HC595    機能
CLOCKピン       SCK        読込クロック(↑でSIのデータを取込)
DATAピン        SI          データ本体
LATCH          RCK        データラッチ(↑で取込データをQxポートへ出力)
NC             SCLR       「H」で固定と思われる
NC             G          「L」で固定と思われる

74HC595の概要

なかなか面白いICで、3線シリアルデータ転送で8ポートの出力を拡張できます。
このICの出力と次のICの入力を接続する事により、さらに出力ポートを拡張できます。
このICはラッチ機能がありますので、データを変更しない限り保持します。
シリアルで転送されたビットデータは各ICのシフトレジスタに順繰りに格納されます。
ラッチパルスを送ると、一斉にシフトレジスタのデータがストレージレジスタに取込れます。
ストレージレジスタ内容はQxピン出力となりますので、表示に反映されます。
シフトレジスタのデータが変更されても、ラッチパルスを送らない限り、ストレージレジスタの内容は保持されています。
よって、ラッチパルスを送らない限り表示は保持されます。
詳細はデータシートのタイミング表を参照して下さい、上記内容が一見で判ります。

このモジュールは上記機能を使用し、8×8=64ポート出力としています。
そして、それらのポートはLEDのセグメントに接続されていると言う事になります。


PICから送信する際のパルスへの応答速度ですが、結構高速な様です。
データシートでは55MHZとなっていますので、約0.02usecとなります。
32MHZクロックのPIC12F1822では1サイクルは8MHZ、0.125usecです。
8ビットPICでは、応答速度に関して考慮する必要は無さそうです。
下限は無い様なので、手動パルス程度の鈍足でも大丈夫の様です。
また、パルス幅も適当に変化しても、問題無いようです。
つまり、好きな時にPICのポートをON-OFFすれば良い事になります。
かなり柔軟に(いい加減に)プログラムしても動作しそうです。


モジュール全体へのPICの処理速度
話が前後してしまい申し訳ありません。
今回の実験で試作した、モジュールへのデータ転送ルーチンは[PUTL]
このルーチン内では約1usec程度のパルス幅で処理してます。
モジュール内の全シフトレジスタは8×8の64ビットで、1ビットデータ転送に4パルス程使います。
その上、ビットデータ生成等の雑処理もあります。
全シフトレジスタにデータ転送し表示するのに、約240usec程度の処理時間(注)となりました。
計算上、もっと早く処理可能と思われます。
ところが、そのままでは表示変化が早すぎて、何を表示しているのか判りません。
よって、1度表示(変更)すると100msecのウエイトを挿入しています。

注)
デバッガによる結果で、設定は32MHZ動作
DFR0090モジュールへの基本送信シークェンス

①DATA(SI)ビットを提示
②CLOCKビットをL→Hとする
 ↑エッジでデータをレジスタに取り込む
③LATCHピットをL→Hとする
 ↑エッジでレジスタデータをラッチする
 すなわちQxポートをデータと同じにする

①~②を8回繰り返すと1ケタ分のセグメントを制御した事になる。
PICの準備と予備実験(画像はありません)

まずはPICのI/Oピンによる簡単な制御ルーチンを作ってみました。
そして目に見える速度でセグメントを発光させ、動作確認をして見る事にします。
つまり、1ビットずつデータ転送しては表示(ラッチ)させる事にしました。
実際は1パルスを1秒程度としてみました。
使用するPICは12F1822で、これでモジュールの動作の様子を確認したいと思います。
PICはブレッドボードに配置し、I/Oポート3線をモジュールに接続したけです。

プログラムは超簡単で、ポートAをデジタルI/Oモードにします。
その内の3本の出力ピンがモジュールの入力3ピンに接続されています。
そして、74HC595の出力QA~QHを順番にONするようにコントロールします。
それを8×8回(8セグメント分を8桁分)繰り返します。
その後同様に、出力QA~QHを順番にOFFしていきます。
これで74HC595のQA~QHがLEDのどのセグメントに接続されているかが判明します。

結果
意外と簡単に動作してくれました。
74HC595の出力QA~QHはそれぞれ7セグLEDのa~g、QHがDPに接続されていました。
Qxポートが0(すなわちL)の時にセグが発光するようです。
データは7セグ内では、a~gそしてDPへとシフトしていきます。
また、上位桁から下位桁にシフトしていきます。
各7セグLEDに対してスタティック動作なので、明るく見易くてFBです。
ただし、全セグ点灯で約350mA程の電流消費があります。

↑回路図と言う程のものでは無いですが・・・



↑ 秋月C基板の半カットに乗せました。
実験基板回路

さて、今度は高速で動作せててみて、実用性の実験をしてみたいと思います。
ハードウエアは、左記の回路図の如く、超シンプルで気が抜けます・・・ (-。-)y-゜゜゜
使用基板は秋月C基板を以前半カットしてた残り物を使用しています。
それでも、基板上は隙間だらけです・・・
PIC基板からモジュールへはVCC、GND、信号線3本の計5本の配線となっています。
モジュール側は2列ピンヘッダと同じ配列となっています。
よって、基板側で、2列ピンソケットを使用すると、直接基板に着脱可能です。
それらは秋月で安価に販売(「分割ピンソケット」等)されています。
モジュールと一緒に購入すると良さげです。
実際は1列のピンソケットにピニール線をはんだ付けして、使用しています。
今回の基板上のPIC12F1822は内部オシレータで動作させています。
PIC12F1822ソースファイル

ハンドシェイク版
12f1822_dfr0090_hs.asm

インタラプト版
12f1822_dfr0090_in.asm


シリアルデータ送信
基本シークェンス

①通常時 DATA=H
②スタートビット送信  DATA=L
③データビット連続送信  DATA=x
④ストップビット送信  DATA=H
⑤通常に戻る

それぞれのビット幅
HSモード時 50usec
INモード時 10usec

これに合わせて受信します。
実験基板のPIC12F1822プログラム

モジュールへの制御はソフトウエアで行っています。
以前当局作製の「PIC16F648A8桁7セグ表示基板」と同等性能を目標としてみます。
データ送受信フォーマットおよびコマンドも互換性を維持します。
そんな訳で、久々に16F648Aの該当ソースを見てみました。
その内容はすっかり忘れていて、しばらくソースを眺めていました・・・ (-_-;)
その際、しつこい程の詳細なコメントは、自分にとっても大変有効なのを再認識しました。
見かけは旧プログラムの移植作業なのですが、殆ど書換えが必要となりました。
とは言っても、簡単になる方向への書換えなので、FBです。
ただ、シリアルデータ受信ルーチンは、ソースをそのまま使用可能でした。
ルーチン内のタイミングを動作クロックに合わせて微調整しただけで済んでいます。
勿論、ポートはハードウエアに合わせて変更しますが。

LEDモジュール制御ルーチンは、ソースリストコメント欄に、しつこく記入しています。
そちらの方がアッセンブラソースと対峙していて解り易いので、ご参照ください。
初期実験段階なので、とりあえず動作している、と言った超手抜き状態です。
最適化の余地が、山ほどある事は十分承知しています。

基本的な流れは、(ソース内の定義名は実際は小文字です)
①16進バッファ「HEX0-3」に32ビット16進数値データを書き込む。
②「FLG」に必要な指令フラグ、表示桁数、桁ドットの要否、ゼロブランキングの要否をセット
③BCD変換ルーチン「BCD」をコールする
④「SETBUF」ルーチンをコールし、桁バッファ「DBUFx」にデータセット
⑤表示ルーチン「PUTL」をコールする
実際、①と②は受信ルーチン「RXS_DATA」をコールするとセットされる
モジュール用ルーチンは③と④と言う事になる。

↑ 恥ずかしながら・・・再登場でっす。
I/Oポートが3本で、スイッチも1個あります。
クロックも結構正確で安定です。
各種信号源として意外と役に立っています。



↑ 基板同士を接続しました(HSモード)



↑ SSGから10MHZを入力
 それを表示してます(HSモード) 
実験① ハンドシェイク転送

データ送信用基板としては、以前「初めてのPIC」の時に製作した物を使用しました。
それは「PIC12F683周波数カウンタ実験基板」です。
今更再登場させたくない代物ですが、ジャンク箱からの再登場です。
この実験基板は缶タイプの水晶発振モジュールを使用しています。
よってクロック周波数精度・安定度はかなり良好です。
本来は周波数カウンタ基板なのですが、意外と汎用性があります。
このような、実験用データ送信ソース源としては結構便利に使えます。
この実験基板をビット幅50usのハンドシェイク版プログラムで動作させています。
この基板にSSGから信号を入力して、そのカウントデータを送信させています。


試運転① ハンドシェイク転送モード

実験用PIC12F683周波数カウンタ基板と本基板+7セグモジュールを用意
で、それぞれを接続通電・・・意外とあっさり動作してくれました。
心配していたクロック精度ですが、今の所エラーも発生せず、安定に受信しています。
このシリーズの内部発振精度はそこそこ良いようです。

LEDに対してスタティック駆動ですので、ちらつきも無く、明るくて視認性大変良好です。

以前の基板のPIC16F648Aは7セグLEDに対してダイナミック駆動していました。
よって、各ルーチンの処理時間を気にしながらの、全体プログラムの組立てでした。
今回は74HC595によるスタティック駆動で、ラッチしなければ表示されません。
そして制御パルス送信も事実上任意のスピードでOKです。
よって、時間をあまり考慮しないでプログラムしても大丈夫です。
プログラムもシンプルになり、速度的にも余裕の動作です。
何か別の処理のついででも、十分対応できそうです。

↑ 実験②での信号源のカウンタ基板
割込み受信を想定した送信をします。



↑ 基板同士を接続(INモード)



↑ 表示がおかしいです(INモード)
SSG入力10MHZ
表示指示 8桁表示、3,7桁ドット表示
実際表示 5桁表示 2,5桁ドット表示



↑ 正常に表示するようになりました。
受信ルーチンを微調整(INモード)


実験②
データ送信用基板としては、以前「初めてのPIC」の時に製作した物を使用しました。
それは「PIC12F683オフセット付周波数カウンタ基板」です。
この実験基板は普通?の水晶発振モジュールを使用しています。
よってクロック周波数精度・安定度はまあまあ良好です。
このカウンタ基板はビット幅10usの割込み送信プログラムで動作します。

さて、心配なクロック精度ですが、ビット幅10usではどうでしょうか。
このシリーズの内部発振精度は結構良いようですが、ちょっと厳しいようです。
受信動作させるためのタイミング調整に、結構手間取りました。


試運転② 割込み転送モード

PIC12F683周波数カウンタ基板と本基板+7セグモジュールを用意
で、接続通電・・・とりあえず動作しました。
「とりあえず」と言うのは、転送されたデータが化けていたからです。
下記「対策」を施す事により、何とか動作するようになりました。

理由
まず、シリアルデータ受信ルーチンですが、
ハンドシェイク(HS)モード、割込み(IN)モード、どちらの転送モードも基本的に同じ構成です。
①スタートビットを確認します。(以前は確認してなかった・・・)
②その後、データ読込ループ(注1)のビット幅中央部に突入させます。
③ループアウト後、ストップビットを確認して終了となります。
ここで、動作クロックが正確・安定で無い場合(内部発振等)が問題となります。
つまり、②のビット幅中央で読込がスタートしても、だんだん読込ポイントがずれてしまいます。
ズレが進行すると終盤の読込ポイントがビット幅からハミ出てしまいます。
結果、データが化けてしまいます。
特に最後転送のFLGバイトは化けやすく、桁数やドット等がおかしくなります。

注1)
データ読込ループ
HSモードは1ループ50usで、INモードは1ループ10usで構成されています。
それを40ビット分繰り返すと、ループアウトします。
詳細はソースリストでご確認ください。


対策
読込ループ内のプログラムによる時間調整の余裕はありません。
1サイクルでも数が合わないと、即読み込みエラーとなります。
よって、②の突入ポイントで微調整する事としました。
さて、このPICには内部発振微調整機能(OSCTUNEレジスタ)があります。
それを使用しても良いかもしれませんが面倒くさ・・・
結局このモードの時は、水晶発振、少なくともセラミック発振とするべきです。

↑ 実験回路は少々変更があります。
GP3とGP4を変えてあります。
それにより、出力ピンが3本確保できました。
これで、モジュールを制御できます。


PIC12F683実験用基板(変更後)
7セグモジュールDFR0090対応版
ソースリスト
ダウンロードしてから、
MPLAB_IDEのエディタでご覧ください。

count_test3_dfr0090.asm




↑ 初期の実験基板での動作
SSGから10MHZを入力しています。
OSCに缶タイプを使用しています。
よって、周波数安定度は抜群です。
カウンタ基板上のPICに、モジュール制御を追加させる実験

さて、ここからが本題です。
ここまで読んでくれた各局様は、すでにうずうずしている事は承知しております。
当局自身もそうですから (^_^;)
モジュールをコントロールするために、1つのPICと基板を使うのはもったいない。
主処理のPICに、さらにこのモジュール制御処理も、付加させれば良いのでは?
例えば、上記周波数カウンタ基板上のPICに、モジュール処理もやらせれば良い。
カウンタ基板から7セグ表示基板に接続するのでは無く、直接モジュールを接続する。
と言う事になって、然るべきですよね。
じゃあ、今回の基板製作する必要など無かったんじゃね、
と言う事になってしまいますが・・・



と言う訳で・・・ またまた恥ずかしい基板のご登場です・・・ (-_-;)
この実験用周波数カウンタ基板上のPIC12F683にもうひと頑張りしてもらいます。

12F683へ移植に当たっての注意点
サブルーチン群の移動(ソースリストでは小文字です)
①「GET_7SEG」 表示ビットデータ生成
②「BCD」 32ビット16進→BCD変換
③「SETBUF」 1バイトのFLGと4バイトBCDから8バイトの機能混合データ群の生成
④「PUTL」 8バイトの機能混合データ群からLEDモジュールを制御
以上の内、①②はそのまま移動しただけ、③④は少々変更しています。
変更点は、
モジュールへの接続ポートを合わせた
警告LED用のポートが無いので、最下位桁に`E`を表示する事とした。
1usecのウエイトが出来ないので、パルス幅を2usecにした。(動作に問題無い)
これはNOP命令2~3個で代用した方が簡単かも
詳細はソースリストをご参照ください。



結果
周波数カウンタと7セグLEDダイナミック駆動制御は、1つのPICでは厳しい物があります。
対して、このモジュールの制御は、データ生成も含めて軽いので、余裕でこなせます。
加えて、制御タイミングは、かなり適当でも大丈夫なのが利点です。
1回の8桁表示に1msecもあれば十分以上の余裕です。
表示変更し終われば、再度変更するまで表示しているので、チラつきも皆無です。
よって、主作業のプログラムの、ちょっとした隙間に埋め込む事も可能です。
たいがい、1msec程度以上のウエイトは多用されていますのでね。
何より、明るくてチラつきも無く、見易いのが一番と思います。
欠点と言えば、ちょっと高め(1,350円2014年02月現在)なのが残念です。
でも、自分で表示ボードを作る事を考えると、まあまあの対価でしょうか?
もう一つ、スタティック駆動のため全セグ点灯で350mA程度消費します。
電池で動作する機器ではちょっと無理があります。
戻る  実験・製作の記録TOPへ戻る