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