連載
» 2005年05月19日 17時01分 公開

春だからはじめる工作教室:入門その4「PICでLEDをフルカラーで光らせる」 (1/2)

前回までに、PICのプログラミングから開発環境とPICへの書き込み環境の構築を行い、LEDを点滅させることに成功した。今回は、「LEDをフルカラーで光らせる」ためにプログラムのチューニングに挑んでみる。

[小林哲雄,ITmedia]

遅ればせながらプログラムの解説

 プログラムは、まず単純に作成してだんだんと複雑にしていくか、あるいは、確実に動作するプログラムを組み合わせながら作成していくのが確実。そしてIDEを使って、正しく動くことを確認してから実際の回路を作ったほうがよい。前回までは、よく分からないままにプログラムを入力し、開発キットやPICへの書き込みキットの使い方を覚えた。

 そこで、順序が逆になってしまったが、連載第2回で紹介したテストプログラムの解説を少々しておこう。

LIST P=PIC12F675
INCLUDE "P12F675.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF

 は「おまじない」だ。上の二行はアセンブラに対して「PIC12F675を使いますからね」という宣言と文字列の定義。下の行はPICの使い方を定める「コンフィグレーションワード」の設定で、アセンブラには直接関係ないが書込み時に必要となる。もちろんシミュレータもこれで動作が変わる。

 このプログラムで使っているそれぞれの命令は、内部クロックを使い、外部に出力なし(_INTRC_OSC_NOCLKOUT)、サボりチェックなし(_WDT_OFF)、クリア端子なし(_MCLRE_OFF)という意味で、要するに電源以外のピンをすべてI/Oとして使おう、ということになっている。

COUNT1 EQU 20H ; ループカウンタ1
COUNT2 EQU 21H ; ループカウンタ2
COUNT3 EQU 22H ; ループカウンタ3

 12F675には汎用レジスタがあるので、その場所を定義している。資料を見ればわかるが$20-5Fまでが汎用レジスタとして使え、ループカウンタを3つ使っているので、プログラムでも上から3つを定義した。

ORG 0
BSF STATUS,RP0 ; Bank 1 へ切替
CLRF TRISIO
CLRF ANSEL
BCF STATUS,RP0 ; Bank 0 へ戻る

 ORGとはPICにはない擬似命令と言うもので、アセンブラに対して「0番地から結果を書いてね」とお願いするものだ。リセットすると0番地から実行されるので、これでリセットすると動き出すプログラムということになる。その次からがプログラムの本体だ。

 12F675には6つのI/Oピンがあるが、そのすべてが出力に使えるわけではない。GP0からGP5のうち、GP3は入力専門、またそのほかのピンも設定で動作が変わる。リセット後の状態からGP0からGP5(GP3を除く)を出力にするためにはTRISIOに0を書けばよい(これがCLRF命令)。

 また、初期状態ではアナログ入力の設定になっているので、これもデジタル用に書き換える。そのレジスタがANSELだ。TRISIOANSELに何を書けばよいかはデータシートを読めば分かる。

 前後にあるBSFBCF命令は、特定ビットを「1」または「0」にする命令で、ここではSTATUSレジスタのRP0(これは第5ビット)を変更している。TRISIOANSELの両レジスタはアドレスが$80以上にあるため、バンクの切替をする必要がある。

 残るはメインルーチンだ。IOへの書き込み命令というのは特別に用意されておらず、GPIOレジスターに書き込めばよい。書き込むべき値はあらかじめアキュムレータ(Wレジスタ)に入っている必要があるから、メインコードはこうなるはずだ。

main
MOVLW 3FH ; 3FHをGPIOに書込み
MOVWF GPIO
; あとで時間待ちいれる
MOVLW 00H ; 00HをGPIOに書込み
MOVWF GPIO
CALL TIME1N
GOTO main ; 元に戻る

 アセンブラの解説だが、最初のmainというのはプログラムを分かりやすくするためのラベル。これは自由に作ることができる。MOVLW命令はアキュムレータに値を書き込め、という命令。そしてMOVWF命令はアキュムレータの内容をレジスタに書き込め、という命令になる。

 CALL命令はサブルーチンを呼び出すもの。なお、ここで呼び出されるサブルーチンは単なる時間待ちループなので説明は省略する。最後のGOTO命令はジャンプで、ここではmainに飛べ、ということだ。ということで、これをアセンブル………ちょっとまった。GPIOって何?

 データシートを見れば分かるが、命令にないTRISIOとかANSELGPIOは定義済みのレジスタ名だ。アセンブラではレジスタを文字列で表現したほうが分かりやすい。この文字列をどこで定義しているのかというと、冒頭のINCLUDE文で定義している(例えばGPIO EQU h'0005'となっている)。

 プログラムでワーク用として必要な場合は先に書いた「COUNT1 EQU 20H」のように定義すればよい。これでCOUNT1と書くと20Hと書いたのと同じ意味になる。

 RISC型プロセッサの場合、演算がおこなえるアキュムレータ(ワーキングレジスタとも言う)と多数の汎用レジスタがあり、限られた命令で処理をこなすことになる。

フルカラーなんだから色もつけたい

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

この記事が気に入ったら
ITmedia PC USER に「いいね!」しよう