あそ~ぶUSB サンプルソース解説・その1

LEDを交互に点滅させる

2010/11/11

Assembly Desk

1. 概要

ここでは、あそ~ぶUSB のサンプルプログラムを解説していきます。

このサンプルは最も基本的な物で、LEDを点滅させるプログラムです。

USBケーブルを挿し込むと、赤と青のLEDが1s毎に交互に点滅します。

この文章は、開発環境が既にインストールされている事を前提としてかかれています。

まだ、開発環境を整えて居ない方はこちらを参考にして、まずは開発環境を整えて下さい。

http://a-desk.jp/modules/forum_pic/index.php?cat_id=4

まだ、ファームウェアのビルドの仕方についてはこちらを参考にして下さい。

http://a-desk.jp/modules/forum_pic/index.php?cat_id=3

2. ソースコード解説

2.1 ファイルの構成

このサンプルソース”skelton”を開くと、プロジェクトには3つのファイルが登録されています。

“main.c”はmain関数が含まれているソースファイルです。今回のサンプルプログラムはこのファイルだけで記述されています。

“bootload.h”と”rm18f2550 - HID Bootload.lkr”にはブートローダでファームウェアをあそ~ぶUSBへ書き込み出来る様にする為のおまじないが書かれています。

興味があれば読んでみてください。意味が分からなくても全く問題ありません。

2.2 関数

“main.c”には3つの関数が含まれています。

“isr_high”は高位レベル割り込みの処理を、”isr_low”には低位レベル割り込みの処理を記述します。

ここでは、割り込みを使用していないので、特に何も記述していませんが、この関数自体を消してはいけません。

プログラムは“main”から始まります。(厳密には違いますが・・・)

ここから内容を追っていきます。


void main(void)

{

        TRISB = 0;                                //PORT Bを全て出力に設定

        LATBbits.LATB4 = 1;                //PORT B4をON(青LED)

        LATBbits.LATB5 = 0;                //PORT B5をOFF(赤LED)

        while(1)

        {

                Delay10KTCYx(120);        //100ms

                Delay10KTCYx(120);        //100ms

                Delay10KTCYx(120);        //100ms

                Delay10KTCYx(120);        //100ms

                Delay10KTCYx(120);        //100ms

                

                LATBbits.LATB4 = !LATBbits.LATB4;        //LEDを反転

                LATBbits.LATB5 = !LATBbits.LATB5;                

        }        

}


最初のTRISB=0;はPORT Bの0~7を全て出力として使いますよ。と言う意味になっています。

1は入力、0は出力でビット毎に設定します。

例えば、TRISB = 0x15;とすると、PORT Bの0/2/4だけ入力、後は出力として使いますよ、と言う意味になります。

LATBbits.LATB4 = 1;とLATBbits.LATB5=0;はそれぞれ、PORT Bの4と5の出力値を設定しています。

ここでは、PORT Bの4は5Vを出力、5は0Vを出力としています。

あそ~ぶUSBには2色のLEDが乗っており、PORT Bの4には青LED、5には赤LEDが付いています。

なので、青を光らせて,赤を光らせない、と言う事になります。

while(1)は無限ループです。この中の処理をグルグル繰り返しますよ、と言う意味です。

これを入れておかないと、プログラムが直ぐに終わってしまいます。

Delay10KTCYx(120);はmicrochipが用意しているディレイ関数です。

この命令は引数×10000サイクルだけ待つ、と言う意味です。つまり、ここでは、1200000サイクル分待つ、と言う事になります。

これが具体的にどのくらいの時間になるかと言うと、100msです。

あそ~ぶUSBは内部クロック48MHzで動いています。PIC18Fシリーズは4クロックで1命令なので、一秒間に12000000の命令を実行しています。

ということは、1200000サイクル分の時間と言うのは、0.1秒になるわけです。

ここでは、この命令を5回繰り返していますので、0.5秒待っています。

Delay10KTCYxの引数は0~255なので、このように書いてある訳です。

LATBbits.LATB4 = !LATBbits.LATB4;とLATBbits.LATB5.LATB5 = !LATBbits.LATB5;はそれぞれ0を1に、1を0に反転させています。

LEDが付いていたら消し、消えていたら付けるわけです。

これで、LEDが0.5秒毎に付いたり消えたりするソフトが出来ました。