PICマイコンでprintf()を使ってデバッグする方法
ちょっと動作を確かめたくてprintf()でシリアル出力してデバッグをしようとしました。ところがシリアル出力が一切出ないのです。コンパイルエラーも無し。
ブレークポイントを指定しても止まらない。
Web検索しても、なかなか核心にヒットしません。ということで備忘録として記事に残そうと思います。
結果からいうとMCC(MPLAB Code Configurator)の「設定」がキモでした。
最近はデータシートを読まなくても「Code Configurator」の設定項目にcheckを入れるだけでイイ感じにソースコードを吐いてくれるハイテクな開発環境が多いですね。初期設定などを書かなくて済むので楽ちんです。しかし各々のcheckの詳細説明が足りていません。んまあ、データシートを読めって話なんですけども、データシートには「どんなソースを吐きだすか」までは書かれていません。
今回の環境を書いておきます。
開発環境:MPLAB X IDE v5.30
マイコン:PIC16F18326(32MHz動作のMIDレンジPIC)
コンパイラ:XC8 v1.45(v2.20では原因不明のコンパイルエラー)
プラグイン:MCC v3.95.0
XC8コンパイラとMCCのバージョンとで「相性」があるという部分も引っかかるのですが、
一番ハマったのは、
printf()が動作しない状態(MCC設定)でもコンパイルエラーが出ない。
というところ。自分がもじゃもじゃ書いたコードならそこを重点的に確認するのですがprintf("Test"); としか書いてないので確認しようにも何もない。
stdio.hにprintf()が宣言されているから、という理由かもしれませんがMCCが吐き出したソースコードとstdio.hとの繋がりを保てないなら、その旨をワーニング・エラーで表示してくれると分かりやすいですよね。
こんな状況でも、皆、悩まずに乗り越えていっているのか諦めているのか分かりませんが、ネット検索しても解決方法を明確に書いているものが見つかりませんでした。
すったもんだで解決まで2時間もかかってしまいました。ちょっとシリアル出力したいだけなのに。。。
設定は、上のMCC画面のキャプチャで赤丸付けた通りです。UARTのTXのみ空いているポートへアサイン。RXは無くてもOKです。
ちなみに、MCCでEUSART Interrupt をEnableしてCode Generatした場合は、
//INTERRUPT_GlobalInterruptEnable();
//INTERRUPT_PeripheralInterruptEnable();
main.cで上の2行のコメントアウトを外す必要があります。ちゃんと割り込みを使って出力しているんでしょうね。(確認してません)
結局、MCCを上のように設定することで
printf(”AD=%d\r\n”, adc_value);
みたいなソースを記載すれば、シリアルに出力させることができました。めでたしめでたし。
AE-FT234X はとても小さいくて便利なUSB-シリアル変換基板です。600円。
そもそも、
printf()デバッグとは
動作を止めずにマイコン内部のデータをシリアル通信にて外部へ伝えてプログラムの動作・挙動をモニターするデバッグ手法です。プログラム各所にprintfを挿入すればトレース的な事も可能です。
CPUを動作させながらモニターできるという点で、ブレークポイントを張ってデバッグするよりも優れているところがあります。リアルタイムで内部レジスタ等をWatchできるICEを使えばもっと手軽なのですがPickit3では出来ません。それにリアルタイムWatchといいつつ更新が毎秒5~10回程度と遅いICEも多いと思います。
どうしても止めたくない、止めるとヤバいという場合にはprintfデバッグが有効です。よくあるソフトウェアservo(DSP)の場合は、ブレークするとモーターが暴走してメカが吹っ飛んでいって一発で壊します。光ディスクFEプログラムもブレークはご法度で、1枚数万円の高価なTEST-DISCにレンズをぶつけて傷つけてしまいます。
ブレークポイント、リアルタイムなWatch、printf() デバッグは、ケースバイケースで使い分けると良いです。
さて、
今回は、可変抵抗の位置を10bitADCで取得したときに、どのくらい数値がふらつくのかを見たくてシリアル出力してみました。外来ノイズの影響も含めてモニターしたいため、できるだけリアルタイムなデータを見てみたいのです。
毎秒100~150回程度データ取得できました。十分な更新速度です。
10bitADCと言うと、1024段階。範囲が0-5Vなら約4.89mVの分解能です。
閾値ぎりぎりになると、チラチラっと数値が揺れるのを確認できました。数値が2以上フラつくことはありませんでしたので想定よりも良いです。ノイズ混入が少ないという証拠ですね。この結果からソフトウェアによるヒステリシス特性は「±2以上なら更新」としてOKそうです。
さてさて、音だしは・・・??
久しぶりのソフトウェア開発も思惑通りに動くと楽しいですね。SB32+PRO DoP以来のマイコンソフトです。
古いバージョンのMPLAB Xでの動画がマイクロチップ社から出ていました。画面の構成が今と違いますが、概ねこの通り手順ですね。先にこれを見ておけば解決しました。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« HPA-1000の動作時の各所電圧 | トップページ | PGA2311 電子ボリューム基板 »
「ソフトウェア」カテゴリの記事
- Fusion360 個人利用の制限が厳しくなる(2020.09.27)
- PICマイコンでprintf()を使ってデバッグする方法(2020.06.09)
- yaMPC 1.5 Update(2020.05.05)
- 遅まきながらGithub利用へ(2019.06.01)
- yaMPC 新生MPDクライアントv1.0リリースされています。(2019.02.17)
たかじんさん、
久しぶりにたかじんさんのwebをチェックしてみたところ、「printf()」についての記事だったので懐かしくなりコメントを書いています。
私も若い頃RTOSを使ってCで組み込み機器のプログラムを書いていた頃があります。
ただ、その手のルーティンはコンパイラやRTOS付属のライブラリがインクルードされて、結果としてコードが肥大化したり、自分が把握できない挙動を示されるのが嫌だったので、自分で関数は書いてライブラリにしていた事を思い出しました。「printf()」は「Printf()」にして。もちろんフルスペックに作る必要もないので、必要な範囲の引数で。
今どきそんな事する人もいないでしょうが、数年前にpicマイコンで遊んだ時も、結局、昔の自作ルーティンを移植してインクルードしちゃいました。。。
投稿: ま。 | 2020年6月15日 (月) 17時20分
ま。さん
おおぉ。 RTOSですか。 uiTRONとか流行りましたね。
カーナビや携帯電話では当たり前でしたが、おっしゃる通り全てのコードを把握できない状態で、おかしな挙動がでると頭を抱えますね。uiTRON、QNX、FreeRTOSくらいですけど私も何度かは使いました。メモリ不足になったときは結構参りました。
自分の書いたコードは隅々まで把握できているという良さがありますよね。
マイコンはPICに拘っているつもりはないのですが、価格、入手性の良さ、ディスコンしない会社の姿勢などで、なんとなくこれになってしまいます。
投稿: たかじん | 2020年6月16日 (火) 22時03分
いまTAS6422の基板を作っててPICを載せてるのですが、ちょうど先週末MPLAB Xpressで4bit接続のI2C液晶を駆動するコードを書いてたら、誤ってトークンを再生成してしまいPICKit4が2度と見つからない事態にハマり。 諦めてMPLAB XでMCC使ってI2Cのコード吐かせて表示できるとこまでは良かったのですが、なぜかputch()を作ってprintf()でパラメーター変数表示すると暴走してしまうけどsprintf()ならちゃんと動作するという謎な事態になりました。 もしかするとUART使ってないけどデフォの出力先が明後日の方向になってて暴走してるのかも?とこのページ見てて思いました。 まぁsprintf()でも実質大差ないので大して問題はないのですけどね・・・(苦笑)
投稿: HILO@町田 | 2020年6月18日 (木) 02時05分
HILO@町田さん
TAS6422ですか。 I2S入力のD級アンプですね。昨年あたりに、TASシリーズのDSP内蔵タイプのToolプログラムをTIに申請したら、返信がもらえなかったという事がありました。
MCCのprintf()関連、色々と問題がありそうですね。putch()を改造すると出せるというのがどこかのフォーラムに書いてあたったりもしましたが、闇が深そうです。
PICKit4が2度と見つからないという現象もなかなかですね。 マイコン側のプログラムを書いてそんなことになるとは驚きです。
投稿: たかじん | 2020年6月18日 (木) 22時47分
そうなんですI2S接続なので制御するマイコンが必須なんですよ。数年ぶりにPICのコード書こうと思ったら随分時代が変わったんだなと感じました。 昨夜JLPCBでPCBAが終わって発送されたようなのでもうじき基板が届くのでその間にソフトを書いておかなきゃという状況です。 DSP内蔵のアンプが簡単に使えると非常に便利でいいんですけど、TIさん個人売りしたくないのか?サポートが嫌なのか?分かりませんが個人相手だと冷たいですよね・・・
なのでDSPは開発環境がお気楽なADIでやってます。
https://cyberpithilo.web.fc2.com/audio/freedsp/index.html
こんな調子なのでリンクを貼ったDSPプリアンプの方も全然進捗してない状況です(汗)
投稿: HILO@町田 | 2020年6月19日 (金) 22時02分
HILO@町田さん
MPLAB のころとは使い勝手が変わりましたね。 良い面も良くない面もあるように思いますが、macに対応したという部分ではユーザー層が広がったと思われます。
マイクロチップの代理店の人の話では、世界的にはmacユーザーの方が多いらしいです。
HILOさんの基板、激しいですね。個人向けDIY audioの域を超えてます。。。
アナデバのDSPはAVアンプに搭載されているのは見かけますが、こんなTOOLがあったのですね。知りませんでした。 むかしTIのC31でキーコンのプログラムを作って遊んだのを思い出しました。
投稿: たかじん | 2020年6月20日 (土) 08時50分
MicrochipのPICがホビイストからも強い支持を受けているのは無償ツール提供によるものも大きいのでしょうね。
ガッツリとデーターシート読んでからレジスター叩きまくっていた時代から変わりましたね、実際今回は行き詰まった時だけしかデーターシート読んでません(笑)
DSPキーコンの話も懐かしいですよね、私の時はASSP作ってアナログでクロスフェードしながら2系統を繋いでましたが、今やSigmaStudioで機能ブロックを一個置いて入出力繋いでシフト量を設定すればハイ終わりと、なんと一行もコード書かないで作れてしまいます、便利な時代になったなぁ・・・
投稿: HILO@町田 | 2020年6月21日 (日) 14時08分
HILO@町田さん
たしかに、PICは仕事や製品に乗せるよりもホビーで使われる方が多いようにも思いますね。市販製品でPICが出てくることは殆どありません。不思議です。
そうそう、クロスフェードが厄介でトレモロ状態で使い物になりませんでした。1行もコードを書かないでも済むような時代なのですね。あのアセンブラのようなコードはどうにも難しかった覚えがあります。
投稿: たかじん | 2020年6月22日 (月) 20時28分