標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第370回]

●誤動作しています?

MYCPU80キットをご購入いただいたYT様からメールをいただきました。
YT様は下記のブログでMYCPU80について、いろいろご紹介していただいています。
FIAT500と洗車の日々・・・(http://plaza.rakuten.co.jp/flyback/)

そのYT様から、プログラムの動作がおかしいので確認してほしい、というメールが届きました。
どうもRZ命令がおかしいようなのですが、それが組立の不具合によるものかどうか、調べてほしい、との依頼です。

プログラムがメールに添付してありました。
テストプログラムなどではなくて、かっちりと書いたしっかりしたプログラムです。
おかしいのは、そのプログラムの中で、


     JNZ AAA
     RZ
AAA:CALL BBB
という部分だと言われるのです。
このプログラムを実行すると、期待した通りの動作をするのですが、これを

     ;JNZ AAA
     RZ
AAA:CALL BBB

のように、JNZをコメント文にすると、おかしな動作をするということらしいのです。
私のMYCPU80で、試してみますと、YT様がメールにかかれているとおり、あとのようにしたプログラムを実行すると、暴走してしまいます!
んな、ばかな!

ちょっと信じられないことがおきています。
RZはZフラグが立っているときにリターンしますが、そうでないときには、次の命令を実行します。
その前にJNZを置いても、これは冗長なだけで、動作には変わりはないはずです。

YT様からのメールには、このJNZはRZの動作がおかしいので、それを確認するために入れたものです、と書いてありました。
うーん。確かにおかしい。
でもRZもテストしたはずですから、そんなおかしなことはないはずです。
念のために簡単なテストプログラムを書いて試してみますと、ちゃんと正常です。

じつは、メールに添付していただいたプログラムでは、このRZを含むサブルーチンは2回CALLされているのです。
ところが不思議なことに、最初のCALLでは全く異常は発生しないのに、2回目のCALLになると異常が発生するのです。
普通、そのような動作をするときは、たいていはプログラムに問題があることが多いものです。
プログラムのどこかがおかしい、はず。
と思って、何回も見なおしてみたのですが、特におかしいところはありません。

リターン命令ですから、スタックがおかしくなるのでは?
そのへんの動作を確認するために、プログラムに手を加えて、何ヶ所かトラップをしかけて確認してみることにしました。

ところが…。
トラップを素通りしてしまうのです。
これは、おかしい!
確かに、CPU回路で何かが起きている!

タイミングチャートを確認してみました。
RET命令のタイミングチャートはこちら([第98回])にあります。
クロックが4MHzのままで2MHzに直してありませんが、タイミングチャートそのものは直すところはありません。
どこといっておかしいところはないようです。
しかし、どこかにおかしいところがあるはずです。

ところがさらにテストをするためにあれこれプログラムに手を加えているうちに、さらにおかしいことがおきてきました。
突然、プログラムが正常に動作するようになってしまうのです。
プログラムの解析のために、あるプログラム部分を書き加えると正常動作をするようになり、それを外すとまた異常になってしまいます。
いろいろ試しているうちに、どうもRZ命令の置かれているアドレスが異常動作に関係しているように見えてきました。
たとえば、さきほどのJNZ命令を加えた部分で、JNZ AAAの代わりに、NOPを3回書いても、正常動作するのです!
でも、なぜ?

ひょっとすると、TK80回路のLED表示のためのDMA動作に関係があるのでは?
と考えました。
LED表示のDMA動作は、各命令のM1(T2、T3)のときに行われます。
LED表示のために強制的にRAMアドレスを外部で変更してしまい、LED表示バッファの内容をLEDに送る働きです。
RET命令(RZも同じ)は、その直後のM2(T4、T5)のときにメモリ(スタック)からPC(プログラムカウンタ)にリターン先アドレスを読み込みます。
DMAの動作がこのときに何かの影響を与えて、スタックから読み出したアドレスが変化してしまうのでは?(うわー、めっちゃおそろしい話!身の毛が総立ち!も、もうあかん。気分が悪くなってきた…)

こういうときは、頭から布団をかぶって寝てしまうに限ります。
で、そうしてしまいました。

翌朝、気を取り直して、再び追求を開始しましたところ。
あれ…?
直ってしまった…。
昨日のあれは、いったいなんだったのか…。
それこそ狐に化かされたような気分です。
これが、自分一人だけで経験したことでしたら、やっぱり、狐の仕業に違いない。ということでけりをつけてしまったかもしれません。

しかし、もとはYT様が経験されたことからはじまったことですから、してみると私が狐に化かされた、というわけではなさそうです。
仕方がありませんから、YT様にお詫びとお願いのメールをお送りしました。

こちらでは異常が発生しなくなってしまいました。
(YT様はロジアナをお持ちなのだそうですので)申し訳ありませんが、そちらで調べてみてくださいませんか?
疑っているのはDMAとスタックからの読み込みのタイミングです(そのあたりをロジアナで観測できれば、なにかがわかるのでは?)。

●異常の正体がみつかりました

翌日、YT様からメールが届きました。
犯人がみつかった、という知らせです。

犯人はDMAではありませんでした。
ロジアナでRZの動作を観測したところ、おかしなところにヒゲがある。というのです。
ロジアナで観測した波形も添付していただきました。

もういちどさきほどの、RET命令のタイミングチャート([第98回])を見てください。
RZ命令で、条件が成立しなかったとき、つまりZフラグが立たなかったときは、T4になると同時にMclr信号によってマシンクロックカウンタをクリアしてしまうので、それよりもうしろの動作は行われません。
の、はずなのですが。
ところがその後ろにある、regWRのmem to PCLのあたりにヒゲがある、のです。せいぜい10nsか20nsていどの幅の狭いヒゲなのですが…。

YT様がロジアナで観測されたポイントです。
下図は回路図bSの部分です。


図の左上、IC42(74HC32)のpin1、pin2、pin3が観測ポイントです。
さきほどのRET命令のタイミングチャート([第98回])と、RET命令の回路図([第98回])から、T4のときにregWRがLになり、そしてT4の後半(CLK2のLのとき)に、IC42のpin3がLになって、そのときにPCLregWRが出力されることがわかります。
しかし上でも書きましたようにRZで条件不成立のときには、T4でMclrが出力されるので、そこまでは進まないはずなのですが…。

お送りいただいたロジアナの波形は、このようになっていました。

このパルス波形と、回路図から見る限り、pin3の出力は「ありえない」ものです。
YT様は「regWRがなまっているか、IC42が異常なのでは?」と書いておられます。
で、「このヒゲはpin3とGND間に270pFコンデンサをつけて退治したところ、正常動作するようになりました」と解決策まで書いてくださいました。

この波形を見たとき、私は回路の設計ミスにやっと気がつきました。
なんという、おばかなことを…。
当然、こうなる可能性に、気がつくべきでした。
(次回に続きます)

2009.10.25upload

前へ
次へ
ホームページトップへ戻る