2022.10.25
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第83回]



●PICUSBIO−03(32)Timer1(14)CAPTUREモード(5)誤差を0にする

前回はCAPTUREモードのテストでCCPR1レジスタの値が入力パルスをカウントするごとに一定の値ずつ増加(または減少)する原因が水晶発振の誤差であるらしいということをテストと計算によって確かめました。

今回は前回とは別のテストによって確認してみます。
前回書いたことなのですが、CAPTUREモードのテストはTimer0とTimer1の違いはあるものの、送出するパルスの周期は12MHzの入力クロックを65536カウントしてオーバーフローする時間の整数倍(これをN回とします)になっていて、その一方でそのパルスの周期をCAPTUREモードでカウントするTimer1のクロックも12MHzですからTimer1が65536カウントでオーバーフローする回数がちょうどN回のときに入力パルスの1周期をカウントしたことになるはずです。
その計算は前回に示しましたがその計算結果には端数はありません。
つまり今まで問題としていた増加減少の差分がもしも水晶発振の誤差だったとしたら、その誤差さえなければCCPR1の値はカウントするごとに常に一定の値を示すはずです。
どうしたら水晶発振の誤差を0にすることができるでしょうか?
そんなことはできっこない、でしょうか。
そうですよねえ。
ちょっと考えるとそんなことは無理だと思えますけれど。

実は突然にひらめいたのです。
送出側とそれを受ける側が別々に水晶発振をしているからそこに発振誤差が発生します。
もしも両方が同じクロックを使ったら誤差は生じないはずです。
と言っても回路を改造したりPICのプログラムをいじくったりする必要はありません。
もっと簡単な方法があるじゃありませんか。
1台のPICUSBIO−03だけを使って自分で送出したパルスを自分で受けてそれをカウントすればよいのです。

そんなことがうまくできるでしょうか。
それはやってみればわかることです。
今まで左側のPICで実行していたプログラムと右側で実行していたプログラムを合体させて1本のプログラムにしてしまいました。

5、6、7行のプログラムが左側のプログラムです。
それを右側のプログラムの先頭に追加しました。
ただし今までは左側のPORTCはRC4からパルスを出力しそれを右側のRC5で入力していました。
そのRC4とRC5を結線するとともにPORTCのビットの向きをビット4(RC4)のみ出力にして他のビットを入力に設定しました。
それが5行のpicout TRISC,$efです。
またまた自画自賛ですけれどこういうことがいとも簡単にできてしまうところがPICUSBIO用BASICインタプリタのなんとも便利なところなのです。

プログラムを実行しました。

考えた通りの結果になりました。
CCPR1の値は見事に固定したままです。
CAPTURERモードが働いている証拠にTimer1の値(TMR1H、TMR1L)は毎回異なった値を表示しています。

PIC−USBIO using BASIC[第83回]
2022.10.25upload

前へ
次へ
ホームページトップへ戻る