PIC18F45K22ボードでシリアルモニタを使う

MPLAB-XのMCCを使って、PIC18F45K22 CPUボードでシリアルモニタを使うための設定方法を紹介します。

シリアルモニタについて

シリアルモニタはArduino IDEの用語で、基板上のプログラムでprint文を使ってUSBコネクタ経由でPCにデータを送って表示する機能です。

組み込みプログラミングで機器を制御する場合、短いプログラムを繰り返し使うことが多く、プログラム構造は簡単ですがCPUに接続された機器の特性を知ることが重要になります。

ものづくりコンテストの課題で使われるスイッチのチャタリング

「スイッチをONにしたらLEDを点灯、OFFにしたら消灯しなさい。」という初歩的な設問なら、条件文や単なる代入文を使って論理的に考えたプログラムで問題なく動作しますが、

「スイッチを一度ON-OFFしたらLEDを点灯、もう一度ON-OFFしたら消灯しなさい。」という設問に対して、スイッチのチャタリングを知らずに論理的に考えただけのプログラムを書くと、ON-OFFを繰り返す度に動作したりしなかったりするという不思議な現象に悩まされることになります。

チャタリングというのは、スイッチをON-OFFした直後のごく短い時間に信号が0と1の振動を繰り返すというもので、スイッチの種類によってチャタリングの時間が違ったり、チャタリングがあったりなかったりします。

チャタリングによるトラブルは、PCの画面でプログラムを穴が空くほど見つめて考えても解決できませんが、シリアルモニタを使ってスイッチの状態が変わった時に信号の状態を表示するようにすれば、
「あれっ?一度スイッチを操作しただけなのに、何度も信号が変化している。」と一発で気が付き、対策を考えることが出来ます。

また、シリアルモニタで信号の状態を観測することは、データシートには載っていないハードウェアの動作特性を知るために大変役に立ちます。

MALAB-Xでシリアルモニタを使うには

Arduino IDEのシリアルモニタは、シリアル通信を使ったprintfデバッグをIDEに組み込んだものです。
PICの開発環境MPLAB-Xにはシリアルモニタ機能が含まれていませんが、MCCを使ってprintfの出力をシリアルポートに出力するようにすれば 、Arduinoと同じ感覚でシリアルモニタが使えるようになります。

GUI画面で初期化設定が出来るMPLAB-XのMCC

PICの新しい開発環境MPLAB-Xの最大の特徴はMCC(MPLAB Code Configurator)が使えるようになったことです。
MCCを使うとGUI画面で設定項目を選んで値をセットするだけで、ハードウェアを初期化する関数を自動的に生成してくれます。
組み込みプログラムで難しいのは、データシートに記載された多くの情報を元にCPUのレジスタを設定しなければならない初期化プログラムです。

ものづくりコンテストに挑戦する場合、
Arduinoでは単純化した初期化関数をライブラリに用意することで初期化が簡単におこなえるようにしてあるため、初期化部分を覚えるのが簡単でした。
MCCが使えないMPLAB時代のPICのプログラム環境を使う場合は、覚えにくい初期化プログラムを丸暗記して書かなければならず、その部分に間違いがあればプログラムがまともに動作しなかったので、Arduinoに対して圧倒的に不利な条件で闘う必要がありました。

MCCを使うと、タイマーやPWMなどのPICに内蔵された高機能な機能を、課題に合わせて柔軟に設定できるので、Arduinoより高性能なCPU機能を使えるようになるため、高機能なプログラムを簡単に書けるようになります。

1.MCCでEUSART(シリアルポート)を有効にする

PIC18F45K22CPUのシリアルポートからデータを出力するにはプログラムの最初で初期化する必要があり、MCCを使えば自動的に初期化部分を含んだプログラムのテンプレートを作ってくれます。
MCCを起動し、左のDevice Resourcesで下図の赤丸で囲まれたEUSART2をダブルクリックして、上のProject Resourcesに追加します。

2.EUSARTのパラメータを設定する

次に、下の画面のとおりに設定をおこないます。
Mode asynchronaous → 非同期通信とはRS232C規格でも使われている標準的なシリアル通信プロトコルです。
Enable EUSART → このシリアルポートを有効にします
Enable Transmit → 送信を有効にします
Enable Receive → 受信を有効にします、シリアルモニタだけなら受信無効でもかまいません。
Baud Rate → とりあえず115200を選択します
Software Settings の Rediret STDIO to USART にチェックを入れます → これでprintf文の結果がEUSARTに出力されるようになります。

その他の項目は初期状態のままにしておいて下さい。

3.プログラムテンプレートを生成(再生成)する

設定が終わったらProject ResoucesタブでGenerateボタンをクリックすると初期化プログラムとmain.cが生成されます。
プログラムを書いている途中で設定を変更したい場合も再度MCCを開いて設定を変更した後にGenerateボタンをクリックします。
main.cにプログラムを書き込んでいる途中で、再度MCCのGenarateをおこなっても、編集した部分はそのまま保存されますので、デバッグ時にハードウェアの初期化を追加変更することも出来ます。

MCCが生成するプログラム

MCCで初期化プログラムを生成した後にProjectタブの内容を見るとmain.cとMCC Generated Filesが作られているのが確認できます。
生成されたファイルのmain.cを直接編集して課題のプログラムを書いていきます。
MCC Generated Filesフォルダにあるプログラムを編集することはありませんが、この中の関数を使う場合には関数名や使い方を確認するために開いてみることが出来ます。

PIC18F45K22CPUボードのKiCad5データ

PIC18F45K22CPUボードのKiCad Ver5のデータを公開します

KiCadデータはgithubの下記リンクに置いています。

KiCad5-pic18f45k22-v2cpubrd

回路図PDF

pic18f45k22-v21_sch

データとライセンス

KiCad Ver5.0用にアップデートしました、githubを使って公開しています。
ライセンスはオープンソースハードウェア扱いとし、オリジナル元の記載を忘れないようにしていただければ、使用上の制限は設けません。

PIC18F45K22CPUボードについて

広島県工業高校ものづくり検定の課題用に設計したCPUボードです。
部品には出来るだけ秋月電子で入手可能なものを使っています。

このCPUボードの特徴

最近のワンチップCPUは非常に使い勝手が良くなり、基板に載せて端子を入出力の相手に接続するだけで使えるようになりました。
この基板もCPUボードの機能としては、CPU端子をコネクタで接続できるようにしただけですが、教育用CPUボードとして工夫した点がいくつかあります。

1.電源供給とUSBシリアル通信機能を備えたUSBコネクタがある

USB機器が普及した今では、ダイソーでも、USB用電源アダプタやUSBケーブルを手に入れることが出来ますし、PCのUSBコネクタから電源を供給することも出来ます。
そのため、USBコネクタを電源供給用コネクタとして使うことで電源供給機器を用意する手間を最小化出来ると考えてUSBコネクタから電源供給が出来るようにしています。

また、組み込みプログラミングではprintf文を使って、プログラム動作中の情報をPCに表示することが大きなデバッグ効果を発揮します。
Ardinoがプログラミング入門用に広く受け入れられているのも、使い始めるときの敷居の低さと、シリアルモニタ、シリアルプロットというプログラム動作中の情報表示機能を備えているからです。
PICの場合、プログラム書き込み用ツールPicKitによるデバッガ機能を備えていますがシリアルモニタは出来ません。

PICはUSB通信をおこなう機能も備えていますが、入門者にUSB機能を使うためのプログラムを書かせるのは負担が大きすぎますし、割り込み関数の周期が不正確になるなどCPUの動作に影響を及ぼしてしまいます。

秋月でも入手できるFTDIのUSBシリアルを使えば、CPU側では単純なシリアル通信を行うだけでPCからは通信機能を持ったUSB機器として認識できるので、USBコネクタに電源供給とUSBシリアル通信機能を持たせて、教育効果を上げることを狙っています。

2.LEDで入出力ポートの状態を確認出来るようにしている

自分が撃ち込んだプログラムが思った通りに動作しない時、初心者はPCの画面だけを見て、「どこに問題があるんだろう?」と考え込んでしまうことがあります。
しかし、実際にはプログラムのせいではなく、コネクタの接続を間違っていたり、接触が悪かったりと、ハードウェア的要因によるトラブルの可能性もあります。

組み込みプログラミングに慣れてくれば、プログラムの確認と同時にオシロスコープ等を使ったハードウェアの確認が自然に出来るようになるものですが、初心者が少しでもハードウェアに意識を向けられるように、コネクタにつながる信号をLEDの点滅で確認できるようにしてあります。

また、限られた時間で課題に取り組む場合には、測定器などを準備する手間なくポートの状態を確認して、課題を解く時間を短縮できるという効果もあります。

KiCad用データの使い方

このサンプルデータをKiCadで開いて編集する方法については KiCad5サンプルデータの使い方 を参照してください

ものづくりコンテスト:演習課題

ものづくりコンテストでは新しくプロジェクトを作ってMCCを使って初期化部分の作成をおこなう必要がある。
ここでは新規プロジェクトの作り方とプロジェクトのコピーの練習をおこなう

演習の内容

1.ゼロから新しいプロジェクトを作る

新規プロジェクト mykadai1 を作成してRGBLEDを点滅させる(点滅間隔は人が点滅を認識できれば良い)

2.プロジェクトをコピーして新しいプロジェクトを作る

mykadai1をコピーしてmykadai2を作り回答例のプロジェクトを参考にして以下の処理をおこなう

A.7セグメントLEDに2桁の数値を表示する。

B.SW2(トグルSW)がONの時SW1(タクトスイッチ)を押す毎にLEDの数値がカウントアップする(最大12)

C.SW2がOFFの時SW1を押す毎に7セグメントの数値がカウントダウンする。―12以下にはならないようにする。

D.printf文を使って7セグメントの数値とスイッチの状態をPCのターミナルに表示する

3.おまけの課題

時間が余った人はスイッチを押す毎にステッピングモータが文字盤の1目盛りづつ動くプロジェクト mykadai3を作ってみる。

新規プロジェクト作成手順

新規プロジェクト mykadai1 を作る

メインメニューの
File -> Close All Projectsで全てのプロジェクトを閉じる
File -> New Projectを実行して下のウィンドウを開き Next をクリック

デバイスPIC18F45K22を選択する

Select DeviceのウィンドウでFamily (PIC18)の中からPIC18F45K22 を選択してNextをクリック
※たくさんのデバイスがあるので間違えないように

書き込みツールにPicKit3を指定する

Select ToolsウィンドウでPicKit3を選んでNextをクリック

コンパイラを選ぶ

Select CompilerウィンドウでコンパイラXC8を選んでNextをクリック

プロジェクト名とフォルダを指定

Select Project Name and Folder ウィンドウでプロジェクト名とフォルダを入力してFinishをクリックすると新しいプロジェクトが作られる
※ プロジェクト名は mykadai とする
※ フォルダはサンプルプロジェクトが入っている場所と同じでOK
※ Encoding にShift JISを選んでおくとWindowsのメモ帳で日本語が正常に表示される

続いてMCCを使って設定をおこなう(別資料参照)