I2C接続GROVE4桁7セグモジュールをPICで使う実験
GROVE 4桁7セグモジュールをアッセンブラで制御してみる
AQM-1602の制御がとりあえずできたので、秋月でついでに購入していた、
標記モジュールにも、ついでにちょっくら手を出してみました・・・
Aitendoにも同じようなモジュールが売っているようですし、少し安い・・・
このモジュールもI2C接続と言う事で、同じルーチンでコマンドを変えるくらいで
大丈夫かなと、タカをくくっていたのでしたが・・・
これが少々ハマってしまったのでした・・・ (-_-;)
実験に使用したPICは、同様に16F1823です。
参考文献
TM1637データシート TITAN MICRO ELECTRONICS
PIC16F1823日本語データシート 第25章MSSPモジュール
AQM-1602の制御がとりあえずできたので、秋月でついでに購入していた、
標記モジュールにも、ついでにちょっくら手を出してみました・・・
Aitendoにも同じようなモジュールが売っているようですし、少し安い・・・
このモジュールもI2C接続と言う事で、同じルーチンでコマンドを変えるくらいで
大丈夫かなと、タカをくくっていたのでしたが・・・
これが少々ハマってしまったのでした・・・ (-_-;)
実験に使用したPICは、同様に16F1823です。
参考文献
TM1637データシート TITAN MICRO ELECTRONICS
PIC16F1823日本語データシート 第25章MSSPモジュール
PICでI2Cインターフェイスモジュールを利用する
今回もPIC16F1823のMSSPモジュールを使用しました。
このモジュールは当局の様な初心者には少々解りずらいのですが、
スイッチビット?を押せば動いてくれるので、楽の様な気がします・・・
MSSPモジュールから送信されるビットデータは、MSBから送信されます。
「I2C接続」を謳うからには、それら規格に準拠しているのかと思いきや、
今回のI2CモジュールはLSBから送信前提で、受信しているとは・・・
これに気付かず、ウンともスンとも言わない日々が続いたのでした・・・
今回も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バイトの内の、どのビットが、
どのセグメントに対応しているかが判明します。
ここで行っている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は無視される
①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)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)連続送信シーケンス
例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 ←ラッチ、最大光度で発光
↓
ストップコンディション送信・終了
(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からここまで回すのは疲れます・・・
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 ネムクナッテキタ・・・
プログラムしていても、今後の展望が思いつかないと気合が入りません・・・
何か手抜きな感じですが、とりあえず動いたので、これで終了でしょうか・・・
左記アッセンブラ ソースリストを参照して下さい。
(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 ネムクナッテキタ・・・
プログラムしていても、今後の展望が思いつかないと気合が入りません・・・
何か手抜きな感じですが、とりあえず動いたので、これで終了でしょうか・・・