マイコンの内部で使われている変数の値がいくつなのか、デバッグ中に知りたいものです。
ループカウンターなどはシミュレーションでもわかるのですが(実はシミュレーションは使いこなしていないのです)ADコンバータやRS232Cなどから取り込むデータが正しいのかそうでないのかはバグの範囲を狭めるための重要な情報です。
簡易的にLEDやキャラクター表示器を使うのが多いのですが、直接数値をUSB経由でパソコンに表示するのが確実で簡単のように思えます。
今つかっているWIZ-Cの無料のCコンパイラにもシリアルの入出力のライブラリーがあります。
const long SERIALRATE_IN=9600;
const int BITTIME_IN=(4000*1000)/SERIALRATE_IN/4;
const long SERIALRATE_OUT=9600;
const int BITTIME_OUT=(4000*1000)/SERIALRATE_OUT/4;
と定数を定義しておいて(9600はボーレイト、4000はPICのクロック周波数)
SerialOut(&GPIO,5,CH1D);
mainの中で上記のようにかくとPICのビット5にCH1Dの内容がシリアルで送られます。
USBへは、SVX日記で配布していた?梅林コースで購入した、FT232BM変換基板を使っています。FT232BMはLQFPパッケージでユニバーサル基板では使えないので、試作用にはこのような変換基板が便利ですね。
PICとFT232BMの間はシリアル転送で9600bpsです。
でやってみたら、「ありゃ。。。文字化けだ!」
これは当然でCH1DはADコンバータの値でバイナリー値です。ハイパーターミナルでの表示はキャラクター表示ですね。そのままのバイナリー値を渡しては表示できません。バイナリーキャラクター変換をする必要があります。
以下の変換ルーチンを作りました。見易さのため改行、ラインフィードも必要ですね。
void dspserial(unsigned char no)
{
unsigned char dg3;
unsigned char dg2;
unsigned long mod3;
unsigned char mod2;
unsigned char mod1;
dg3=no/100; //MSD
mod3=dg3%10;
mod2=no%100;
dg2=mod2/10;
mod1=mod2%10;
SerialOut(&GPIO,5,0x30+dg3);
SerialOut(&GPIO,5,0x30+dg2);
SerialOut(&GPIO,5,0x30+mod1);
SerialOut(&GPIO,5,0x0D); //"CR"
SerialOut(&GPIO,5,0x0A); // "LF" TXdata
}
これでmainで
dspserial(CH1D);
と呼べばCH1Dの値をハイパーターミナルで読むことができるようになりました。

写真は「FT232BM変換基板」でリード線は紫色がTXdataで黒色はGNDです。

