LEDを点灯するプログラム。
LEDを点灯するプログラムを書きます。(使用する文字は全部半角英数字です)
が、上のプログラムについて、解説。
1行目・3行目・5行目の//の後に、文が続いていますが、//から行末までは、注釈文と言って、PICに書き込む機械語プログラムには、反映されず無視されます、
途中にある//から後ろも注釈文です、この場合は、//の前までは、PICに書き込む機械語プログラムには、反映されます(薄い灰色の文字の部分が注釈文)。
ここには、プログラマーがプログラムを後で見たとき分かりやすいように、コメントを自由に書けます。
6行目から13行目までが、コンフィギュレーションの設定です。
15行目・16行目は、注釈行。
#include <xc.h> は、xc.h という文を参照しなさいという意味。
int main(void) からが、LED点灯するプログラムです。
LED 点滅 実験回路
ブレッドボード配線状況
int main(void) // 関数の名前
{
PORTB = 0x20;
TRISB = 0x00;
return 0;
}
これが、LEDを点灯するプログラムで、実際の回路は上のようになります。
int main(void)は、mainが関数名で、int はmain関数を処理した結果、()内は関数に渡す入力で、voidは、”ない”という意味、関数の名前と{ から }までの文を関数と言います。
電源が入ると、PICは、C言語プログラムの、main関数の最初から、処理を開始します、ここでは、PORTB = 0x20;から処理が始まります、次は、TRISB = 0x00;と処理が続き、プログラムがある限り次々と処理をして、return 0で処理が終わります。
なお、マイクロチップのMPLAB XC8入門書には、メイン関数は、
int main(void)
{
命令文
~
命令文
return 0;
}
のように書くように、と書かれています。
下の図は、メモリマップと言います、PICの状態を表したり、PICのピンの制御をしたりします。
番地(アドレス)が割り当てられた所をレジスタといい、各番地に割り当てられたTMR0等をレジスタの名前といいます、TMR0は01番地に割り当てられているわけです。
Cコンパイラは、基本的にレジスタは、アドレスで管理していますので、プログラムでは、レジスタを指定するときはアドレスで指定しなければなりません、しかし、プログラマーは、アドレスでは、単なる数値ですから覚えられません、そこで、判りやすい名前を付けてあるのですが、Cコンパイラには、理解できませんので、名前をアドレスに変換するリストを用意します、TMR0は01h、PCLは02h=82h(82hは02hと変換される)と書いてあるわけです。
#include <xc.h> は、xc.h という変換リストを参照せよということです。
次に、PORTB = 0x20; の解説。
上図の RB0~RB7 を POATB( RA0~RA7 を POATA)と言います、= は、プログラムでは、等しいではなく、右側を左側に入れるを表し、等しいは、== で表しますので、注意します。
0x20 は16進数の表現で、数字の前に 0x が付くと16進数を表します。
PORTB = 0x20; は、PORTB に16進数の20(に、ゼロと読む、にじゅうとは読まない、16進数の読み方は何桁でも、一桁ずつ読む、例;0x201F は、に、ゼロ、いち、エフと読む)を入れるということになります。
PORTB = 0x20; の;は、命令文の終わりを表します、付けないと、エラーになります。
このように、プログラムを記述するにあたり約束ごとがありますので、面倒ですが覚えるしかありません。
PORTB は、RB0~RB3 と RB4~RB7 に分かれ、0x20 は、RB0~RB3 が0、RB4~RB7 が2です、RB5 にLEDを接続して点灯させるので、RB5 に1をセットして、5Vを出力させ、LEDを点灯させるのです、その他の RB0~RB4 と RB6~RB7 には 0をセットし0Vを出力させます。
では、PORTB の値がなぜ 0x20 になるのか、説明します。
ポートBの各ビットは、RB0が下位でRB7が上位になり、RB0~RB3 と RB4~RB7 のように4ビットを16進数の1桁として変換します。
変換値は2進数(2進数は 0b を最初に付けて 0b1010 の様に書く)を16進数に変換するときの重み(係数)です。
2進数を16進数に変換するときは、2進数の1のビットの重みを加算するのです。
上の表の上側の 0b00100000 は、0b0010 と 0b0000 に分け変換すると、2と0になり、0x20 というわけです。
上の表の下側の 0b01101011 は、0b0110 と 0b1011 に分け変換すると、6とBになり、0x6B というわけです(16進数のBは、10進数では、11 です)。
10進数は、 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ・・・・・・・・ 20 21 ですが、
16進数は、 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 ・・・・ 1E 1F 20 21 となります。
次に、TRISB = 0x00; の解説。
ポートBの各ビットは、入力にも出力にも使用します、5Vや0Vを出すこともできれば、ピンが5Vになっているか、0Vなっているか、読むこともできますので、これを、切り替えながら使います、その切り替えを指定するのが TRISB です、各ビットごとに、1の時が入力、0の時が出力となり、TRISB = 0x00; はBポートは全部出力設定だということです。
したがって、PORTB = 0x20; はRB5に5Vを、ほかは0vを設定、TRISB = 0x00; は、設定したように出力せよという命令です。
これで、プログラムが書けましたので、ビルド(機械語に変換)して、書き込み機でPIC16F627Aに焼きこめば、LEDを点灯させることができます。
ビルドして、PICに焼き、LEDを点灯させるのは、次回とさせていただきます。