目次>9章 PIC18F1320編 (02)スイッチでLEDを点滅させる

スイッチでLEDを点滅させる

更新日2008.6.28

PIC18F1320の初回は、スイッチでLEDを点滅させると言うものです。
使用している命令は、PIC16のものに限定していますので、設定部分を変えればPIC16F84Aなどでも動作します。

実験回路

2つのLEDをRB0/RB1に接続し、RB4のスイッチでON/OFFさせます。

同じ18ピンPICでも、PIC16とはピン配置が異なりますので注意して下さい。

680Ωの抵抗3本は、300Ω〜1KΩの範囲であれば何でもOKです。
同様に100KΩの抵抗は、1KΩ〜500KΩ程度の範囲であればOKです。

RB4の680Ωは保護抵抗です。この抵抗無しで、誤ってRB4を出力モードにし、1をセットしてスイッチを押すとPICが壊れます。(たぶん)

クロックは、10MHzのセラミックレゾネータを使います。
(20MHzでも使えますが、新たに購入するのであれば10MHzも買っておいて下さい。理由は後のページで分かります。)

こちらは、ブレッドボードに組んだ状態です。
回路図に無いもの(右上の6ピンヘッダ周り)が有りますが、これはICSP(In-Circuit Serial Programming)用の回路です。
秋月のPICライタを使うのであれば不要です。

仕様

電源ON時は、RB0のLEDを点灯しRB1のLEDは消灯します。
スイッチを押すと、点灯状態を逆転し、スイッチを離すと元に戻すと言う動作です。

スイッチの状態RB4の状態RB0(LED)RB1(LED)
OFF
ON

プログラム

今回のプログラムは、以下のように非常に単純です。
PIC18で追加された命令は使っていませんので、PIC16F84Aなどでも若干の変更で動作できます。

	LIST	P=18F1320
	INCLUDE	P18F1320.INC

	__CONFIG  _CONFIG1H, _HS_OSC_1H

; ******** リセットベクタ *************************
	ORG	0x0000

	MOVLW	0xFC
	MOVWF	TRISB		;RB0,1:Output(LED)
	MOVLW	0x7F
	MOVWF	ADCON1		;A/D未使用

; ******** メイン処理 *****************************
main
	BTFSS	PORTB,RB4		;スイッチの状態チェック
	GOTO	main2
	BSF	PORTB,RB0
	BCF	PORTB,RB1
	GOTO	main
main2
	BCF	PORTB,RB0
	BSF	PORTB,RB1
	GOTO	main

	END
		
最初の3行はPICの機種に依存しますので、PIC16F84AとPIC16F88との違いなどと同様です。

このプログラムで注目する点は、TRISBやADCON1をバンク切り替えせずに使っている事です。これがPIC18の大きな利点の1つです。

また、使っている命令はPIC16でもそのまま使えます。このように、PIC16の命令はPIC18でもそのまま使えます。(RRF,RLFを除き)

PIC18の勧め(Vol.1)

その1. PIC16と命令の互換性がある
PIC18ファミリーはPIC16ファミリーよりも命令数が多いですが、下位互換があり、追加された命令を使わなければPIC16と同様に使えます。
ただし、RRF,RLF命令のみRRCF,RLCFに変更が必要です。

その2. バンク切り替えが不要
PIC18F1320の場合、GPR(汎用RAM)の使用を128バイトまでとすれば、SFR(特殊レジスタ)を含めバンク切り替えが不要で非常に使いやすくなっています。(ちなみに、PIC16F84AのGPRは68バイトです。)
このバンク切り替えは、PIC16F84A以外のPIC16を使っていると(特に割込みを使う場合)良く考えて設計しておく必要があります。 この考慮が不要と言うだけでもPIC18を使う価値があります。

尚、128バイトを超えてGPRを使う場合はバンクの意識が必要になります。