2017-04-08 15:45 | カテゴリ:PIC応用回路

アマゾンを見ていたら、ARDIUNOに適した、8X8X4のドットマトリクスLEDアレイの商品が出ていましたので、早速注文していました。
私は、PIC派なので、PICでドライブしてみました。

3週間かかって到着しましたので、早速テストです。

シリアルインタフェース、8桁LEDディスプレイドライバで8x8ドットが制御され、芋づる式に接続できます。
今回は、4個つながっています。


(DMT01)
DMT01.jpg

(DMT02)
DMT02.jpg

続きは、、、


到着したLEDは、WEBの写真通りで、想像よりは少し大きめでした。
ケーブルやL字型のピンもセットされていて、ブレッドボードに簡単に接続できるように配慮されたキットです。

(DMT03)
DMT03.jpg


4個のドットマトリクスLEDとそれをドライブするIC(MAX7219マイコン)が基板上でくみ上げられていて、その基板が4個接続された構造になっています。

(DTM04)
DMT04.jpg

(DTM05)
DMT05.jpg

このモジュールとPICとの接続は、

+5V、GND、SDI、SCK、Loadの5線で行えます。
制御は、SPI通信規格で、SDIとSCKでデータをシリアル送信し、ラッチをLoad端子の操作で、行います。



PDF資料

http://www.microtechnica.tv/support/manual/MAX7219_jp.pdf



詳細は、ここのマニュアルを参照していただくとして、要するにあるマトリクスLEDの8ドットの1ラインのデータ(1バイト)を、表示する場所のアドレスデータ(1バイト)の計2バイト、16ビットのデータを送信することで、表示するデータを与えます。

DMT_Format.jpg


4個のマトリクスLEDに一度にデータを送信できますが、1つのLEDには一度に1つのデータしか渡せませんので、2バイトx4の64ビット送信を一つのブロックとして送信することで、1ラインの表示ができます。

では、早速PICのプログラムを組んでテストしてみました。
PIC16F1986を使用し、MCC(コードコンフィギュレータ)を利用して、SPIインターフェスを組み込みました。

コマンドは、この表の種類があります。

DMT_Register.jpg


まず、LEDが点灯するか否かのテストのために、備わっているテストモードを起動します。

DMT_TestMode.jpg


レジスタアドレス(0F)にデータの1を書き込めばOKです。

(プログラム例)

//------------------
// 全LED点灯テスト
//------------------

Load_data = 0;

SPI_Exchange8bit(0x0f); // テストモード起動のアドレスを送出(Bit8-15)
SPI_Exchange8bit(1); // ONのデータ(1)を送出(Bit0 - 7)
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(1);
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(1);
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(1);

Load_data = 1; // 立ち上がりでデータをロードする
Load_data = 0;


__delay_ms(1000);


//------------------
// 全LED点灯テスト解除
//------------------


Load_data = 0;

SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(0);
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(0);
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(0);
SPI_Exchange8bit(0x0f);
SPI_Exchange8bit(0);

Load_data = 1;
Load_data = 0;



所が、全ドットLED点灯どころか、一部のブロックが点灯したり、しなかったり、非常に不安定です。
また、テストモード解除のコマンドは、全く動作しません。
データシートを見ながら、データ送出の順番が、逆ではないかとか、Load_Dataのタイミングを変えたりしながら、テストしましたが、一向に動作しません。

DMT_Timing.jpg


MCCのメニューの中のSPIを設定するセクションで、SPIのクロックスピードを変えたりしてもダメでした。

SPIマスターの設定を見ていると、

Clock Polality とか、Clock Edgeがあり、ひょっとしたらクロックの立ち上げ、たち下げの位相が逆ではないかと気づき、いままでデフォルトで使用していた項目を

DMT_SPI1.jpg



Clock Polality = Idle : Low / Active : High <----(初期設定のまま)
Clock Edge = Active to idle <------------(初期設定は、Idle to Active でした)


に設定したら、見事、正常動作しました。(やれやれ)

ようやく、LEDの点灯テストから、初期データクリアリセット、指定データ書き込みまでできました。


(DMT06)
DMT06.jpg


次は、文字をかっこよくスクロールしたいです。
このディスプレイの横方向のドット数は32ドットで、ちょうどLONG整数の4バイトに収まります。

この変数を各行分、配列に持って処理すれば簡単そうです。
スクロールも、LONG変数を左右にビットシフトすればできそうです。

そこで、チャチャット組んで実行してみました、。
画面クリアのあと、数字を順に書き込み、確認の後、Vividの文字を表示して、スクロール、、、、、




あちゃー

Vividの文字が壊れていく、、、


実はちょっと予想していました。
スクロールが簡単に一筋縄ではいかないであろうと。

そのそも、文字データ(画像のフォントパターン)をLONGの整数変数として、持つところまでは良いアイデアだったのですが、そのLONGの文字変数のメモリー上のMSBとLSBの位置関係と、LEDの各バイトのそれと、データを送り出す順番とが、微妙に異なって、文字パターンデータを素直に16進データになおして収めただけではだめでした。

いろいろ試行錯誤の結果、文字パターンデータのMSBとLSBを反転させて、上位4ビットと下位4ビットを入れ替え、さらに、
右端の文字から順に左端の文字へ送出する必要がありました。
細かな作業は端折って、元の文字データフォントを予め加工して、それを出力することで、当面スクロールを実行することにしました。
できれば、素直に文字フォントデータを入力し、それをプログラムが勝手に修正加工して利用できるようにしたいのですが、結構面倒な感じです。

とはいえ、ようやく、スクロールができるようになりました




まずは、ここまで。

【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(2)

管理者のみに表示する