« 6-5-7 PIC赤外線受信ボードの完成 | メイン | 7-2 課題2 LEDの点滅 ~その2~ »

はてなブックマークに追加   7-1 課題1 LEDの点滅 ~その1~

 第6章で製作したPIC赤外線受信ボードは無事に完成することができましたか?
 この章では完成したボードを使ってPICプログラミングを楽しみましょう。


 PICが装着されている側を下にして、PIC赤外線受信ボードを縦にします。タクト・スイッチを中心にしてLEDを上下左右で考えてください。

    ○  ・・・UP_LED
  ○  ○ ・・・LEFT_LED、RIGHT_LED
    ○  ・・・DOWN_LED

■ 課題1

 四つのLEDを●●●●と○○○○のパターンで250ms間隔で点滅させましょう。全部のLEDがフラッシュします。★の部分を埋めて完成させてください。
 ●が点灯、○が消灯を表します。

ex7-1.gif

■ ソース・ファイル

【注意】ブログの仕様で、プログラムリスト中のインデント(段付け)が再現されません。
 次回のダウンロード可能なソース・ファイル内のインデントを参考にわかりやすい記述を心がけてください。

// 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,NOPROTECT
 PICの動作モードを指定します。
   HS:ハイスピード・モード。
   NOWDT:ウォッチドッグ・タイマはなし。
   NOPROTECT:メモリ・プロテクトなし・・・プロテクトすると読み出し、書き込みができなくなる。
#use delay(clock=20000000)
 PICの動作周波数は20MHzです。
#define ON 1 
#define OFF 0
 ON,OFFをそれぞれ1,0と定義します。これによりON,OFFをプログラム中で使用することができます。
#byte  RA=5
#byte RB=6
 PICのポートはメモリに直接割り振られています。ここでは5番地をRA,6番地をRBと定義します。

■ ポートの使い方

 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への書き込み→実行してください。正解は次回に掲載します。



長野県飯田工業高校 竹内浩一

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/453

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

カレンダ

2008年11月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

おすすめ書籍

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

About

2007年10月 1日 08:11に投稿されたエントリーのページです。

ひとつ前の投稿は「6-5-7 PIC赤外線受信ボードの完成」です。

次の投稿は「7-2 課題2 LEDの点滅 ~その2~」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 4.1