KL5C80A12マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
KL5C80A12はZ80互換の高速高性能8ビットマイクロコントローラです。
残念なことに数年前に生産中止になってしまいました。
しかし当社ではKL5C80A12を使った組込みマイコンボードはまだ健在です。
そのKL5C80A12を使ったND80Z3.5上位互換マイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第9回]
●最上位4ビット表示プログラム
アドレス表示LEDの最上位5桁目に値を表示するためにモニタプログラムを変更します。
最初にまず9桁目の値を保存しておく場所を作ります。
作業はND80Zモニタプログラムに対して行ないます。
2016/12/23 14:16 ndkmon8p.txt END=0E8C ;;; ND80Z MONITOR FOR ND80Z3 ;16/11/13 for ND80KL ;from nd3mon2o ;11/15 from ndkmon8c ;11/16 11/18 ;12/22 12/23 ; LEDHI=$FFB7 SEGHI=$FFB6 |
LEDHIには物理メモリベースアドレスの上位4ビットの値00〜F0を格納します(下位4ビットは0にします)。
SEGHIにはLEDHIの上位4ビット0〜Fのセグメント表示データを入れます。
そして下は今回ND80Zモニタプログラムに追加した[*(I/O)][5]が押されたときに実行されるプログラムです。
; ;High Address set ; 0E4B 3AECFF HISET:LD A,(DATAL) 0E4E E60F AND 0F 0E50 4F LD C,A 0E51 17 RLA 0E52 17 RLA 0E53 17 RLA 0E54 17 RLA 0E55 32B7FF LD (LEDHI),A 0E58 21E901 LD HL,SEGD 0E5B 0600 LD B,00 0E5D 09 ADD HL,BC 0E5E 7E LD A,(HL) 0E5F 32B6FF LD (SEGHI),A 0E62 C3BD08 JP START2 |
LEDのデータ表示部の右端の値を左に4ビットシフトして[LEDHI]に格納します。
その値を7セグメントLEDに表示するためにセグメントデータに変換して[SEGHI]に格納します。
アドレス01E9はTK−80モニタプログラムのセグメント変換テーブルのアドレスです。
[*(I/O)][5]が押されたときに上記のプログラムが実行されるように、上のプログラムのアドレスをキー入力ジャンプテーブルに追加しました。
; ;;; KEY JUMP TABLE (3) ; 092A D30A JPT3:DW RPRT 092C BD08 DW START2;LPRT 092E 4707 DW SOUT 0930 6907 DW SIN 0932 CE0A DW TRON 0934 4B0E DW HISET;***** 12/22 0936 BD08 DW START2;R256 0938 BD08 DW START2;START2 093A C30D DW REMOTE 093C B40C DW MMEM 093E 570D DW DMEM 0940 BD08 DW START2;DAS 0942 2C0D DW LSAVE 0944 0705 DW LOAD 0946 340B DW OUT 0948 0D0B DW IN |
これで[*(I/O)][5]が押されたときにLEDのデータ表示部の最下位(右端)の値が物理メモリベースアドレスの上位4ビットとして[LEDHI]に格納されるようになりました。
しかしそれだけでは、まだLEDのアドレス表示部の5桁目への表示は行なわれません。
次はそのための表示プログラムの作成です。
●LED表示にはPICを使います
ND80ZV、ND80Z3.5、ND8080では7セグメントLEDの表示はTK−80と同じDMAという方法で行なっています。
しかし今回の回路では、その部分に限ってはTK−80互換をやめて、PICに任せることにしました。
ひとつには今回の9桁目を含めてDMAでの表示を行なおうとすると、回路がちょっと面倒になる、と判断したためでもあります。
PICへの表示データの転送はアドレス0000からのTK−80モニタプログラムと、アドレス0400スタート版のTK−80モニタプログラムの両方の7セグメントデータ表示プログラムに組み込みました。
下がそのプログラム部分です。
; 07CF CDC005 LEDDP0:CALL SEGCG 07D2 E5 LEDDP:PUSH H 07D3 D5 PUSH D 07D4 C5 PUSH B 07D5 21F8FF LXI H,DIG 07D8 0608 MVI B,08 07DA 0E00 MVI C,00 07DC CDE907 LEDDP2:CALL LEDDPS 07DF 23 INX H 07E0 0C INR C 07E1 05 DCR B 07E2 C2DC07 JNZ LEDDP2 07E5 C1 POP B 07E6 D1 POP D 07E7 E1 POP H 07E8 C9 RET ; 07E9 3E0E LEDDPS:MVI A,0E 07EB D388 OUT 88;busy 07ED 7E MOV A,M 07EE D38C OUT 8C 07F0 79 MOV A,C 07F1 D388 OUT 88;adrs set 07F3 1602 MVI D,02 07F5 CDDF06 CALL D1_2;0.5msec wait 07F8 3E0E MVI A,0E 07FA D388 OUT 88 07FC C9 RET |
SEGCGだけだったところを、そのあとセグメント表示バッファ(FFF8〜FFFF)の値をLEDDPSでPICに送る部分を追加しました。
こちらが7セグメントLED表示回路です。
LED表示にはPIC16F883を使います。
上でTK−80モニタプログラムに追加したLED表示プログラムはアドレス0800からのND80ZモニタプログラムでもCALLして使っていますが、それは8桁LEDに対しての表示プログラムなので、これだけでは9桁目の表示は行なわれません。
そこでその部分をND80Zモニタプログラムに追加しました。
そこでも上の7セグメントLED表示データをPIC16F883に送るサブルーチン(LEDDPS)を利用しますから、そのサブルーチンへのジャンプ命令をTK−80モニタプログラムの先頭部分(アドレス040B)に追加しました。
2016/12/22 18:32 ndkmon4e.txt END=07FC ;;; TK80 MONITOR PROGRAM FOR ND80Z(WORK AREAR FFxx) ;;16/11/13 for ND80KL ;from NDMON4P ;16/12/22 ; ORG $0400 ; 0400 C33B04 JMP MONST 0403 C3CF07 JMP LEDDP0;SEGCG+LEDDP ; ; ORG $0008 ; JMP START ORG $040B 040B C3E907 JMP LEDDPS;***12/22 ; |
そして下がND80Zモニタプログラムで9桁目の表示を追加したLED表示プログラムです。
TK−80モニタプログラムのLED表示プログラムをCALLしたあと、SEGHIに格納されている9桁目に表示するセグメントデータをPIC16G883に送ります。
0E3F CD0304 LEDDPA:CALL LEDDP4 0E42 0E08 LD C,08;LED Hi-address 0E44 21B6FF LD HL,SEGHI 0E47 CD0B04 CALL LEDDPS 0E4A C9 RET |
このLEDDPAサブルーチンはTK−80モニタプログラムのSEGCGサブルーチンに相当するプログラムです。
TK−80モニタプログラムのSEGCGはLEDに表示するアドレス、データを格納しているメモリの値を7セグメント表示データに変換してDMA用表示バッファに書き込みます。
あとはDMAで表示処理されるのですが、そこのところをPIC16F883にセグメント表示データを送るようにしているのです。
これでLEDの9桁目に物理メモリアドレスの最上位4ビットを置数して、それを表示させることができるようになりました。
しかし前回も書きましたように、それだけではまだ物理メモリアドレスにアクセスして、その値をLEDに表示させることはできません。
説明が長くなってしまいましたので、この続きは次回にいたします。
KL5C80A12マイコンボードの製作[第9回]
2016.12.26upload
前へ
次へ
ホームページトップへ戻る