PICでprintf()を使う
PICのコードの動作確認のためにコード中にprintfを書いてパソコンの通信ソフトウェアでその内容を受信する方法です。ArduinoではSerialPortの設定をしてArduino IDEのターミナルで簡単にできます。とても便利なのでPICでも同じことがやりたかっただけです。その手順の忘備録。
環境
パソコンはmacOSを使ってます。macOS sonoma 14.5、MacBook Pro 14(2021)
MPLAB X IDEはver 6.2。
MCC Content Managerはver 1.0.0
プログラマはPICKit3を使っています。
プロジェクトの作成
では新規のプロジェクトを作成します。
FileメニューからNew Project…を選択します。以下の画面が表示されます。
Microchip Embeddedを選択してApplication Projectを選択します。
Nextボタンで次に進みます。
次に使うPICを選択します。
Familyで8bit mid rangeを選択し
Deviceで使うPICを選択します。私はPIC16F1823を使っています。
(なぜPIC16F1823なのか?引き出しに入ってたからという理由)
ToolsにはPICKit3を接続してあれば出てきますので、それを選択してあげます。
Nextのボタンを押して次に進みます。
Debug headerを選択します。使わないのでNoneを選択してNextのボタンで次へ進みます。
コンパイラを選択します。
XC8のv2.46を使います。
Nexのボタンを押して次へ進みます。
プロジェクト名を決めます。今回はprintf_demoとしました。
Finishボタンを押します。
ちょっと間が有ってから次の画面に進みます。
MCCの設定
MCC Melodyを使って設定を行います。Nextボタンを押します。
通信をするためのUARTを設定します。UARTの「+」ボタンを押してデバイスに追加します。
builderの画面にEUSARTとUART1が追加されました。
EUSARTを選択して右側のパネルで設定をします。デフォルトの設定で問題ないかな?
同様にUART1を選択して設定を行います。
Requested Baudrate :9600
Data Size :9
Flow Control Mode :none
Redirect printf to UART:on
下部のパネル、Pin Grid ViewでEUSARTに割り当てられているPinを確認します。下の図はデフォルトの状態ですがEUSARTのRX(input)が PORT C5、TX(output)がC4になっているのがわかります。
動作クロックの設定を行います。
左側のパネルでClock Controlを選択し、右側のパネルで
System Clock Select :INTOSC
Internal Oscillator Frequency Select:16MHz_HF
としておきます。これでPICは内蔵のオシレータを使ってクロック16MHzで動作します。
最後にGenerateのボタンを押します。これによって設定した内容によっていろんなファイルが自動的に作られます。MCCの設定を変更した場合は再度、このGenerateボタンを押して更新する必要があります。main.cは変更されないので、コードを書いてる途中でも大丈夫です。
main.cのコード
左側のパネルのFilesタブを開きmain.cを探します。
main.cをダブルクリックすると中央の画面にmain.cを開いてくれます。今回はprintfを試したいだけなので1秒間隔でprintfを実行するだけです。
永久ループのwhileの外側でint変数 iを宣言し初期値を0にしておきます。
ループの中でiを1づつ増やします。その値をprintfで出力します。
__delay_ms(1000)で1000m秒=1秒の停止を入れます。
int i = 0;
while(1)
{
i++;
printf("%d\n",i);
__delay_ms(1000);
}
printfは書式の設定が必要です。
%dは整数(int、short)
%sは文字列
%gはfloat
\nは改行になります。
「\」の文字はmacOSの日本語キーボードの場合はoption + ¥で出てきます。
PICへ書き込み
PICKit3とPICを接続して再生ボタンっぽいものをクリックするとコンパイルと書き込みが行われます。結線については以下の「ハードウェア」の項目をみてください。
問題なくコンパイルと書き込みができると下部のパネルに以下のように表示されます。BUILD SUCCESFULとかProgramming/Verify Completeが表示されてればOKです。
ハードウェア
シリアルからUSBへの変換が必要になります。私が使っているのはこちらです。
他にも同様な商品は色々とあると思います。接続の必要があるピンはRx、Tx、GNDの3本です。
接続は以下のように行います。PICのRxからシリアル変換基板のTxへ、PICのTxからRxへと逆に接続します。送信と受信が見る方向によって逆になるという理屈だと。Power Supplyの+5Vですが、繋がなくてもPICKit3からの給電でも動くようです。(動かない時もあった気がする)
パソコンのシリアル通信ソフトウェア
パソコン(macOS)に通信ソフトを用意します。適当なもので構わないと思います。Arduino IDEのターミナルでもできるかと思ったのですが、ターゲットボードが見つかりません、とのエラーメッセージが表示されてだめでした。Arduinoを繋がないとダメなようです。そこでSerialToolsというソフトを使いました。SerialToolsはApp Storeから入手しました。
以下のような画面になります。
Serial Portは接続したUSBシリアル変換機が表示されると思うので、それを選択します。
Baut Rateは9600。PIC側で指定した速度と同じにします。
Bit:8
Parity :odd
Stop bits :1
みたいな感じ。
「connect」というグレーの小さい文字が通信開始のボタンになってます。これ押さないと通信が始まりませんので注意ポイントです。
上記の画面のようにPICから1秒間隔で1づつ増える数字が送られてきています。
これで動作中のPICからパソコン側に数値やメッセージを送ってデバッグが可能になりました。めでたし、めでたし。
この記事が気に入ったらサポートをしてみませんか?