今日は、ノイズを加えて3分間待つのだよ。
と言う簡単なお仕事を2,30回こなしたあと、
やっと本来のPICのコーディングに戻れました。
いつもの様に修正を加えてビルド、PICkit2での書き込み、
あれ、動作がおかしい。
おかしくなるような修正したはずはないのに、
と思って、修正したところを元に戻しました。
でも、まだ動作がおかしいのです。
よく見ると、シリアル通信で、ACKを返していません。
コマンドを読み込んだら、ACKを返すはずなのに
と思って、通過ポイントをチェックしてみると
どうやら、受信データがエラーになっています。
試しに、受信したデータをそのまま送信するように
コードを追加してみると....
なんと、1ビットの長さが114μsになっています。
9600ボーなので、104μsになっていないといけない。
目で見ただけで、長くなっているのが分かるほどです。
逆算してクロックの周波数を計算すると、7.3MHzです。
本来の8MHzに比べて8%も低いのです。
これはどう考えてもおかしい。
普通に書き込みをしただけなのに。
ひょっとして、周波数校正したデータを書き換えてしまった?
ところが、このPIC16F687にはそういうものがありません。
クロックは校正され、それからずらすためのOSCTUNEと言う
レジスタは有るみたいですが、起動時は0になっています。
念のため、OSCTUNE = 0; を入れてやっていましたが
変わりませんでした。
代わりに、初期値として10を入れると、動作が正常になりました。
と言うことは、何らかの原因で、ユーザから操作できないレジスタが
書き換わって、周波数がずれてしまったのかも知れません。
ツイッターで聞いてみたら、
PICkit3のバグで書き換わることが有ったそうです。
えー、そんなの怖くて量産で使えないじゃん!
って言ったら、
PICkitは量産用のツールじゃ無いとのこと。
なーんだ、そうなのか。
って、そう言う問題じゃないって。
いずれにしても、気持ちが悪いので、
基板から外して調べてみる必要がありますね。
それと、新しいのを貼り付けたらどうなるのか。
んー、どうも最近PICに振り回され続けています。