Z80からのI/O信号に対し、どのくらいでAVRによる割り込み反応が得られるのかを調査してみました。 回路は前回作ったものを使います。
PC-6001側からI/O命令を発行し、AVRの外部割込み入力をトリガにして反応を調べます。 まずは、主な信号線の様子。
ここで、INT0が活性化されている時間(A-B)は、630ns。
実行されているプログラムは以下のような感じです。
.org 1 rjmp INT_IN INT_IN: sbic PIND, 2 ; 割り込み終了だったらInputへ rjmp Input ; omit... Input: out DDRC, r18 out PORTC, r19 sbi PORTB, 4 reti
INT0は両トリガでの割り込みにしているのですが、 AVRの割り込みルーチンが反応するときには、INT0はHレベルになっているのか、常にInputルーチンへ飛びます。
上図にあるLEDという信号線は実際にはAVRのポートB4で、これがLからHになる(sbi PORTB, 4)まで2,040nsかかっています。 8MHzだと約16クロック分です。
割り込みへの反応速度を見るために、プログラムを少し変えてみました。
.org 1 rjmp INT_IN INT_IN: sbi PORTB, 4 ; omit...
割り込みがアクティブになってから、rjmpおよびsbiのみの実行です。 タイミングは以下のようになっています。
これで、LED(PORTB4)の変化までの反応時間は1,200nsでした。8MHzで9.6クロック分。 rjmpとsbiの実行時間4クロックを差し引くと、割り込みの反応に700ns(5.6クロック)ほどかかることになります。
ちなみに、割り込みをダウンエッジのみにして追試してみましたが、反応時間は1,160nsで、それほど大きな差はありませんでした。
これを、最初の図と照らし合わせると、INT0の活性化時間が700nsに満たないため、割り込みルーチン開始時にはどう足掻いてもI/Oには間に合わない、ということになります。
やはりどうしてもZ80とAVRの間にはラッチが必要ということになりますね。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!