2018年7月23日月曜日

PIC18F47K40のPPSは鬼門でした。

ESMのメインCPUであるPIC18F47K40のソフト作成を進めております。
IO-DEMOから移植すれば少しは楽になるかと思いきや、
IO-DEMOとESMでは基本仕様から異なる点が多々あることと、
CPUの違いが大きいことの2点から、移植部分があんまり無いという結果に。

まぁそれはともかくとして、18F47K40でSPI通信を行うべく、格闘しておりました。
A/Dコンバーター部などの仕様が大幅に変わったのに対し、
MSSPはほぼ変らず搭載されているので、そんなに苦労せず動かせるかなぁと思いきや、
全然通信できません。

あれこれ調べた結果、どうも原因はPPSの設定にあるっぽい??

このPPSモジュール(正式名はPERIPHERAL PIN SELECTモジュール)は、
最近のPICに搭載された新しい機能でして、 私も触るのは今回が初めて。

従来のPICだと、周辺機能モジュールの入出力ピンは
それぞれ接続先が決まっていたわけですけれど、
PPSモジュールが間に噛むことで、かなり広範囲にピン割り振りを変更できるようになりました。
まぁ、全ピンどれでも好きに割り振りできるというところまでは行ってないんですけどね。

で、このPPSモジュール、上にも書きましたように、
I/Oピンと周辺機能モジュールの間に噛んで存在するのですが、
使わないから無効にする、ということが出来ないのです。
百歩譲って、デフォルト設定ならばPPSモジュールが存在しないのと同じ状態に
なってくれるのならば、特に問題にもならないのですが、そんな便利な仕様にもなっていません。

つまりPPSモジュールの設定をきちんと行わないと、
I/Oピンの機能がまともに動きません。

仕方無いのでPPSモジュールの設定を行うことにしますが、
これが非常にわかりづらい!!

PPSモジュールの設定内容は、おおまかに2つに分類されます。

①周辺機能モジュールからの入出力ピン設定

②I/Oポート側から接続先設定

1つの機能(例えばMSSP1のSCK1)を動かす為には、①と②の2つの設定が必要なのです。

①と②で設定するレジスタは各々別々なわけですが、そこに入れる値も異なります。
この値はデーターシートの表を参照しない判らないという代物なのですが、
ここで更に問題をややこしくしてくれるのが、
・①と②で使う値が非常に似ていて、とても紛らわしい。
・データーシートの表がとても解りづらい。

という2点。

たださえ英語のデーターシートで四苦八苦しているのに、
それで表記が判りづらいとか、もうイジメですよね。(;;

周辺機能モジュールを使わなきゃ、別に関係無い問題だな、と思ってる方、
それが甘いのです。

周辺機能モジュールの中には、デジタルポート出力も含まれているのです。
つまり、PPSモジュールをきちんと設定しないと、
ポートの単純なON/OFF出力も出来ないのです。

高機能さを求めた結果、逆に使い勝手を悪くしてしまった いい例のような気がしますねぇこれ。

0 件のコメント:

コメントを投稿