PIC16F887のシリアル通信の謎? → 解決

※下の方に解決の追記あり

これまではPIC16F628AやPIC16F88で内臓のUSARTモジュールを使ってシリアル通信をしてきました。
今回新たにPIC16F887でシリアル通信を行おうと上記2機種と同様の設定を行ったところ、送受信ともにうまくいかない。あれ?
1日中あれこれ試した結果、とりあえずはボーレートを決定するSPBRGの数値を変更することで正常な通信ができるようになりました。

使いたいボーレートとしては9600bpsで、この時20MHzクロック、高速ボーレートを選択という条件で、これらよりSPBRGの数値としては129を選択。
この設定でPIC16F628AやPIC16F88などでは正常に通信できましたが、PIF16F887だと明らかに挙動がおかしいことが判明しました。


今回はオシロスコープで実際に波形を観測したところ、スタートビットからストップビットまでの時間が正常な9600bpsの通信では約1[ms]であるところ実測では4.3[ms]
そこでSPBRGに設定しておく数値を微調整しながら決定したところ、25が今回はちょうどよいことがわかったため設定。現在のところこの設定でうまく送受信できています。


しかしこのやり方は当然納得いかんwどこをうまいこと設定すればいいんだろうなぁと悩んでいます。
というわけでこれはボーレートが合ってないけど受信したことはちゃんと検知してるみたいだから偶然動いてるといえる?もしこのプログラムのままだと値を読み出そうとするとおかしい動作をするはず。これはちゃんと指定が合っていたため問題なく動きます。詳細は以下を参照。


2009 11/25追記

なんと外部クロック指定になってなかったという超初歩的なミスが発覚!今まで_HS_OSCしか指定してなかったのになんで内部クロック動作になっていたのか自分でもよく分かりません。テンプレートから割り込みのレジスタの退避部分をコピーしてくる時に間違えたのかなぁ、くらいしか原因の予想ができませんw

というわけで外部クロック指定にしたところ、ちゃんと思ったとおりに動いてくれるようになりました。いやー恥ずかしいミスでしたw