マイコン初心者講座その4 LEDを点滅させてみる

とりあえずマイコンというものを実際に動かしてみましょう。マイコン界では一番最初にやることとしてLEDを点滅させるという風習があるのでここでも従うことにします。

プログラミング

まずは準備としてCドライブに演習用の「programming」というフォルダを作ります。さらにその中に「HelloWorld」というフォルダを作ってください。

次にmikroCを開きます。今後作るものは全てプロジェクトという単位で管理されます。Project -> New Projectを選択します。

すると新しいプロジェクトの作成画面が開きます。

まず使用するPICの選択画面になるので、一覧の中からPIC16F88を選択します。

次にクロックの設定です。ここでは8.00000MHzにしておきます。元々そうなっている場合は変更する必要はありません。

続いてプロジェクト名の設定です。先ほど作成したHelloWorldフォルダに移動し、その中にHelloWorldというプロジェクトファイルを作成します。


追加ファイルの読み込み画面です。今回は何も入力しません。

ライブラリの読み込みの選択ですが、ここも変更せず次に進みます。

これで設定完了です。このままデバイスの設定もしたいので、"Open Edit Project〜"にチェックを入れてFinishを押してください。

するとデバイスの設定画面が開きます。赤丸の付いた部分を図のように変更してください。

そしてOKを押すとようやくプログラムの編集画面が表示されます。


まず中身は理解しなくていいので以下のプログラムを入力してください。

void main() { 
     OSCCON = 0x70;
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}


入力し終わったらこのプログラムをマイコンが理解できる形式に変換する必要があります。それがビルドという作業です。Build -> Buildを押してください。

すると画面の下の方に青と水色の文字が並び始め、ビルドが実行されます。もしここで赤い文字が表示された場合はエラーが発生しています。もう一度プログラムに誤りが無いか確認して下さい。

これでプログラムは完成です。

回路の作製

次に回路を用意します。ブレッドボード上で以下の回路を組んでください。

赤・黒・白・青・緑の書き込み用の線を使いPICとPICkit2を接続します。

マイコンへ書き込み

接続が終わったらPICkit2 programmerを起動します。"PICkit2 found and connected.PIC Device Found."と表示されることを確認します。こう表示されないときは接続を確認して下さい。

次に赤丸で囲まれたボタンを押して先ほど作ったフォルダのまで移動します。すると先ほどのフォルダに"HelloWorld.hex"というファイルができています。これがC言語で書かれたプログラムがマイコンで読み込める形式に変換されたものです。
そのファイルを指定します。


すると自動でマイコンへ書き込みが行われます。正常に終了すると緑の背景に"Programming Successful.〜"と表示されます。

それではマイコンの電源を入れてみましょう。"5.0"と書かれていることを確認して赤丸のチェックボックスにチェックを入れてみてください。


これでLEDが点滅を始めたら成功です。

プログラミング詳細

以上がマイコンのプログラミングの一通りの流れです。
プログラム作成  回路作製
   ↓
  ビルド      ↓
   ↓
   マイコンへ書き込み
       ↓
     動作確認


また、プロジェクトの作成後の段階でデバイスの設定の変更をしました。

  • Oscillator

これはPICのクロック源の設定です。PICをはじめ、全てのマイコン、そしてパソコンに使われているような高性能なプロセッサまで全てのCPUはクロックという発振器の周期に合わせて演算をしています。パソコンのスペック表で見るような"2.4GHz"などという表示がそれです。一般にこの数字が大きいほど1秒間に多くの演算をすることができます。
今回PICの設定ではここを8MHzにしました。また、Oscillatorの設定で"INTRC-OSC2 as RA6"というものを選択しました。PICでは発振器を内蔵しているため、その内蔵発振器をクロック源として使用する設定にしました。今回使用したPIC16F88では内蔵の発振器で8MHz、外部に別の発振器を接続した場合には20MHzまで動作させることができます。

  • RA5 / MCLR Pin Function Select

PICにはMCLRという端子があります。これはPICのリセットを行うための端子です。PORTAの5bit目とピンを兼ねているため、そのピンをリセット端子として使うかRA5ピンとして使用するかを選択するものです。今回はRA5端子として使用しました。


次にプログラムの解説です。

void main() { 
     OSCCON = 0x70;
     ANSEL = 0x00;
     TRISA = 0x00;
     TRISB = 0x00;
     PORTA = 0x00;
     PORTB = 0x00;

     while(1) {
          PORTB = 0b00000001;
          Delay_ms(1000);
          PORTB = 0b00000000;
          Delay_ms(1000);
     }
}

C言語では{〜}で囲まれた区間が1つのブロックになります。また、マイコンに限らずC言語のプログラムは全てmain関数から始まります。
つまり、1行目の"void main() {"から最後の行の"}"までがmain関数のブロックという意味です。
2行目から7行目はマイコンの設定です。ここではとりあえず必要なものという認識でOKです。
9行目からまた{〜}で囲まれたブロックが始まります。"while(1)"という文字がブロックの先頭に付いています。whileというのはループを作るためのもので、このブロック内を条件を満たすまでループします。その条件というのがwhileに続く括弧内に記述されたものです。括弧内が真の時、ループが実行されます。今回はその条件に"1"が指定されています。C言語では"0"が偽、それ以外が真というように定められています。そのため、この条件式は常に真となり、永遠にこのブロック内はループします。
パソコン向けのアプリケーションを作る際には無限ループは嫌われますが、マイコンではこのような無限ループを作ることがよくあります。


2行目の"OSCCON = 0x70;はクロックの設定です。"0x70"はPICを内蔵クロックで8MHzで動作させるための設定です。
3行目の"ANSEL = 0x00;"はPICの持つアナログ入力の機能を使わないという命令です。PIC16F88には8本のアナログ入力ができるピンがあり、デフォルトではこれらをアナログ入力ピンとして使用するように指定されています。アナログ入力として使うかディジタル入出力として使うかを指定するのがANSELというレジスタです。今回はディジタル入出力ピンとしてだけ使いたいので、ANSELを0にしてディジタル入出力ピンとして指定しています。
4、5行目のTRISA/TRISBはPORTA、PORTBそれぞれの入出力方向レジスタというものです。PORTというのはPICのピンを8本まとめたものです。以下のPIC16F88のピン配置図を見るとRA0〜RA7、RB0〜RB7と書かれたピンがあります。このRA0〜RA7をまとめてPORTA、RB0〜RB7をまとめてPORTBと呼びます。

それぞれのピンは入力端子、出力端子のどちらとしても使うことができます。それを指定してあげないとマイコンは出力していいのか入力として使えばいいのか分からないので、それを決めてあげるのがTRISというレジスタです。0を指定すると出力、1を指定すると入力ピンとして動作させることができます。「OUT」の頭文字Oを0、「IN」の頭文字のIを1として覚えると分かりやすいかもしれません。
今回は全て出力ピンとして設定します。
6、7行目はそれぞれのポートの出力を0にしています。
ここまでがPICの初期化処理です。


無限ループ内には4つの文が記述されています。
PORTB = 0b00000001;
この文はPICのPORTBの出力の状態を変更するものです。0b〜というのは2進数で表記するという意味なのでここではPORTBの0bit目だけを1にしています。こうすることでPICのPORTBの0bit目のピン状態が0(0V)から1(5V)となり、繋がっているLEDに電流が流れます。
次のDelay_msは指定時間待機する関数です。ここでは"1000"を指定しているため、1000ms、つまり1秒待機します。
次にまたPORTBへの出力の命令が書かれています。ここでは0bit目が0となっており、PORTBの0bit目を0(0V)にしています。
この次にまた待機の命令があり、それが終わるとまた"PORTB = 0b00000001;"の文にジャンプし、永遠にこの動作を繰り返します。こうすることで2秒の周期でLEDが点滅しているように見えます。


このように、マイコンはプログラムに応じて各ピンの状態を0Vか5Vに変化させることができます。また、その逆に各ピンの電圧を読み取ることもできます。これだけしかできないかと思うかもしれませんが、実に様々なことを実現することができます。

目次