第6章で製作したPIC赤外線受信ボードは無事に完成することができましたか?
この章では完成したボードを使ってPICプログラミングを楽しみましょう。
PICが装着されている側を下にして、PIC赤外線受信ボードを縦にします。タクト・スイッチを中心にしてLEDを上下左右で考えてください。
○ ・・・UP_LED
○ ○ ・・・LEFT_LED、RIGHT_LED
○ ・・・DOWN_LED
■ 課題1
四つのLEDを●●●●と○○○○のパターンで250ms間隔で点滅させましょう。全部のLEDがフラッシュします。★の部分を埋めて完成させてください。
●が点灯、○が消灯を表します。
■ ソース・ファイル
【注意】ブログの仕様で、プログラムリスト中のインデント(段付け)が再現されません。
次回のダウンロード可能なソース・ファイル内のインデントを参考にわかりやすい記述を心がけてください。
// ex7-1.c // PIC16F84A用#include<16f84a.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20000000) #define ON #define OFF 0
#byte RA= #byte RB=6
void main() { RB=0; set_tris_a(0x0c); set_tris_b(0x00); while(1){ RB=0x0f; delay_ms(250); ★★★★; ★★★★; }
}
■ イニシャライズ
メイン・プログラムに先立って記述する部分をイニシャライズ(初期化)と呼んでいます。PICプログラミングでは使用するPICへの適合やPICの動作モードの決定をこの部分で行います。
//が先頭行にあるとコメント行(注釈行)となります。この行にはなんでも自由に書くことができます。
#include<16f84a.h>PIC16f84a用の定義が記述されたファイルを取り込みます。
#fuses HS,NOWDT,NOPROTECTPICの動作モードを指定します。
HS:ハイスピード・モード。
NOWDT:ウォッチドッグ・タイマはなし。
NOPROTECT:メモリ・プロテクトなし・・・プロテクトすると読み出し、書き込みができなくなる。
#use delay(clock=20000000)PICの動作周波数は20MHzです。
#define ON 1ON,OFFをそれぞれ1,0と定義します。これによりON,OFFをプログラム中で使用することができます。
#define OFF 0
#byte RA=5PICのポートはメモリに直接割り振られています。ここでは5番地をRA,6番地をRBと定義します。
#byte RB=6
■ ポートの使い方
PICのポートの入出力は、プログラマが自由に決めることができます。出力:0、入力:1としてRA0~5、RB0~7までを決定します。何も接続しないところは0とします。ここでの入力と出力はPICから見ての状態です。プログラマが決定したポートの入出力は、set_tris_a()、set_tris_b()の括弧内に記述することで有効になります。
(1) RAポートについて
RA3:タクト・スイッチ・・・入力・・・1
RA2:赤外線受光素子・・・入力・・・1
RAポート:5 4 3 2 1 0
なし なし SW IR なし なし
0 0 1 1 0 0
RAポートは上のようになります。
00 1100
となりました。
上に二つ0を加えて8ビットにします。
0000 1100
これを16進数に変換します。
0x0c
この「0x0c」がset_tris_a()に書き込む値となります。
set_tris_a(0x0c)と記述します。
このset_trisは8255の頃に「CTW(コントロールワード)」と呼んでいたものと同じです。
(2) RBポートについて
次に、RBポートについて考えましょう。
RB0・・・DOWN_LED・・・出力
RB1・・・RIGH_LED・・・出力
RB2・・・UP_LED・・・出力
RB3・・・LEFT_LED・・・出力
RBポート:7 6 5 4 3 2 1 0
なし なし なし なし L U R D
0 0 0 0 0 0 0 0
RBポートは、
0000 0000・・・・0x00
となります。
この値がset_tris_b()に書き込む値となります。
set_tris_b(0x00)と記述します。
■ while()文
while(1){
} ()の中が成立している間(=1となります)、{}の中を実行し続けます。while(1)とすると無限に実行し続けます。
■ LEDの点灯・消灯
RBポートにはLEDが四つ接続されています。RBポートはRB0~7まであります。この0~7の一つ一つを「ビット」と呼びます。
LEDを点灯させるには接続されている各ビットを1にします。消灯するには0にします。
接続されているLEDを全部点灯するには、
0000 1111・・・0x0f
を出力します。
RB=0x0f
と記述します。
消灯するには・・・
0000 0000・・・0x00
を出力します。
■ delay命令
LEDの点灯消灯を繰り返すには、
点灯・待機・消灯・待機・・・・・
という具合に途中に「待機」を入れないと人間の目にはちらちらするだけになります。
そこで、時間稼ぎをする命令がdelay命令です。
delay_ms(500)とすると、500ms=0.5秒停止します。
delay_us(500)とすると500μS止まります。
delay命令を使うにはプログラムの先頭で、
#use delay(clock=20000000) //PICの動作周波数は20MHzですを記述して、コンパイラに駆動周波数を教えてやります。
コンパイラはこの記述を参照して正確な時間になるように自動的に調整します。
■ 注意点
プログラムを完成させるには上の出題部分をTerapadにコピーして★を削除し、正しく記述し、コンパイルします。どうみても正しく記述されているのにコンパイル時に、
0x81
がうんぬんというエラー・メッセージが出る場合があります。これは全角の空白が混じっている場合に出現するエラーです。
Terapadのメニュー→表示→表示タブ→マーク・・・改行・EOF・半角空白・全角空白
にチェックを入れてください。全角空白が表示されるようになります。この全角空白が混入していることにより起きるエラーなので、見つけて削除してください。
以上を参考に★印の部分を埋めてプログラムを完成後、コンパイル→PICへの書き込み→実行してください。正解は次回に掲載します。

PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン