新製品の紹介(プチ連載です)
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
前へ
次へ
ホームページトップへ戻る