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


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

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

[第74回]



●AM188CPUボード直結RS232CIF(2)

一般にRS232C通信と言う場合には非同期式または調歩同期式のシリアル通信のことを言います。
その通信ポートをAM188 User’s ManualではASYNCRONOUS SERIAL PORTとして説明しています。

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

送信(TXD)と受信(RXD)を独立して行なえるのでFull−duplexと書いてあります。
データ長は7ビットまたは8ビットでパリティビットを付加できます。
ストップビット長は1または2ビットです。
AM188内蔵のシリアルポートはRXDとTXDの2線のみでの通信ですから、タレ流し式になります。
ハードウェアフロー制御に必要なRTS、CTSなどの信号端子はありません。
それらが必要なら汎用のI/Oポートを使えばできるでしょう、と書いてあります。
Xon、Xoffによるソフトウェアフロー制御なら可能です。
ZB3BASIC、ZBK−V3BASICはソフトウェアフロー制御はしていません。

シリアルポートの割込みは要因別に依らず1種類のみです。
TYPE 14の割込みになります。

AM188内蔵のシリアルポートのためのレジスタは5個あります。
SPCT(アドレスFF80)は基本的な設定を行ないます。
SPSTS(アドレスFF82)は送受信の状態を示します。
SPTD(アドレスFF84)は送信データレジスタです。
SPRD(アドレスFF86)は受信データレジスタです。
SPBAUD(アドレスFF88)はボーレートを設定します。

SPCTの説明です。

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

TXIE 1のとき送信バッファエンプティ割込みを許可します。
RXIE 1のとき受信データレディ割込みを許可します。
LOOP 1のときループバックテストモードになります。TXDとRXDが内部で直結され、送信データが即受信データになります。
BRK 1のときTXDからブレーク信号を連続して送出します。送出する信号レベルは次のBRKVALで指定します。
BRKVAL 1のときブレーク出力はHになります。0のときブレーク出力はLになります。
      
SPCTの説明の続きです。

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

PMODE パリティビットを指定します。0Xのときパリティなしです。10のときは奇数パリティ、11のときは偶数パリティです。
WLGN データ長を指定します。0のとき7ビット長、1のとき8ビット長です。
STP ストップビット長を指定します。0のとき1ビット長、1のとき2ビット長です。
TMODE 1のとき送信を可能にします。0のとき送信は行なわれません。
RSIE 1のとき受信エラー割込みを許可します。
RMODE 1のとき受信を可能にします。0のときは受信は行なわれません。

SPSTSの説明です。

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

TEMT 1のとき送信バッファエンプティを示します。TXDから送信データが完全に送出されたときに1になります。
THRE 送信レジスタが空のときに1になります。送信データが送信レジスタから送信シフトレジスタに送られ、送信レジスタに次のデータを書き込めることを示しています。
RDR 1のとき受信データが読み出し可能であることを示します。
BRKI ブレーク信号を受信すると1になります。
FER 受信中にフレーミングエラーが発生すると1になります。フレーミングエラーは送信側と受信側で設定(ボーレート、データビット長、パリティ、ストップビット長)が異なるときに発生します。
PER 受信データのパリティが合わないときに1になります。
OER 受信データを読み出す速度よりも受信速度が速いときにオーバーランエラーになって、このビットが1になります。受信バッファは受信レジスタ+受信シフトレジスタの2レジスタ構成なので、データを読み出す前に2個のデータを受信し終わって、さらに次のデータが着信するとオーバーランになります。

SPTD(送信レジスタ)の説明です。

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

送信レジスタは16ビット長ですが下位8ビットしか使われません。
送信レジスタに書き込まれたデータはすぐに送信シフトレジスタに送られ、TXDからシリアル送出されます。
送信レジスタからデータが送信シフトレジスタに送られるとすぐに送信レジスタは書き込み可能になります(SPSTSのTHREが1になります)。
送信レジスタが空になる前にデータを書き込んでしまわないために、書き込み前にTHRE=1を確認すべきです。

SPRD(受信レジスタ)の説明です。

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

受信レジスタは16ビットですが下位8ビットしか使われません。
受信データが受信レジスタにセットされるとSPSTSのRDRが1になります。
受信データを正しく読み取るために、RDR=1を確認してからRDATAにアクセスするようにします。

SPBAUDの説明です。

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

ボーレートはCPUクロックから生成されるため、CPUクロックによって設定する値が異なります。

以上がとりあえずRS232C通信に必要なレジスタです。
実はこれだけでは足りないのですが、AM188のマニュアルはそこのところが実に舌足らずです(TXD、RXDと汎用I/Oとの端子の兼用をどうするのか?)。
それはともかくとして、SPCTのところにLOOPビットの設定がありますから、まずは手始めにこのビットを1にしてループテストをしてみました。
TXDとRXDが内部的に直結されるとありますから、兼用端子についてはとりあえず無視することにしました。
割込みも禁止です。

とりあえず作成したテストプログラムです。

2018/8/17  18:45  86rstst1.LST
[00001]                     ;;; 232C test1 loop test,not int
[00002]                     ;18/8/17
[00003]                     ;
[00004]                         ORG=8000
[00005]                         TBF=8100
[00006]                         RBF=8200
[00007]                     ;
[00008] 8000  BA80FF            MOV DX,FF80;SPCT
[00009] 8003  B81502            MOV AX,0215;LOOP,8NX1
[00010] 8006  EF                OUT DX,AX
[00011] 8007  BA88FF            MOV DX,FF88;SPBAUD
[00012] 800A  B88100            MOV AX,0081;9600(40MHz)
[00013] 800D  EF                OUT DX,AX
[00014] 800E  BE0081            MOV SI,TBF
[00015] 8011  BF0082            MOV DI,RBF
[00016]                     ;
[00017] 8014  BA82FF        LOOP:MOV DX,FF82
[00018] 8017  ED                IN AX,DX
[00019] 8018  A91000            TEST AX,10;read data?
[00020] 801B  7508              JNZ READ <8025>
[00021] 801D  A92000            TEST AX,20;write ok?
[00022] 8020  750F              JNZ WRITE <8031>
[00023] 8022  EBF090            JMP LOOP <8014>
[00024] 8025  BA86FF        READ:MOV DX,FF86
[00025] 8028  ED                IN AX,DX
[00026] 8029  8805              MOV [DI],AL
[00027] 802B  47                INC DI
[00028] 802C  3C0A              CMP AL,0A
[00029] 802E  75E4              JNZ LOOP <8014>
[00030] 8030  CB                RETF
[00031] 8031  BA84FF        WRITE:MOV DX,FF84
[00032] 8034  8A04              MOV AL,[SI]
[00033] 8036  46                INC SI
[00034] 8037  EF                OUT DX,AX
[00035] 8038  EBDA90            JMP LOOP <8014>
[00036]                     ;

LOOP         =8014  RBF          =8200  READ         =8025  TBF          =8100  
WRITE        =8031  

データを送信しつつ、受信データを受信バッファに書き込みます。
データの最後(0D0A)を受信したらシステムに戻ります(RETFの実行)。
RETFについては[第26回]を参照してください。

下は上のテストプログラムを実行したときのログです。

logfile nd80klog\08180852.txt open

ND80KL/86に接続しました
0001 0093 - z
0003 0339 - 
*** nd80kl/86(am188) basic ****
>/ld 86rstst1.com,8000
loading 86RSTST1.COM ...003b(59)bytes loaded,from 8000 to 803A
>cm 8100
8100 17-41
8101 38-42
8102 A8-43
8103 04-31
8104 AC-32
8105 35-33
8106 E2-34
8107 51-35
8108 E0-0d
8109 CC-0a
810A 2E-
>dm 8000,800f
8000  BA 80 FF B8 15 02 EF BA-88 FF B8 81 00 EF BE 00  コ..ク...コ..ク...セ.
>dm 8100,810f
8100  41 42 43 31 32 33 34 35-0D 0A 2E C8 C5 02 EF 27  ABC12345...ネナ..'
>dm 8200,820f
8200  F4 4D 94 6B 35 B2 96 05-1D CA 67 2B 19 6A 1B 84  .M.k5イ...ハg+.j..
>jp 8000
>dm 8200,820f
8200  41 42 43 31 32 33 34 35-0D 0A 67 2B 19 6A 1B 84  ABC12345..g+.j..
>

送信用データバッファ(アドレス8100〜)にテストデータとしてABC12345を書き、最後にエンドマークとして0D0Aを書きました。
受信データはアドレス8200〜に書き込まれます。
プログラム実行前に8100〜と8200〜をDMコマンドで確認してからJP 8000を実行しました。
実行後に8200〜をDMコマンドで確認しました。
正しく送受信が行なわれたことが確認できました。
とりあえずここまではテストOKです。

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

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