前回、久しぶりにMicroChip社の8ビットマイコンを使って吉例Lチカ。遥か昔の記憶でPICはメンドイという意識があったのですが、そんなことはありませんでした。MPLAB X IDEに「標準装備」されたMCCでスイスイです。今回はこれまた吉例Hello Worldを実施。UART1個しかないのに端子は2組、なぜに?
※「鳥なき里のマイコン屋」投稿順Indexはこちら
MPLAB Xpress Evaluation Board
今回使用しているMicroChip社の8ビットマイコンPIC16F18855は、ミッドレンジの8ビットPICとして「推し」になっている近代化したPIC16Fのシリーズ品種みたいです。しかし使用しているXpressボードは、特価品(見切り品)の一品。お求めやすい価格でした。というのもMicroChip社の主力製品はどれもPickitなどの開発ツールでインタフェースをとる形式が多いなかで、あまり人気だとは思えない(個人の感想です)MicroChip社のWeb開発環境むけに特化して(もちろんPCにインストールしたMPLAB X IDEでも使えます)、素のままではPickitなどのツールに対応していないためかと思われます。
USB経由でPCとXpressボードを接続すると、PCからは以下の2つのデバイスが見えます。
-
- UARTシリアルデバイス
- XPRESSというボリューム名のストレージデバイス
こんな感じ。
前回、プログラムの書き込みは XPRESSなるドライブにHEXファイルをドラッグ&ドロップで行いました。
今回は、接続すると現れるUSBシリアル・デバイスにシリアル出力したいと思います。
PIC16F18855のシリアル入出力
データシートをみると、SPI、I2Cなどは複数搭載されているのですがUARTとして使用できるペリフェラルは EUSART が 1個だけのようです。このナケナシの1チャンネルを今回は標準入出力に割りあて、printf()に使ってしまおうという目論見です。printf()さえ使えれば、今回使用のXpressボードはハードウエア・デバッガとのIF無ですが、「伝統のprintf()デバッグ」は出来ると。
しかし、Xpressボードの回路図をみると、UARTの信号らしい信号名の端子が2組存在しているのです。
-
- F188TXU、チップの端子は RC0
- F188RXU、チップの端子は RC1
- F188TXM、チップの端子は RC6
- F188RXM、チップの端子は RC5
回路図上の行先は、TXU/RXUの方がUSB-IFを担当している「裏面」マイコンPIC18LF25K50へ接続。TXM/RXMの方が、表面にある mikroBUS(TM) のスロットにです。TXU/RXUの方に接続すればUSB経由でPCの仮想シリアルポートにつながるんじゃね。
なお、POR(パワーオンリセット)後の初期状態でEUSARTのRXは、上記のどちらでもない端子RC7に接続されているみたいです。ううむ。
この「Pin接続何でもあり」な状態を支えているのが、PPS (Peripheral Pin Select module)というものみたいです。これにより各種ペリフェラルの入出力機能は remappable なんだとか。小ピンでもシブトイPICの真骨頂か?
以下はMCCでEUSARTを追加した後のEUSARTのピンの初期状態です(なお、前回LチカにPA0使いましたが、今回はPA1に変更してます。)
上記をみると、POR後初期値のPC7にRXが接続されとります。
そこでXpressボードのUSB経由で通信できるように以下のようにTX/RX端子をRC0とRC1に変更いたしました。
順序が前後しますが、MCC(Harmony版)ではEUSARTではなく、非同期なUART1というお名前でリソース追加します。こんな感じ。
同期式で使いたかったら別なお名前があるのか?すいません未確認デス。
さて追加したUART1の設定値が以下に。PrintfをUARTに向けろ、割り込みドリブンだぜ、にチェックしてあります。
ビルドしてGo
main.c に以下のような Lチカ 兼 Hello Worldのコードを書き入れました。
早速ビルドしてみます。BUILD SUCCESSFULとな。
生成されたHEXファイルをXPRESSストレージに書き込みましたが、様子が変です。RESETかけると一度だけLEDが点滅し「H」という文字が仮想シリアル端末に表示されるのですが、その後が続きません。もう一度RESET、ダメじゃ。
なんか忘れているだろ~ということで、生成済の main.c 内を見直しました。以下のインタラプトをイネーブルにするための御印は、ジェネレート後のままではコメントアウトされておりました。こいつらのコメントを外してみると。
書き込んだ後、仮想シリアル端末(伝統のTeraTermPro)をみれば、ほれこのように。
よかった。これで伝統のPrintf()デバッグは可能と。