2008年11月24日

PIC12F629でLEDちかちか

今度は自作のプログラムをPICチップに書き込んでみます。

PICチップとしてはPICKit2のデモボードについてきたPIC16F690ではなく、PIC12F629という小さめ(ピン数が8個)で機能が少ないものを使います。

これはPIC12F629が私が買ったPIC本で使われていたという理由ですが、何事も初めは単純なものから始めたほうがいいような気がします。

まずはデモボードのICソケットからPIC16F690をとりはずさなければいけません。ICソケットには取り外すという行為にたいするアフォーダンスがまったくないので、どうやって外したらいいか最初よくわかりませんでしたが(指では取れません)、マイナスドライバを差し込んで交互に持ち上げればいいようです。



次にPIC12F629を取り付けます。

20081124PIC12F629取り付け.png

ここで注意したいのはPICの向きです。PICの表面には窪みがあり、ここでは窪みのあるほうを上にします。逆向きに取り付けてしまうとPICkit2 Programmerアプリケーションで認識できず、「VPP voltage level error」といわれてしまいます。

次にPICに書き込むプログラムを作ります。MPLAB IDEを開いて、

1. Project -> Project Wizard
2. Step Oneで「Device」として「PIC12F629」を選択
3. Step Twoはそのまま
4. Step Threeで「Create New Project File」にプロジェクトファイルを作るパスを指定。
今回は「C:\pic\pic12f629_led\pic12f629_led」としました。スペースを含まないパスにすべきようです。
5. Step Fourはそのまま
6. View -> Project でプロジェクトのウィンドウを表示
7. File -> Add New File to Project で pic12f629_led.asm として新規ファイルを追加

このpic12f629_led.asmにプログラムを書き込みます。プログラムの先頭には以下のように書きます。

	list		p=12f629
#include <p12f629.inc>

__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT


この辺は細かく理解していませんが、入門書から借用しました。

続けて以下のように書きます。

COUNTER1	EQU	0x20
COUNTER2 EQU 0x21


これはCOUNTER1とCOUNTER2という2つの変数(1バイト)を定義し、0x20番地と0x21番地を使うということを定義します。他にもcblock 0x20とendcで囲む書き方もあるようです(PICKit2のサンプルプログラムではそうしている)。PIC12F629では0x20番地から64バイトがメモリとして使えます(ファイルレジスタと呼ばれる)。

続けてプログラム本体の開始です。

		ORG		0x000


ORGは後続のプログラムがプログラム領域のどの番地に展開されるかを指定します。
プログラムは0x000番地から開始するので0x000と指定します。

続けてPICの初期設定です。

		bsf		STATUS,RP0	;bank=1
call 0x3ff ;較正データをWに入れる
movwf OSCCAL ;それをOSCCALレジスタに入れる
bcf STATUS,RP0 ;bank=0


これはPICには出荷時にプログラムの最終番地(PIC12F629では0x3ff)にクロック補正用のデータが記録されており、それをOSCALレジスタというところに入れて上げないといけないことになっています。他に書きようがないのでこの塊でいつも流用するようにすればいいのでしょう。

		clrf	INTCON


これは割り込みを使わないという設定です。今回は使いません。

		movlw	0x07
movwf CMCON


コンパレータという機能を使わないという設定です。今回は使いません。

		bsf		STATUS,RP0
bcf TRISIO,0 ;GPIO 0=output
bcf STATUS,RP0


これはPIC12F629のピンのうち、GPIO 0を出力用に指定しています。GPIO 0というのは窪みを上に向けたときの右列の上から2番目のピンです。この先にLEDがつながります。

以上で初期設定が終わりです。ここからLEDをちかちかさせる箇所になります。

LOOP
bsf GPIO,0 ;点灯
call WAIT
bcf GPIO,0 ;消灯
call WAIT
goto LOOP


「bsf GPIO,0」がピンGPIO 0をオンにする命令で、「bcf GPIO,0」がオフにする命令です。
ウェイトをいれつつそれをぐるぐるループさせます。ウェイト処理自体はWAITというサブルーチンで行います。以下がそのWAITルーチンです。


WAIT
movlw d'200'
movwf COUNTER1
WAIT_LOOP
call WAIT_SUB
decfsz COUNTER1,f
goto WAIT_LOOP
return

WAIT_SUB
movlw d'200'
movwf COUNTER2
WAIT_SUB_LOOP
nop
nop
decfsz COUNTER2,f
goto WAIT_SUB_LOOP
return


WAITサブルーチンの最初でCOUNTER1に200という値をいれます。movlwでWレジスタに値をいれ、さらにmovwfでファイルレジスタのCOUNTER1に入れます。PICアセンブラでファイルレジスタに値を入れるには常にこのような回りくどい操作が必要になります。

WAIT_LOOP内の処理ではWAIT_SUBを呼びつつdecfszでCOUNTER1の値を減らしていきます。通常はcall,decfsz,gotoのループを繰り返していきますが、COUNTER1がゼロになるとdecfszの次の命令=gotoがスキップされ、サブルーチンからリターンします。

つまりWAITサブルーチンの処理は「WAIT_SUBを繰り返し200回呼ぶ」ということになります。

WAIT_SUBサブルーチンの処理は殆ど同型ですが、callの代わりに何もしないnop命令を使っています。なぜこのような2重ループを作るのかというと、ウェイト処理として長い時間をとりたいのですが、カウンタが1バイト(0〜255)しか取れないため、ループ1個だとウェイトの長さに限界があるためです。

ところで実際このループによりどのくらいの遅延ができるのでしょうか。ここで用いられている命令の1命令あたりのサイクル数は以下の通りです。

movlw(1), movwf(1), call(2), decfsz(1 or 2), goto(2), return(2)

decfszはスキップしないときは1サイクル、するときは2サイクル消費します。

WAIT_SUB_LOOP内の処理はループしている間は(1+1+1+2)*199で、ループを抜けるときは(1+1+2)です。これにWAIT_SUBの前(1+1)と後(2)の命令を加算すると、1003サイクルです。

PIC12F629の内蔵クロックは4MHzで動作しますが、このとき1サイクル(4クロック)あたり1マイクロ秒消費しますので1003サイクルは1.003ミリ秒になります。

WAIT_LOOPではcall(2)+WAIT_SUB(1003)+decfsz(1)+goto(2)=1008サイクルが199回分とcall(2)+WAIT_SUB(1003)+decfsz(2)=1007サイクルが1つで201599サイクルです。これに前後の4サイクルを足すと、201603で、201.603ミリ秒の遅延を起こすことになります。

プログラムの最後にはENDと書きます。

		END


さて、このプログラムを書き込んだらブレッドボード上に配線します。

20081124配線.png

配線に使っている赤黒白のケーブルはジャンプワイヤと呼ばれるものです。サンハヤトのSPP-100という10本セットをマルツパーツ館WebShopで購入しました。

見えにくいのでインチキ図であらわすとこうです。

20081124配線図.gif

まずPICに対して電源を供給しなければいけませんが、それはPICのこの図でいうと左下のピンを電源のプラスに、左上のピンを電源のマイナスにつなぎます。

もう一つ「0.1μF」とある、写真では水色の部品は積層セラミックコンデンサです。これはPICの動作を安定させるための役割で取り付けます。こういうのをバイパスコンデンサ、略してパスコンというそうです。なくてもいいのかもしれませんが、とりあえず入門書に倣って取り付けました。0.1μFというのはコンデンサの容量をあらわすスペックです。

ピンの上列の左から2番目がGPIO 0です。この先には先ほど書いたとおり抵抗とLEDをつなぎ、その先はマイナスにつながるようにします。

さて電源をどうするか。PICは3V程度でも動くようなので単3電池x2ケースを取り付けて動かしてみましょう。



動作しました!

ところで電源を調達するもう一つの方法はPICKit2プログラマから電源を取るというものです。この場合、プログラマの右から2番目の端子がプラス、右から3番目がマイナスです。以下のようにワイヤを差し込むといいです。

20081124給電.png

電源供給の際はPICkit 2 Programmerアプリケーションを起動して「VDD PICkit2」の「On」にチェックを入れるのを忘れないようにしましょう。この方法を使うとアプリからの制御で2.5V〜5.0Vまでの電圧を供給することができます。

さて、LEDちかちかは単純なようですが、実は目標としている「PICでMIDI」から既にそう遠くないところまで来ています。LEDちかちかはPICからするとピンのON/OFFの制御でしかないのですが、MIDI信号の出力というのもPIC的にはピンのON/OFFの制御に他ならないからです。(その先にLEDがあるかMIDI端子があるかの違い)
posted by picmidi at 16:43| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。