プログラムは、まず単純に作成してだんだんと複雑にしていくか、あるいは、確実に動作するプログラムを組み合わせながら作成していくのが確実。そしてIDEを使って、正しく動くことを確認してから実際の回路を作ったほうがよい。前回までは、よく分からないままにプログラムを入力し、開発キットやPICへの書き込みキットの使い方を覚えた。
そこで、順序が逆になってしまったが、連載第2回で紹介したテストプログラムの解説を少々しておこう。
は「おまじない」だ。上の二行はアセンブラに対して「PIC12F675を使いますからね」という宣言と文字列の定義。下の行はPICの使い方を定める「コンフィグレーションワード」の設定で、アセンブラには直接関係ないが書込み時に必要となる。もちろんシミュレータもこれで動作が変わる。
このプログラムで使っているそれぞれの命令は、内部クロックを使い、外部に出力なし(_INTRC_OSC_NOCLKOUT)、サボりチェックなし(_WDT_OFF)、クリア端子なし(_MCLRE_OFF)という意味で、要するに電源以外のピンをすべてI/Oとして使おう、ということになっている。
12F675には汎用レジスタがあるので、その場所を定義している。資料を見ればわかるが$20-5Fまでが汎用レジスタとして使え、ループカウンタを3つ使っているので、プログラムでも上から3つを定義した。
ORGとはPICにはない擬似命令と言うもので、アセンブラに対して「0番地から結果を書いてね」とお願いするものだ。リセットすると0番地から実行されるので、これでリセットすると動き出すプログラムということになる。その次からがプログラムの本体だ。
12F675には6つのI/Oピンがあるが、そのすべてが出力に使えるわけではない。GP0からGP5のうち、GP3は入力専門、またそのほかのピンも設定で動作が変わる。リセット後の状態からGP0からGP5(GP3を除く)を出力にするためにはTRISIOに0を書けばよい(これがCLRF命令)。
また、初期状態ではアナログ入力の設定になっているので、これもデジタル用に書き換える。そのレジスタがANSELだ。TRISIOとANSELに何を書けばよいかはデータシートを読めば分かる。
前後にあるBSFとBCF命令は、特定ビットを「1」または「0」にする命令で、ここではSTATUSレジスタのRP0(これは第5ビット)を変更している。TRISIOとANSELの両レジスタはアドレスが$80以上にあるため、バンクの切替をする必要がある。
残るはメインルーチンだ。IOへの書き込み命令というのは特別に用意されておらず、GPIOレジスターに書き込めばよい。書き込むべき値はあらかじめアキュムレータ(Wレジスタ)に入っている必要があるから、メインコードはこうなるはずだ。
アセンブラの解説だが、最初のmainというのはプログラムを分かりやすくするためのラベル。これは自由に作ることができる。MOVLW命令はアキュムレータに値を書き込め、という命令。そしてMOVWF命令はアキュムレータの内容をレジスタに書き込め、という命令になる。
CALL命令はサブルーチンを呼び出すもの。なお、ここで呼び出されるサブルーチンは単なる時間待ちループなので説明は省略する。最後のGOTO命令はジャンプで、ここではmainに飛べ、ということだ。ということで、これをアセンブル………ちょっとまった。GPIOって何?
データシートを見れば分かるが、命令にないTRISIOとかANSEL、GPIOは定義済みのレジスタ名だ。アセンブラではレジスタを文字列で表現したほうが分かりやすい。この文字列をどこで定義しているのかというと、冒頭のINCLUDE文で定義している(例えばGPIO EQU h'0005'となっている)。
プログラムでワーク用として必要な場合は先に書いた「COUNT1 EQU 20H」のように定義すればよい。これでCOUNT1と書くと20Hと書いたのと同じ意味になる。
RISC型プロセッサの場合、演算がおこなえるアキュムレータ(ワーキングレジスタとも言う)と多数の汎用レジスタがあり、限られた命令で処理をこなすことになる。
Copyright © ITmedia, Inc. All Rights Reserved.