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


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

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

[第77回]



●AM188CPUボード直結RS232CIF(5)

また間が空いてしまいました。
ND80KL/86ボードキットの仕上げ作業の追い込みに入っているのですが、なにしろやらなければならない作業が多くて遅れ気味です。
できるだけ良いものにしたいと思ってがんばっておりますので、今しばらくのご猶予をお願いいたします。

前回からの続きです。
前回の終わりのところで、割込みに必要なレジスタの一覧が出てきました。
RS232C(Asynchronous Serial Port)に必要なレジスタはアドレス44(FF44)のSPICONとアドレス22(FF22)のEOIのようです。

下がSPICONの説明です。

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

ビット3(MSK)がシリアルポートの割込みをマスクするビットです。
このビットが1のとき、シリアルポート割込みは許可されません。
0のときシリアルポート割込みが許可されます。
実は割込みをマスクするレジスタはこのほかにもある、ということが書いてあります。
Interrupt Mask Registerがそれで、7.3.11を見よ、と書いてあります。
名前からすると、そちらが割込み全部を統括しているレジスタのようです。
SPICONのビット3をセット、リセットするとそちらのレジスタの対応するビットも同時に変化するようです。
Interrupt Mask Registerについてはこの後のところで説明をします。

ビット2〜0は割込みの優先順位で000が最優先レベルで111が一番低いレベルです。

AM188では多種類の割込みサービスが提供されているため、そのうちの1つの割込みサービスが終る時点でどの割込みに対する割込みサービスが終了したのかを割込みコントローラに知らせる必要があります。
IRETを実行する前に、End−of−Interrupt Register(EOI、アドレスFF22)にその割込みのタイプ(INT ajを書き込むことで、その割込みの終了が割込みコントローラに伝えられます。

下はEnd−of−Interrupt Register(EOI)の説明です。

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

NSPECビットは通常は0にします。
ここを1にする使い方というのはよくわかりません。
S4−S0でINT TYPEを指定します。
5ビットですから指定できるINT TYPEはbO0〜bPFの32種になります。
それ以外は割込みに分類されていますが、INT命令による「ソフトウェア割込み」で一般の割込みとは別物です。

上のところで言及したInterrupt Mask Register(IMASK、アドレスFF28)についても簡単に書いておきます。
下はその説明です。

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

MASK可能割込みは、それぞれの割込みコントロールレジスタのMASKビットをセット、リセットすることでその割込みの許可、不許可をコントロールします。
このところ説明しておりますRS232C割込み(Serial Port Interrupt)の場合はこのページのトップで説明しましたSPICONがそのレジスタです。
MASK可能割込みをMASKする方法のひとつはそれぞれの割込みタイプごとにそれぞれの割込みコントロールレジスタを操作する方法ですが、ここで説明するIMASK Registerは1つのレジスタで全部のMASK可能割込みをコントロールするためのものです。
一見すると便利なようですが、扱いには注意が必要なようです。
個々の割込みコントロールレジスタを使ったほうがよい、との説明があります。
私もそう思います。
個々の割込みコントロールレジスタのMASKビットをセット、リセットすると、IMASKレジスタの対応するビットもセット、リセットされます。
たとえばSPICONのMASKビットをセット、リセットすると、それと同時にIMASKレジスタのビット10(SPI)もセット、リセットされます。

下は作成したRS232C送受信テストプログラムです。
送信については割込みを使わず通常の送信を行ないます。
受信のみ割込みを使います。

2018/8/20  22:44  86rstst4.LST
[00001]                     ;;; 232C test3 int(read & err)/ write not int
[00002]                     ;18/8/18 8/19 8/20
[00003]                     ;
[00004]                         ORG=8000
[00005]                         TBF=8100
[00006]                         RBF=8200
[00007]                         ERRMK=8300
[00008]                     ;
[00009] 8000  BA80FF            MOV DX,FF80;SPCT
[00010] 8003  B81704            MOV AX,0417;8NX1,RINT,ERINT enable
[00011] 8006  EF                OUT DX,AX
[00012] 8007  BA88FF            MOV DX,FF88;SPBAUD
[00013] 800A  B84000            MOV AX,0040;9600(20MHz)
[00014] 800D  EF                OUT DX,AX
[00015] 800E  BA78FF            MOV DX,FF78;PDIR1
[00016] 8011  ED                IN AX,DX
[00017] 8012  25FFE7            AND AX,E7FF;TXD,RXD active
[00018] 8015  EF                OUT DX,AX
[00019] 8016  BE0081            MOV SI,TBF
[00020] 8019  BF0082            MOV DI,RBF
[00021] 801C  B85C80            MOV AX,RSINT
[00022] 801F  A35000            MOV [0050],AX
[00023] 8022  8CD8              MOV AX,DS
[00024] 8024  A35200            MOV [0052],AX
[00025] 8027  33DB              XOR BX,BX
[00026] 8029  881E0083          MOV [*ERRMK],BL
[00027] 802D  BA44FF            MOV DX,FF44;SPICON
[00028] 8030  B81000            MOV AX,0010;SPI enable
[00029] 8033  EF                OUT DX,AX
[00030] 8034  FB                STI
[00031]                     ;
[00032] 8035  80FBFF        LOOP:CMP BL,FF
[00033] 8038  741D              JZ ERR <8057>
[00034] 803A  80FB0A            CMP BL,0A
[00035] 803D  75F6              JNZ LOOP <8035>
[00036] 803F  BF0082            MOV DI,RBF
[00037] 8042  BA82FF        WRITE:MOV DX,FF82
[00038] 8045  ED                IN AX,DX
[00039] 8046  A92000            TEST AX,20;write ok?
[00040] 8049  74F7              JZ WRITE <8042>
[00041] 804B  BA84FF            MOV DX,FF84
[00042] 804E  8A05              MOV AL,[DI]
[00043] 8050  47                INC DI
[00044] 8051  EE                OUT DX,AL
[00045] 8052  3C0A              CMP AL,0A
[00046] 8054  75EC              JNZ WRITE <8042>
[00047] 8056  CB                RETF
[00048] 8057  881E0083      ERR:MOV [*ERRMK],BL
[00049] 805B  CB                RETF
[00050]                     ;
[00051] 805C  52            RSINT:PUSH DX
[00052] 805D  50                PUSH AX
[00053] 805E  BA82FF            MOV DX,FF82
[00054] 8061  ED                IN AX,DX
[00055] 8062  8BD0              MOV DX,AX
[00056] 8064  240F              AND AL,0F
[00057] 8066  7512              JNZ RSERR <807A>
[00058] 8068  8AC2              MOV AL,DL
[00059] 806A  A810              TEST AL,10;read data?
[00060] 806C  740E              JZ RSINTEND <807C>
[00061] 806E  BA86FF            MOV DX,FF86
[00062] 8071  ED                IN AX,DX
[00063] 8072  8805              MOV [DI],AL
[00064] 8074  47                INC DI
[00065] 8075  8AD8              MOV BL,AL
[00066] 8077  EB0390            JMP RSINTEND <807C>
[00067] 807A  B3FF          RSERR:MOV BL,FF
[00068] 807C  BA22FF        RSINTEND:MOV DX,FF22;EOI
[00069] 807F  B81400            MOV AX,0014
[00070] 8082  EF                OUT DX,AX
[00071] 8083  58                POP AX
[00072] 8084  5A                POP DX
[00073] 8085  CF                IRET
[00074]                     ;
ERR          =8057  ERRMK        =8300  LOOP         =8035  RBF          =8200  
RSERR        =807A  RSINT        =805C  RSINTEND     =807C  TBF          =8100  
WRITE        =8042  

必要な設定のあとは受信割込みのみ受け付けます(LOOPの部分)。
受信したデータは割込み処理ルーチンによって受信バッファに書き込まれます。
メインルーチンではデータの最後(0Aコード)を受信したことを確認したら、今度は送信を行ないます。
今受信したデータをそのまま送信します。
0D0Aを送信したらシステムに戻ります(RETFの実行)。

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

logfile nd80klog\08210539.txt open

ND80KL/86に接続しました
0001 00B3 - z
0003 0339 - 
*** nd80kl/86(am188) basic ****
>/ld 86rstst4.com,8000
loading 86RSTST4.COM ...0086(134)bytes loaded,from 8000 to 8085
>dm 8200,820f
8200  F6 4D 9C 6B 35 B2 16 01-3D CA 27 3B 19 7A 19 84  .M.k5イ..=ハ';.z..
>jp 8000
>dm 8200,820f
8200  61 62 63 78 79 7A 0D 0A-3D CA 27 3B 19 7A 19 84  abcxyz..=ハ';.z..
>/exit
0003 037C - 
リモート接続を終了しました
logfile closed at Tue Aug 21 05:44:00 2018

受信、送信の相手は別のWindowsパソコン(Windows98SE)に接続したND80Z3.5です。
下はND80Z3.5のログです。

logfile nd80zlog\08210546.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>.
>h.
TEXT 8004-80CE
ヘンスウ 25A8-DFFF
>.
    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"
>r.
sousin start
sousin       abcxyz
jusin
abcxyz       6
end

>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Aug 21 06:07:07 2018

こちらのプログラムは前回のテストと同じです。
テストデータとしてabcxyzを送信します。
WRITE #1,A$のように最後にカンマ(,)またはセミコロン(;)をつけないで終るとデータの送出後に0D0Aが送られます。
送信したあとはREAD #1命令を実行して、相手から送られてくるデータを待ちます。
送信したのと同じabcxyzを受信しました。
これでAM188のテストプログラム(割込み受信)が正しく実行されたことが確認できました。

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

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