PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第85回]
●PICUSBIO−03(34)Timer1(16)CAPTUREモード(7)オーバーフロー回数を確認
前回からの続きです。
プログラムを実行しました。
左側のプログラムは今までと同じです。
T0CONに$85を設定しています。
プリスケーラは1:64です。
左側のPICも右側のPICもプログラムのもとになるクロックは12MHzです。
左側のPICが送出するパルスの1周期は12MHzをカウントするTimer0が64*2=128回オーバーフローする時間です。
右側のPICも入力パルスの1周期の期間にTimer1がそれと同じだけの回数オーバフローします([第82回]参照)。
右側のプログラムの実行によって表示されたオーバーフロー回数が計算通りの値になっているかどうか確認してみます。
右側のプログラムでは入力パルスの立下りごとにラッチされたTimer1の値が表示されます。
Timer1は16ビットのカウンタですがオーバーフローのたびに+1される上位16ビットのレジスタも同時に表示されます。
合わせて32ビットの値です。
表示は上位桁から8ビットごとに区切って16進数で表示されています。
ひとつ前の値を引いた差が入力パルスの1周期間にTimer1がカウントした総カウント数になります。
下にひとつ前の値との差を計算で求めて追記しました。
DF0973AD
DF897497 008000EA
E0097581 008000EA
E089766B 008000EA
E1097755 008000EA
E189783F 008000EA
追記した値の上位16ビットはオーバーフロー回数でもあります。
それを見ると全て0080(10進数の128)です。
確かに計算通りの値になっています。
下位16ビットは00EA(10進数の234)になっていますが本来は0000であるべき値です。
これは水晶発振の誤差と考えられます([第82回]参照)。
念のためにもう少しテストを続けてみます。
T0CONに$84を設定しました。
プリスケーラは1:32です。
計算によるTimer1のオーバーフロー回数は32*2=64です。
右側のプログラムの表示が実際にそうなっているかどうか確かめてみます。
5B90F588
5BD0F5FD 00400075
5C10F673 00400076
5C50F6E8 00400075
5C90F75D 00400075
5CD0F7D2 00400075
上位16ビットの値は0040(10進数の64)です。
確かに計算通りの値になっています。
下位16ビットは0075(10進数の117)か0076(10進数の118)になっていてこれはさきほどプリスケーラを1:64に設定したときの値の1/2です。
こちらも[第82回]で説明した通り水晶発振の誤差はカウント総数に比例しますから計算通りの結果になっています。
もう少しテストを続けてみました。
T0CONに$83を設定しました。
プリスケーラは1:16です。
計算によるTimer1のオーバーフロー回数は16*2=32です。
8DF940C6
8E194100 0020003A
8E39413B 0020003B
8E594176 0020003B
8E7941B0 0020003A
8E9941EB 0020003B
8EB94226 0020003B
8ED94260 0020003A
上位16ビットの値は0020(10進数の32)です。
確かに計算通りの値になっています。
下位16ビットは003A(10進数の58)か003B(10進数の59)になっていて今回もさきほどプリスケーラを1:32に設定したときの値の1/2です。
こちらも計算通りの結果になりました。
PIC−USBIO using BASIC[第85回]
2022.10.28upload
前へ
次へ
ホームページトップへ戻る