AVR に入力する方法にはいろいろあるが、せっかくだから今後に生かせるように赤外線受光素子の出力を AVR の入力としてみることにした。赤外線受光素子の出力は負論理なので、反転して正論理の出力に変換してみる。
今回の赤外線受光素子は出力段にトランジスタが使われていて、 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
2003/09/13
2003/09/15 update (PB5 を電源に接続)