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


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

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