AVRのI/Oポートを拡張

I/Oポートの少ないAVRマイコンを使っていてAVRのI/Oポート数よりも多くの入出力が
必要になるときがあります。そんなときにデコーダーの74HC138をI/Oセレクタに使って、
入力に74HC244、出力に74HC273を使って入出力I/Oポートを増設することができます。
Tiny2313を使った場合、以下のような回路になります。

イメージ 1


ポートBを入出力のデータポートとして、ポートDの上位3ビットをI/Oセレクタのアドレスに
使います。この回路図では、アドレス0x10が、入力ポートに、アドレス0x20が出力ポートに
なります。
ここで、アドレス0x00は、特殊なアドレスになり使用しないので、74HC138のY0は、使いません。
この回路では、入出力1ポートづつですが、最大で、7本のI/Oポートを増設できます。

AVRのプログラムは、アドレスを指定して、ポートDの入出力の方向を切り替えてポートを
読み書きします。この回路では、アドレス0x10を指定すれば、74HC244からデータを入力。
アドレス0x20を指定すれば74HC273からデータが出力されます。
データの入出力は、高速なので、プログラムは、C言語よりもアセンブラが向いています。
C言語でプログラムを作る場合は、入出力のサブルーチンをインラインアセンブラで組むと
処理が速くなります。

AVRのアセンブラによるプログラムは、以下のような感じになります。
ここでは、データの入出力は、ポート単位で行っていますが、ビット単位でも可能です。

;//////////////////////////////////////////////////////////

データ出力の例
outPORTB,tmp     ;ポートBの出力設定
rcallioout

データ入力の例
rcallioin
intmp,PORTB     ;ポートBからデータを入力

;//////////////////////////////////////////////////////////

ioout:               ;出力 HC273
pushtmp
sertmp
outDDRB,tmp       ;ポートBを出力
cbiPORTD,5       ;L
rcallioexit
poptmp
ret

ioin:                ;入力1 HC244
pushtmp
clrtmp
outDDRB,tmp       ;ポートBを入力
sbiPORTD,4       ;H
cbiPORTD,5       ;L
cbiPORTD,6       ;L
nop
poptmp
ret

ioexit:
cbiPORTD,4       ;L
sbiPORTD,5       ;H
cbiPORTD,6       ;L
ret

;//////////////////////////////////////////////////////////

この回路では、AVRのデータポートの入出力を切り替えているので、常時入力の状態を監視
しているとか、常時パルスなどを出力するような用途では使えませんが、入力のSWの状態を
監視して、それに応じた出力するなどの用途に使えます。
このI/O回路は、Z80の入出力I/Oポート回路そのものですが、結構汎用性があります。
スポンサーサイト



[ 2010/05/30 03:47 ] 電子工作 | TB(0) | CM(0)

コメントの投稿













管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
https://ngc4826.fc2.net/tb.php/69-2c365745