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

新製品の紹介(プチ連載です)
27C256WRITER組立キット

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


[第15回]


●書き込みパルスの確認

27C256へのデータの書き込みは、Vddを約+6Vに上げるとともにVpp端子に約+12.5Vを加えた状態でアドレス、データをセットし、OEはHにしておいてCSに0.1msか1msのLパルスを与えることで行ないます。
メーカーによって多少の差異はありますが、1回パルスを与えたあと、すぐにOEをLにすることでベリファイを行い、正しく書き込めていなければ、正しく書き込めるまで最大25回繰り返して書き込みを行なうという方式が多いようです。
うんと昔のものはパルス幅が1msでしたが、近年のものは大抵は0.1msが普通のようです。

書き込みパルスとしては0.1msまたは1msのタイマーサブルーチンを作って、それをコールすることでパルス出力を得ています。
命令の実行クロック数を計算することでその時間幅を得ていますが、そういえば実際に出力パルスを測定して確認してはいませんでした。
正しくROMに書き込みが行なわれていますから、多分間違いはないだろうとは思っているのですが、念のためにこの機会に確認をしておくことにしました。

パルス幅を確認するのに一番簡単なのはオシロスコープによる測定です。
しかし実際の書き込みプログラムは短時間で終了してしまいますし、ベリファイをはさんでパルス出力されますから、通常のスイープモードではうまく測定できません。
要はタイマールーチンによって作られる時間幅が正しいかどうかがわかればよいのですから、タイマールーチンをコールするたびに82C55の出力を反転させるようなテストプログラムを作って、その出力を測定することにしました。

そう考えて作ったテストプログラムです。
いざ作るつもりになってタイマールーチンを確認してみましたら、ちょっといいかげんなところが目に付きましたので、再計算して補正しました。

2016/2/14  22:10  ndwpout.txt
END=C036
              ;;;; ROM WRITER FOR ND80Z3 pulse test
              
              ;16/2/14
              ;
                ORG $C000
              ;
C000 3E80       LD A,80;PA out,PB out,PC out
C002 D383       OUT (83),A
C004 3E00     LP:LD A,00
C006 D380       OUT (80),A
C008 CD15C0     CALL TM1
C00B 3EFF       LD A,FF
C00D D380       OUT (80),A
C00F CD15C0     CALL TM1
C012 C304C0     JP LP
              ;1MS TIMER
C015 C5       TM1:PUSH BC
C016 0605       LD B,05
C018 CD21C0   TM11:CALL TM02
C01B 05         DEC B
C01C C218C0     JP NZ,TM11
C01F C1         POP BC
C020 C9         RET
              ;0.2ms TIMER
C021 C5       TM02:PUSH BC;11
C022 0E51       LD C,51;7;=81
C024 0D       TM022:DEC C;4
C025 C224C0     JP NZ,TM022;10,,,(14*81+11+7+12+10+10+17)/6=200us
C028 00         NOP;4
C029 00         NOP;4
C02A 00         NOP;4
C02B C1         POP BC;10
C02C C9         RET;10  CALL=17
              ;0.1ms TIMER
C02D C5       TM01:PUSH BC;11
C02E 0E2B       LD C,2B;=43
C030 0D       TM012:DEC C;4
C031 C230C0     JP NZ,TM012;10,,,(14*43+11+7+4+10+10+17)/6=100us
C034 00         NOP;4
C035 C1         POP BC;10
C036 C9         RET;10 CALL=17
              ;END
LP           =C004  TM01         =C02D  TM012        =C030  
TM02         =C021  TM022        =C024  TM1          =C015  
TM11         =C018  


アドレスC008とC00FでTM1をコールすると1msのパルス(出力波形はH、Lそれぞれ1ms)になり、TM01をコールすると0.1msのパルス(出力波形はH、Lそれぞれ0.1ms)になります。

こちらが1msのパルスです。

1msのタイマールーチンをコールするたびにH、Lを反転して出力しますから、周期は2ms(500Hz)になります。

こちらは0.1msのパルスです。

このくらいの時間になるとOUT命令やJP命令の実行時間も無視できなくなりますから、実際のパルス幅は0.1msよりも少し長くなっています。
0.1msよりも短いよりは長いほうが安全側に働きますから、まあこの程度でよろしいでしょう。

●MYCPU80の場合

上記はND80Z3.5(ND80ZV)でのテストです(CPUクロック6MHz)。
27C256WRITERはMYCPU80にも接続できるように考えてあります。
前回お見せしたテスト用の書き込みプログラムをご覧になって、お気付きになられた方もいらっしゃったかもしれません。
もともとこのプログラムは昔にZ80ボード用に書いたものをもとにしているのですが、そこでは当然のことながらZ80の機能を十分に使うプログラムになっていました。
それを今回はわざわざZ80固有の命令やレジスタを使わないプログラムとして作成しました。
それはMYCPU80(CPUは8080互換)での使用も考えてのことでした。

ということで、27C256WRITERはMYCPU80での使用も念頭に置いています。
プログラムそのものはZ80固有の命令を使うことを避けて、8080でも実行できる命令だけで記述すれば、MYCPU80でも同じように実行できます。
しかしタイマールーチンだけは、CPUが違い(命令クロックが異なる)、CPUクロック周波数が違えば(MYCPU80は2MHz)、そのままでは使い物になりません。
そこで27C256WRITERプログラムのうち、タイマールーチンだけはMYCPU80での実行を前提にして書き直したうえで、こちらについてもテスト用のパルス出力プログラムを作って、その出力パルスをオシロスコープで測定しました。

下がそのプログラムリストです。

2016/2/14  22:50  m8wpout.txt
END=C032
              ;;;; ROM WRITER FOR MYCPU80 pulse test
              
              ;16/2/14
              ;
                ORG $C000
              ;
C000 3E80       MVI A,80;PA out,PB out,PC out
C002 D383       OUT 83
C004 3E00     LP:MVI A,00
C006 D380       OUT 80
C008 CD15C0     CALL TM1
C00B 3EFF       MVI A,FF
C00D D380       OUT 80
C00F CD15C0     CALL TM1
C012 C304C0     JMP LP
              ;1MS TIMER
C015 C5       TM1:PUSH B
C016 0605     MVI B,05
C018 CD21C0   TM11:CALL TM02
C01B 05       DCR B
C01C C218C0   JNZ TM11
C01F C1       POP B
C020 C9       RET
              ;0.2ms TIMER
C021 C5       TM02:PUSH B;8
C022 0E12     MVI C,12;8;=18
C024 0D       TM022:DCR C;8
C025 C224C0   JNZ TM022;12or8,,,(20*17+8+8+8+8+8+18)*0.5=199us
C028 C1       POP B;8
C029 C9       RET;8 CALL=18
              ;0.1ms TIMER
C02A C5       TM01:PUSH B;8
C02B 0E08     MVI C,08;8
C02D 0D       TM012:DCR C;8
C02E C22DC0   JNZ TM012;12or8,,,(20*7+8+8+8+8+8+18)*0.5=99us
C031 C1       POP B;8
C032 C9       RET;8 CALL=18
              ;END
LP           =C004  TM01         =C02A  TM012        =C02D  
TM02         =C021  TM022        =C024  TM1          =C015  
TM11         =C018  


こちらが1msのパルスです。

1msタイマールーチンは0.2msタイマールーチンを5回コールすることで1msを得ています。
CPUクロック2MHzでは0.2msタイマールーチンを5回コールするための命令の実行時間なども無視はできなくなります。
1msよりも少し長くなっていますが、この程度は許容範囲でしょう。

こちらは0.1msのパルスです。

こちらも0.1msよりは少し長くなっていますが、こちらもまあ許容範囲でしょう。

27C256WRITER組立キット[第15回]
2016.2.17upload

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