005回
点滅


・ただ点いてるだけじゃ能が無い

さて、プログラムを作り、回路を作り動く事を確認した。
次はもう少し複雑な動きをさせてみよう。って事で今度は点滅させてみる。

要は、出力5Vと0Vを交互に繰り返せばいい訳だ。
そんな訳で先ほどのプログラムを見てみる。


void main (void)
{

   PORTB=0xFF;      //PORTBを使用するという宣言
   TRISB=0x00;       //PORTBを出力端子として使用するという宣言
   PORTB=0x00;      //PORTBの初期出力が0であるという宣言

   PORTB|=0x20      //RB5から出力

}

RB5の出力を0にしたいわけだから、001回の時に書いたように、「PORTB=0x00」と新しい値を丸々代入してやればOKである。




けれども、あまりこの方法はお勧めできない。
プログラムが複雑になるにつれて様々なポートから出力が出ている可能性がある。
上記の方法だと、消したくない出力まで消してしまう可能性があるのだ。
かといって、出力されている場所を調べてそれに対応した命令を書きこむのはあまりにも手間がかかる。
そんな訳で今度はANDという処理を行う。

ANDの性質は以下の通りである。因みに、式で書くと「AND」=「×」で、プログラム上では「&=」ある

A×B
0 0 0
0 1 0
1 0 0
1 1 1
X 0 0
X 1 X

つまり、0をANDすると必ず0となり、1をANDすると元の出力によりけり、という具合となる。 

そんな訳で、RB5番のみを0とし、他の値を1としたものをANDすれば良いのである。

初期値 0 0 1 0 0 0 0 0
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
ANDする値(逆数)
PORTB&=0xDF
1 1 0 1 1 1 1 1
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
最終値 0 0 0 0 0 0 0 0
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

となる。

よってプログラムは


void main (void)
{

PORTB=0xFF;      //PORTBを使用するという宣言
TRISB=0x00;       //PORTBを出力端子として使用するという宣言
PORTB=0x00;      //PORTBの初期出力が0であるという宣言

PORTB|=0x20;      //RB5から出力
PORTB&=0xDF;     //RB5のみ出力を0に

}

となる。

さぁ!PICに書きこんで動作チェックしてみよう!




・実は足りない

実際に動かしてみたら分かると思うのだが、恐らく何の反応も無かったはずである。
それもそのはず。このプログラムでは命令が上から順次処理されるだけだからである。
RB5が光ったかと思えば、直に消され、そのままプログラムは終了なのである。
しかも1つの命令はμ秒単位で動いているため、あっと言う間に点いて消えたのである。
人間の目で確認できるわけも無い。

そこで必要なのが、一定時間待つ動作と、繰り替えす動作である。

・Wait

取りあえず、「光る」→「消える」といった動作を目で見れるようにしてみようか。
それには、Waitという命令を使えばOKである。

Waitの使い方は、

Wait(2000);

と書いてやればOK。()の中はm秒単位なので2000と書いた場合は2000m秒。つまりは2秒の待ちとなる。

最終的なプログラムは以下の通りである。


void main (void)
{

   PORTB=0xFF;      //PORTBを使用するという宣言
   TRISB=0x00;       //PORTBを出力端子として使用するという宣言
   PORTB=0x00;      //PORTBの初期出力が0であるという宣言

   PORTB|=0x20;      //RB5から出力
   Wait(2000);        //2秒間待つ
   PORTB&=0xDF;     //RB5のみ出力を0に

}

これで、2秒点灯した後、消えるといったプログラムが完成する。

・while

使い方は

while()
{

}

である。

whileの()内の条件が満たされている間は、ずっと{ }の中を繰り返すといった動作を行う。
よって、ずっと繰り返したい場合は()内に変化しない値をいれてやればOKなのである。

これらを踏まえた上でプログラムを作成すると以下のようになる。

#include <P16F873.h>
#include <Datalib.h>
#include <Delays.h>

void main (void)
{

   PORTB=0xFF;      //PORTBを使用するという宣言
   TRISB=0x00;       //PORTBを出力端子として使用するという宣言
   PORTB=0x00;      //PORTBの初期出力が0であるという宣言

   while(1)
   {
      PORTB|=0x20      //RB5から出力
      Wait(2000);        //2秒間待つ
      PORTB&=0xDF;     //RB5のみ出力を0に
      Wait(2000);        //2秒間待つ
   }
}

これをコンパイルして書きこめばOKである。

さて、しかししかししかし、コンパイルの手間はまぁしょうがないとして毎回毎回PICライターの設定をするのは面倒である。何とか出来ないものか?と思うのが人情である。

↑毎回の調整は面倒

そんな時、ふと目に付くのがコンフィグ1の隣にある16進数である。
初期値は0x3FFFだったのに、設定を行う事によって0x3F7Aに変化している。

実はこれは非常に便利な存在で、このコンフィグワードを覚えておいてプログラムにある形式で記述する事によって最初から設定された状態にする事が出来るのである。

↓魔法の言葉

#__config 0x3F3A       //コンフィグワード
#include <P16F873.h>
#include <Datalib.h>
#include <Delays.h>

void main (void)
{

   PORTB=0xFF;      //PORTBを使用するという宣言
   TRISB=0x00;       //PORTBを出力端子として使用するという宣言
   PORTB=0x00;      //PORTBの初期出力が0であるという宣言

   while(1)
   {
      PORTB|=0x20      //RB5から出力
      Wait(2000);        //2秒間待つ
      PORTB&=0xDF;     //RB5のみ出力を0に
      Wait(2000);        //2秒間待つ
   }
}

プログラムの一番上に上のような形で記述してやればOKである。
これで手間が省けた・・・・


[戻る]