2017-02-13 16:38 | カテゴリ:PIC応用回路

3本線でシリアル接続できるフルカラーLEDをPICで点灯させるテストを行い、以前にブログで報告させてもらいました。

以前のCPU付LEDのブログ


テストもうまくいったと思って、1個のLEDではなく、複数(4個)のLEDをシリアルに接続してテストしてみました。
ところが、うまくありません(泣)
何が悪いのか?
ちょっと調べてみました。


続きは、、、


前回のテストでは、1個のLEDを下記のソフトでドライブさせていました。


LED_mainprog.jpg



For文でRGBの色の数値を順次増加して、LEDに送出しています。
LEDは一つなので、RGBデータを連続送信(20マイクロ秒間隔)したあとで。約1秒待って、次の色データを送っています。

しかし、時々、なぜか誤動作の様な発色をします。
早速、ロジアナを出してきて調べました。

Log05
Log05.jpg


RGB各データ(各1バイト)の間隔が、6.5usecと5.5usecの様にばらついています。
プログラム上は、送信データをSSPバッファにストアしたのち、20usecの遅延を経て、次のデータを送信する様になっていますが。送信するデータによっては、パルス幅が変化し、結果、次のデータとの間隔が変化し、この様な観察結果になったと思います。

ちなみに、遅延時間を20usecではなく、22usecや15usecに変えてみると、うまく動作しませんでした。
どうやデータ間隔の時間は、かなりシビアなようです。

安定させる方法はないかと考えてみると、MPLABXのXC8にはSPI送受信時に関数でデータを送受信できる機能がありました。
その送りたいデータをセットして、関数を呼び出せば、送受信のフラグをチェックして、最適なタイミングで自動で送受信してくれます。
タイミングを計ってみました。

Log03
Log03.jpg

ちゃんと、5.56usec間隔で安定しています。

次に、LEDを多数連結した際に、データを送り出すルーチンを簡素化するために、For文で、LEDに送信するデータを順次送り出す事を考えて、組みなおしました。


CPU_LED_Test05
CPU_LED_test05.jpg


ところが、これが期待通りにうまく動きません。
これも早速、ロジアナで波形を確認してみました。

Log01
Log01.jpg


おや??

本来ならば、一連のパルスが、一段目から3パルス遅れて、二段目に引き継がれていくはずですが、パルスは1個しか出ていません。
おまけに、調整したはずの、パルス間隔が、11.56usecになっています。

プログラムを見て気づきました。

For文で時間をとっているようです。
アセンブラなら気にする程でもないのでしょうが、明らかに遅れています。

どうやら、シリアルにつながったLEDをドライブする一連のデータ送信は、For文で行わず、SPI送信関数を、LEDの数 X RGBの3個 ぶん長々と記述する必要があるみたいです。

こんなかんじで、、、

SPI_Exchange8bit(LED_Color[0][0]);// LED1個目R
SPI_Exchange8bit(LED_Color[0][1]);//G
SPI_Exchange8bit(LED_Color[0][2]);//B

SPI_Exchange8bit(LED_Color[1][0]);// LED2個目
SPI_Exchange8bit(LED_Color[1][1]);
SPI_Exchange8bit(LED_Color[1][2]);

SPI_Exchange8bit(LED_Color[2][0]);// LED3個目
SPI_Exchange8bit(LED_Color[2][1]);
SPI_Exchange8bit(LED_Color[2][2]);

SPI_Exchange8bit(LED_Color[3][0]);// LED4個目
SPI_Exchange8bit(LED_Color[3][1]);
SPI_Exchange8bit(LED_Color[3][2]);

(まとめ)

(1)CPU付LEDのドライブは、MPLABXのXC8に備わっているMCC(コードコンフィギュレータ)を利用して。SPIを組み込み、
SPI_Exchange8bit(n)関数を使用する

(2)LED一つずつにFor文で繰り返しデータを送ると、時間遅れで誤動作することがあるので、SPI_Exchange8bit(n)関数命令文を必要なLED個数x3個並べて記述する

で行うと、良いようです。

ビデオ参照ください。




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

管理者のみに表示する