SSブログ

マイコン制御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を入れるようにしている。


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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。