SSブログ
English Version

Z80GalCompactの制作(その5)AMラジオで音楽演奏 [Z80]

 twitter の タイムラインでマイコンから発生する電波を利用してラジオから音楽を流す動画を見かけました。
 学生時代に Z80 マイコンを作り同様なことをやってみたことがありますが、直ぐに1ビットのデジタル出力を使って演奏する方式に移行して二重奏等をやって遊んでいました。

 余りにも懐かし過ぎるので最近開発した Z80 マイコン(Z80GalCompact)を使ってラジオ演奏をやってみました。

 基本はループ処理の周期によってシングルトーンの音を生成するのですが、最初は綺麗な音が中々出ませんでした。色々やってみると AMラジオ側の受信周波数によって聞こえ方が結構違うことに気が付き、良く聞こえる受信周波数にするとそれなりの音が出るようになりました。
 また、演奏音をなるべく綺麗にするために
  1. 雑音低減のために演奏中はタイマ割込みを禁止する
  2. 頻繁に通る分岐処理部分では両方の処理のステート数を合わせる
  3. 音程と長さは1バイト処理にしてトーンジェネレータ以外の処理時間を短くする
等の対策を施すことでそれなりに聞こえるようになりました。今回使用した Z80GalCompact は 20MHz 動作なので上記の第 3 項を実現するために結構な数の NOP 命令をトーンジェネレータ処理部に入れています。

 トーンジェネレータ処理のループ部が合計で 108 ステートとなり、クロック 20MHz の情報と合わせて音程パラメータを計算した結果が下表になります。
 Loop times のカラムがシングルトーンを生成するためのループ回数(=音程パラメータ)で上記のように 1 バイト処理なので Hex カラムが 2 桁以下のデータ部分が使用できる音階になります。

音階パラメータ表


 楽曲としては著作権が消滅しているドイツ民謡で広くなじみのある「かえるの合唱」のデータを使用しました。ネット上にあるこのページ等を参照させて頂きました。
 更に今回は無謀にもラジオを用いた自動演奏による二重奏にチャレンジしてみました。アセンブラで組んだソースが下記になります。

ラジオ演奏 カエルの合唱(Z80 アセンブラ)
;++++++++++++++++++++++++++++++++++++++++ ; play music by AM-radio ; Ver 0.01 2022/07/28 by skyriver ;++++++++++++++++++++++++++++++++++++++++ 0080 LENG EQU 80H ; tone length parameter 0010 WAVREP EQU 16 ; wave repeat times ; note definition($:means #) 00FA N_F0$ EQU 0FAH 00EC N_G0 EQU 0ECH 00DF N_G$0 EQU 0DFH 00D2 N_A1 EQU 0D2H 00C7 N_A$1 EQU 0C7H 00BB N_B1 EQU 0BBH 00B1 N_C1 EQU 0B1H 00A7 N_C$1 EQU 0A7H 009E N_D1 EQU 09EH 0095 N_D$1 EQU 095H 008C N_E1 EQU 08CH 0085 N_F1 EQU 085H 007D N_F$1 EQU 07DH 0076 N_G1 EQU 076H 006F N_G$1 EQU 06FH 0069 N_A2 EQU 069H 0063 N_A$2 EQU 063H 005E N_B2 EQU 05EH 0058 N_C2 EQU 058H 0054 N_C$2 EQU 054H 004F N_D2 EQU 04FH 004A N_D$2 EQU 04AH 0046 N_E2 EQU 046H 0042 N_F2 EQU 042H 003F N_F$2 EQU 03FH 003B N_G2 EQU 03BH 0038 N_G$2 EQU 038H 0035 N_A3 EQU 035H 0032 N_A$3 EQU 032H 002F N_B3 EQU 02FH 002C N_C3 EQU 02CH 002A N_C$3 EQU 02AH 0027 N_D3 EQU 027H 0025 N_D$3 EQU 025H 0023 N_E3 EQU 023H 0021 N_F3 EQU 021H 0000' ASEG ORG 0100H 0100 21 0000 START: LD HL,0 ; wait until serial buffer empty 0103 2B ST00: DEC HL 0104 7C LD A,H 0105 B5 OR L 0106 C2 0103 JP NZ,ST00 0109 F3 DI 010A 21 0150 LD HL,DATA 010D 7E LOOP: LD A,(HL) 010E B7 OR A 010F CA 014E JP Z,EXIT 0112 57 LD D,A 0113 23 INC HL 0114 5E LD E,(HL) 0115 23 INC HL 0116 E5 PUSH HL 0117 0E 80 LD C,LENG ; length 0119 AF XOR A ; clear length sub counter 011A 2E 10 TONE00: LD L,WAVREP ; wave repeat times 011C 42 TONE01: LD B,D ; set tone para 011D 3D TONE02: DEC A ; 4(4) 011E C2 0128 JP NZ,TONE03 ; 10(14) 0121 0D DEC C ; 4 0122 CA 014A JP Z,NEXT ; 10(14) 0125 C3 012E JP TONE04 ; 10(24) 0128 00 00 00 00 TONE03: DB 0,0,0,0 ; 16(30) NOP x 4 012C 00 00 DB 0,0 ; 8(38) 012E 00 00 TONE04: DB 0,0 ; 8(46) 0130 00 00 00 00 DB 0,0,0,0 ; 16(62) 0134 00 00 00 00 DB 0,0,0,0 ; 16(78) 0138 00 00 00 00 DB 0,0,0,0 ; 16(94) 013C 05 DEC B ; 4(98) 013D C2 011D JP NZ,TONE02 ; 10(108) loop:108 * para 0140 2D DEC L 0141 C2 011C JP NZ,TONE01 0144 62 LD H,D 0145 53 LD D,E 0146 5C LD E,H 0147 C3 011A JP TONE00 014A E1 NEXT: POP HL 014B C3 010D JP LOOP 014E FB EXIT: EI 014F C9 RET 0150 DATA: 0150 B1 B1 DB N_C1, N_C1 ; single 0152 B1 B1 DB N_C1, N_C1 0154 9E 9E DB N_D1, N_D1 0156 9E 9E DB N_D1, N_D1 0158 8C 8C DB N_E1, N_E1 015A 8C 8C DB N_E1, N_E1 015C 85 85 DB N_F1, N_F1 015E 85 85 DB N_F1, N_F1 0160 8C 8C DB N_E1, N_E1 0162 8C 8C DB N_E1, N_E1 0164 9E 9E DB N_D1, N_D1 0166 9E 9E DB N_D1, N_D1 0168 B1 B1 DB N_C1, N_C1 016A B1 B1 DB N_C1, N_C1 016C 01 01 DB 1, 1 016E 01 01 DB 1, 1 0170 8C 8C DB N_E1, N_E1 0172 8C 8C DB N_E1, N_E1 0174 85 85 DB N_F1, N_F1 0176 85 85 DB N_F1, N_F1 0178 76 76 DB N_G1, N_G1 017A 76 76 DB N_G1, N_G1 017C 69 69 DB N_A2, N_A2 017E 69 69 DB N_A2, N_A2 0180 76 76 DB N_G1, N_G1 0182 76 76 DB N_G1, N_G1 0184 85 85 DB N_F1, N_F1 0186 85 85 DB N_F1, N_F1 0188 8C 8C DB N_E1, N_E1 018A 8C 8C DB N_E1, N_E1 018C 01 01 DB 1, 1 018E 01 01 DB 1, 1 0190 B1 B1 DB N_C1, N_C1 0192 B1 B1 DB N_C1, N_C1 0194 01 01 DB 1, 1 0196 01 01 DB 1, 1 0198 B1 B1 DB N_C1, N_C1 019A B1 B1 DB N_C1, N_C1 019C 01 01 DB 1, 1 019E 01 01 DB 1, 1 01A0 B1 B1 DB N_C1, N_C1 01A2 B1 B1 DB N_C1, N_C1 01A4 01 01 DB 1, 1 01A6 01 01 DB 1, 1 01A8 B1 B1 DB N_C1, N_C1 01AA B1 B1 DB N_C1, N_C1 01AC 01 01 DB 1, 1 01AE 01 01 DB 1, 1 01B0 B1 B1 DB N_C1, N_C1 01B2 01 01 DB 1, 1 01B4 9E 9E DB N_D1, N_D1 01B6 01 01 DB 1, 1 01B8 8C 8C DB N_E1, N_E1 01BA 01 01 DB 1, 1 01BC 85 85 DB N_F1, N_F1 01BE 01 01 DB 1, 1 01C0 8C 8C DB N_E1, N_E1 01C2 8C 8C DB N_E1, N_E1 01C4 9E 9E DB N_D1, N_D1 01C6 9E 9E DB N_D1, N_D1 01C8 B1 B1 DB N_C1, N_C1 01CA B1 B1 DB N_C1, N_C1 01CC 01 01 DB 1, 1 01CE 01 01 DB 1, 1 01D0 B1 B1 DB N_C1, N_C1 ; duo 01D2 B1 B1 DB N_C1, N_C1 01D4 9E 9E DB N_D1, N_D1 01D6 9E 9E DB N_D1, N_D1 01D8 8C 8C DB N_E1, N_E1 01DA 8C 8C DB N_E1, N_E1 01DC 85 85 DB N_F1, N_F1 01DE 85 85 DB N_F1, N_F1 01E0 8C 8C DB N_E1, N_E1 01E2 8C 8C DB N_E1, N_E1 01E4 9E 9E DB N_D1, N_D1 01E6 9E 9E DB N_D1, N_D1 01E8 B1 B1 DB N_C1, N_C1 01EA B1 B1 DB N_C1, N_C1 01EC 01 01 DB 1, 1 01EE 01 01 DB 1, 1 01F0 8C B1 DB N_E1, N_C1 01F2 8C B1 DB N_E1, N_C1 01F4 85 9E DB N_F1, N_D1 01F6 85 9E DB N_F1, N_D1 01F8 76 8C DB N_G1, N_E1 01FA 76 8C DB N_G1, N_E1 01FC 69 85 DB N_A2, N_F1 01FE 69 85 DB N_A2, N_F1 0200 76 8C DB N_G1, N_E1 0202 76 8C DB N_G1, N_E1 0204 85 9E DB N_F1, N_D1 0206 85 9E DB N_F1, N_D1 0208 8C B1 DB N_E1, N_C1 020A 8C B1 DB N_E1, N_C1 020C 01 01 DB 1, 1 020E 01 01 DB 1, 1 0210 B1 8C DB N_C1, N_E1 0212 B1 8C DB N_C1, N_E1 0214 01 85 DB 1, N_F1 0216 01 85 DB 1, N_F1 0218 B1 76 DB N_C1, N_G1 021A B1 76 DB N_C1, N_G1 021C 01 69 DB 1, N_A2 021E 01 69 DB 1, N_A2 0220 B1 76 DB N_C1, N_G1 0222 B1 76 DB N_C1, N_G1 0224 01 85 DB 1, N_F1 0226 01 85 DB 1, N_F1 0228 B1 8C DB N_C1, N_E1 022A B1 8C DB N_C1, N_E1 022C 01 01 DB 1, 1 022E 01 01 DB 1, 1 0230 B1 B1 DB N_C1, N_C1 0232 01 B1 DB 1, N_C1 0234 9E 01 DB N_D1, 1 0236 01 01 DB 1, 1 0238 8C B1 DB N_E1, N_C1 023A 01 B1 DB 1, N_C1 023C 85 01 DB N_F1, 1 023E 01 01 DB 1, 1 0240 8C B1 DB N_E1, N_C1 0242 8C B1 DB N_E1, N_C1 0244 9E 01 DB N_D1, 1 0246 9E 01 DB N_D1, 1 0248 B1 B1 DB N_C1, N_C1 024A B1 B1 DB N_C1, N_C1 024C 01 01 DB 1, 1 024E 01 01 DB 1, 1 0250 B1 B1 DB N_C1, N_C1 0252 01 01 DB 1, 1 0254 9E 9E DB N_D1, N_D1 0256 01 01 DB 1, 1 0258 8C 8C DB N_E1, N_E1 025A 01 01 DB 1, 1 025C 85 85 DB N_F1, N_F1 025E 01 01 DB 1, 1 0260 8C 8C DB N_E1, N_E1 0262 8C 8C DB N_E1, N_E1 0264 9E 9E DB N_D1, N_D1 0266 9E 9E DB N_D1, N_D1 0268 B1 B1 DB N_C1, N_C1 026A B1 B1 DB N_C1, N_C1 026C 01 01 DB 1, 1 026E 01 01 DB 1, 1 0270 00 DB 0 ; end of data END


 流石に完全な二重奏とまではいきませんが「かえるの合唱」の輪唱がそれなりに聞こえるようになりました^^


★追記 2022/7/28
 twitter に投稿した動画付きのメッセージを貼っておきます。




★追記 2022/08/15
 twitterにアップした動画はラジオのパネルに天井の照明が写り込んで見辛かったので動画を取り直して説明コメントも付けてYoutubeにアップしました。




[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

TL866II Plus用VPP:21V/25V対応アダプタの製作(その5)プリント基板完成 [その他]

 前回の記事で書いた回路更新したプリント基板を 7/3 23時に ELLOCROW さんに製造依頼して 7/11 の午前中に届きました。

 下の写真が出来上がったプリント基板のトップ面です。今回 ZIF ソケットのフットプリントを修正して幅を狭くしていますが、少し狭すぎました^^;
 でも足を少し曲げると入るので問題ありません。

VppConverter プリント基板(トップ面)


 下の写真がボトム面です。左上の "C4" のシルクのCが見えなくなっていますね^^;

VppConverter プリント基板(ボトム面)


 上記のように軽微な問題が2点あったものの機能上は問題無いと思います。
 表面実装部品を実装後のボトム面が下の写真です。今までは SOP パッケージは半田ごてで半田付けしていましたが、今回は他の部品と同様にクリーム半田を使ってヒートガンで半田付けしてみました。クリーム半田の方が速く綺麗にできました。

表目実装部品実装後(ボトム面)


 ボトム面の部品を実装後にトップ面の表面実装部品(と言っても USB コネクタと LED 及び電流制限抵抗)の半田付けを行いました。今回は上記の SOP IC と同様に USB コネクタもクリーム半田で半田付けしてみました。ピン間隔が狭いのでピン毎にクリーム半田を塗ることはできませんでしたがヒートガンを当てると綺麗に分かれて半田付けできました(今までは半田ごてと吸取り線を使って半田付けしていました)。

表目実装部品実装後(トップ面)


 残りはリード部品と ZIF ソケット及びピンヘッダの半田付けなので楽です。注意点として ZIF ソケットの半田付けの前にロムライタとの接続用のピンヘッダを半田付けする必要があります。また ZIF ソケット直下のピンヘッダは ZIF ソケットと干渉しないようにトップ面からの出っ張ったピンの部分をニッパーでカット後に半田付けしました。
 ZIF ソケットは前述のようにフットプリントの幅が少し狭いのでピンを内側に曲げてから半田付けしています。

 部品実装が完了したトップ面とボトム面の写真を貼っておきます。

部品実装後(トップ面)


部品実装後(ボトム面)


 VppConverter が完成したので 手持ちの UV-EPROM を使って動作確認を行いました。結果は 2716/2732/2764 の3種類の UV-EPROM への書込みが成功しました

 今回作成した VppConverter は外部から供給された 5V 電源を昇圧して Vpp 用の 21V/25V を生成していて内部回路のグランドは 外部電源である USB のグランドと同電位ですが、ロムライタ(TL866II Plus、以降 TL866II と記す)側のグランド(ロムライタ側の USB のグランドと同電位)と電位が異なります。
 従ってロムライタを接続したパソコンのUSBから VppConverter に給電しないよう注意する必要があります。モバイルバッテリからの給電が安全です。


 以降に確認結果の詳細を記録しておきます。
  1. NEC製 uPD2716D (Vpp:25V)
     TL866II のデバイス一覧には無いのでデバイスとして INTEL M2716 を選択した状態で試験しました。
     VppConverterによる Vpp の変化を確認するために、最初に UV-EPROM を TL866II に直接つないだ状態での書込み時の波形を確認しました(下図)。
     下図で ch1(黄色)が Vpp で ch2(水色)がCE/ です。TL866II に直付けなので Vpp が18V になっていて書込みは失敗します。

    2716 ダイレクト接続時の波形

     次に VppConverter を使って書き込んだ際の波形が下図になります。Vpp は想定通りほぼ 25V になっています。

    2716 書込み時の波形( VppConverter 使用時)

     書込み後の TL866II の画面が下図で、書込み後のベリファイも成功しています。

    VppConverter 使用時の書込み後の画面表示


  2. NEC製 uPD2732D (Vpp:21V)
     TL866II のデバイス一覧に無いのでインテルの 2732A を選択して確認しました。
     2732 問題(書き込み時に CE/ が High のまま)はソフトウェアの問題なのですがソフトウェアがすぐに対応しそうにないことからハード対応するということを前回の記事で書きました。
     VppConverter 経由で 2732 を接続し、書込み動作を行った際の波形が下図になります。ch1(黄色)が Vpp で ch2(水色)が CE/ です。Vpp は想定通り 21V になっていますし、 CE/ も髭は発生していますが想定通りに Vpp が High の時に low になっています。

    2732 書込み時の波形( VppConverter 使用時)

     書込み後の TL866II 画面が下図になります。書込みは成功していますね。

    2732 書込み後の画面


  3. 富士通製 MBM2764 (Vpp:21V)
     富士通製 MBM2764 は TL866II のデバイス一覧にありました。デバイス選択後の TL866II 画面が下図になります。
     MBM2764 の Vpp はデータシートでは 21V ですが、TL866II では 12V に設定されています。このように TL866II は UV-EPROM のパラメータ設定が間違えている場合があるので注意が必要です。

    MBM2764 選択後の画面

     VppConverter では TL866II からの Vpp が 18V の場合、内部で昇圧した Vpp に切り換えているので Vpp を 18V に手動で設定し直して書込み試験を行いました。書込み時の波形が下図になります。ch1(黄色)が Vpp で ch2(水色)が PGM/ です。

    MBM2764 の書込み時の波形

     書込み後の TL866II の画面が下図になります。ベリファイも通り、書込みは成功しています。

    MBM2764 の書込み後の画面表示


 以上が書込み試験時の波形等の記録です。

 最後に 2732 書込み時の写真を貼っておきます。2732 問題をハードで対応しているのでジャンパ接続不要でスッキリですね^^

2732 書込み時の様子



★追記 2022/07/16
 手持ちのUV-EPROM を使って今回開発した VppConverter での書込み試験を行った結果をメモしておきます。
 書込み試験でのデータは GAMEインタープリタ(0000H~0CB4H)を用いました。

No.MakerTypeVppResult
1NECD2716D25VOK
2FUJITSUMB851625VOK
3SSSM2716F125VOK
4NECD2732D21VOK
5MITSUBISHIM5L2732K25VOK
6FUJITSUMBM2732A21VOK
7NECD2764D21VOK
8NECD27C6421VOK
9FUJITSUMBM276421VOK

★2022/07/17 NEC D2764D を追加

※ST M2732A は 2732の書込み問題の記事の最後の方に追記で 2732 問題が発生している状態でも書き込めるということを書きましたが、大きなデータを書込むと 0800H のアドレスの読込みデータが不一致になりました。
 VppConverter を使って書込みを行うと 0000H で書き込みデータ( 0C3H )が 0FFH に読めるというエラーが発生しました。
 この ROM 自体が壊れている可能性があります。


★追記 2022/09/02
 需要があるか否かは不明ですが試験的に完成品を BOOTH で販売することにしました。
 検査時間等も入れると組立は結構時間が掛かるもんですね。でも表面実装部品は取付けた状態にしないと敬遠されそうだし、部品を部分的に実装した状態では検査し辛いし、悩ましいですね。


★追記 2022/09/09
 最近は基板の製造を ELECROW さんに依頼していますが、ELECROW さんでは現在 5 枚の基板製造を 1 ドルで行うキャンペーン中です。送料も Yun EXPRESS(8-11 Business Days) で $7.33 だったので、円安なのに従来よりも安く上がりました^^
 この ELECROW さんのリンクから新規登録すると 500 points ($5) が貰えるそうです。初オーダー時にこちらにもキックバックがあります。


★追記 2022/09/21
 数個ですが BOOTH へ出品したところ、直ぐに完売してしまいました^^
 部品実装、洗浄、検査等に時間が掛かって余り乗る気ではなかったのですが、欲しい人がいるのであれば、増産(と言っても個人レベルでは数個単位^^;)すべく、追加の PCB 製造を JLCPCB さんへ初めて依頼しました。
 格安の送料(SHIPPING CHARGE: ¥143.60)で、かつ製造もかなり速くていい感じです。

JLCPCB さんへの初めてのプリント基板製造依頼


★追記 2022/09/27
 JLCPCB さんの送料が格安なのは良かったのですが、shipping されてからはスローモーションです。毎日トラッキングを確認するのが日課になってしまった・・

JLCPCB さんの格安送料で待ちぼうけ


★追記 2022/09/29
 18:05 現在において上記の状況から進展無し(同じ内容の行が追加されたorz)・・・もしかして AliExpress での買い物並に時間が掛かる? orz

JLCPCB さんの格安送料で待ちぼうけ2


★追記 2022/10/01
 漸く届きました。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

TL866II Plus用VPP:21V/25V対応アダプタの製作(その4)回路更新 [その他]

 前回の記事で書いたように TL866II Plus(以降、TL866IIと記す)で 2732 を書き込む際に発生する問題は Vpp 電圧が 18V 以下の 2732 でも発生する問題であり、現状の対策は CE/( 18 番ピン)を強制的にグランド( 12 番ピン)に接続する方法しかないようです。また、この問題に対してソフトウェアがすぐには対応しない可能性もあるので今回作成する VppConverter( eBay で同種の基板が VppAdaptorと言う名称で販売されていたので名称を変更)でハード的に対応することにしました。

 上記の既存の対策は TL866II からの CE/ をグランド接続し TL866II 側の負荷が大きくなりあまり宜しくない(そもそも 2732 を焼く時だけジャンパー接続するのは面倒)ので下図のように Vpp でオンするトランジスタの出力とダイオードORを取って 2732 の CE/ として供給するようにします。このトランジスタは 2732 の場合のみオンになるので追加の操作は必要ありません。

2732 問題対応の追加回路


 6/23 に Elecrow さんに製造依頼した基板が本日( 7/3 )に届きました。過去の経験から Elecrow さんでは小さめの基板は10枚作ってくれるようで、今回も予想通り 5 枚の発注で予備分も含めて 12 枚届きました^^
 しかし、次の問題があったため、上記の 2732 対応も追加して改版することにした次第です。
  • ROM ソケットの幅
     2764 のフットプリントをネットからダウンロードし使用したが、ソケット無しの直付けを想定したもののようで幅が広すぎたので修正した
  • ROM ソケットのピン穴サイズ
     ZIF ソケットの足は横幅が大きく入らなかったので 30 Thou(穴径)/ 45 Thou(外径)のピン穴を 40 Thou / 54 Thou に変更した

 改版した全体の回路図が下図になります。

VppConverter 回路図( Ver 0.02 )


 グランドベタ化前のパターンが下図です。前回よりもサイズを少し小さくしました。

VppConverter パターン図(グランドベタ化前)


 グランドベタ化後のトップとボトムのパターン図も貼っておきます。

VppConverter パターン図(トップ面)

VppConverter パターン図(ボトム面)


 トップ面とボトム面の3D表示が下図になります。

VppConverter 3D表示(トップ面)

VppConverter 3D表示(ボトム面)



[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー