AVR 超入門 NO.6

[Previous] [Next] [Index]
ATtiny15L を使って入力を扱う簡単なプログラム
 今回は ATtiny15L に入力されたパルスを反転して出力するプログラムを作ってみる。ロジック IC で言う NOT 回路である。ということで実用にはならないが勉強のステップとしてプログラムを組んでみるのも無駄ではない。

 AVR に入力する方法にはいろいろあるが、せっかくだから今後に生かせるように赤外線受光素子の出力を AVR の入力としてみることにした。赤外線受光素子の出力は負論理なので、反転して正論理の出力に変換してみる。

今回のテストプログラム(テキスト形式)

 今回初めて入力の設定を行うが、 AVR には I/O ポート個別に内部でプルアップができるようになっている。 PIC(PIC12F629) ではポート全体をプルアップするかしないかの選択しかできなかった。

 今回の赤外線受光素子は出力段にトランジスタが使われていて、 20kohm 程度の抵抗で電源にプルアップされている。従って本来なら AVR 内部でプルアップする必要はないが、スイッチなどを使って GND に落とすような場合には、内部プルアップを有効にすると外付け抵抗が必要がないので便利である。内部プルアップ抵抗値はデーターシートによると 35-112kohm と記されてる。

 今回は入力を PB3(3PIN) として内部でプルアップし、残りの PB0,PB1,PB2,PB4 を出力に設定してみた。 PB5 だけは他の I/O ポートと違ってオープンドレインなので入出力として使うにはちょっと工夫がいるようだ。

	ldi	temp,0b00110111	;PB3のみ入力設定    			(1step)
	out	DDRB,temp  	;DDRB(Data Drection Register, Port B)	(1step)
	ldi	temp,0b00001000	;                  		    	(1step)
	out	PORTB,temp  	;PB3を内部ブルアップ			(1step)
 個別に内部でプルアップができることを考えると AVR の方が優れているように思えるが、プルアップされた状態で出力にすると、ポート出力が Low の時に内部のプルアップ抵抗を通じて電流が流れてしまう。 PIC12F629 ではすべてのポートを内部でプルアップしておいても出力として使われるポートは内部で自動的にプルアップが解除されるようになっている。果たしてどちらの方がいいのだろう。

 ここまで勉強してきて AVR ポートの入出力電流について調べてみた。 AVR 超入門 NO.3 でも書いたが、データシートの電気特性のところに、電源電圧 5V 時のシンク電流が 20mA 時の L レベル出力電圧と、ソース電流つまり AVR 内部から外部に取り出す電流が 3mA 時の H レベル出力電圧が記されていた。これは明らかにシンク電流よりソース電流の方が遙かに少ないことを示している。電源電圧が 3V の時ではシンク電流で 10mA、ソース電流で 1.5mA とさらに少ない。無理すればもう少し流せそうだが、ポートの電圧ドロップが大きくなるはず。これではマグネットアクチュエータを直接ドライブするのは無理かもしれない。後日実際にテストで確認してみたいと思う。

 さて入出力プログラムに本題を戻そう。負論理入力の立ち下がりで立ち上がり出力とし、立ち上がりで立ち下がり出力とすればいい。

loop:	in	temp,PINB  	;PB3の入力をチェック
	sbrc	temp,3		;Skip if Bit in Register is Cleared
	rjmp	out_l		;つまりPB3の入力が0ならスキップ1ならout_lへ

out_h:	ldi	temp,0b00010111	;$17としても0x17としてもよい
	out	PORTB,temp	;PB0,PB1,PB2,PB4に1を出力
	rjmp	loop

out_l:	ldi	temp,0		;ここはclr tempとしてもldi temp, 0b00000000としてもよい
				;ldi temp, 0x00 としてもかまわない
	out	PORTB,temp	;PB0,PB1,PB2,PB4に0を出力
	rjmp	loop

[Previous] [Next] [Index]
2003/09/13
2003/09/15 update (PB5 を電源に接続)