というわけで、前回インストールしたmikroElektronika社のmikroCを使って、PICで動くプログラムを作ってみましょう。
スタートメニューに登録されたmikroCを実行してみます。すると、(このバージョンでは)いきなりなにやらプログラムが現れました。何のことやらわかりませんでしたが、あとからこれはサンプルのひとつだとわかりました。このままではPIC16F628Aでは使えませんので眺めるだけにして、新しいプロジェクトを作ることにします。
でも、せっかくなので眺めてみましょう。
void main() { PORTC = 0; TRISC = 0; while(1) { PORTC = ~PORTC; Delay_ms(1000); } }
main()関数がプログラム本体っていうのはどこのC言語も変わりませんね。その中で、PORTCとTRISCというシンボルに0を代入しています。これは予め用意されたレジスタシンボルで、PORTCレジスタに0を、TRISCレジスタに0をセットしています。PORTCは汎用ポートCの入出力レジスタです。TRISCは、汎用ポートCの入出力方法制御レジスタです。
無限ループの while文の中で、PORTCの値を反転し、Delay_ms(1000)で1000msecのウェイトをいれています。1秒ごとにPORTCの値を反転しているわけですね。ここにLEDなどをつないでいれば、1秒ごとに点灯・消灯を繰り返すようなものです。
しかしこれはPIC16F877A用に作られたプロジェクト。ウインドウ左側の「ProjectSetup」でPIC16F877Aが選択されていますね。そもそもPIC16F628AにはPORTCなんてありませんからね。しかしせっかくですから、これをもとにPIC16F628A用のプログラムを作ってみましょう。
せっかくなので、一から新しいプロジェクトを作ります。プロジェクトというのは、ひとつのアプリケーションを作るためのたくさんのファイルのカタマリですね。プロジェクトにプログラムのソースファイルやヘッダファイルを登録しておくと、まとめてコンパイルしてくれるってわけです。また、PICのコンフィギュレーションなどもここに登録されることになりますので、作る回路ごとに違うプロジェクトを作ります。
メニューの を実行します。
すると、こんなダイアログが登場します。ここで、必要な設定をしていきます。
プロジェクト名を決めます。今回はとりあえずのテストなのでtestとしてみました。
プロジェクトの保存先を決めます。ネットワークフォルダだとうまくいかないみたいですので、ローカルにします。ダイアログを開いてすぐは前のプロジェクトのパスが残っていますので、必ず変更するように注意しましょう。分けたかったのに同じところに保存してしまったとかいう失敗をよくやっちゃいます。
あとから何のプロジェクトだったかわかる程度に説明書きをしておきましょう。
対象のPICマイコンを選びます。今回はPIC16F628Aですので、それを選んでおきました。
使用するクロック周波数を設定します。ここで設定するとそのクロックで動作するというわけではありません。使用するクロックをここで指定しておくと、時間やタイミングの計算をこのクロックを元にコンパイラが勝手にやってくれるというわけです。さっきちょっとでてきたDelay_ms(1000)も、きっとここで指定したクロック周波数をもとに計算してくれるのだと思います。今回は、内蔵クロック4MHzを使うことにしますので、4を記入します。単位はMHzです。
CONFIGレジスタの内容を指定します。WDT_OFF、内蔵クロックを使うのでINTOSC_OSC_CLKOUTまたはINTOSC_OSC_NOCLKOUTにチェックを入れます。INTOSC_OSC_CLKOUTにしておくと、内蔵クロックの出力がピンで得られますので、チップが動いているかどうかわかるっていうだけのことです。今のところ利用する予定はありません。その他、初期状態でONですが明示的にLVP_ON(私の今の環境では低電圧書き込みをするので)にチェックを入れました。データシートを見ながら必要な項目にチェックをしていきます。
以上でプロジェクトの設定はOKでしょう。また後から修正したくなったら、
の で再び設定することができます。プロジェクトの設定が終わったら、早速プログラムを作ってみましょう。先ほど勝手に表示されたサンプルプロジェクトを元に、PIC16F628A用のプログラムを作ってみます。もちろん、回路も考えないといけません。まずはソースファイルから。
void main() { PORTB = 0; TRISB = 0; while(1) { PORTB = ~PORTB; Delay_ms(1000); } }
先ほどのサンプルソースのポートCをポートBにしただけですが、こんな感じです。本当はコンパレータの設定とかその辺もやっておかないといけないみたいですが、とりあえず動けばOKということにしておきましょう。
mikroCでは、予め組み込まれた関数などを使うときには特にincludeファイルを指定する必要はないようですね。
ソースを書き込んだら、早速ビルドしてみます。ビルドとは、コンパイル・アセンブル・リンクなどまとめて一気にやってくれる便利な機能です。そこでエラーがあるとエラーが出てきますが、この程度なら多分エラーは出てこないんじゃないかなぁ?
メニューの を実行します。Ctrl+9キーでもイケます。エラーなくコンパイルできたら、ウインドウ下のメッセージに「Success」と出てくるはずです。この小さなプログラムは、PIC16F628Aのわずか1%のプログラム領域で完成してしまいました。たったこれだけで、LEDがピコピコしてしまうんですね~。すごいですね~。
コンパイラがどのように働いたか、せっかくですので、その成果を見てみましょう。
メニューの を実行すると、C言語をコンパイルした結果のアセンブラソースを見ることができます。";"で始まっている行はコメント、左端の4桁の16進数がアドレス、その次の4桁がデータ、そして右端の文字がアセンブラソースです。コンパイラはC言語のコトバをこの摩訶不思議なアセンブラソースというコトバに翻訳し、そしてさらにアドレスとデータの数字に変換してくれたってわけですね。お疲れ様でした。では、このプログラムが動作する回路図を描いてみましょう。本当は回路図が先でしょうが、この程度ならまぁいいでしょう。
LEDの点灯・消灯(以後LEDピコピコ)を繰り返すテスト回路図を描いてみました。2種類ありますが、どちらも同じです。
知ってる人は知っているのですが、回路図その2の描き方だと、例えばGND同士をつなぐということを知らない場合もあるらしいのです。回路図その1の描き方だと、電源から出た5Vが帰ってくるのがわかると思います。しかしどこからでも帰ってくるようにすると、回路図が複雑になるにつれて線がたーくさんになってしまうので、それをGND記号で省略して描きます。このくらいのカンタンな回路だと問題ないのですけどね。
さて回路図について見ていきましょう。電源5Vはどこからか取ってきてください。例えばこんな方法があります。
ACアダプタは安価でちいさなものが秋月から販売されています。ひとつ持っておくと便利でしょうね。また、PIC16F628Aの動作電圧は3.0V~5.5Vですから電池でもOKです。2個直列ではちょっと厳しいでしょうから、3個直列がいいでしょう。また、100円ショップでケータイのUSB充電ケーブルを買ってきて、抵抗を外せばパソコンのUSBポートから5Vを取り出すこともできます。または、9Vのや12Vの電池から5Vのレギュレータなどを使う方法もあります。以後の説明では、5Vが電源電圧として使われていることにします。
C1とC2はバイパスコンデンサ(パスコン)といって、電源ノイズを軽減するためのものです。一応念のために容量の違う2個をつけておきましたがやりすぎかもしれません。
IC1はPICマイコンです。実際にはICソケットを使います。4番ピンはMCLR端子がリセット端子になります。Lレベル(GNDと同電位)でリセット、Hレベル(電源電圧と同電位)でリセット解除ということになりますので、予め電源電圧をつないでおきます。フツウは抵抗を挟みますが、とりあえず・・・。
IC1の14番端子がPICの電源、5番端子がGND端子です。また、10番ピンRB4/PGMは低電圧書き込みモード(LVP_ON)が有効になっていると、Hレベルにしたときに書き込みモードになってしまいますので、GNDに接続して通常動作をさせます。
肝心のLEDですが、RB3につなぎました。ポートBの3番ポートになります。ここにつないだのはワケがあるのですが、それはおいおい出てきます。電源電圧とLED D1のVfによって抵抗R1の抵抗値は変更する必要があります。秋月のLED抵抗計算機を使わせてもらいましょう。
さて、回路に従って基板に部品を乗せていきましょう。こういうテストにはブレッドボードがいいかもしれません。今回はユニバーサル基板に組んでみました。
で、ICソケットにPIC16F628Aを乗せるのですが、そういえばまだプログラムが入っていませんでしたね。まずはプログラムのダウンロードをしなければただのゲジゲジです。
PIC PICの一年生