I/O LEDを点滅させる。
さてさて、前回LEDをつけましたね(^^
つけるだけでも楽しいですが、今度はそれを点滅させてみましょう。
案外難しいんですよ。それ。
〜LEDの点滅方法〜
点滅させる って言う命令や関数はありません。
じゃあどうするか?自分で点滅させるしかないです。
簡単に言うと
点けた後に消すんです。(エコの宣伝みたい)
ただし、そのつけると消す、消すとつけるの間に何もしない作業を挟みます。
そうすればつく → 1秒なにもしない → きえる → 1秒何もしない → またつく
動作になり。点滅してるように見えますよね?
ただ、何もしない とか 1秒待つ なんて命令は無いので
ただ何かを1秒やらせるしかないんです。
〜無駄な時間〜
無駄な時間をどう作るか。
forで作ってみましょう
for(ii=0;ii<0xffff;ii++){
}
これがfor文です。
for文はその右側 (この場合{}があるので{}で囲まれた) 部分を繰り返し実行します。
ただし、その繰り返し回数を決められます まず()の一番左に最初の変数の設定。
次にどんな条件だったら繰り返すのか、そして一番右に1回ごとの変数の変化を書きますfor(最初の数値;続ける条件;変数の変化)
となっています
この場合for(ii=0;ii<0xffff;ii++)
ですから、まずiiは0になります。そして毎回1ずつiiは増えるんですが、
iiが0xffffになったらもう、実行されません。
つまり0xffff回実行されるわけです。(16進数わかる?)
これで{}の中に何も書かなかったり 1+1みたいな無駄な計算をさせるプログラムを書けば
何もしないプログラムの完成です。これをLED ONとOFFの間に挟みましょう
#include<p30f2012.h> void main(void){ TRISCbits.TRISC13=0; int i; int ii; while(1){ LATCbits.LATC13=1; for(i=0;i<100;i++){ for(ii=0;ii<0xffff;ii++); } LATCbits.LATC13=0; for(i=0;i<100;i++){ for(ii=0;ii<0xffff;ii++); } } }
これで点滅するはずです。
では解説。
TRISCbits.TRISC13=0;
int i;
int ii;まず、LEDがつながってるところのTRISを0にして、出力に設定。
そして後で使う変数の初期化をします。
int i;
って書くと int型の変数iが用意されます。
これ以降はi=0とかi=100みたいに数字を入れて使うことができるようになります。
int以外にもいろいろあるけど、今度紹介します。
while(1)は無限ループでしたよね。何度も繰り返される。
そして、LED ON と OFFの間には
for(i=0;i<100;i++){
for(ii=0;ii<0xffff;ii++);
}これです。
これが待ち時間の正体ね。
さっきやったforが二重になってるの分かりますか?
「forで繰り返すのがfor」ってことになってます。
実はdsPICは高速なので0xffff回なんてのはすぐに終わっちゃうんですね。
なので、それをさらに100回やらせています。
「じゃあ0xffffを増やせばいいじゃないか」って思うかもしれませんが、
実はint型の変数は0〜0xffff までの容量しかないんです
だから それ以上の数字は入らなくて使えないので、しょうがなく2重のループにしてるんです。
分かってもらえたでしょうか?実行したらLEDが点滅するはずです。
もし点滅が速かったら100のとこころを1000にするとか。とにかく数字を増やせば大丈夫です。
今日のまとめ for文・・・繰り返しに使う、変数の最初の数字と 繰り返す回数と、
毎回変数をどれだけ増やすか、減らすかを決めて使う例:
for(i=0;i<100;i++){
LATCbits.LATC13=1;
}
これでLATCbits.LATC13=1;が100回繰り返されます。
(0回から99回までだから 100回ってことね)
初めiは0にされ、繰り返すごとに1、2、3と増えていく。
そしてiが100になった時 ループを抜け出し次へ行く。