16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第75回]
●AM188CPUボード直結RS232CIF(3)
AM188のRXDとTXDは汎用入出力(PIO)と端子を兼用しています。
AM188の汎用入出力はPIO0〜PIO31の32本ありますが、その全てが何らかの別の機能の入出力と端子を兼用しています。
下がその兼用端子を示す表です。
[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual
TXDはPIO27と、RXDはPIO28と端子を兼用しています。
表右のpower on reset時の状態を見ると、どちらの端子もinput with pullupとなっています。
リセット後の初期状態ではTXDもRXDも選択されず、どちらもPIO入力に設定されています。
PIOと他の機能を兼用する端子をPIOとして使うか、他の機能端子として使うかを指定するために2つのレジスタが用意されています。
PIO MODE REGISTERSとPIO DIRECTION REGISTERSです。
まずはPIO MODE REGISTERSです。
PIO MODE 1 REGISTER、PIO MODE 0 REGISTERのそれぞれ16ビットのうちの1ビットに1本のPIOが割り当てられます。
下はPIO MODE REGISTERSの説明です。
[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual
PIO MODE REGISTERとPIO DIRECTION REGISTERの同じ位置のビットの組み合わせで4つの選択が行なわれます。
MODE=0、DIRECTION=0のとき、PIO以外の機能が選択されます。
MODE=0、DIRECTION=1のとき、内部プルアップ抵抗付きのPIO入力が選択されます。
MODE=1、DIRECTION=0のときPIO出力が選択されます。
MODE=1、DIRECTION=1のとき内部プルアップ抵抗なしのPIO入力が選択されます。
PIO MODE 0 REGISTER(アドレスFF70)のビット0にはPIO0が、ビット1にはPIO1が割り当てられ、そのようにしてビット15にはPIO15が割り当てられます。
PIO MODE 1 REGISTER(アドレスFF76))のビット0にはPIO16が、ビット1にはPIO17が割り当てられ、そのようにしてビット15にはPIO31が割り当てられます。
PIO MODE 0 REGISTER、PIO MODE 1 REGISTERのリセット後の初期値はともに0000です。
PIO DIRECTION REGISTERSの説明です。
[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual
PIO DIRECTION 0 REGISTER(アドレスFF72)のビット0にはPIO0が、ビット1にはPIO1が割り当てられ、そのようにしてビット15にはPIO15が割り当てられます。
PIO DIRECTION 1 REGISTER(アドレスFF78))のビット0にはPIO16が、ビット1にはPIO17が割り当てられ、そのようにしてビット15にはPIO31が割り当てられます。
PIO DIRECTION 0 REGISTERのリセット後の初期値はDC0Fです。
PIO DIRECTION 1 REGISTERのリセット後の初期値はFFFFです。
上の2つの説明から、端子にTXDとRXDを割り当てるにはPIO MODE 1 REGISTERのビット11、ビット12を0に、PIO DIRECTION 1 REGISTERのビット11とビット12も0にすればよいことがわかります。
PIO MODE 1 REGISTERのリセット後の初期値は0000ですから、このままで条件に合っています。
PIO DIRECTION 1 REGISTERのリセット後の初期値はFFFFですから、そのビット11とビット12を0にすれば、TXDとRXDが有効になるはずです。
今回の目的とは外れますが、PIO端子をPIO入力、またはPIO出力として使う場合についても説明をしておきます。
下がその説明です。
[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual
PIO MODE REGISTERS、PIO DIRECTION REGISTERSと同じ要領で扱うことができるデータレジスタが用意されています。
PIO DATA REGISTER 0(アドレスFF74)とPIO DATA REGISTER 1(アドレスFF7A)です。
PIO DATA REGISTER 0のビット0にはPIO0が、ビット1にはPIO1が割り当てられ、そのようにしてビット15にはPIO15が割り当てられます。
PIO DATA REGISTER 1のビット0にはPIO16が、ビット1にはPIO17が割り当てられ、そのようにしてビット15にはPIO31が割り当てられます。
リセット後の両レジスタの値は不定です。
出力に指定された端子には対応するビットの値が出力されます。
出力はオープンドレインなので、値が0のときはLが出力され、値が1のときはハイインピーダンスになります。
入力に指定されたビットには対応する端子からの入力値が書き込まれます。
以上のデータをもとにRS232C送受信テストプログラムを作成しました。
2018/8/19 15:48 86rstst2.LST [00001] ;;; 232C test2 not int/slave [00002] ;18/8/18 8/19 [00003] ; [00004] ORG=8000 [00005] TBF=8100 [00006] RBF=8200 [00007] ; [00008] 8000 BA80FF MOV DX,FF80;SPCT [00009] 8003 B81500 MOV AX,0015;8NX1 [00010] 8006 EF OUT DX,AX [00011] 8007 BA88FF MOV DX,FF88;SPBAUD [00012] 800A B84000 MOV AX,0040;9600(20MHz) [00013] 800D EF OUT DX,AX [00014] 800E BA78FF MOV DX,FF78;PDIR1 [00015] 8011 ED IN AX,DX [00016] 8012 25FFE7 AND AX,E7FF;RX,TX active [00017] 8015 EF OUT DX,AX [00018] 8016 BE0081 MOV SI,TBF [00019] 8019 BF0082 MOV DI,RBF [00020] ; [00021] 801C BA82FF READ:MOV DX,FF82 [00022] 801F ED IN AX,DX [00023] 8020 240F AND AL,0F [00024] 8022 752C JNZ ERR <8050> [00025] 8024 BA82FF MOV DX,FF82 [00026] 8027 ED IN AX,DX [00027] 8028 A91000 TEST AX,10;read data? [00028] 802B 74EF JZ READ <801C> [00029] 802D BA86FF MOV DX,FF86 [00030] 8030 ED IN AX,DX [00031] 8031 8805 MOV [DI],AL [00032] 8033 47 INC DI [00033] 8034 3C0A CMP AL,0A [00034] 8036 75E4 JNZ READ <801C> [00035] 8038 BF0082 MOV DI,RBF [00036] 803B BA82FF WRITE:MOV DX,FF82 [00037] 803E ED IN AX,DX [00038] 803F A92000 TEST AX,20;write ok? [00039] 8042 74F7 JZ WRITE <803B> [00040] 8044 BA84FF MOV DX,FF84 [00041] 8047 8A05 MOV AL,[DI] [00042] 8049 47 INC DI [00043] 804A EF OUT DX,AX [00044] 804B 3C0A CMP AL,0A [00045] 804D 75EC JNZ WRITE <803B> [00046] 804F CB RETF [00047] 8050 A20083 ERR:MOV [8300],AL [00048] 8053 CB RETF [00049] ; ERR =8050 RBF =8200 READ =801C TBF =8100 WRITE =803B |
送信、受信とも割込みは使いません。
必要な設定のあとは受信のみ行ないます。
受信したデータを受信バッファに書き込みます。
データの最後(0D0A)を受信したら、今度は送信を行ないます。
今受信したデータをそのまま送信します。
0D0Aを送信したらシステムに戻ります(RETFの実行)。
下は上のテストプログラムを実行したときのログです。
logfile nd80klog\08191544.txt open ND80KL/86に接続しました 0001 0093 - z 0003 0339 - *** nd80kl/86(am188) basic **** >/ld 86rstst2.com,8000 loading 86RSTST2.COM ...0054(84)bytes loaded,from 8000 to 8053 >jp 8000 >dm 8200,820f 8200 61 62 63 78 79 7A 0D 0A-19 C8 27 2B 19 6A 19 8C abcxyz...ネ'+.j.. >/exit 0003 037C - リモート接続を終了しました logfile closed at Sun Aug 19 16:40:36 2018 |
受信、送信の相手は別のWindowsパソコン(Windows98SE)に接続したND80Z3.5です。
下はND80Z3.5のログです。
logfile nd80zlog\08191551.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** ndwr2h.bin loaded,from E23F to E535 >/load 232host.txt 10 PRINT "sousin start" 20 A$="abcxyz" 30 WRITE #1,A$ 40 PRINT "sousin",A$ 50 PRINT "jusin" 60 A%=0 70 READ #1,B$,A% 80 IF A%<1 GOTO 70 90 PRINT B$,A% 100 PRINT "end" data end >r. sousin start sousin abcxyz jusin abcxyz 6 end |
テストデータとしてabcxyzを送信します。
WRITE #1,A$のように最後にカンマ(,)またはセミコロン(;)をつけないで終るとデータの送出後に0D0Aが送られます。
送信したあとはREAD #1命令を実行して、相手から送られてくるデータを待ちます。
送信したのと同じabcxyzを受信しました。
これでAM188のテストプログラムが正しく実行されたことが確認できました。
次回はいよいよ割込みを使った受信プログラムの作成です。
これはなかなかにホネでありました。
16ビットマイコンボードの製作[第75回]
2018.8.24upload
前へ
次へ
ホームページトップへ戻る