超小型Z80マイコン(その1)USBシリアル対応とピンアサイン [Z80]
「3チップ構成Pic24CPMマイコン(CP/M起動までの作業まとめ)」の記事で書いた Z80 ボードは PIC24 を使ってメモリをダイレクトアクセスすることで3チップ構成の Z80 ボードを実現しましたが、メモリ制御のために I/O 数の多い PIC が必要でした。
また、「Z80GalCompactの制作(その2)部品実装」等の記事で書いた Z80GalCompact では Z80 を高速(20MHz)で動作させ、シリアル通信や SPI をソフトウェアで実現することで使用チップ数を減らし小型の Z80 ボードを目指しましたが、USB シリアル変換の IC を使う等したため、チップ数は多くなりました。
今回はリセット直後のマシンコードのみを PIC から提供し(ROM 相当の機能)、起動後は Z80 からは PIC をシリアル通信と SD カード用インターフェースを有した単なる I/O チップとして認識させることで PIC 側の必要な I/O 数を削減し、更に USB 対応の PIC を使用することで USB シリアル変換用の IC も不要な小型の Z80 ボード( Z80PicCompact と命名)の実現を目指したいと思います。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
また、「Z80GalCompactの制作(その2)部品実装」等の記事で書いた Z80GalCompact では Z80 を高速(20MHz)で動作させ、シリアル通信や SPI をソフトウェアで実現することで使用チップ数を減らし小型の Z80 ボードを目指しましたが、USB シリアル変換の IC を使う等したため、チップ数は多くなりました。
今回はリセット直後のマシンコードのみを PIC から提供し(ROM 相当の機能)、起動後は Z80 からは PIC をシリアル通信と SD カード用インターフェースを有した単なる I/O チップとして認識させることで PIC 側の必要な I/O 数を削減し、更に USB 対応の PIC を使用することで USB シリアル変換用の IC も不要な小型の Z80 ボード( Z80PicCompact と命名)の実現を目指したいと思います。
- USB 対応
PIC は USB 機能での使用例の多い PIC18F14K50 を使用したいを思います。
始めは少し古い情報を基に USB 機能を試していたのですが、コンパイラが C30 の例だったので XC8 対応しようとごちょごちょやっていました。その後、下記の参考資料3項目の Web ページに MPLABX の XC8 コンパイラで 2018年11月版の Microchip Libraries for Applications(MLA)を使った情報があることを見つけ、割合すんなりとUSB のサンプルが動作しました^^
しかし、PICKIT3 でディバッグモードに入ろうとすると下図のように debug header を要求されてしまいディバッグできませんorz
ディバッグモードへ移行する際のエラー
プロジェクトの設定内容を再確認してみると debug header を設定する項目があったので設定してみました(下図)。
Debug Header の設定
しかし、ディバッグモードに入ろうとすると debug header をロードできないというエラーが発生し、MPLAB X IDE や XC8 コンパイラを最新のものにバージョンアップ(それぞれ V6.00 と V2.40 )したりしても一向に変化がありません・・
ネットで関連情報を調べてみて判りました・・・・ debug header とはソフトウェアでは無く、ハードウェアであるということが orz
ここがマイクロチップ社の販売ページになります。マニュアルは「2006-2015 Microchip Technology Inc.DS50001292WProcessor Extension Pak (PEP)and Debug HeaderSpecification」です。
そういうことであればディバッグモードは諦めるしかないですねw
[参考資料]- PIC18F/LF1XK50データシート
- はじめての PIC : 18F14K50
- 砂町技研 : PIC18F14K50 で USB CDC デバイスを作る
- PICの動かせ方入門 : 18F14K50覚書
- ピンアサインの検討
今回使用予定の PIC18F14K50 は 20 ピンなので I/O 数がかなり少ないです。
必然的に超ケチケチ設計にならざるを得ないのですが、かえってこの部分の検討が面白い所でもあります。
処理中に入出力を切替えたり等してぎっちぎちに詰め込んだ結果が下表になります。
Z80PicCompact ピンアサイン(案)
最後の最後に残ったのが Z80 への RESET/ 信号をどう出すか・・です。
I/O は全て使い切り、しかもほとんどが 1bit で複数の信号を処理するようになっている・・
まぁ何とかなるだろうと思ってはいましたが、SD カードとの SPI インターフェースの DI 信号は SD 側が 3.3V のレベルで出力してくるので、RESET/ 出力時は これを出力側に切替え、出力信号のレベル差を利用して RESET/ 信号を作り出すというアクロバティックなアイディアが浮かびましたw
Z80 への RESET/ 信号の生成
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
Z80でEI直後のDI実行後の割込み許可状態 [Z80]
Z80 の EI(割込み許可)命令は割込み処理終了時の RET の直前で EI を実行した場合にスタックがオーバーフローしないように、EI の次の命令を実行してから割込み可能な状態になります。
それでは EI の直後に DI を実行した場合、結果として割込みは可能/禁止のどちらになっているのか??
確認してみましょう。
Z80 は LD A,I または LD A,R を実行した場合、フラグレジスタの P/V フラグに割込み許可状態を示す割込みフリップフロップ(IFF)の状態がコピーされます。
IFFは
0 : 割込み禁止
1 : 割込み可能
です。
Z80 のフラグレジスタの構成を下図に示します。
ディバッガ(ZSID)を使って検証してみました。(zsidm は使用する RST 命令を変更したもの)
フラグレジスタのコピーである L レジスタの値が 40H になっていて P/V フラグは立っていない(IFF=0)ことから「Z80 では EI 直後に DI を実行した結果として割込みは禁止状態になる」と言う結果でした。
上記で使用した IFF の確認方法は NMOS 版の Z80 にはバグがあるとのことが知られています。
・Z80のバグ
今回使用した Z80 は CMOS 版( Zilog 製の Z84C0020PEC )で、何度かやってみましたが同じ結果でした。
Z80 の EI 命令は次の命令の M1 サイクルの最終クロックで割込みフリップフロップ(IFF)を1にして割込み可能にします。
このため、EI 命令直後に割込みが入ると都合が悪いので EI 命令の RFSH サイクルの最初のクロックで IFF をクリアして EI 直後に割込みが入らないように実装されています。
Twitter 情報での eX1turboZ の場合は、上記の EI が IFF を設定するタイミング( Z80 では M1 )とクリアするタイミング( Z80 では RFSH )の順番が逆転しているものと推測されます。
つまり、「 Z80 では EI,EI の後方の EI では M1 で IFF がセットされ、 RFSH で IFF がクリアされますが eX1turboZ では IFF をクリア後、セットされるので DI,EI,EI,DI で割込みを受け付ける」と考えられます。
eX1turboZ が EI,EI で EI 直後に割込みを受け付けた場合、次の命令の M1 で IFF を設定する機能がどう動くかが気になりますね(IFF:1 の状態で割込み処理が動く可能性も考えられる)。
因みに Z80 が INT 信号をチェックするタイミングは各命令の最後のクロックの立上り時点であり、INT信号が有効(low)な場合は同クロック内で IFF がクリアされます。その後、インターラプトアクノリッジの M1 サイクルが実行されます。
尚、Z80 の細かい挙動に関しては Twitter で教えてもらった The Brain Dump のサイトに詳しく書かれています。
}
それでは EI の直後に DI を実行した場合、結果として割込みは可能/禁止のどちらになっているのか??
確認してみましょう。
Z80 は LD A,I または LD A,R を実行した場合、フラグレジスタの P/V フラグに割込み許可状態を示す割込みフリップフロップ(IFF)の状態がコピーされます。
IFFは
0 : 割込み禁止
1 : 割込み可能
です。
Z80 のフラグレジスタの構成を下図に示します。
Z80 のフラグレジスタ |
|
ディバッガ(ZSID)を使って検証してみました。(zsidm は使用する RST 命令を変更したもの)
EI 直後の DI 実行結果 |
---|
a>zsidm ZSIDM Ver 1.4 #a100 0100 DI 0101 EI 0102 DI 0103 LD A,I 0105 PUSH AF 0106 POP HL 0107 NOP 0108 NOP 0109 NOP 010A . #d100 10f 0100: F3 FB F3 ED 57 F5 E1 00 00 00 52 49 47 48 54 20 ....W.....RIGHT #g100 107 *0107 #x -Z--- A=00 B=0000 D=0000 H=0040 S=0100 P=0107 ----- A'00 B'0000 D'0000 H'0000 X=0000 Y=0000 NOP # |
フラグレジスタのコピーである L レジスタの値が 40H になっていて P/V フラグは立っていない(IFF=0)ことから「Z80 では EI 直後に DI を実行した結果として割込みは禁止状態になる」と言う結果でした。
上記で使用した IFF の確認方法は NMOS 版の Z80 にはバグがあるとのことが知られています。
・Z80のバグ
今回使用した Z80 は CMOS 版( Zilog 製の Z84C0020PEC )で、何度かやってみましたが同じ結果でした。
★追記 2022/09/23 {
Twitter で DI,EI,EI,DI を実行した場合は eX1turboZ では割込みを受け付ける( Sharp 製 Z80 の LH0080 では受け付けない)との情報を頂きました( DI,EI,DI では受け付けない)。Z80 の EI 命令は次の命令の M1 サイクルの最終クロックで割込みフリップフロップ(IFF)を1にして割込み可能にします。
このため、EI 命令直後に割込みが入ると都合が悪いので EI 命令の RFSH サイクルの最初のクロックで IFF をクリアして EI 直後に割込みが入らないように実装されています。
Twitter 情報での eX1turboZ の場合は、上記の EI が IFF を設定するタイミング( Z80 では M1 )とクリアするタイミング( Z80 では RFSH )の順番が逆転しているものと推測されます。
つまり、「 Z80 では EI,EI の後方の EI では M1 で IFF がセットされ、 RFSH で IFF がクリアされますが eX1turboZ では IFF をクリア後、セットされるので DI,EI,EI,DI で割込みを受け付ける」と考えられます。
eX1turboZ が EI,EI で EI 直後に割込みを受け付けた場合、次の命令の M1 で IFF を設定する機能がどう動くかが気になりますね(IFF:1 の状態で割込み処理が動く可能性も考えられる)。
因みに Z80 が INT 信号をチェックするタイミングは各命令の最後のクロックの立上り時点であり、INT信号が有効(low)な場合は同クロック内で IFF がクリアされます。その後、インターラプトアクノリッジの M1 サイクルが実行されます。
尚、Z80 の細かい挙動に関しては Twitter で教えてもらった The Brain Dump のサイトに詳しく書かれています。
}
フィラメント用ファンフードの製作 [3D_printer]
ずっと愛用していた3Dプリンタの調子が悪くなり、今回は思いの外復旧に手こずりました。
症状としては造形中にフィラメントが詰り、エクストルーダーのステッパーがカチカチと脱調する状態です。
今までも同様なトラブルは何度も発生していてノズルの清掃や交換で治っていました。ヒーター等が固着して取れない場合等、最悪の場合でもホットエンド以降を丸ごと交換で復旧していました。
今回は複合した原因で発生していた模様でノズルやスロート等を交換しても復旧しませんorz
スロートは交換用部品が 1 個しかなかった(今まで実績のないスロートにPTFEチューブが通るタイプのもの)に交換しても完全には修復せず、ヘッド関連の部品やセット物を何個か注文し、到着待ちの状態でした。円安の関係で海外通販はどんどん値上がりしていて更には V5 等の古いタイプの部品は品薄でもあり V6 や Volcano の部品に乗り換えられるように色々部品を調達しました。
試しにフィラメントが詰まった状態でフィラメントを抜き、 TPFE チューブを確認しても樹脂が付着していたりはしていません。TPFE チューブも抜き、スロート部分を確認するとノズルのネジ側が綺麗に見えるので特に問題は無さそうです。
下の写真はスロートを覗き込んだもので肉眼では見えないのでマニュアル操作で感でピント合わせして撮影したものです(何度もやり直して漸く撮れた)
しかしながら、エクストルーダーのバネを弱い方向に調整したらフィラメント送り用ステッパーが脱調する症状は解消しました。押し付け力が強すぎて回転に対する抵抗が大きくなっていたようです(フィラメントの送り抵抗に関してはエクストルーダーのフリーレバーを押した状態で確認していたのでなかなか気づけませんでした)。
原因調査の作業中にフィラメント用ファンフードの部品の一部を溶かしてしまいましたorz
3Dプリンタが復旧したので早々にファンフードをCADで設計してみました。
局面部分が多いので設計は面倒かと思っていましたが、DesignSpark Mechanical のブレンド機能を使用することで簡単に作成できました。
透明の PETG で出力したものが下の写真の奥側になります。手前にあるのは作業中に溶かした部品です。
今回は3Dプリンタが使えなくなった時間が長く、不便な状態が続きました。
ん~、何時でも好きなものを3Dプリンタで出力できる環境があるということはすばらしぃ・・と改めて実感しました。
★追記 2022/09/17
空気抵抗が大きそうだったので空気の出口を円に近い形状に変更しました。
症状としては造形中にフィラメントが詰り、エクストルーダーのステッパーがカチカチと脱調する状態です。
今までも同様なトラブルは何度も発生していてノズルの清掃や交換で治っていました。ヒーター等が固着して取れない場合等、最悪の場合でもホットエンド以降を丸ごと交換で復旧していました。
今回は複合した原因で発生していた模様でノズルやスロート等を交換しても復旧しませんorz
スロートは交換用部品が 1 個しかなかった(今まで実績のないスロートにPTFEチューブが通るタイプのもの)に交換しても完全には修復せず、ヘッド関連の部品やセット物を何個か注文し、到着待ちの状態でした。円安の関係で海外通販はどんどん値上がりしていて更には V5 等の古いタイプの部品は品薄でもあり V6 や Volcano の部品に乗り換えられるように色々部品を調達しました。
試しにフィラメントが詰まった状態でフィラメントを抜き、 TPFE チューブを確認しても樹脂が付着していたりはしていません。TPFE チューブも抜き、スロート部分を確認するとノズルのネジ側が綺麗に見えるので特に問題は無さそうです。
下の写真はスロートを覗き込んだもので肉眼では見えないのでマニュアル操作で感でピント合わせして撮影したものです(何度もやり直して漸く撮れた)
スロートの奥の状態 |
|
しかしながら、エクストルーダーのバネを弱い方向に調整したらフィラメント送り用ステッパーが脱調する症状は解消しました。押し付け力が強すぎて回転に対する抵抗が大きくなっていたようです(フィラメントの送り抵抗に関してはエクストルーダーのフリーレバーを押した状態で確認していたのでなかなか気づけませんでした)。
原因調査の作業中にフィラメント用ファンフードの部品の一部を溶かしてしまいましたorz
3Dプリンタが復旧したので早々にファンフードをCADで設計してみました。
フィラメントファンフードの設計 |
|
局面部分が多いので設計は面倒かと思っていましたが、DesignSpark Mechanical のブレンド機能を使用することで簡単に作成できました。
透明の PETG で出力したものが下の写真の奥側になります。手前にあるのは作業中に溶かした部品です。
フィラメントファンフード(従来部品と新部品) |
|
今回は3Dプリンタが使えなくなった時間が長く、不便な状態が続きました。
ん~、何時でも好きなものを3Dプリンタで出力できる環境があるということはすばらしぃ・・と改めて実感しました。
★追記 2022/09/17
空気抵抗が大きそうだったので空気の出口を円に近い形状に変更しました。
フィラメントファンフードの設計(変更) |
|
ヒートシンク用冷却ファンのガード部品の製作 [3D_printer]
円安が進み、遂に 140.56 円になってしまいました(2022/09/05 22:00 現在)。従来は格安だった中華製品も軒並み値上がりしています。
以前は 500 円を切る値段で 4 個購入できた 40 mm サイズのファンが今では 1 個で 250 円程になっていますorz
ヒートシンク用に使っているこのファンは回転する羽が剥き出しの状態なので造形開始直前にピンセットでノズルのお漏らしを取り除く際に羽を破損してしまうことが稀にあります。
初めて羽を破損した際に「今後十分気を付けよう」と思ったのですが再度破損してしまったという経緯があります。
注意力が散漫になっていることを検出できて他の大きな破損を未然に防げる・・というような前向きな考えも可能ですが前述のように部品代が値上がりしているのでファンをガードする部品を3Dプリンタで作ることにしました。
最初に考えた案は下図のようにファンを覆うような構造のものです。
ファンに取付けた状態が下の写真になります。
実際に3Dプリンタに取付けてみるとファンのすぐ上にあるロッドジョイントに干渉すること、及びファンの取付ネジ用の穴に入れる十字の切れ込みを入れた部分が細か過ぎてうまく出力できなかったので下図のように改善してみました。
★変更 2022/09/06 デザインを若干更新しました(下の写真も更新)
3Dプリンタで出力し、ファンに取付けた状態が下の写真になります。ネジ穴に入る部分を少し太くしたので十分サポートされています。
空気が取り入れ口が2~3割塞がれてしまうこと、及びピンセットの先がまだ入れられる状態であることが気になりますが、暫くこれで運用してみたいと思います。
★追記 2022/09/10
下記の理由で上記のファンガードは取り外しました。
★追記 2022/09/07
遂に144円台に突入している・・ (下図は Google Finance より)
★追記 2022/09/07 23:08
止まらない・・・
以前は 500 円を切る値段で 4 個購入できた 40 mm サイズのファンが今では 1 個で 250 円程になっていますorz
ヒートシンク用に使っているこのファンは回転する羽が剥き出しの状態なので造形開始直前にピンセットでノズルのお漏らしを取り除く際に羽を破損してしまうことが稀にあります。
ヒートシンク用冷却ファン |
|
初めて羽を破損した際に「今後十分気を付けよう」と思ったのですが再度破損してしまったという経緯があります。
注意力が散漫になっていることを検出できて他の大きな破損を未然に防げる・・というような前向きな考えも可能ですが前述のように部品代が値上がりしているのでファンをガードする部品を3Dプリンタで作ることにしました。
最初に考えた案は下図のようにファンを覆うような構造のものです。
ヒートシンク用ファンガードの最初の案(CAD画面) |
|
ファンに取付けた状態が下の写真になります。
ヒートシンク用ファンガードの最初の案 |
|
実際に3Dプリンタに取付けてみるとファンのすぐ上にあるロッドジョイントに干渉すること、及びファンの取付ネジ用の穴に入れる十字の切れ込みを入れた部分が細か過ぎてうまく出力できなかったので下図のように改善してみました。
ヒートシンク用ファンガードの改善案(CAD画面) |
|
★変更 2022/09/06 デザインを若干更新しました(下の写真も更新)
3Dプリンタで出力し、ファンに取付けた状態が下の写真になります。ネジ穴に入る部分を少し太くしたので十分サポートされています。
ヒートシンク用ファンガードの改善案 |
|
空気が取り入れ口が2~3割塞がれてしまうこと、及びピンセットの先がまだ入れられる状態であることが気になりますが、暫くこれで運用してみたいと思います。
★追記 2022/09/10
下記の理由で上記のファンガードは取り外しました。
- ファンガードを付けるとファンの音が結構大きくなった
- ファン 4 個を 5 百円未満で購入できるところがあったので注文した
★追記 2022/09/07
遂に144円台に突入している・・ (下図は Google Finance より)
ドル価格の推移 |
|
★追記 2022/09/07 23:08
止まらない・・・
ドル価格の推移2 |
|