PICマイコンがどうも肌に合わない
- 2023/04/13 11:10
- カテゴリー:make:
先日,WEBサイトを巡回してたら,ちょっと作って見たくなるような作例を見つけました。PIC32MXを使った工作で,バイナリも配布されています。
幸い私はPICkit4も持っていますし,MPLAB IPEも問題なく使えていますので,これはさっさと作って見ようと部品を集めて作って見たのが,3月中頃の話です。
しかし,ここですんなり動かないのが私です。全く動作しません。クロックは発振していますし,各部の電圧も正常です。書き込みもベリファイまで済んでいますので問題ないはずです。
ソースが公開されていないので,回路の問題(配線の問題ですね)しか確かめることが出来ないのがもどかしいのですが,簡単な回路ですのでもう確かめようがありません。
電源が汚いとか,周波数が少しズレているとか,そういうところまで疑い始めましたが,それらに対策を施しても解決しません。そうなるともうソフトを疑うほかなくなります。
そこで意を決して,ソースを提供して欲しいと作者にお願いをしました。回路のミスがあるんじゃないのか,という疑いの目がチクチク刺さりましたが,こちらの意図を察して下さって,プロジェクト丸ごと提供頂けました。これはありがたい。
とてもご親切に,ビルドの環境まで教えて下さったので,MPLAB X IDEにC32を組み込んで,元のMPLABのプロジェクトをインポートします。
ビルドはあっけなく通ったのですが,出来上がったバイナリを書き込んでみてもやはり動きません。基板に問題があるかもと,ブレッドボードでも回路を作って試してみましたが,やはりダメです。
実際に動いているものが私だけ動かないというのは納得がいきませんが,違いはMPLAB Xあることと,PICkit4を使っていることで,作者の方はMPLABとPICkit3を使ってらっしゃるそうなのです。
私が同じ環境を使えれば問題は解決しそうなのですが,いまさらPICkit3を買うようなことはしたくありませんし,それに純正の後継ツールなんだから,そこは信じていいだろうと思っていました。
しばらく試行錯誤を繰り返したのですが,動くとされるバイナリは動きませんし,私が自分でビルドしたバイナリも動きません。せっかくソースも頂いたわけですし,こういう時こそなにが起きているかを徹底的に調べるために,PICkit4を活用しようと,インサーキットデバッグを行う事にしました。
Debug buildを行い,深呼吸していざステップ実行,と思ったのですが,なんとステップ実行をするまでもなく,あっさり正常に動作してしまいました。
もしかすると治ったのかも,とProduction build(MPLAB X IDEではリリースビルドのことをこう呼んでいるようです)をして書き込みますが,やっぱりダメでした。
こういう場合は原点に戻り,出来るだけ単純なソフトで試してみる必要があります。定番のLチカを組んで試したところ,これは通常のビルドでもインサーキットデバッグでも問題なく動いています。
うーん,どこにバグがあるかを確かめるインサーキットデバッグで動いているものが,通常の書き込みで動かないなんてことがあるのは,すでにインサーキットデバッガの存在意義がないだろうと首をかしげるわけですが,実際に目の前で起きていることは疑いようがありません。
これって,バグ地獄から抜け出るためにICEを使ってデバッグして動くようになっても,リリースでは動くかどうか分かりませんよと言われていることと同じですので,こんなツールはプロは怖くて使えませんよね。そう考えると,もう何が何やら・・・
で,悩んで1ヶ月が経過し,書き込み環境を変えてみようかと,PIC32MXのライタを探していたところ,気になる情報を手に入れました。なんでも,PICkit3では書けるが,それ以外の自作ライタではベリファイ出来ているのに正常に書き込めていないという問題が出ていると言うのです。
その原因を見て,私は驚きました。
PIC32MXでは,CONFIGRATIONビットのDEVCFG0のDEBUGビットが,通常の動作時は11bでなくてはならないのに,場合によっては10bになっていることがあるのだそうです。
これは,ソースにCONFIGRATIONビットの設定を記述することで行うのですが,通常は,
#pragma config DEBUG = OFF
と記述します。
しかし,この書き方では場合によっては11bではなく,10bと書き込まれることがあるらしく,もし10bと書き込まれてしまうとICEを使う設定になってしまうようなのです。
これがまた不思議な話で,本来ならICEを使う設定は00bか01bで,10bでも11bでも問題なく動くはずなのです。これはデータシートのバグか,チップのエラッタでしょう。
不幸はさらに重なります。
PICkit3で書き込む時はDEBUGビットを11bに自動的に変換して書き込みます。これがまたくせ者で,PICkit3以外のツールで書き込むと10bのまま書き込まれるため,ICEが繋がっていないと動作しないというわけです。
まとめると,DEBUG=OFFとソースに書いて設定し,かつPICkit3以外のライタを使う場合には,ICEを使う設定で書き込まれてしまうため,動かないという事が起きるというわけです。
対策は,DEBUGビットを11bに強制的にすればよいので,
#pragma config DEBUG = 3
とすればOKです。これでPICkit3以外のライタでも正常に動作します。
さて,PICkit4は純正ですし,PICkit3の後継ですので,いいものも悪いものもPICkit3でやってたことは継承されると思っていました。ですがこの問題で起きることはまさに私の目の前で起きていることです。しかもソースにも当該箇所の記述がありました。
もしかしてこれが原因ではないかと試してみることにしました。DEBUG=OFFをDEBUG=3と書き直してビルド,しかしおかしな設定されたとエラーを出してビルドが通りません。
ここで詰んだかと思ったのですが,ものは試しとDEBUG=OFFをコメントアウトしてブルドをしたところ無事に通りました。書き込みを行ってみると,なんと動いてくれました。
これから分かることは2つ,1つ目はPICkit4とMPLAB X IDEの組み合わせでは,自動的にDEBUGビットを11bにしないということです。MPLAB X IDEとPICkit3の組み合わせではどうかを試していませんが,どちらにしても最新の環境はかつての純正環境であるMPLABとPICkit3の組み合わせとは異なる動作をするということです。
もう1つは,DEBUG=OFFと書くと,ICEを使わないビルドでも10bと書かれてしまうが,これを宣言しないと,ICEの有無で自動的にDEBUGビットを書き込んでくれるという事です。
とはいえ,このプロプロセッサ用の宣言は明記することが普通ですし,MPLABのCONFIGURATION設定ツールでも生成されるので,これをコメントアウトするというのは通常思いつくことはないと思います。
これが,DEBUG=OFFと記述した結果が10bでなく11bと正確に反映されればなにもんんだいはなかったでしょうし,PICkit4でもPICkit3と同じように,リリースビルドではDEBUGビットを11bと自動的に修正してくれるなら問題は発生しなかったでしょう。さらにいうとデータシート通りに11bでも10bでもICEを使わない設定になるのであれば,やはり問題はなかったはずです。
こうしてみると,今回の問題は,Microchipの複数の部署にわたるバグが引き起こしたものと思われてなりません。DEBUG=OFFの結果が11b以外になるのはコンパイラのバグですし,純正ライタであるPICkit4でDEBUGビットを11bに自動的にしないという仕様変更も思いつきで行われてるように思います。
最後のデータシートの問題は,データシートの記述がおかしいのか,それとも実チップのエラッタなのかはわかりませんが,どっちにしてもデータシートとチップの間の不一致が起きていますので,これも検討不足でしょう。
そしてその結果起きることは,インサーキットデバッグで動くものが,リリースビルドでは動かないという,ICEの信頼性や存在意義を根底からひっくり返すようなトラブルなわけです。
コンパイラがバイナリを生成した時点ではすでにDEBUGビットは設定済みですから,ベリファイが通ってもそもそも動かないバイナリを書き込めば,そりゃ動くわけがありません。つまり,我々ユーザーは,なにを信じていいやらわからない状態に置かれたと言うことです。
いやまて,開発ツールというのは,いわば測定器であってマザーツールです。これが信用出来ないと,そこから生まれるものはすべて信用出来なくなるので,特に信頼性を高めておかねばならないはずです。
いくら無償で配布しているとはいえ,実質的な選択肢としてこれ以外を選べないなら,信頼性は高めておかねばなりません。もっといえば,コンパイラは有償でないと最適化オプションを使えず,PIC32MXのようなMIPS系のCPUでメモリサイズの小さいPICでは,無償版のコンパイラで出来る事はかなり限られてきます。
Microchipはその辺の意識がどうも緩くて,私は以前にも似たような問題でバグ地獄を這いずり回っていたことがあります。
それでもMicrochipが好きな人がたくさんいるようですが,私はどうも好きには慣れません。肌に合わないとでもいいましょうか,だからAVRに流れたという感じです。
惜しいのはそのAVRも今やMicrochipの製品になり,ATMEL Studioに起源を持つMicrohip StudioもいずれMPLAB Xに切り替わります。私はAVRがMicrochipカラーに染まることを望んでいません。
ということで,一応目的は達成しました。いい勉強にもなりましたし,PIC32MXという安価なのに強力なマイコンに慣れたというのは本当だと思います。しかし,こんな目に遭ってしまえばわざわざPICを使う気はしません。やはり私はPICとは相性が悪いんでしょう。