「天文屋のためのマイコン入門」LEDプログラムの解説
それでは、必要な準備が整ったので、以前出したLEDのプログラムを解説します。こんな小さなプログラムでも、ちゃんと理解するにはこれだけの下準備が必要なのです。
回路図ももう一度、出しておきます。
まず、このプログラムを見て、ちょっとPICのプログラムを知っている人なら、ちょっと様子がおかしいと思うかもしれません。シンボルを使っていなくて、やたら数字が多いです。
普通のPICプログラムはたとえば、こんな感じです。
数値をシンボルに置き換えて、数値の代わりにシンボルでプログラミングすることをシンボルプログラミングといいます。この鍵は、2行目の
INCLUDE P16F88.INC
にあります。この一文によって、シンボルの定義ファイルを取り込んでいるのです。この定義ファイルをヘッダファイルといいます。
この連載ではしばらくヘッダファイルは使わないことにします。つまりシンボルは使いません。(ラベルは使います)
このヘッダファイルというのはプログラミングを習熟した人が使うのは便利で良いのですが、これからプログラムを学ぼうとする人にとっては、なんの利益もありません。これはプログラムの本質をブラックボックス化し、本質を見えなくします。確かにシンボルを使わないと、番地とかいちいち調べなければなりませんが、それゆえ、マニュアルを見る癖がつくでしょう。
また、エラーが起きたとき、ヘッダファイルを使わないと、すべての問題が一つのファイル内で完結しますから、エラー原因がつかみやすいです。(ヘッダファイルをいきなり使うことは、小学生に筆算を教えないでいきなり電卓の使い方を教えるようなものです。)
それでは、元のプログラムにもどり解説します。
1行目 __CONFIG H'2007', H'3F18'
この一行は、PIC16F88の初期状態、たとえば内部クロックを使うか、外部クロックを使うか、リセット信号はどうするかとかのコンフィグレーション情報を設定するものです。
この一文は非常に重要な文です。ですから、この一行は「おまじない」ですとか、この通り書いてくださいですむ一行ではありません。ちゃんと説明しないといけない一文です。もし、この文を理解していないと、このプログラムを他のシステムに流用したり、逆に他のシステムのプログラムをこの回路に流用する場合にプログラムが動かない可能性があります。
しかし、この説明をするとまた横道にそれるので、また改めて後日説明します。
3行目から6行目でポートAの初期設定をしています。
3行目 BSF 3,5
これは3番地のレジスタ(つまりSTATUSレジスタ)の5ビットを1にセットしています。つまりバンク1に設定しています。ビット6は初期値0のままでよいので、ビット6を操作する命令は要りません。
4行目 CLRF 27
バンク1の27番地のレジスタ、つまりANSELレジスタです。ポートAは初期状態でADコンバーターの入力ピンとなっていて、ポートの機能はありません。このANSELレジスタをすべて0にすることにより、ポートAをポート機能として利用できるようになります。
5行目 CLRF 5
バンク1の5番地のレジスタ、つまりTRISAレジスタを0にクリアしています。つまりポートAのすべてのビットを出力に設定しています。
6行目 BCF 3,5
STATUSレジスタのビット5を0にクリアして、バンクを0に戻しています。
7行目以降で実際にLEDを光らせます。
8行目 MOVLW b'00000000'
まず、ワーキングレジスタに0を書き込んでおきます。なぜ0を書き込んでおきかは後で分かります。
9行目 BTFSC 5,5
現在はバンク0の状態です。バンク0の5番地はポートAそのものです。ポートAの第5ビットを調べています。ポートAの第5ビットRA5はスイッチをつなげていましたね。
この命令はRA5の状態が0なら次の命令をスキップしろという命令です。
10行目 MOVLW B'11111111'
ワーキングレジスタに2進数で11111111を書き込んでいます。ただ、8行目により、もしRA5が0ならこの命令はスキップされます。したがって、ワーキングレジスタは0のままです。まとめると
RA5が0なら、すなわち、スイッチONなら、W=00000000
RA5が1なら、すなわち、スイッチOFFなら、W=11111111
11行目 MOVWF 5
ワーキングレジスタをバンク0の5番地、つまりポートAに出力します。ワーキングレジスタの値によって、'1'または'0'が出力されます。'1'の場合は、LEDが点灯し、'0'の場合は消灯します。
12行目 GOTO 4
プログラムは4番地、つまり5番目の命令のところにジャンプします。これにより4番地からのプログラムを繰り返し実行することになります。これによりプログラムは無限ループ構造になります。
つまり電源を切るまで同じことを繰り返します。
実はマイコンのプログラムでは、このようにプログラムを無限ループ構造にすることが重要です。つまりマイコンのプログラムには終わりがないのです。
もし、どうしても一回限りの処理でよく、無限ループ構造にならないなら、GOTOのジャンプ先番地を自分自身にします。
つまりひたすらGOTOを繰り返す命令です。
こうしないと、マイコンが暴走してしまうのです。つまり、プログラムが途中で終わってしまうと、人間から見ると、プログラムはそこで終わりに見えますが、マイコンから見ると、プログラムメモリに終わりの印はあるわけではないです。まだプログラムがあって、でたらめなデータをプログラム命令として実行し続けてしまうのです。ですから、かならず、最後は無限ループ構造にします。(あるいはスリープ状態にして終わらせる方法もあります)
14行目 END
END命令ですが、これはマイコンに対する命令ではありません。この命令はマイコンが実行するプログラムには含まれません。ですからこの命令があっても、マイコンは実行を停止しません。
では何に対するEND命令かというと、プログラムをビルドするMPLABソフトウェアに対する命令です。ここでプログラムは終了するから、翻訳作業を停止せよということです。
このようにマイコンに対する命令ではなく、開発ソフトウェアに対する命令を「擬似命令」といいます。
次回は、7セグメントLEDの取り付けです。
| 固定リンク
コメント