PPI(8255A)ボード [8bitマイコン]
昨日に続いてパラレルポート。
80系の8255Aというパラレルインテーフェース。
非常にシンプルな石で昔の定番で68系のマイコンシステムであってもよく使われていたが、3組の8bitポートがあり、A、BポートがIN,OUTどちらかにしか設定できず、Cポートのみ上位、下位4bit単位でIN,OUTを切り替えられる、まさしくパラレルポートが難点ではあったか?
今、この手のものはGPIO(General Purpos I/O)という言い方をしてbit単位で使う、つまりbit毎にIN/OUTを指定できるのが普通なのでその辺が使いにくいところではある。
PIAボードと同様にPPIを2個搭載。I/Oコネクタは、PPIが8bitポート3組なので34Pのモノを使用。
このコネクタ、昔Oh!PCという雑誌で連載されていたPC工作入門(だったかな?)の8255インターフェースボードにピン配置を合わせている。
違いは「PC工作入門」の方は±12Vを出しているが、こっちのボードはないのでN.C.
では、昨日に続いてMC6802ボードでテスト。
これまた露出を落としてもわかりにくいが一応動作はOK。ボードが4枚立っているが、昨日のPIAボードが刺さったまま。アドレスが違うので影響なし。
続いて80系CPUで確認。
と思ったら8085ボードが動かない(苦笑)。シリアルでエコーバックするだけの簡単なテストプログラムは動くので、どうやらモニタのようだが、去年8085の記事をあげてからそういえば少し手を入れたような…?
もう1年近く前の事なので何をどういじったのか覚えてない。
やはりGit等でバージョン管理するべきかな?
気を取り直してZ80ボードで確認。
これも光っているのかいないのか、全然わからない写真になってしまっているが一応動作OK。
今後I/Oを試して遊ぶにはタイマは必要になってくるので、タイマ使える8085ボードの方が都合いいのだが…
MC6802ボードもタイマ使えないので、I/Oで遊ぶには別のボードかな?
80系の8255Aというパラレルインテーフェース。
非常にシンプルな石で昔の定番で68系のマイコンシステムであってもよく使われていたが、3組の8bitポートがあり、A、BポートがIN,OUTどちらかにしか設定できず、Cポートのみ上位、下位4bit単位でIN,OUTを切り替えられる、まさしくパラレルポートが難点ではあったか?
今、この手のものはGPIO(General Purpos I/O)という言い方をしてbit単位で使う、つまりbit毎にIN/OUTを指定できるのが普通なのでその辺が使いにくいところではある。
PIAボードと同様にPPIを2個搭載。I/Oコネクタは、PPIが8bitポート3組なので34Pのモノを使用。
このコネクタ、昔Oh!PCという雑誌で連載されていたPC工作入門(だったかな?)の8255インターフェースボードにピン配置を合わせている。
違いは「PC工作入門」の方は±12Vを出しているが、こっちのボードはないのでN.C.
では、昨日に続いてMC6802ボードでテスト。
これまた露出を落としてもわかりにくいが一応動作はOK。ボードが4枚立っているが、昨日のPIAボードが刺さったまま。アドレスが違うので影響なし。
続いて80系CPUで確認。
と思ったら8085ボードが動かない(苦笑)。シリアルでエコーバックするだけの簡単なテストプログラムは動くので、どうやらモニタのようだが、去年8085の記事をあげてからそういえば少し手を入れたような…?
もう1年近く前の事なので何をどういじったのか覚えてない。
やはりGit等でバージョン管理するべきかな?
気を取り直してZ80ボードで確認。
これも光っているのかいないのか、全然わからない写真になってしまっているが一応動作OK。
今後I/Oを試して遊ぶにはタイマは必要になってくるので、タイマ使える8085ボードの方が都合いいのだが…
MC6802ボードもタイマ使えないので、I/Oで遊ぶには別のボードかな?
PIA(MC6821)ボード [8bitマイコン]
今まではほぼCPUのみを動かしてきたので周辺の話。
CPUをスタンドアローンのマイコンとして動かすために、コンソールとしてシリアルは必然的に使ってきたので、今回はパラレルポート。
まずは68系のMC6821。
10×7cmの基板にMC6821を2個。日立製のHD46821のBバージョン。
パターン配線の都合で向きをそろえていないので実装は要注意。
それぞれ26Pでポート出し。
MC6821は8bitポートが2組。それぞれに2bit補助の補助ポート。
各ポート毎に割り込みをだせるようになっているのでジャンパで設定できるようにした。
下4個のLEDとスイッチはMC6821のCA1(2)、CB1(2)確認用。
とりあえずテスト用のボードも作成。
この程度のものはどうせ1枚しか必要としないし、ユニバーサル基板で手配線で組んでもいいのだけど、最近はこの程度のものでも億劫になってきたので(苦笑)
コネクタは26PがPIA(MC6821)用、34PがPPI(8255A)用。
PIAからPAが出力でLED8個、PBが入力でスイッチ。
PPIの場合はさらにPCも出力でLED8個。
テストはMC6802の基板で。
バスは80系と68系で共有できるようにしてはいるが、E信号は80系のCPUボードからは
出すようにしていないので、80系CPUボードからは使えない。
簡単なテストプログラムを組んで、前回の68系モニタからロードして実行。
電源用LEDみたいにスモークモールドのLEDでないので、指向性が強くわかりにくいので露出を落としてみたがそれでもわかりにくいか…
さて、具体的にどう使うかは別の話だが、だいぶ先の話でもあるかな?
CPUをスタンドアローンのマイコンとして動かすために、コンソールとしてシリアルは必然的に使ってきたので、今回はパラレルポート。
まずは68系のMC6821。
10×7cmの基板にMC6821を2個。日立製のHD46821のBバージョン。
パターン配線の都合で向きをそろえていないので実装は要注意。
それぞれ26Pでポート出し。
MC6821は8bitポートが2組。それぞれに2bit補助の補助ポート。
各ポート毎に割り込みをだせるようになっているのでジャンパで設定できるようにした。
下4個のLEDとスイッチはMC6821のCA1(2)、CB1(2)確認用。
とりあえずテスト用のボードも作成。
この程度のものはどうせ1枚しか必要としないし、ユニバーサル基板で手配線で組んでもいいのだけど、最近はこの程度のものでも億劫になってきたので(苦笑)
コネクタは26PがPIA(MC6821)用、34PがPPI(8255A)用。
PIAからPAが出力でLED8個、PBが入力でスイッチ。
PPIの場合はさらにPCも出力でLED8個。
テストはMC6802の基板で。
バスは80系と68系で共有できるようにしてはいるが、E信号は80系のCPUボードからは
出すようにしていないので、80系CPUボードからは使えない。
簡単なテストプログラムを組んで、前回の68系モニタからロードして実行。
電源用LEDみたいにスモークモールドのLEDでないので、指向性が強くわかりにくいので露出を落としてみたがそれでもわかりにくいか…
さて、具体的にどう使うかは別の話だが、だいぶ先の話でもあるかな?
モトローラフリーアセンブラをWIndowsで [8bitマイコン]
68系の開発にモトローラのフリーアセンブラを使用しているが、これはMS-DOS時代のソフト(いや元々はunix系だったのかな?)で今のWindowsでは直接は動かない。ただこのアセンブラはソースも公開されているのでリコンパイルしてWindowsで動くようにしてみる。
さて、ソースは確かAMIGA版のやつがソース付だったと思ったが、今現在AMIGAは動作出来る状態にない。ネットであさるとGithubで難なく見つかった。
https://github.com/JimInCA/motorola-6800-assembler
ただし、公開者が色々手を入れてるみたいで完全なオリジナルではない。
Linuxでmakeできるようになっているが、このソースを利用してWindowsで動くようにしてみる。
(1)Windows Subsystem for Linux
これはLinuxだからそのまんま。
すっぴんのWindows Subsystem for Linuxはgccもmakeも入ってないのでインストールする必要があるが、makeするだけ。
当然だがWindowsのコマンドプロンプトから実行できるわけではない。
(2)コマンドプロンプトからmake
コマンドプロンプト、あるいはPowerShellからmakeできるか?
まずはVisual C++。
makefileをVisualC向けに書き直してみたがでエラー。
gnu系のmakeとnmakeでは書式が違ったかな?
bcc32(C++Builder)でmakeしてもだめ。Borlandのmakeはnmakeと同じだったような気もする。
もう何年(十何年)?もmakefileなんか書いてないし、すっかり忘れているのでこれ以上追求するのはやめ。
(3)C++ Builder
次に(Vsual Studioでもできるが)C++Builderの統合開発環境。
C++Builderを起動し、新規作成→その他→コンソールアプリケーションでプロジェクトを作る。
ターゲットフレームワークなし。
ソースの種類はC、マルチスレッドとプロジェクトソースの指定のチェックをはずす。
プロジェクトグループとグループ所属の空のプロジェクトが作成される。
プロジェクトグループ名はオリジナルのあわせてmotoasmとでもし、プロジェクトはas0(6800用アセンブラ)と変更しておく。
プロジェクトも一つ同時に作られるがプロジェクト名を
プロジェクトのあるフォルダにアセンブラソースを全部コピー。
プロジェクトas0に対して「プロジェクトに追加」でソースを追加。
ソースはdo*.c、table*.cが各CPUの個別ソースでそれ以外は共通。
なのでプロジェクトas0(6800向アセンブラ)ならdo0.c、table0.cとそれ以外を全部追加。
念のためヘッダファイルもプロジェクトに追加。
プロジェクト新規作成時にできたデフォルトのソースとヘッダは削除。
同様にプロジェクトグループに対してプロジェクト(as1,as4,as5,as9,as11)を新規追加していく。
そしてそれぞれのプロジェクトにソース(do*.c,table*.cだけ各個でそれ以外は全部同じものを指定)を追加していく。
それが終了したら全てのプロジェクトをビルド。as0,as1,as4,as5,as9,as11が一気にビルドされる。
ビルドするとヘッダファイル"unistd.h"がないとエラーがでる。
"unistd.h"はunix系依存のヘッダファイル
エラーがでるinclude行をコメントアウトしてリビルドをかけると警告はでるがエラーもなく成功する。
警告はopen,close,read,write,create,lseek。
今は使わない古い関数ですね。
fopen等に変更すればいいはずだが、ソースを色々いじる必要があるので"io.h"で代用。これで警告もなくなる。
今までのソース等いくつかアセンブルさせてみたが問題なくアセンブルできているもよう。
まぁ全てのCPU版を試したわけではないが、とりあえず問題なさそう。
あとは今使ってるROMライタにあわせて、IntelHexをはけるようにできれば…
さて、ソースは確かAMIGA版のやつがソース付だったと思ったが、今現在AMIGAは動作出来る状態にない。ネットであさるとGithubで難なく見つかった。
https://github.com/JimInCA/motorola-6800-assembler
ただし、公開者が色々手を入れてるみたいで完全なオリジナルではない。
Linuxでmakeできるようになっているが、このソースを利用してWindowsで動くようにしてみる。
(1)Windows Subsystem for Linux
これはLinuxだからそのまんま。
すっぴんのWindows Subsystem for Linuxはgccもmakeも入ってないのでインストールする必要があるが、makeするだけ。
当然だがWindowsのコマンドプロンプトから実行できるわけではない。
(2)コマンドプロンプトからmake
コマンドプロンプト、あるいはPowerShellからmakeできるか?
まずはVisual C++。
makefileをVisualC向けに書き直してみたがでエラー。
gnu系のmakeとnmakeでは書式が違ったかな?
bcc32(C++Builder)でmakeしてもだめ。Borlandのmakeはnmakeと同じだったような気もする。
もう何年(十何年)?もmakefileなんか書いてないし、すっかり忘れているのでこれ以上追求するのはやめ。
(3)C++ Builder
次に(Vsual Studioでもできるが)C++Builderの統合開発環境。
C++Builderを起動し、新規作成→その他→コンソールアプリケーションでプロジェクトを作る。
ターゲットフレームワークなし。
ソースの種類はC、マルチスレッドとプロジェクトソースの指定のチェックをはずす。
プロジェクトグループとグループ所属の空のプロジェクトが作成される。
プロジェクトグループ名はオリジナルのあわせてmotoasmとでもし、プロジェクトはas0(6800用アセンブラ)と変更しておく。
プロジェクトも一つ同時に作られるがプロジェクト名を
プロジェクトのあるフォルダにアセンブラソースを全部コピー。
プロジェクトas0に対して「プロジェクトに追加」でソースを追加。
ソースはdo*.c、table*.cが各CPUの個別ソースでそれ以外は共通。
なのでプロジェクトas0(6800向アセンブラ)ならdo0.c、table0.cとそれ以外を全部追加。
念のためヘッダファイルもプロジェクトに追加。
プロジェクト新規作成時にできたデフォルトのソースとヘッダは削除。
同様にプロジェクトグループに対してプロジェクト(as1,as4,as5,as9,as11)を新規追加していく。
そしてそれぞれのプロジェクトにソース(do*.c,table*.cだけ各個でそれ以外は全部同じものを指定)を追加していく。
それが終了したら全てのプロジェクトをビルド。as0,as1,as4,as5,as9,as11が一気にビルドされる。
ビルドするとヘッダファイル"unistd.h"がないとエラーがでる。
"unistd.h"はunix系依存のヘッダファイル
エラーがでるinclude行をコメントアウトしてリビルドをかけると警告はでるがエラーもなく成功する。
警告はopen,close,read,write,create,lseek。
今は使わない古い関数ですね。
fopen等に変更すればいいはずだが、ソースを色々いじる必要があるので"io.h"で代用。これで警告もなくなる。
今までのソース等いくつかアセンブルさせてみたが問題なくアセンブルできているもよう。
まぁ全てのCPU版を試したわけではないが、とりあえず問題なさそう。
あとは今使ってるROMライタにあわせて、IntelHexをはけるようにできれば…
マイコン制御PIC [8bitマイコン]
今回はPICの話。
ちょっと長いし文章だけなんですみません。
今までのCPUボードには全てPICを載せている。
主にクロック、RESET生成とUSB-シリアル変換に使っている。
元々の動機はUSB-シリアル変換。
今時のPCにはCOMポートがついていない。
この手の遊びをしている人の多くは、市販のUSB-シリアル変換基板と使っているが個人的にはどうもスマートではない。
変換チップをボードに搭載してしまうのも手だが、最近の変換チップは多機能多ピンのものばかりで、ピンのピッチも細かくて手半田はかなり厳しい。以前はフロー制御線を省略した少ピンでピンピッチも比較的広いチップも手に入ったんだけどね。
で、目を付けたのがPIC16F1454。DIP14Pinだから個人でも扱いやすく、小さくあまりスペースを取らない。5V動作というところも古いマイコンの周辺として使うのに都合が良い。なにより安い。
あと、外付けの水晶発振子を必要としない。USBは通信クロックにそれなりの精度を要求するので、ほとんどのUSBマイコンはUSBを使う場合は外部に水晶発振子を必要とするが、これは内部発振でUSBを可能としている珍しいチップ。
ただし、USBが使えるだけあって安定はしているのだろうけど、発信周波数は12MHzぴったりというわけでもなさそうだ。
少ピンとはいえピンはあまるので、7×10cmの小さな基板上のパーツ点数を減らすべく他にも機能を割り当てた。
ファームウェアはUSBのCDCクラスとなるように組む必要があるが、統合開発環境MPLABのプラグインMCC(MPLAB Code Configurator)を使えば自動生成してくる。多少システムにあわせてカスタマイズする必要もあるが。
ではこのマイコン制御チップであるPICの機能であるが
(1)USB-シリアル変換
一番メインとなる部分。
USBのファームは一から作るとなるとかなり面倒だがMCCのおかげでかなり楽ちん。
シリアル側もMCCで生成。これらに限らず内蔵ペリフェラルは全てMCCで。
ドライバと呼ばれる部分を生成するだけなので、もちろん一方で受信したら他方へ送信というメイン処理は自分で書かなくてはいけない。
(2)CPUクロック生成
CPUにクロックを供給。
このPICはシステムクロックを出力する機能があり、システムクロックを1/2**n分周を出力してくれる。
USB機能を使うとシステムクロックは48MHzになるので、生成クロックは
48,24,12,6,3MHz
となる。
Z80だとBバージョンで6MHz。Aだと3MHzにするしかない。
8085だと6MHz入力で3MHz動作。
68系は4分周されるので、6MHz入力で1.5MHzとなりAバージョン。
6809や6303ならCバージョンを使うと12MHz入力で3MHz動作が可能となる。
ただ先にも書いたが発信周波数は正確ではないようで、6MHz生成しているつもりが6.4MHzでていたりする。一方でほぼ6MHzでる場合もあり、これは個体差なのかロット差なのかまだ何ともいえない。
周波数的にいまいち使いにくいが水晶発振子(器)の節約になる。
(3)ボーレートクロック生成
マイコン側8251、6850等のシリアルチップ向けにボーレートクロックを出力。
通常9600bps想定で、その16倍となる153.6Kbpsを出力。6801の場合は8倍の76.8Kbps。
ボーレートの許容誤差は一般的に5%と言われているが、16倍クロック入力の場合だいたい1/16で6.25%。
このボーレートもPICのシステムクロックから生成しているわけで、CPUクロック生成6MHzのつもりが6.4MHzになっているとすると、6.67%のずれで許容範囲外なのだが、PIC内部のシリアルボーレートも、同じPICシステムクロックから生成しているので、ぴったしあって問題なし。あくまで9600からずれているというだけ。
(4)リセット信号生成
パワーオン時とリセット入力ピンがLowになった時に、リセット出力ピンをLowに。
リセット入力ピンがHighになってから約120msリセットを持続。
自分が知る限り一番長いRESETを要求しているのは68000で100ms。
少し余裕を見て120msにしている。
リセットは単純でありながら奥が深く昔からトラブルが多い。
アナログ的要素が強いからでもあるが、マイコンでON-OFFしてやるのが単純で簡単。
マイコンのファームウェアで制御しているわけだからある意味複雑とも言えるが。
リセット入力は使用しているポートがプルアップ付なのでスイッチをつなげるだけ。
(5)タイマ出力
10msでワンショットパルスを出すようにしている。定周期タイマとして使えるように。
10ms経過で単純にソフトでONしてOFFしているだけなので、ひょっとしたらパルスが短すぎて認識できないCPUがあるかもしれないが。
8085ボードではRST7.5に入れて定周期タイマとして使えるようにしている。今のところ問題なく動作している。
8085にあわせて通常LowでHiアクティブ。
その他CPU用では論理を逆にしているが、使っているボードは今のところない。
(6)オプション選択
余ったピンを使って動作選択できるようにしていて、今のところボーレート切替。
リセット中にチェックしてHiで9600、Lowで19200に切り替えるようにしているが、現状使っていないので動作確認はできていない。
とまぁこんな感じに機能を盛り込んだので、Z80ボードなんかはICはこれとZ80CPU,SIOの3チップ構成で済んでいる。
問題点
まだ残っている問題点として、
例えばPCでteratermを端末に利用するとしよう。マイコンボード側のボーレートが9600だからCOMポートの設定も9600にしたとしても、USBの通信速度が9600bpsになるわけではない。USB機器がCDCクラスだからCOMポートの振りをしているだけで、ハードはUSBであり12Mbpsで通信されてしまう。たぶんデータ長とかはソフト的なプロトコルだから意味があるだろうし、ハードフロー制御を使ったらそのようにエミュレーションするからこれも意味があるが、通信速度は無視される。ちなみにPIC側のファームでUSB CDCクラスの通信速度を設定する項目はない。
これはどうなるかというと、たとえばマイコン側のモニタでHEXファイルをロードしようとした時、teratermなんかでファイル転送するとPCからUSB経由でPICへは12Mbpsで転送されてしまい、PIC内部でバッファオーバフローを起こす。
この辺、市販のUSB-シリアル変換基板、あるいはチップはよくできている。
しかたがないのでteratermの設定でファイル転送時、文字間に1msのwaitを入れるようにしている。
ちょっと長いし文章だけなんですみません。
今までのCPUボードには全てPICを載せている。
主にクロック、RESET生成とUSB-シリアル変換に使っている。
元々の動機はUSB-シリアル変換。
今時のPCにはCOMポートがついていない。
この手の遊びをしている人の多くは、市販のUSB-シリアル変換基板と使っているが個人的にはどうもスマートではない。
変換チップをボードに搭載してしまうのも手だが、最近の変換チップは多機能多ピンのものばかりで、ピンのピッチも細かくて手半田はかなり厳しい。以前はフロー制御線を省略した少ピンでピンピッチも比較的広いチップも手に入ったんだけどね。
で、目を付けたのがPIC16F1454。DIP14Pinだから個人でも扱いやすく、小さくあまりスペースを取らない。5V動作というところも古いマイコンの周辺として使うのに都合が良い。なにより安い。
あと、外付けの水晶発振子を必要としない。USBは通信クロックにそれなりの精度を要求するので、ほとんどのUSBマイコンはUSBを使う場合は外部に水晶発振子を必要とするが、これは内部発振でUSBを可能としている珍しいチップ。
ただし、USBが使えるだけあって安定はしているのだろうけど、発信周波数は12MHzぴったりというわけでもなさそうだ。
少ピンとはいえピンはあまるので、7×10cmの小さな基板上のパーツ点数を減らすべく他にも機能を割り当てた。
ファームウェアはUSBのCDCクラスとなるように組む必要があるが、統合開発環境MPLABのプラグインMCC(MPLAB Code Configurator)を使えば自動生成してくる。多少システムにあわせてカスタマイズする必要もあるが。
ではこのマイコン制御チップであるPICの機能であるが
(1)USB-シリアル変換
一番メインとなる部分。
USBのファームは一から作るとなるとかなり面倒だがMCCのおかげでかなり楽ちん。
シリアル側もMCCで生成。これらに限らず内蔵ペリフェラルは全てMCCで。
ドライバと呼ばれる部分を生成するだけなので、もちろん一方で受信したら他方へ送信というメイン処理は自分で書かなくてはいけない。
(2)CPUクロック生成
CPUにクロックを供給。
このPICはシステムクロックを出力する機能があり、システムクロックを1/2**n分周を出力してくれる。
USB機能を使うとシステムクロックは48MHzになるので、生成クロックは
48,24,12,6,3MHz
となる。
Z80だとBバージョンで6MHz。Aだと3MHzにするしかない。
8085だと6MHz入力で3MHz動作。
68系は4分周されるので、6MHz入力で1.5MHzとなりAバージョン。
6809や6303ならCバージョンを使うと12MHz入力で3MHz動作が可能となる。
ただ先にも書いたが発信周波数は正確ではないようで、6MHz生成しているつもりが6.4MHzでていたりする。一方でほぼ6MHzでる場合もあり、これは個体差なのかロット差なのかまだ何ともいえない。
周波数的にいまいち使いにくいが水晶発振子(器)の節約になる。
(3)ボーレートクロック生成
マイコン側8251、6850等のシリアルチップ向けにボーレートクロックを出力。
通常9600bps想定で、その16倍となる153.6Kbpsを出力。6801の場合は8倍の76.8Kbps。
ボーレートの許容誤差は一般的に5%と言われているが、16倍クロック入力の場合だいたい1/16で6.25%。
このボーレートもPICのシステムクロックから生成しているわけで、CPUクロック生成6MHzのつもりが6.4MHzになっているとすると、6.67%のずれで許容範囲外なのだが、PIC内部のシリアルボーレートも、同じPICシステムクロックから生成しているので、ぴったしあって問題なし。あくまで9600からずれているというだけ。
(4)リセット信号生成
パワーオン時とリセット入力ピンがLowになった時に、リセット出力ピンをLowに。
リセット入力ピンがHighになってから約120msリセットを持続。
自分が知る限り一番長いRESETを要求しているのは68000で100ms。
少し余裕を見て120msにしている。
リセットは単純でありながら奥が深く昔からトラブルが多い。
アナログ的要素が強いからでもあるが、マイコンでON-OFFしてやるのが単純で簡単。
マイコンのファームウェアで制御しているわけだからある意味複雑とも言えるが。
リセット入力は使用しているポートがプルアップ付なのでスイッチをつなげるだけ。
(5)タイマ出力
10msでワンショットパルスを出すようにしている。定周期タイマとして使えるように。
10ms経過で単純にソフトでONしてOFFしているだけなので、ひょっとしたらパルスが短すぎて認識できないCPUがあるかもしれないが。
8085ボードではRST7.5に入れて定周期タイマとして使えるようにしている。今のところ問題なく動作している。
8085にあわせて通常LowでHiアクティブ。
その他CPU用では論理を逆にしているが、使っているボードは今のところない。
(6)オプション選択
余ったピンを使って動作選択できるようにしていて、今のところボーレート切替。
リセット中にチェックしてHiで9600、Lowで19200に切り替えるようにしているが、現状使っていないので動作確認はできていない。
とまぁこんな感じに機能を盛り込んだので、Z80ボードなんかはICはこれとZ80CPU,SIOの3チップ構成で済んでいる。
問題点
まだ残っている問題点として、
例えばPCでteratermを端末に利用するとしよう。マイコンボード側のボーレートが9600だからCOMポートの設定も9600にしたとしても、USBの通信速度が9600bpsになるわけではない。USB機器がCDCクラスだからCOMポートの振りをしているだけで、ハードはUSBであり12Mbpsで通信されてしまう。たぶんデータ長とかはソフト的なプロトコルだから意味があるだろうし、ハードフロー制御を使ったらそのようにエミュレーションするからこれも意味があるが、通信速度は無視される。ちなみにPIC側のファームでUSB CDCクラスの通信速度を設定する項目はない。
これはどうなるかというと、たとえばマイコン側のモニタでHEXファイルをロードしようとした時、teratermなんかでファイル転送するとPCからUSB経由でPICへは12Mbpsで転送されてしまい、PIC内部でバッファオーバフローを起こす。
この辺、市販のUSB-シリアル変換基板、あるいはチップはよくできている。
しかたがないのでteratermの設定でファイル転送時、文字間に1msのwaitを入れるようにしている。
オリジナルベースボード [8bitマイコン]
ワンボードで動く基板は最初のHD6301のものだけで、あとは2枚以上の組み合わせで動く基板になってしまったわけだが、その連結にGUPPYのマザーボードを利用していたがそれも基板をおこしてみた。
最大4枚の基板を搭載できるのと、ついでに電源の供給と電源スイッチ。一応プルアップ抵抗を入れたが、アドレス線、データ線、制御信号線(MREQ,IORQ,RD,WR)はそれぞれの単位でジャンパで選択できるようにしてみた。
クロックや割り込み関係、リセット等はプルアップは個別にした。これらは抵抗値を選択する必要になる場合があるため。ただ、今回は全て何も考えず10Kに統一。
この手の物は専用のラックがあってガイドレールが付いていてまっすぐ抜き差しできるのだが、裸の状態ではピンを曲げずに抜くのに気をつかう。
コネクタの間隔をなんとなく20mmにしてしまったが、基板の厚みをすっかり失念してしまったので既存のスペーサ等で連結固定することはできない。ちょっとぐらぐらするが固定運用することはないと思うので、まあいいか…。
追加することがあれば基板の厚み分(1.6mm)間隔をあけるのだが、追加することはないだろうな…
接続例はこれ
GUPPYのベースボードの時と同じZ80CPUボードとメモリボードを使用。
ベースボード側からスマフォ用の充電器で給電。CPUボードにもシリアル通信用USBからと、それとは別にUSB給電をジャンパで選択できるようにしてあるが、ジャンパ外してどちらもカット。
ついでにスタック接続用の基板も同じZ80とメモリで作ってみた。
今時の流行というか、こっちが主流ですね。40Pの連結ソケットなるものも、RaspberryPiのおかげか手に入りやすいし。
連結ソケットは間隔がだいたい10mmになるのだが、ICにソケットを利用するとIC上面と上部基板の端子が接触するので少し浮かしている(笑)
ROMの入れ替えを頻繁に行うだろうな?と思ってCPUボードをベースにしてメモリをスタックさせたが、リセットスイッチを押せない(笑)
最初からこういう事を想定していたら、リセットスイッチを基板端に寄せていただろうに。
こちらはシリアル通信用USBコネクタから給電。
ちょっと動作が不安定。プルアップが一切入っていないからかな?
最大4枚の基板を搭載できるのと、ついでに電源の供給と電源スイッチ。一応プルアップ抵抗を入れたが、アドレス線、データ線、制御信号線(MREQ,IORQ,RD,WR)はそれぞれの単位でジャンパで選択できるようにしてみた。
クロックや割り込み関係、リセット等はプルアップは個別にした。これらは抵抗値を選択する必要になる場合があるため。ただ、今回は全て何も考えず10Kに統一。
この手の物は専用のラックがあってガイドレールが付いていてまっすぐ抜き差しできるのだが、裸の状態ではピンを曲げずに抜くのに気をつかう。
コネクタの間隔をなんとなく20mmにしてしまったが、基板の厚みをすっかり失念してしまったので既存のスペーサ等で連結固定することはできない。ちょっとぐらぐらするが固定運用することはないと思うので、まあいいか…。
追加することがあれば基板の厚み分(1.6mm)間隔をあけるのだが、追加することはないだろうな…
接続例はこれ
GUPPYのベースボードの時と同じZ80CPUボードとメモリボードを使用。
ベースボード側からスマフォ用の充電器で給電。CPUボードにもシリアル通信用USBからと、それとは別にUSB給電をジャンパで選択できるようにしてあるが、ジャンパ外してどちらもカット。
ついでにスタック接続用の基板も同じZ80とメモリで作ってみた。
今時の流行というか、こっちが主流ですね。40Pの連結ソケットなるものも、RaspberryPiのおかげか手に入りやすいし。
連結ソケットは間隔がだいたい10mmになるのだが、ICにソケットを利用するとIC上面と上部基板の端子が接触するので少し浮かしている(笑)
ROMの入れ替えを頻繁に行うだろうな?と思ってCPUボードをベースにしてメモリをスタックさせたが、リセットスイッチを押せない(笑)
最初からこういう事を想定していたら、リセットスイッチを基板端に寄せていただろうに。
こちらはシリアル通信用USBコネクタから給電。
ちょっと動作が不安定。プルアップが一切入っていないからかな?
8ビットマイコン基板 [8bitマイコン]
MC6801関係でぼちぼち遊んでる間も、別のものに浮気してたりしてその成果物を。
1.8085CPUボード
既に基板はできあがってきてます。
主要な石は8085とシリアル通信用の8251、USB変換のPIC1454。
あとはTTLが3個程度。
メモリを搭載すれば動かせますが、メモリは別ボードで。
このPICはMC6801の時に使った物と基本的に同じ。
CPUクロックとボーレート用クロックとリセット。
実はこの基板だけ電源用USBコネクタは搭載していない。
部品点数的にすかすかの基板だけど、
そのコネクタ一つ追加するだけで配線に苦労するようになったので。
縦横、ICの向きがかわっているのもその影響。
6801の時と同じで、基本的にKiCadの全自動配線を利用。
全部自動で配線させてみては、その結果をみて配置を変更を繰り返し
残未配線が数本で、手動で通せそうなら残りを手動でやり完成。
2.Z80CPUボード
こちらはZ80版。Z80は同じZ80ファミリで作ると非常にシンプルになり
Z80CPU、Z80SIO、PICのみとなりTTLはなし。
そのおかげもあって、こちらはUSB電源コネクタを搭載。
Z80SIOは2チャンネルあるので片方も使えるようにだけはしておいた。
3.メモリボード
64KBのメモリボード。
基本的に32KBのSRAMと32KBのROMを搭載するようになっている。
このメモリボードは使い回しできるように、色々よけいな回路を組み入れていて
(1)CPUボードと接続するためのメモリストローブ信号として80系ではMREQを想定しているが
68系ではEを割り当てストローブ代わりに。
MREQは負論理だけどEは正論理なのでジャンパで切り替えられるように。
(2)80系はリセットが0スタートなのに対して、68系は$FFFEがリセットベクタなので
ROM、RAMの配置をアドレス逆転できるように。こちらは6Pスイッチを想定。
(3)ROMをRAMに変更して全RAMにできるように。これは後々を考えて。
そのため28pinのメモリを3個搭載できるようになってるが同時使用は2個。
これもジャンパ設定での切替で昔のパソコンみたいにI/Oをたたいてきりかえる
なんてことはできません。
できあがってから思ったけど、貫通ビアを入れすぎかな?
なんか気持ち悪い(笑)
4.HD6303ボード
メモリボードを68系でも使えるようにしたのでその確認用に。
64pin SDIPタイプのHD6303X、HD6303Y。
最初は6802でやろうとしたけど、部品点数の少ない基板でも配線に苦労したので
部品点数を減らせる6303で。主要なものは6303とPICのみです。
ワンチップマイコンらしく、I/Oコネクタを搭載し、6303のポートをだしています。
実はこれのみ全部手動で配線しました。
KiCadの自動配線は結構おバカで、時々基板外形の外側に配線してしまうことがあって
特にバス出し用の2列ピンヘッダパターンを基板端に配置するとよくなり、
この基板の時のみどうやっても外に配線してしまって困り果てました。
で、部品点数も少ないすかすか基板なので自分でやる事に。
結果的にはこれが一番時間はかかってるかも?
ちなみに裏側がこれ。
自動配線ではアドレスバス、あるいはデータバスといったバス配線をきれいに並べてくれないけど
自分でやればこの通り。
それ以外も、スカスカ基板のおかげもあって無理なく。
自動配線だとこの程度のすかすか配置でも、
どこ飛ばしてるんだ!?といった感じにこねくり廻してくれます。
4枚とも2列ピンヘッダの横に1列ハーフピッチのピンヘッダを配置してるがこれも配線対策。
とにかくヘッダのまわりと回り込むように配線しようとするので、
いったん横にまっすぐださせてバスを横一列に並べるような感じに。
こうしておくと手動配線するときも楽です。
それだけのためのパターン。
ハードでバッグ用にテストピン立てたりするには便利かな?
さて、あとは組み立てて動作検証を。
修正することなく1発で動いてくれるかな?
1.8085CPUボード
既に基板はできあがってきてます。
主要な石は8085とシリアル通信用の8251、USB変換のPIC1454。
あとはTTLが3個程度。
メモリを搭載すれば動かせますが、メモリは別ボードで。
このPICはMC6801の時に使った物と基本的に同じ。
CPUクロックとボーレート用クロックとリセット。
実はこの基板だけ電源用USBコネクタは搭載していない。
部品点数的にすかすかの基板だけど、
そのコネクタ一つ追加するだけで配線に苦労するようになったので。
縦横、ICの向きがかわっているのもその影響。
6801の時と同じで、基本的にKiCadの全自動配線を利用。
全部自動で配線させてみては、その結果をみて配置を変更を繰り返し
残未配線が数本で、手動で通せそうなら残りを手動でやり完成。
2.Z80CPUボード
こちらはZ80版。Z80は同じZ80ファミリで作ると非常にシンプルになり
Z80CPU、Z80SIO、PICのみとなりTTLはなし。
そのおかげもあって、こちらはUSB電源コネクタを搭載。
Z80SIOは2チャンネルあるので片方も使えるようにだけはしておいた。
3.メモリボード
64KBのメモリボード。
基本的に32KBのSRAMと32KBのROMを搭載するようになっている。
このメモリボードは使い回しできるように、色々よけいな回路を組み入れていて
(1)CPUボードと接続するためのメモリストローブ信号として80系ではMREQを想定しているが
68系ではEを割り当てストローブ代わりに。
MREQは負論理だけどEは正論理なのでジャンパで切り替えられるように。
(2)80系はリセットが0スタートなのに対して、68系は$FFFEがリセットベクタなので
ROM、RAMの配置をアドレス逆転できるように。こちらは6Pスイッチを想定。
(3)ROMをRAMに変更して全RAMにできるように。これは後々を考えて。
そのため28pinのメモリを3個搭載できるようになってるが同時使用は2個。
これもジャンパ設定での切替で昔のパソコンみたいにI/Oをたたいてきりかえる
なんてことはできません。
できあがってから思ったけど、貫通ビアを入れすぎかな?
なんか気持ち悪い(笑)
4.HD6303ボード
メモリボードを68系でも使えるようにしたのでその確認用に。
64pin SDIPタイプのHD6303X、HD6303Y。
最初は6802でやろうとしたけど、部品点数の少ない基板でも配線に苦労したので
部品点数を減らせる6303で。主要なものは6303とPICのみです。
ワンチップマイコンらしく、I/Oコネクタを搭載し、6303のポートをだしています。
実はこれのみ全部手動で配線しました。
KiCadの自動配線は結構おバカで、時々基板外形の外側に配線してしまうことがあって
特にバス出し用の2列ピンヘッダパターンを基板端に配置するとよくなり、
この基板の時のみどうやっても外に配線してしまって困り果てました。
で、部品点数も少ないすかすか基板なので自分でやる事に。
結果的にはこれが一番時間はかかってるかも?
ちなみに裏側がこれ。
自動配線ではアドレスバス、あるいはデータバスといったバス配線をきれいに並べてくれないけど
自分でやればこの通り。
それ以外も、スカスカ基板のおかげもあって無理なく。
自動配線だとこの程度のすかすか配置でも、
どこ飛ばしてるんだ!?といった感じにこねくり廻してくれます。
4枚とも2列ピンヘッダの横に1列ハーフピッチのピンヘッダを配置してるがこれも配線対策。
とにかくヘッダのまわりと回り込むように配線しようとするので、
いったん横にまっすぐださせてバスを横一列に並べるような感じに。
こうしておくと手動配線するときも楽です。
それだけのためのパターン。
ハードでバッグ用にテストピン立てたりするには便利かな?
さて、あとは組み立てて動作検証を。
修正することなく1発で動いてくれるかな?