PICマイコンのEUSART通信のトラブル解決(電源関連)
デジタル屏風では、監視警報装置の開発を行っています。監視警報装置では、人感センサー、PICマイコン、音声合成LSI、LEDを使って人を検知すると、音声を発すると同時にLEDが点滅する製品です。
PICマイコンと音声合成LSIの間はシリアル通信EUSARTを使っています。しかしある時を境に開発環境上のEUSARTが動作しなくなりました。PICマイコンにはLEDが接続されていて、そのLEDの点灯は問題なく動作していたため、PICマイコン上のEUSARTの問題との認識で調査を数日間行いました。結果的には開発環境の電源供給の問題でありましたが、原因に到達するまでの経験を以下に記述します。
◆Arduino Unoを使ったシリアル通信の検証
PICマイコンと音声合成LSI(ATP3012)を使ったシステムでは、音声が出ないときにPICマイコン側に問題があるのか、ATP3012側に問題があるのかを判断しにくいという問題がありました。そのためPICマイコンと音声合成LSIのそれぞれをArduino Unoで置き換え、シリアル通信を行い、Arduinoのシリアル通信モニタ機能により、それぞれの間で正しい通信が行われているのかを確認することを考えました。
●Arduino Uno 2台でのシリアル通信
まずは、Arduino Unoを2台で、ソフトウェアシリアルを使って相互に通信を行い、それらのうち必要な情報のみをハードウェアシリアルに出力し、モニタすることを考えました。Arduino Unoの3番および4番のピンをソフトウェアシリアルのRXとTXに割り当て、結線します。
プログラムは以下のようにごく簡単なものでArduino間のシリアル通信は動作しました。
モニタ画面に表示される通信内容。タイムスタンプとともに表示することで時系列での送信内容を把握することができます。
●ArduinoとPICのシリアル通信
Arduino Unoどうしがソフトウェアシリアルで通信し、ハードウェアシリアルでモニタできるようになったので、1台のArduinoをPIC16F1823に置き換えました。
PIC側の電源は乾電池と5Vの三端子レギュレータ(5V100mA TA78L05S)を使って提供していました。この電源ではシリアル通信が全く行われません。PICに接続されたLEDはちゃんと点灯します。PICマイコンのシリアル通信EUSARTの設定の問題ということで各種文献を調査しましたが、問題点を見つけることができませんでした。もしかしてArduino側から電源供給をしたら現象が変わるのではないかと考え、試したらシリアル通信が行われたのです。供給電圧は5V、3.3Vのいずれでも正しく動作しました。一方三端子レギュレータで提供する電圧をテスターで測ってみたら6.0Vとなっていました。PIC16F1823の動作電圧は1.8Vから5.5Vと記載されているので、電圧が正しくないという結論に至りました。当初考えもしなかった問題点です。
●Arduino Unoをシリアル通信の動作確認に使う利点
ArduinoをPICマイコンのシリアル通信の確認に使う利点は、ArduinoにつながったPCでシリアル通信の内容が簡単に把握できるという利点の他、Arduinoの基板上に実装されたTXとRXのLEDが光るという点があります。通信のタイミングでLEDが光るので、通信の様子がよくわかるのです。
◆MCCによるEUSART通信設定
PICマイコンのEUSART通信の設定がまずいのだろうということで、色々と調査しました。結論としてはMCC(MPLAB Code Configurator)が有効でお勧めということです。
●MCCの有効性
MCCはグラフィカルなユーザインタフェースから当該PICマイコンに必要な設定を行うものです。MCCについては「C言語によるPICプログラミング大全」(後閑哲也著)に詳しく書かれています。本著ではEUSARTについては、必要最小限の設定(Easy Setup)を行うだけで動作するということが書かれています。本書の通り設定してもどうしても動かない時には、どこかに間違いがあるのではないか、という観点でMCCが生成するパラメータ値が正しいかどうかをMicrochip社のWebサイトなどを使って調べましたが、見つかりませんでした。技術資料の中にはMCCが誕生する前のものであったり、使用するPICマイコンの型によって指定が変わるなど、調べれば調べるほど深みにはまってしまう感がありました。とにかくMCCを信じて問題点を見つけることが重要と感じました。
●PICデータセグメントのオーバーフローに注意
先述の「C言語によるPICプログラミング大全」には記述されていませんが、別の技術資料ではstdioをシリアル通信USARTにリダイレクトすることを推奨するものがあります。この設定を行えば、printf文での出力がシリアル通信にリダイレクトされ非常にデバッグしやすくなります。
筆者も一時期この指定にチェックを入れたのですが、メモリのオーバフローが発生し、プログラム開始直後に異常終了してしまいました。PIC16F1823は128バイトしかデータメモリのサイズがないので、やむを得ないと考え利用をあきらめました。メモリサイズの大きい他のPICマイコンであれば、オーバーフローは発生しないかもしれません。