↑ GROVE 4桁7セグLEDモジュール
  秋月で購入しました


GROVE 4桁7セグモジュールをアッセンブラで制御してみる

AQM-1602の制御がとりあえずできたので、秋月でついでに購入していた、
標記モジュールにも、ついでにちょっくら手を出してみました・・・
Aitendoにも同じようなモジュールが売っているようですし、少し安い・・・
このモジュールもI2C接続と言う事で、同じルーチンでコマンドを変えるくらいで
大丈夫かなと、タカをくくっていたのでしたが・・・
これが少々ハマってしまったのでした・・・ (-_-;)

実験に使用したPICは、同様に16F1823です。


参考文献
TM1637データシート TITAN MICRO ELECTRONICS
PIC16F1823日本語データシート 第25章MSSPモジュール

↑ 回路図と言うほどの物では無いですが
  プルアップ抵抗は配線していません
  モジュール内に存在します


PICでI2Cインターフェイスモジュールを利用する

今回もPIC16F1823のMSSPモジュールを使用しました。
このモジュールは当局の様な初心者には少々解りずらいのですが、
スイッチビット?を押せば動いてくれるので、楽の様な気がします・・・

MSSPモジュールから送信されるビットデータは、MSBから送信されます。
「I2C接続」を謳うからには、それら規格に準拠しているのかと思いきや、
今回のI2CモジュールはLSBから送信前提で、受信しているとは・・・
これに気付かず、ウンともスンとも言わない日々が続いたのでした・・・

今回のハマリ原因について

ここで行っているI2C基本制御の方法については前項「AQM1602]を参照して下さい。
まず、このモジュールに使用されている制御IC「TM1637]のデータシートを、読むしかないのですが・・・中国語だし・・・ 
一見読めそうで、まるで解りません・・・
まあ、気を取り直して、図でも見れば何か解るかも・・・
バス制御はちゃんと?I2Cの様で、記載図もその様な物が表示されています。
まずは、I2Cアドレス(スレーブアドレス)を探して・・・あれ?見あたら無い・・・
そもそも、データシート内のスイッチ群は何なんだ・・・
コマンドに続く、Sx、Kxビットは何なんだ・・・
データシート後半の制御用?CリストにI2Cアドレス送信の様な物は無いし・・・

結局、Weblio日中中日辞典に、データシートPDFから、片っ端から中国語をコピペし、入力・翻訳すると・・・
当たらずとも遠からずの日本語訳が出来ました。
その日本語訳解釈の結果、スレーブアドレスは「無い」事が判明
もう一つ、1バイト送信の際のビット列はMSBからでは無く、LSBから送信している事、 ( ゚Д゚)
ただ、START-DATA-ACK-STOPの基本ビット制御はI2Cのそのものでした。
セグメント用のビットデータは不明だったのですが、サンプルCでは、FFHを送信で
全セグメントが発光しているので、bit=1で発光、bit=0で消灯と推察されます。
後は、片っ端からデータを送信してみれば、SEGデータ1バイトの内の、どのビットが、
どのセグメントに対応しているかが判明します。
基本的な送信シーケンス

①MSSPモジュールの起動

②スタートコンディション送信

③セットアップコマンド送信

④ACK確認

⑤ストップコンディション送信

⑥スタートコンディション送信

⑦桁アドレス送信

⑧ACK確認

⑨セグメントデータ送信

⑩ACK確認

⑪ストップコンディション送信

⑫スタートコンディション送信

⑬ラッチ・光度コマンド送信

⑭ACK確認

⑮ストップコンディション送信

必要に応じて、②に戻る



セグメント発光指定ビットデータ


      A
    ---

 F |   | B    ○ X
    -G-

 E |   | C    ○ X
    ---
      D

「2」を表示するには5BHとなる
      X G F E D C B A
5BH= 0 1 0 1 1 0 1 1 LSB

「2:」と表示するにはbit7=1とする
      X G F E D C B A
DBH= 1 1 0 1 1 0 1 1 LSB

ただし、アドレスC1Hのみ有効
他の桁ではbit7は無視される
GROVE 4桁LEDモジュール(TM1637)制御コマンドについて

 色々弄ってみた結果、判明した事を記します。
 とりあえす動作はしていますが、記載事項の何の保証もしません・・・

(1)Command1:セットアップコマンド
   このコマンドは最初に、かつ単発で送信します。
   下記以外のコマンドは何のリアクションも得られず、今の所不明です。

 1)40H
   以後の送信データは桁レジスタにロードされる(注1)
   桁レジスタアドレスは自動インクリメント(左から右)される
   よって、連続して最大4バイトのセグメントデータを送信する
 2)44H
   以後のデータ1バイトは桁レジスタアドレスにロードされる(注1)
   桁アドレスは固定
   よって、1バイトのセグメントデータを送信する

(2)Command2:桁レジスタアドレス設定命令
   このコマンドを送信後にセグメントデータを最大4バイト連続送信します。

 1)C0H:左から1桁目(最上位桁)
   連続データ送信の場合、通常このアドレスを指定する。
 2)C1H:左から2桁目(ドットアドレスも兼用)
 3)C2H:左から3桁目
 4)C3H:左から4桁目(最下位桁)
   
(3)Command3:発光命令(光度設定およびラッチ)
   このコマンドは最後にかつ単発で送信します。
 1)88H:1/16の光度で発光
 2)89H:2/16の光度で発光
 3)8AH:4/16の光度で発光
 4)8BH:10/16の光度で発光
 5)8CH:11/16の光度で発光
 6)8DH:12/16の光度で発光
 7)8EH:13/16の光度で発光
 8)8FH:14/16の光度で発光
 9)80H-87H:bit3=0で消灯(注2)


(4)セグメント データ

 1)数字
            XGFE DCBA
 「0」表示:3FH  0011 1111B
 「1」表示:06H  0000 0110B
 「2」表示:5BH  0101 1011B
 「3」表示:4FH  0100 1111B
 「4」表示:66H  0110 0110B
 「5」表示:6DH  0110 1101B
 「6」表示:7DH  0111 1101B
 「7」表示:07H  0000 0111B
 「8」表示:7FH  0111 1111B
 「9」表示:6FH  0110 1111B

 2)A-F表示 

 「A」表示:77H  0111 0111B
 「B」表示:7CH  0111 1100B
 「C」表示:39H  0011 1001B
 「D」表示:5EH  0101 1110B
 「E」表示:79H  0111 1001B
 「F」表示:71H  0111 0001B

 3)その他

   bit7=1とし、アドレスC1H(左から2桁目)に書き込むとドット「:」が発光する
   他の位置では無視される

 注1)
 セグメントデータを送信しただけでは表示はされす、桁レジスタにロードされるだけです。
 Command3を送信後、ロードされたデータはラッチアップされ、表示される。
 次のcommand3が来るまで、新データがロードされても、そのまま表示されている。

 注2)
   コマンド3のbit3=1とすると、セグデータはラッチされる

↑ 連続送信シーケンス(例1)

 「DEBUG1」の実行結果



↑ 単発送信シーケンス(例2)

 {DEBUG2」実行結果
モジュール制御基本シーケンスについて

(1)連続送信シーケンス

例1)左から”1234”と表示させる、或いは”12:34”※と表示させる
    ※これをソースリスト内「DEBUG1」に実現してあります。

    スタートコンディション送信
     ↓
    Command1送信 40H ←桁アドレス自動インクリメント
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command2送信 C0H ←送信開始桁アドレス指定
     ↓
    セグメントデータ送信 06H ←”1”
     ↓
    セグメントデータ送信 5BH ←”2”、DBH ←”2:”
     ↓
    セグメントデータ送信 4FH ←”3”
     ↓
    セグメントデータ送信 66H ←”4”
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command3送信 8FH ←ラッチ、最大光度で発光
     ↓
    ストップコンディション送信・終了

(2)単発送信シーケンス

例2)左から”0625”と表示させる、或いは” 6:25”と表示させる

    スタートコンディション送信
     ↓
    Command1送信 44H ←桁アドレス固定モード
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command2送信 C0H ←桁アドレス指定
     ↓
    セグメントデータ送信 3FH ←”0”、00H →” ”(ブランク表示)
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command2送信 C1H ←桁アドレス指定
     ↓
    セグメントデータ送信 7DH ←”6”、FDH ←”6:”
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command2送信 C2H ←桁アドレス指定
     ↓
    セグメントデータ送信 5BH ←”2”
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command2送信 C3H ←桁アドレス指定
     ↓
    セグメントデータ送信 6DH ←”5”
     ↓
    ストップコンディション送信
     ↓
    スタートコンディション送信
     ↓
    Command3送信 8FH ←ラッチ、最大光度で発光
     ↓
    ストップコンディション送信・終了
ソースファイル

PIC16F1823_GROVE4D_TEST01.asm

使用ツール
 MPLAB'X IDE Ver3.05
 MPLAB'X IPE Ver3.05
 PICKIT3




↑ 4桁アップダウンカウンタ

0からここまで回すのは疲れます・・・

制御ルーチンおよびサンプルプログラム

左記アッセンブラ ソースリストを参照して下さい。

(1)GROVE 7セグLED制御サブルーチン

 1)PUTW:WレジスタのセグデータをLED画面に表示させる
       表示位置アドレスは、変数「DSP_ADR」に設定

 2)PUTL:DBUF0~DBUF3の4バイトのデータをLEDに表示させる
       このデータはセグデータでは無く、数値です。
       ルーチン内で数値をセグデータに変換してから送信します。

(2)4桁アップダウンカウンタ(サンプル プログラム)

   ロータリーエンコーダ(RE)によるカウンタです。
   十進数を1個ずつアップダウンして表示します。
   0~9999まで表示します・・・ただそれだけ・・・
   I2CポートはRC0:SCL、RC1:SDA
   REポートはRC3:REA、RC4:REBです。



今回はここまでです

無線関連でこのモジュールは桁数が少なく使いにくい感じですが・・・
せめてこの価格で6桁だったら使えそうだが・・・
I2Cアドレスが無いので、他I2Cモジュールと共存しないし・・・
すると、他I2Cセンサモジュールは使えないし・・・
おまけに各桁にドットが無いし・・・ 時計用のドットはあるけど・・・
時計作っても、超つまんないし、実用性も無いし・・・
う~~ん・・・ (-_-)zzz ネムクナッテキタ・・・

プログラムしていても、今後の展望が思いつかないと気合が入りません・・・
何か手抜きな感じですが、とりあえず動いたので、これで終了でしょうか・・・

戻る  実験・製作の記録TOPへ戻る