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


PIC−USBIO using BASIC

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

[第82回]



●PICUSBIO−03(31)Timer1(13)CAPTUREモード(4)左右を入れ替えてみる

今回はいよいよ謎の解明にとりかかります。
前回までのところで謎は2つありました。
2つの謎はからみあっているようです。
こういうときはとりあえず解決し易いと思われるほうから取り掛かるのが得策です。
ということで2つ目のほうは後回しにしてまずは1つ目の謎から取り掛かることにします。
これについては[第80回]の終わりのところに書きましたように「あれではないか」と思いついたことがあります。
そのときはただ推測しただけだったのですが昨日になってそのことを確認するよい方法を思いつきました。
今までは左側のコマンドプロンプトでPICUSBIO−03 #30からパルスを出力してそれを右側のコマンドプロンプトのPICUSBIO−03 #31で受けてCCPR1レジスタの値を表示するという形でテストしてきました。
その左右を入れ替えてテストしてみたらどうなるでしょうか?

今までのテストとは逆に右側のPICからパルスを送出してそれを左側のPICで受けてカウントしてみました。
思った通りの結果になりました。
今まではカウントするごとに一定の値だけCCPR1の値が増加しました。
ところが今回は逆に値が減少していっています。
その差を計算してみました。
今までとは逆に前の値から次の値を引きます。

CBA1
CAA7 FA
C9AD FA
C8B3 FA
C7B9 FA
C6C0 F9
C5C6 FA

16進数表示でFA(10進数では250)かF9(249)です。
[第80回]のテストでは16進数表示で104(10進数では260)か103(259)でした。
値が少し違うじゃないかと思われるかも知れませんが、前回テストしたときから少し時間が経っています。
おそらくは気温が関係していると思われます。
念のために左右をもとに戻して今までと同じ向きでテストしてみました。

うっかりして画像をキャプチャするのを忘れてプログラムを実行してしまいましたのでスクロールモードで画面を少し「巻き戻し」ました。
自画自賛ですがPICUSBIO用BASICはとても便利なのです。
前回までと同じように左側のPICからパルスを送出して右側のPICでそれをカウントします。
右側のPICは上のテストでPORTCを出力に設定しました。
今度はPORTCを入力にしなければいけませんからRUNの前にダイレクトモードでTRISCに$FFをOUTしてPORTCを入力に設定しました(BASICインタプリタは便利です!!)。
そのようにしてもう一度実行してみました。

左右を入れ替えましたから前回までと同じ状態でのテストです。
前回までと同じようにCCPR1の値はカウントごとに増加していっています。
その差を計算しました。
次の値からひとつ前の値を引きます。

EFE6
F0E1 FB
F1DD FC
F2D8 FB
F3D4 FC
F4CF FB

16進数表示でFC(10進数では252)かFB(251)です。
上のテストの結果とはわずかに値が異なっていますが前回までの結果(10進数では260か259)に比べれば今回の2度のテストの結果のほうがはるかに差は小さいことがわかります。
今回のこの記事は早朝に書いています。
上のテストはまだ日が昇って間が無い時間に行ないました。
秋もだんだん深まってきてここ数日は朝晩の冷え込みを感じるようになりました。
何が言いたいかといいますと記事を書きながら上のテストをしているために最初のテストと次のテストとでは時間に差があってわずかですが室温に差が出てきてそれが上記のわずかな差になったのではないかということです。
こうやって書いているうちにまた少し時間が経ちました。
窓の外を見ますと日がしっかり昇って本日もよい天気です。
時間が経ちましたのでもう一度RUNしてみました。

差を計算しました。

34EC
35EA FE
36E8 FE
37E6 FE
38E4 FE
39E2 FE

16進数表示でFE(10進数では254)です。
また少し差が大きくなりました。
やっぱり多分室温が影響しているようです。
しかし左右を入れ替えるとそれまではカウントするごとに値が増加していたものが逆に減少するということははっきりしています。
そしてその増加、減少する値の絶対値はほぼ同じと考えてよいと思います。
さらにその値は多分温度によって変化するらしいこともわかってきました。
テストに使っている2台のPICUSBIO−03は全く同じものです。
2つの左右を入れ替えても同じはずです。
ところが左右を入れ替えると増加していたカウント数が減少するようになります。
しかもどうやら温度の影響を受けるらしい、ということになりますと。

もうおわかりかと思います。
水晶しかありませんでしょう。
左右の違いは水晶の個体差による発振周波数のわずかな差によるものと考えられます。
ええっ、それってちょっとおかしいんじゃないの?
水晶発振は高精度なんじゃありませんか?
それがこんなに差が出るなんておかしいと思いますよお。

信じられませんか?
念のため計算してみましょう。
CAPTUREモードでカウントするパルスの周期は。
12MHzのクロックをプリスケーラで1:64に分周してそれを65536カウントするごとに反転するパルスですから周期はその2倍になります。
12000/64/65536の逆数の2倍です。
64*65536/12000*2になります。
それをカウントするTimer1はやはり同じ12MHzのクロックを65536カウントするごとにオーバーフローします。
CCPR1の値は入力するパルスの立下りエッジのときのTimer1の値をキャプチャします。
CCPR1の前の値と次の値の差は入力パルスの1周期をTimer1がカウントした値の差になります。
しかし今までのテストの場合入力される周期はTimer1が何回もオーバフローしてしまう長さですから、単純にCCPR1の差を求めてもその間にTimer1がカウントした総カウント数はわかりません。
それについてはまたのちほど別のプログラムで求めることにして今回は計算でそれを求めてみることにします。
CAPTUREモードで入力パルスをカウントするTimer1もパルスの送出側と同じように12MHzのクロックを65536カウントするごとにオーバーフローします。
ということはそのオーバーフローする回数は64*65536/12000*2を12000/65536で割ることで求められます。
計算すると64*2=128回になります。
端数はありませんから、前に書きましたように計算上はCCPR1の値はカウントごとに常に一定の値になるはずです。
それが増加、減少するのはパルスの送出側の12000/65536とそれをカウントする側の12000/65536が実は同じ値ではないということになります。
65536はどちらも同じですから、結局両者の差は12MHzのクロックの差しか考えられません。
つまるところ水晶の発振周波数の誤差ということになります。
それではその誤差はどれほどのものなのでしょうか。
前回までのテストと今回のテストではわずかですが値に違いがあります。
ここでは大きいほうの値(260)で考えてみます。
入力パルスの1周期の間をTimer1がカウントするごとに260カウントの差が出ます。
入力パルスの1周期は上に書きましたように64*65536/12000*2=699.05(msec)です。
Timer1の1カウントは1/12=0.083(μsec)です。
前者を後者で割ると総カウント数が求められます。
12000が消去されますから総カウント数は64*65536*2=8388608です。
この総カウントごとに260の差が出るのですから左右の水晶の発振周波数の差は260/8388608を計算することで求められます。
非常に小さい値ですのでその結果に1000000を乗じて示します。
30.9944です。
1000000を乗じて求めましたから単位はPPM(parts per million)です。
普通に入手できる水晶の誤差は30PPMほどとされていますからまさにその程度の誤差であることが計算から求められました。

次回はもう少し深く掘り下げてみたいと思います。

PIC−USBIO using BASIC[第82回]
2022.10.24upload

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