あれこれやっていましたが,やっとまた1つ理解が進みました。これも,分かってる方からすればな
んでもないことなのでしょうが,改めて理解できたというところです。
単体(1つだけ)の書き込みをしてる分にはいいのですが,for等で繰り返し処理をすると2回目以降
の書き込みで,1番目にLED書き込んたデータが2番目,3番目,4番目と順次表示されます。書き込
みは1番目のLEDなのに2番目以降のLEDに表示されるが理解できませんでした。これもやっと理解でき
ました。
一度書き込まれたデータの後に書き込みを行うと,
先に書き込まれたデータに上書きされるのではなく,
先に書き込まれたデータは,次以降のLEDに順送りにされる。
このことが分からなくて,思った動作をさせられず,もがきました。
for(int i=1;i<9;i++){
maxTransfer(i,1);
digitalWrite(CS_PIN, HIGH);
delay(500);
}
この繰り返しのスケッチは,一番左に1つドットを描き,それを一番下まで繰り返すスケッチです。このまま
だと動画のようになります。
それと, digitalWrite(CS_PIN, HIGH); の命令は,本来 maxTransfer( ,); のサブ関数内で一括処理して
た、ものです,データをかきこんだらそれをレジスタにその都度アップロード・ラッチを行う処理でした。
データの書き込み--アップロード(ラッチ)と一連の流れで処理してしまうと,別な命令の書き込み
ができないので,諸兄スケッチから変更しました。こうすることで、下記のスケッチのように、何もしない
命令( maxTransfer(0,0))を2番目、3番目、4番目のLEDに先送りにし、一度にデータをアップロード
ラッチすることで、余分な表示を防げます。
for(int i=1;i<9;i++){
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(i,1);
digitalWrite(CS_PIN, HIGH);
delay(500);
}
2番目,3番目,4番目に先に送られたno-opコードのため余分な表示がされなくなります。
一度表示されると,消去するまで,表示されますので,次のように一度表示したものを消去すると移動するよ
うに見えます。
For(int i=1;i<9;i++){
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(i,1);
digitalWrite(CS_PIN, HIGH);
delay(500);
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(0,0);
maxTransfer(i,0);
digitalWrite(CS_PIN, HIGH);
}
ここまでたどり着くのに結構時間がかかりました。ライブラリーを作成している先達は,いち早くこういうこ
とが理解できたのでしょうね。凡人はとてつもなく時間がかかります。