2021年1月7日木曜日

PICのピン振りの修正

 V/AプローブのPICマイコン部で、回路図レベルの間違いが露見。
今回は その修正のお話です。

こういう話を書くならば回路図を載せるところなんですが、
V/Aプローブは未完成ということもあり、まだ回路図が公開できません。
内容がわかりづらくて御免なさい。

V/AプローブにはPIC16F18456というマイコンが載っています。
これで各種制御を行っているわけです。

PICマイコンですから当然ながら内蔵A/Dコンバーターも有るわけですが、
外付けA/Dコンバーターも使用しておりまして、
PICとのインターフェースはSPIバスを使用しております。

それとは別に、V/Aプローブをデーター収集用機器と接続する為の外部インターフェースとして、
SPIのようなバスを用意しております。
「SPIのような」と書いているのは、動作的にはSPIバスそのものなのですが、
電気的な仕様が通常のSPIバスと異なっているからでして、
PICマイコン側は標準で内蔵されているMSSPを使っております。

回路設計上、外部インターフェースはSPI1系統、
A/DコンバーターはSPI2系統に割り振っておりました。

昔のPICマイコンでは、各周辺機能のI/Oピンは割り振りが固定なので、
繋ぎ間違えていた場合は基板上でジャンパーを飛ばして修正していたわけですが、
最近のPICマイコンではPPSという機能で、周辺機能の接続ピンを任意指定できるので、
昔よりは かなり楽に回路設計を進めることが出来ます。
V/Aプローブも同様に、ラフに回路設計しておりました。

V/Aプローブのファームを書き始めまして、
PICのPPSにてピン振りを始めたところ、問題が発生。
回路図通りにピンが割り当てられないことが判ったのです。

PPSって実は、どこでも好きなピンに割り振れるよ、と言う超便利な仕様ではなくて、
割り振れないピンというのが一部有るんですね。
例えば28ピンパッケージのPICマイコンならば、I/OピンはポートA、ポートB、ポートC、ポートEの
4つに分類されておりますが、ポートEはMCLRなので割り当て不可として、
残りのポートA~Cの内、どれか2つに割り振り可能になっています。

具体的な話をしますと、V/AプローブのSPI1系統は回路図上でポートBに繋いでおりました。
SCK1やSDI1、SDO1は問題無かったものの、SS1のみがポートBに割り当て不可だったのです。
ポートBに割り当て不可というのは、ポートAかポートCならば割り当て可能という話。
これがPICマイコンのPPSの仕様上の制約なのです。

ちなみにSPI2系統は全てポートCに繋いでいたので、割り当ても問題ありませんでした。

基板を改造してジャンパー飛ばすのは避けたいなぁと思い、対策検討。
すると、以下の3つの方法がありました。

(1)SS信号の動きをソフト経由で他ピンに渡す
ソフトで入力ピンの状態を監視し、SS入力信号が変化したらソフトウェアで、
正しいSS入力ピンの状態を動かすという方法です。
前提として、SPI動作中でも各ポートの単純I/Oが生きてることが必要です。
EUSARTのI/Oを割り振られたピンは、単純I/Oの入出力が切り離されるので、
将来的にSPIも 同様の仕様になる可能性はあるかもしれません。
もしそうなった場合、この方法は使えなくなってしまいますね。

(2)SPI1とSPI2を交換する
実は今回、V/Aプローブで使ったのがこれ。
SPI1とSPI2は機能的には全く同一のもの。
なので交換しても問題ありません。
ということで、A/DコンバーターではSPI1を、外部インターフェースではSPI2を使うことに。
するとピン割り当ても全て問題無くなりました。

V/Aプローブでは外付A/DコンバーターのアクセスにSS信号を使う必要がありません。
PIC側がマスターになるからです。
なので今回は うまく行ったという話でして、
SPI1もSPI2も両方スレーブというような案件の場合は この方法だと解決しません。

(3)CLCを活用する
案外汎用性ありそうな方法としてCLCを使う手を思いつきました。
CLCというのはPICのI/Oピンをハードロジック回路に繋ぎ、
ソフトウェアを介さずにちょっとしたロジック処理を行うことができるという代物。
簡易PLDと呼べばいい感じかな?
これもPPS経由で任意のピンに入出力を割り当てできるので、
ジャンパー線の代わりに、PIC内部でピン間接続を行うことが可能になります。
ジャンパー線のように双方向で信号を流したり、
アナログ信号を送ったりということはできませんが、
PICの汎用性の高さを物語る上で、面白い方法の1つかと思います。

0 件のコメント:

コメントを投稿