当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのC言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、出てこないことの方が多いと思いますので、ご了承願います。

LEDを点灯するプログラム。

LEDを点灯するプログラムを書きます。(使用する文字は全部半角英数字です)

f:id:higonohimajin:20210226201720p:plain

 が、上のプログラムについて、解説。

1行目・3行目・5行目の//の後に、文が続いていますが、//から行末までは、注釈文と言って、PICに書き込む機械語プログラムには、反映されず無視されます、

途中にある//から後ろも注釈文です、この場合は、//の前までは、PICに書き込む機械語プログラムには、反映されます(薄い灰色の文字の部分が注釈文)。

ここには、プログラマーがプログラムを後で見たとき分かりやすいように、コメントを自由に書けます。

6行目から13行目までが、コンフィギュレーションの設定です。

15行目・16行目は、注釈行。

#include <xc.h> は、xc.h という文を参照しなさいという意味。

int main(void) からが、LED点灯するプログラムです。

 

LED 点滅 実験回路

f:id:higonohimajin:20210215095133j:plain

ブレッドボード配線状況

f:id:higonohimajin:20210227151327j:plain


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番地に割り当てられているわけです。

f:id:higonohimajin:20210301093529p:plain

コンパイラは、基本的にレジスタは、アドレスで管理していますので、プログラムでは、レジスタを指定するときはアドレスで指定しなければなりません、しかし、プログラマーは、アドレスでは、単なる数値ですから覚えられません、そこで、判りやすい名前を付けてあるのですが、Cコンパイラには、理解できませんので、名前をアドレスに変換するリストを用意します、TMR0は01h、PCLは02h=82h(82hは02hと変換される)と書いてあるわけです。

#include <xc.h> は、xc.h という変換リストを参照せよということです。

次に、PORTB = 0x20; の解説。

 f:id:higonohimajin:20210214170658j:plain

 上図の 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 になるのか、説明します。 

f:id:higonohimajin:20210301085511p:plain

ポート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を点灯させるのは、次回とさせていただきます。