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になった時 ループを抜け出し次へ行く。

 

ホームへ