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


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

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

[第99回]



●ストップウォッチプログラム

前回はND80KL/86(AM188版)のサンプルプログラムとして電子オルガンプログラムを作成しました。
電子オルガンプログラムは8086マシン語プログラムのサンプルであるとともに、モニタプログラムのキー入力サブルーチンをコールするサンプルにもなると思います。
それとは別にLED表示のサンプルプログラムもあるとよいと考えました。
8086のマシン語プログラムは前回書きましたように、8080やZ80とは違ってソフトウェアで正確なタイマーを作ることができません。
AM188はタイマー回路を内蔵しています。
それを利用すれば正確なタイマールーチンを作ることができそうです。
2つ目のサンプルプログラムとして、キー入力とLED表示と内蔵タイマーの利用と三拍子揃ったストップウォッチプログラムを作ってみることにしました。

そういうことになりますと、まずはAM188の内蔵タイマーについて説明しないわけにはいきません。
AM188は16ビットのタイマー・カウンタを3個内蔵しています。
Timer 0、Timer 1、Timer 2の3個です。
いずれも16bitのタイマーです。
Timer 0とTimer 1はほぼ同じ機能ですが、Timer 2は少し機能が異なっています。
今回はそのうちのTimer 0を使うことにしました。

AM188の内蔵カウンタはカウントアップカウンタです。
値を設定してスタートすることもできます。
普通はタイマーとして使う場合には設定値からダウンカウントしているものが多いように思うのですが、AM188の内蔵カウンタはカウントの上限値を設定できるMaxcount Compareレジスタを2個(Timer 2は1個)もっていて、カウント値とMaxcount Compareレジスタの値を比較することで必要な時間のタイマーが得られる仕組みになっています。
Timer 0とTimer 1には外部入出力端子がありますがTimer 2にはありません。
Timer 0とTimer 1は設定によって外部入力パルスか内部クロックのいずれかをカウントしますがTimer 2は内部クロックのカウントのみを行ないます。
Timer 2はTimer 0、Timer 1のプリスケーラとして使うこともできます。


[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual

各タイマーは機能動作を設定するためのモード/コントロールレジスタをもっています。
Timer 0用のT0CON(I/OアドレスFF56)、Timer 1用のT1CON(I/OアドレスFF5E)、Timer 2用のT2CON(I/OアドレスFF66)です。
Timer本体はそれぞれT0CNT(FF50)、T1CNT(FF58)、T2CNT(FF60)と名付けられています。
Maxcount CompareレジスタはTimer 0用はT0CMPA(FF52)とT0CMPB(FF54)の2個です。
Timer 1用はT1CMPA(FF5A)とT1CMPB(FF5C)の2個です。
Timer 2用はT2CMPA(FF62)です。

Timer 0とTimer 1のモード/コントロールレジスタの説明です。

Bit15はイネーブルビット(EN)です。
ここを1にするとタイマーが有効になります。
0のときは働きません。
このビットは単独では設定できません。
Bit14のINHビットと一緒に設定します。
Bit14(INH)はENビットを書き込むためのWR信号として使われます。
INH=1でEN=1のときEN=1になり、INH=1、EN=0のときEN=0になりますが、INH=0のときはENビットは変更できません。
Bit13(INT)はインタラプトを設定します。
INT=1のときカウント値がMaxcountレジスタの値に達すると割込みが発生します。
INT=0のときは割込みは発生しません。
Bit12(RIU)はMaxcount CompareレジスタのAかBを選択するビットです。
Aレジスタを使うときはこのビットを0にします。
Bレジスタを使うときはこのビットを1にします。
BIt5(MC)はカウント値がMaxcount Compare Aの値かBの値に達したときに1になります。
このビットは割込みが設定されているかどうかに関係なく1になります。
割込みを使わない場合、プログラムでこのビットが1になるのを確認することで所定の時間に達したことを知ることができます。
余程正確なタイマーが必要な場合でなければ割り込みを使わないで、このビットを監視する方法の方がプログラムが簡単になります。
その目的のためにはこのビットをクリアしてからタイマーをスタートさせます。
Bit4(RTG)は内部クロックをカウントするモードのとき(このあとで説明するEXTビット=0のとき)に外部入力でタイマーをクリアするためのビットです。
RTG=1のときは、外部入力端子TMRIN0またはTMRIN1が0から1になる立ち上がりエッジでTimer 0またはTimer 1がリセットされます。
RTG=0のときは、外部入力端子TMRIN0またはTMRIN1が1のときにTimer 0またはTimer 1がカウント動作をし、0のときはカウント値がホールドされます。
Bit3(P)はプリスケーラとしてTimer 2を使う場合に1にします。
0のときはTimer 0またはTimer 1は4システムクロックごとにカウントアップします。
このビットはEXT=1のときは無視されます。

説明の途中ですが本日は時間がなくなってしまいました。
次回に続きます。

16ビットマイコンボードの製作[第99回]
2018.10.16upload

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