最近のPICには、Peripheral Pin Select(ピン割り付け機能:PPS)があって、機能をもったピンを変更することができます。初めて触れたPIC16シリーズは割り付けできず、決まったピンに決まった機能がありました(たぶん最近のはPPSできるものもある)。次にPIC24に触れたのですが、そのときは、割と自由に変更できてとても便利でした。しかしPIC32では再び制限がでてきて、それがわかりにくかったのでメモしておきます。
Microchip Harmony Configurator(MHC)を使えば、ひとつのピンを選んでそのピンが何に割り付けできるかをGUIで確認できます。、たとえば「UART1のURX1とUTX1は、どのピンが使えるんだったっけな?」と思えば「PIN TABLE」を見るとわかります。
でもわかりにくく感じたので、原点にもどってデータシートを読んでみます。
データ読み方
データシートの「Peripheral Pin Select」の項目に説明があるのですが、その読み方って??と思ったのでメモです。たとえば上の図はインプットPPSの説明なのですが「0000〜0111まで順番に隣に明記されてあるピンに割り当てることができて、1000と1111がReservedされている」と読み取れます。ところが「1000・・・1111」の「・・・ってどういうこと?」と最初は理解できませんでした。
もしかして、1001とか指定するとその他のピンに割り当てられる?ここに明記されてるピン以外にPIC24みたいに自由にピンに割り当てられるってこと?と期待したのですが、推測すると「1000〜1111までReserved」ということのようです。だったら、なぜ4ビット確保する必要があるの?違うPICとか将来拡張する予定があるのでしょうか。
いつもシリアル通信やI2C通信をするために、いちいち調べては混乱して、何度も繰り返しているので、「UART1」「UART2」「SDA1」「SCL1」「SDA2」「SCL2」のピンをサッと思い出せるようにしたいです。
印をつけてみる
データシートの該当箇所に印をつけてみると、インプットのPPSは「U2RX」「SDI1」、「U1RX」「SDI2」の割り当て可能なピンが同じでした。アウトプットのPPSをみてみると、「U1TX」「U2TX」がありました。
あれ?「SCL1」「SCL2」がない?インプットプルアップなのかな?と思うけど、やっぱりインプットPPSのほうにもありません。
MHCを起動して確認してみると、PIC32MX120F032Bの場合は「SCL1」「SCL2」は、なんと1つのピンしか選べませんでした。I2Cを使おうとしたら必然的にSCLピンが決まるのでしょうか(もっとじっくり調べます)。最近I2Cを覚えて、ずっとシリアル通信だけでやってきたので、回路設計時にはPPSを期待して厳密にピンを決めませんでした。しかし、ここまで制限があると、回路設計はI2Cピン基準とする必要があります。これは十分に気をつけたいところです。
最後に
PICって難しいなぁ。というか、Arduinoって本当にわかりやすくしてくれている。でもその分、Arduinoは裏でいろんな処理をしてくれています。ミニマムにいきたければ、こういうコアなところに向き合わないといけないです。
ピンの設定のところに、3種類のタブがあります。これらをうまく使い分けて、ピンを決めていくとよさそうです。そういう意味で3つもあったんですね!