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


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第51回]



●AM188EMのCLOCK

マイコン独立化セットでは8pinのRTC(Real Time Clock)、DS1307を使って、ZB3BASICにDATE$、TIME$を実装しました。
ND80Z3.5、ND8080、MYCPU80、MYCPU80Bでは、独立化セット、新独立化セットに接続した場合に使えるオプション機能です。
ND80KL/86では本体ボード上にDS1307を実装しますので、DATE$、TIME$は標準仕様になります。
このところ作成作業をしています86版BASICはZ80版ZB3BASICをもとにしていますがDATE$、TIME$の部分は後回しにしてきましたので、まだ実際に組み込んではいませんでした。
86版BASICの作成作業も終わりに近づいてきて、浮動小数点計算プログラムのデバッグも一通り完了して、ほぼ最終的なROMを作成する局面になりました。
それでこのあたりでDATE$、TIME$を組み込むことにしました。

といっても基本的なプログラムはすでにZ80、8080用として作成済みですので、今まで行なってきたように、Z80版のプログラムを8086用に書き直せはよいだけなのですが、ただ一箇所、DS1307とデータの送受信をするところだけは、通信のクロックをソフトウェアで作り出しているために、その部分だけはAM188用に作る必要があります。
そのクロックにはソフトウェアで5μsのタイマーサブルーチンを作ってそれを利用します。

ND80KL/86用に実装を予定しているAM188CPUはずっと昔に入手して使わないままになっていたAMDのAM188EM−40KCです。
CPUクロックは最高40MHzですが、それはいくらなんでも高速すぎて、メモリが追いつきません。
コストの問題もあるので、KL5C80A12と同じ20MHzでいくつもりです。
20MHzを予定しているのには別の理由もあります。
とりあえずは販売を予定しているND80KL/86キットには昔に入手したAM188EM−40KCを使うつもりです。
どれだけ売れるかはわかりませんが、いずれそのうち在庫がなくなってしまったら補充をしなければなりません。
ところがKL5C80A12と同様、AM188もすでに生産中止になっています。
インターネットで検索するとまだ入手は可能のようですが、ただ40MHzはちょっと見当たらないようです。
多いのはVCC=3.3Vのタイプなのですが、そちらは最高クロックが25MHzなのです。
そういう理由もあって、AM188のクロックは20MHzを予定しています。

ソフトウェアで5μsを作るには命令を組み合わせてサブルーチンを作り、そのサブルーチンの実行時間が5μsになるようにします。
今回のDS1307用のクロックは5μs以上あればよいので、多少それより長い時間のサブルーチンになっても問題はありません。
組み合わせて使う命令の実行クロックはAM188のマニュアルに記載されています。
その資料を参考にしてテストプログラムを作りました。
まずはテストをしてそれでよいかどうかを確認してみようと思ったからです。
テストをして確かめる簡単な方法は、そのクロックサブルーチンをコールしながらND80KL/86ボードに搭載している82C55からパルスを出力して、それをオシロスコープで観測するという方法です。
作成したテストプログラムを下に示します。

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  

後で気が付いたのですがアドレス8012のINC ALは余計でした。
サブルーチンのループ部分は5μsですが、それにCALLとRETの実行時間を加えると7μsになります。
ま、このくらいはあってもよろしいでしょう。
そのほかにOUT命令やJMP命令の実行時間もかかりますから、それらを含めた出力パルスの幅は計算ではLが約7.6μsでHが約8.5μsのはずです。

オシロスコープで出力波形を観測してみました。

あれえ?
おかしいじゃありませんか。
Lが約16μs、Hは約18μsもあります。
倍の時間がかかっています。
ということはCPUクロックが20MHzではなくて10MHz???

いやいやいや、それはありえませんでしょう。
AM188EMのDatasheetです。

このドキュメントにはPRELIMINARYと明記されていますが、正規のUser’s Manualでもここに記載されているのと同じ内容のことが書かれていますから、ことCPUクロックについては、この文書を参考にしても問題はないはずです。
で。
このドキュメントの左側中ほどを読みますと、
remove the requirement for a 2x clock input
とあります。
その下には、
(内蔵の)PLLによってCPUクロックは入力クロックと同じにできる、と書いてあります。

こちらにはもっとはっきりと、露骨に明記してあります。


Phase−Locked Loop(PLL)のところを読むと、
(インテルの)80C186/188はCPUクロックの2倍の周波数の水晶が必要だが、内蔵のPLLによってAm188EMは外付け水晶と同じ周波数の内部クロックを作り出す(ことが出来る)。
とあります。
本家よりも技術は上なんだぞと言わんばかりの解説文であります。

おかしいじゃないの。
そういうことならば、20MHzの水晶を外付けしたのだから、CPUクロックも20MHzにならなければならないはず。

ひょっとしたら外付けした20MHzクリスタルとの相性とかなにかがあるのかも。
そこで秋月から48MHzと32MHzの水晶を取り寄せて、試してみました。
こんな感じでかなりいい加減なテストです。

ひょっとすると水晶周りのコンデンサも何か関係しているかも、と思ってコンデンサは外しました。
48MHzですものね。
ま、浮遊容量だけでもそこそこ利くのではありませんか。

48MHz水晶でテストしてみた結果は。

Lが約6.8μsでHが約7.4μsです。
この数字をもとに逆算するとCPUクロックは23MHzほど。
やっぱり1/2じゃありませんか。

せっかく入手しましたので32MHz水晶でも試してみました。

Lが10μsでHが10.2μsほどです。
逆算するとCPUクロックは約16MHzほどです。
やっぱり1/2です。

こんな説明もあります。

間にはパワーセーブするための周波数分周回路もはさんでいますが、その回路はデフォルトではOFFになっていることを確認済みです。
するとPLLを通した内部クロックと同じ周波数のパルスがCLKOUTAから出力される、ということになります。

それじゃあということで、48MHz水晶を実装した状態でCLKOUTAを測定してみました。

48MHzの1周期は約21nsですから、CLKOUTAからは48MHzがちゃんと出力されていることになります。
これはもう全然辻褄が合いません。

AM188EMのクロックには別の設定もあります。
リセット/パワーオン時にCLKDIV2端子にLを入力すると、内部PLLが無効になって、CPUクロックは外付け水晶の1/2になる、とのこと。
ひょっとしてそいつが利いているのかも。
48MHz水晶のままで、CLKDIV2端子をLにしておいてリセットしたあと、上と同じテストをしてみました。
すると。

Lが約13.5μs、Hは15μsほどになりました。
これは上でテストした48MHzの周期の約2倍ですから、CLKDIV2端子はここではじめて利いていることになります。
つまりCLKDIV2にLを入力しない通常のリセットなら、本来ならPLLが利いているはず、ということになります。
このときのCLKOUTA端子も測定してみました。

こちらの出力はかなり波形がひずんでいますが、周期は約42μsですから、48MHzの1/2の24MHzが出力されています。
うーん。
こういうことになると、なんだかよくわかりませんが、PLLはちゃんと働いていて(いや、まともには働いていない?)、CPUクロックは外付け水晶と同じ周波数になるのだけれど、それにもかかわらずCPUはその1/2のクロックで動作する、ということになります。
なんだかなあ、という感じであります。
結局のところ、AM188EMを20MHzで動作させるためには、40MHzのクリスタルが必要なようです。

なんだ、それじゃインテルの80C188と同じじゃないか、AMDさんよ。
[2018.7.9訂正]
私のミスでした。
次回[第52回]を参照願います。
[訂正ここまで]

仕方がありませんから、40MHz水晶を取り寄せることにいたしました。
え?
48MHz水晶でもいいじゃないか。
ですか?
でもねえ。
CLKOUTAからはちゃんと48MHzが出力されていますでしょ。
AM188EM−40の最高周波数は40MHzですから、どういう理由かわかりませんけれど内部クロックが24MHzだからといって、それでも40MHzを越える水晶を外付けするというのは、ねえ。
ちょいと心配ですから、ここはやっぱり40MHz水晶ということにしておきましょう。

16ビットマイコンボードの製作[第51回]
2018.7.7upload
2018.7.9訂正

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