16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第53回]
●AM188EMのCLOCK(3)
前回はAM188の初期設定のところで、ROM、RAMのアクセスにWaitを挿入する設定になっていることを忘れていたために、テストプログラムの実行時間が計算した値より大幅に遅くなってしまい、ちょうどそれが外付けした水晶の周波数の1/2がCPUクロックになっているかのような値となっていた、というお粗末な顛末について書きました。
それでWaitを外してあらためてテストをしたところ、実行時間がかなり短縮されて、Lの期間が10μs、Hの期間が12μsほどになりました。
かなり計算値に近づいたのですが、それでも計算ではLが約7.6μsでHが約8.5μsのはずですから、まだ何かおかしいです。
ひょっとするとAM188はデータバスが8ビットですが本来の8086(AM186)はデータバスが16ビットのはず。
それがからんでいるのでは?
というところまで書いて前回は終わりました。
それについて、あらためて確認してみました。
結論から言いますと、確かにAM188とAM186とでは命令によってクロック数が異なっているものもありますが、かなりの命令で同じクロック数になっています。
計算の根拠になった命令のクロック数に間違いはありませんでした。
うう。
忙しいのですけれど。
もうこの辺でとりあえずAM188については区切りをつけて、早くKL5C80A12版も仕上げてしまって、はやく製品として仕上げてしまいたいのですけれど。
どうにも気になって、このままにはしておけないのですよねえ。
困った性分です。
さてどうするか。
まず考えたのは、Waitは0にしたはずだけれど、ひょっとしてどこかにまだ何か設定があって、システムが別に1クロックのWaitをかけているのではないか、という疑いです。
それでAM188のUser’s Manualをあらためて読んでみたのですけれど、そんなことはどこにも書いてありません。
こうなると、やっぱり自分の目で何が起きているのか確かめてみるしかありません。
オシロスコープで波形を観測してみるしかありませんでしょう。
そうするには、タイマーサブルーチンが邪魔になります。
タイマーサブルーチンを外して、もう少し出力パルス間隔を狭めないと、原因究明のためのオシロでの観測がやりづらいです。
最初はタイマーサブルーチンのコールそのものを外したのですが、これはうまくいきませんでした。
82C55からのパルス出力間隔が短くなりすぎて、正しい出力が得られませんでした。
結局もとのテストプログラムを次の2通りのように手直しして、それぞれ実行してみました。
下がもとのプログラムです。
2018/7/1 7:226 86cktst.LST [00001] ;;; clock test for am188 [00002] ; [00003] ORG=8000 [00004] ; [00005] 8000 B080 MOV AL,80 [00006] 8002 E683 OUT 83,AL [00007] 8004 32C0 LOOP:XOR AL,AL;3 [00008] 8006 E680 OUT 80,AL;9 +1.5us [00009] 8008 E80C00 CALL T5US;7us <8017> [00010] 800B FEC8 DEC AL;3 [00011] 800D E680 OUT 80,AL;9 +0.6us [00012] 800F E80500 CALL T5US;7us <8017> [00013] 8012 FEC0 INC AL;3 [00014] 8014 EBEE90 JMP LOOP;14 <8004> [00015] ; [00016] ;5us timer clock 20MHz [00017] 8017 B106 T5US:MOV CL,06 [00018] 8019 FEC9 T5US2:DEC CL;3 [00019] 801B 75FC JNZ T5US2;13,,,16*6=96 0.05*100=5us <8019> [00020] 801D C3 RET;20 CALL=19,,,0.05+140=7us [00021] ; [00022] ;END LOOP =8004 T5US =8017 T5US2 =8019 |
第1のプログラムはアドレス8018の06を01に変更しました。
この場合にはDEC CLで0になりますから、JNZがスルーされる形でリターンします。
第2のプログラムは8017をC3(RET)にしました。
この場合には、サブルーチンとしては何もしないですぐにリターンしてしまいます。
第1のプログラムの実行結果です。
Lが4.8μs、Hが6μsぐらいになりました。
Lの期間を倍のレンジで見てみました。
やっぱり4.8μsぐらいですね。
Hの期間も確認してみました。
こちらは5.8μsぐらいに見えます。
第2のプログラムの実行結果です。
Lが3.4μs、Hが4.5μsぐらいです。
ここでおかしいことに気が付きました。
第1のプログラムと第2のプログラムとの実行時間の差はL、Hとも1.3〜1.4μsです。
いや。
それはおかしいでしょう。
ちょっと差がつき過ぎです。
第1のプログラムはMOV CL,01(3クロック)、DEC CL(3クロック)、JNZ LOOP(4クロック)でRETしますから、第2のプログラムとの差は3+3+4=10クロック(0.5μs)のはずです。
確かにおかしい!
さてはやっぱり内緒のWaitが入っている?
下はMEMRDとCLKOUTAの波形です。
MEMRDは約2クロックです。
ううむ。
AM188のデータシートと一致していますねえ。
Waitが入るならT3のタイミングですから、やっぱりWaitは入っていないようです。
うむむ。
わけがわからん。
それならば。
ということでRAMのCS端子も確認してみたのですが、この波形では何もわかりません。
オシロスコープでCSを観測中の写真です。
さて、どうするか。
こうなったら、やっぱりあれでしょう。
あれしかありません。
カメレオンロジアナの出番です。
次回に続きます。
16ビットマイコンボードの製作[第53回]
2018.7.11upload
前へ
次へ
ホームページトップへ戻る