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
前へ
次へ
ホームページトップへ戻る