AVR Tiny2313をROMとして動作させられるかどうか、ここのところ試行しているわけですが。
どうも、20MHz動作でも必ずアクセスが成功するというわけではないようです。 ごく稀にですが、誤動作することがあります。
プログラムは以下のようになっています。
_loop: in ZL, PIND ;1 7bit lpm ;3 out PORTB, r0 ;1 rjmp _loop ;2
ここからアクセス時間が最長になってしまう状況を考えると、こうなります。 すなわち、in命令で得られたデータはまだアドレス確定前で、その直後にアドレス確定、次のinでようやく正しいアドレスが取得できる状況です。 すると、正しいデータが出るまでの最長のクロック数は、以下のようになります。
3(lpm)+1(out)+2(rjmp)+ 1(in)+3(lpm)+1(out) = 11 (clk)
これを20MHzで考えると、1clkあたり50nsなので、550nsということになります。 これは最悪の場合で、通常はここまでかからないのですが。 ただ、プログラムを読んでいるので、一回でも読み間違えれば当然のように誤動作します。
PC-6001で使われているROMのアクセスタイムは、以下のようになっています。
- BIOS(BASIC) ROM: uPD2364 Max. 450ns (2364-45)
- Character ROM: uPD2332 Max. 450ns (2332-45)
- UV-EPROM: uPD2732 Max. 450ns (互換品のHN462732のデータ)
やはりこの時代の製品は450nsあたりが最大のようで、550nsでは間に合わないことがあるようです。
上 記のプログラムではrjmpが無駄にクロックを消費しています。 rjmpがなければ最悪でも9clk = 450nsで動作してくれます。 そのため、in~outをたくさん並べれば誤動作の可能性は低くなります。 でもメモリは有限ですからいつかはrjmpで元に戻る必要があるため、絶対誤動作しないとは言い切れません。
誤動作といっても、ごく稀のことなのでこのまま行くか、信頼性を上げるために別の手を考えるか、悩ましいところです。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!