PIC32MM CPUを活用する

令和元年10月

 PIC32MMシリーズは国内の商社で取り扱っている所が少ないためか、ネットにもあまり情報がありません。
PIC32MXシリーズに比べると、マイナーなイメージとなりがちですが、マイコン自体は良くできていると思います。

 そこで、私のPIC32MM0256GPM064(ROM256kB, RAM32kB)の使用経験から注意点をまとめてみます。
そのくらいにハマリ所があります。

このデバイスを比較的規模の似ているPIC32MX350と比較してみると次のようになります。
  ・ 価格は概ね半額程と安価です。反面、CPU処理能力は1/4に、RAM容量は1/2に制限されています。
  ・ バグの数は比較的少ないです。ただし、BORが正しく動作しないため外付けのリセットICが必須です。
  ・ タイマの数が非常に多く32ビットタイマを10個も取ることが出来ます。16ビットなら21個と非常に潤沢です。
  ・ XC32コンパイラではMIPS16, microMIPSの圧縮コードは有償版・無償版に関わらず使用できません。
(令和元年10月07日追記)
  microMIPSの圧縮コードに関してはdefautで有効になっているようです。こちらを参照してください。
  ここで言いたかったのはConfigration画面にある"Generate microMIPS compressed code"のチェックボックスを選択できないことです。
  また、MIPS16の記述は余計でした。元からこのCPUコアにはそのための機能はありません。
(追記ここまで)

 この辺りまではデータシートやMPLABXを実際に操作してみることで知ることが出来ます。
圧縮コードへの非対応は価格が安いため販売戦力として便利な機能の一部を制限している製品のようです。

 CPUの処理能力が低いとは言っても8ビットや16ビットのCPUとの比較では、はるかに有利です。
また、ISR用にシャドーレジスタが1セットあるので、割り込みにかかるレイテンシを低く抑えることが出来ます。
このため小規模な機械制御を行うには十分な性能を持っています。



 では、実際にデバイスを動かしてみて分かったことは以下の点です。
  ・ MPLABXのシミュレータはほとんど使い物になりません。

 これが非常に大きなマイナスポイントです。
 こちらでは主としてMPLABXのVer4.2を使用してきたのですが、今日現在の最新版であるVer5.25でも実機では正しく動作する
プログラムが、期待通りには動作してくれません。

私の方で確認できただけでも、以下のような問題があります。これはVer4.2での話です。
  ・ UART1のIEフラグ操作が正しく反映されない。
  ・ あるクラス内の変数の合計バイト数がある一定値を超えた領域へのアクセスが正しく動作しない。
  ・ タイマ1のISR内での関数の呼び出しが正しく行えない。
このVerではPIC32MMのシミュレータはベータ版ですのである程度は仕方のないことです。
これらが常時発生するのか特定の条件化でのみ起きるのかまでの確認はしていません。よって鵜呑みにはしない方がいい。
コードを見直しても納得がいかないので実機で動かしてみたら、アッサリと動作したという経験を何度かしています。




  マイクロチップ社製MPLABX Ver4.2内の文書ファイルDevice Support.htmより一部を引用。

SIMISAは命令セットのシミュレーション, SIMPは周辺機能のシミュレーションのサポート状況を示します。
なぜかPIC32MM0256GPM064の命令セット検証はベータに留まっています。仕様的には非常に良く似たデバイスの大半が正規リリースなのに...


  マイクロチップ社製MPLABX Ver5.25内の文書ファイルDevice Support.htmより一部を引用。

 Ver5.25ではシミュレーションがベータから正規版になったので期待したのですが、ダメでした。
実機では正しく動作するプログラムでも例外エラーを起こしてしまいます。
こちらは面倒なので詳細なエラー箇所の追跡まではしていません。いずれ正しく動作することを祈るのみです。
なお、同じPIC32MMで早くからシミュレーションが正規サポートがされていたPIC32MM0128GPM064にデバイスを変更してみても
シミュレーションでの結果は同じくダメでした。

 とはいえ、ごく簡単なプログラムの動作確認まで実機で動作させるのは如何にも面倒です。
このため、アルゴリズムの検証を行うための実験環境を自前で用意して使用していました。
 今後もしばらくはこの環境を使用することになりそうです。


 1.PIC32MMでのシミュレーションをあきらめて、PIC32MXでシミュレーションを行う。

 PIC32MMで直接シミュレーション出来るのがベストですが、それが出来ないので代わりにPIC32MXでシミュレーションを行います。
両者はCPUコアから違っていますが、その違いはコンパイラが吸収してくれます。
周辺機能はほぼ同じですが、割り込み処理関数の記述部分で違いがあります。
CPUをPIC32MX350またはPIC32MX370に指定することで、それなりに便利なシミュレーション環境でデバッグを行うことが出来ます。
ここではシミュレーション時の周辺機能としてタイマとUARTを使用します。
タイマは実験環境と実際の環境の差異を少なくするためにマルチタスク動作や経過時間の観測が出来るようにします。
UARTは主にデバッグ出力をMPLABXのデバッグウインドウに表示させる目的で使用します。

 PIC32MX350およびPIC32MX370のシミュレータサポートはPIC32MM0256GPM064と同じく命令セットまでが正規サポートとなっていますが、
こちらは上記の周辺機能を含めても、私の使用環境では期待通りに動作してくれます

 2.必要な変更作業

 シミュレーションデバッグのために必要な変更箇所は以下の通りです。
これらはPIC32MMとPIC32MXで設定内容が異なる、または設定方法が違っています。これらの処理を条件コンパイルとして記述します。
  ・ Config_bitの定義(設定内容が異なる)
  ・ リセット後にPIC32MXのみROMとRAMへのアクセス時のウェイト数を設定する必要がある。
  ・ 割り込み処理関数(PIC32MXでは一つのデバイスに対して一つのISRなのに対してPIC32MMでは割り込み要因ごとに必要)
  ・ AD入力ピンをデジタルピンとして使用する処理(シミュレーションのみであれば無くても動作する)
  ・ SRS(シャドウレジスタセット)を割り込み優先度の何番に設定するか。(PIC32MXはConfigBit内, PIC32MMはPRISSレジスタ内)

 なお、全てのソースコードは個別にコンパイルし直す必要があります。これはCPUコアが異なるため必須の作業です。
各ProjectのConfigrationを追加することで対応します。

 実際に動作させてみるとコンパイルの手間は増えますが、シミュレーションだけでもそれなりの動作検証が行えます。
新規に記述したコードの初期デバッグには非常に重宝します。



上記の画面コピーは実際にデバイスをPIC32MX350としてシミュレーション動作させているときのものです。
シミュレータ内でタイマ1およびUART1を動作させ、UARTの出力結果をOutputウインドウで確認することが出来ています。


 3.終わりに

 私はPIC32MXとPIC32MMのデータシートを比較してPIC32MMの方が使いやすそうだと考え、採用しました。
結果として現時点での開発環境ではPIC32MXの方がはるかに扱いやすいと言えます。これは結果論です。
PIC32MXを採用するなら、まず最初にエラッタを注意深く読むことをお勧めします。
特に型式をPIC32MX3x0とした場合、x(数字の下二桁目)が偶数のデバイスはバグの数が非常に多いので注意が必要です。
これからデバイスを選択できるなら、避けた方がいい。

 国内では秋月電子社がPIC32MX370F512HT-I/PT(ROM512kB, RAM128kB)を600円台で販売してくれています。
この金額はPIC32MMとの比較でも十分に魅力のある金額です。メモリ容量が2倍〜4倍にも増えて価格は2倍に留まっています。
CPUの処理性能が数倍ほどあることも加味すれば非常に魅力的です。
どちらを選ぶかは選定条件によるでしょうが、どちらも魅力のあるデバイスです。
 両者は僅かのソースコードの修正で相互に利用できるため、使いやすい方を選択することが出来ます。

前へ  次へ