8PINのPIC12F675で7セグメントへの表示やRS-232Cのシリアル通信を確認し、今度はPIC16F88に変えてLEDの点灯確認、LCDへの文字列表示、次にRS-232Cのシリアル通信と順番に確認してみた。とにかくPIC16F88の出力ポートでのLEDの点灯確認は最低限ポートの使い方やポートの入出力設定仕様確認上必要だ。ひとまずインターネットからPIC16F88のデータシートをダウンロードしてみた。ページがかなりあるので、必要な部分をとりあえずプリントアウトした。特に配線で使うPinDiagramと出力ポートの全体像が分るDEVICE BLOCK DIAGRAM,とピンの入出力の設定が分るPINOUT DESCRIPTION,そしてシリアル通信のスピード設定のためのBAUD RATES FOR ASYNCHRONOUS MODE(BRGH=1)がのっているページだ。他の細かな部分はPC上で見るため、手元に紙の上記のデータシートがあると作業時の確認はしやすい。ボード作成は小型のブレッドボードを使ったため、配線がしにくかったが、何とかジャンパーワイヤー等を使うことで作れた。もちろんLEDの位置はバラバラで致し方ない。点けばいいという感じになってしまった。今回もシリアル通信の開始前には電源オンでBCDコードを吐き出す出力4ポートは全点灯にする。まったくPIC12F675でやったときと変わらない仕様です。7セグメントはそのままブレッドボードにあるので、いずれ小型のブレッドボードから7セグメントがあるボードに今回の回路を移動しつなげる予定だ。シリアル通信用のレベル変換は前のブレッドボードのものをそのまま使った。電源(+-)とPC側とPIC側の各送信受信ポート2本をそれぞれつなぐだけだ。回路上はなんら問題はない簡単な回路だ。今回は順番にLCDの表示を先に作成していったため、LCDで使ったポート以外でシリアル通信を行うことになるのだが、順番は逆の方がいいと思った。たまたまPIC16F88のUSARTのポートがLCD作成で未使用であったためできたという状況だからだ。これはPINOUT DESCRIPTIONを見ると分る。つまり使用できるポートがAUSARTでは限定されているのです。受信用がRB2で入力ポート、送信用がRB5で出力ポートという具合です。通信用のポートは除いてLCD表示を作成するというのが常道だろう。
さて一番の問題だったのが、PICの675のときのmain以外にあったプログラムとヘッダー群だ。計算では9600bpsを予定したため、(後述するが)675での通信速度は2400bpsで使えないからだ。今回のPIC16F88ではソフトウェアでのシリアル通信ではなく、ハード上に組み込まれたシリアル通信でやるという違いがある。しかも通信速度を決めるクロックもLCD表示でタイミングも既にFosc=8MHzとなってしまっている。この為まったくPIC12F675のときとは違うハード設定のプログラム方法になる。なのでmain以外のシリアル関連のプログラムとヘッダーは全て削除することになった。つまり、main.c、lcd.c、lcd.h、それと削除した代わりのUSART用のHI-TECH のusart.h、usart.cをそれぞれ名前をpic16f88usart.h,pic16f88usart.cに変えてプロジェクトに追加した。というより新規に作成追加したときのファイル名をpic16f88usartにしたためファイル名がオリジナルと違うようになったのが本当だ。なおUSART情報の参考にしたページのURLです。http://picprograming.blog39.fc2.com/blog-entry-8.html
以下写真の右が作成したブレッドボードPIC16F88の回路です。左はシリアル通信のPC用のレベル変換インターフェース回路(DM3202AN)です。
イメージ 1

電源ON後にPCからのキーで0が押されてLCDに表示されたメッセージです。
イメージ 2

TERA-TERMでのPIC電源ON時のメッセージ(Pewer ON,pic16f88usart.h is usefull!)とその後の
PCでのキー操作です。押した数字キーとPICから返された数字のコードが表示されています。
イメージ 3
動作は上記の通りPIC12F675のときとほとんど同じだ。あえてプログラム上では同じ数字でなくコードを送り返した(変数値を使った)。プログラム検討時に少し悩んだことがあった。通信の速度設定値であるSPBRGがPIC16F88のデータシートには8MHz時の設定データとしては載っていないのです。データがあるのはFosc=20MHz、Fosc=16MHz、Fosc=10MHz、Fosc=4MHz、Fosc=3.6864MHzだけです。この為、概略比例計算でSPBRGの値(ボードレート計算用の数値:X)を出した。9.6Kの速度時で20MHzではSPBRGは129であるので、8MHzでは周波数比0.4倍なので129*0.4=51.6 約52を初期の設定値に仮設定した。この設定値が丁度中心にあるかを確認してみた。単純にコンパイルを何回か行う単純確認作業である。この結果SPBRGの可能設定範囲が49から54が文字化け無しの設定範囲でした。ほぼ概略計算があっているようだった。シリアルデータの送信方法として、1文字ずつの送出用と標準のprintfを使うストリング送出の方法で行っています。
PCへの送出データ”Power on”は各1文字ずつ、スペース、改行コード、復帰コードを送っています。
  Rs232Out('P');
        Rs232Out('o');
        Rs232Out('w');
        Rs232Out('e');
        Rs232Out('r');
        Rs232Out(0x20);
        Rs232Out('O');
        Rs232Out('N');
        Rs232Out('\n');
        Rs232Out('\r');
上記の関数は以下の通りです。
void Rs232Out(char outChar)
{
    while(!TRMT);
    TXREG = outChar;
}
その次にPCに送っているデータ”pic16f88usart.h is usefull!”はprintfでのストリング送出です。
        printf("pic16f88usart.h is usefull!\r\n");
どちらかというとPrintfの方が使い勝手はいいです。なお漢字と全角スペースは文字化けします。
やってみて、XC8の対応するPIC(PIC16)ではふるいのだろうか?USART用のヘッダー、プログラムが無いのが、残念だが、今回のHI-TECKのサンプルはそのままでも問題なかったのでこれからはUSART用として使用できると思う。XC8ではあまり機能の少ないデバイスや古いPICを使うなということなのだろうか(PIC18用のUSARTはインクルードのplib中にある)?と思った。また最初の動画の説明をわすれたので、最後にする。電源を入れて最初のメッセージが出ます。上の”Power ON”と”pic16f88usart.h is usefull!”その後にパソコン側でキーボードの数字キーを0から9,8,7.....とたたいていった時のPCから送られたデータを検出してLCDに表示しているだけです。それからLCDの表示は次のデータを表示する前に画面クリアをしないと前のデータとかさなりぐちゃぐちゃになります。
終わりに先の__delay_us(x)、__delay_ms(x)のタイミングに関して、過去のプログラムでディレーを変更して確認しましたが、タイミング等問題はありませんでした。