PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第101回]
●PICUSBIO−03(50)Timer3(8)CAPTUREモード(2)T3H3、T3H2
[第84回]でPICUSBIO−03に実装しているPIC18F13K50に組み込んでいるTimer1用の割り込みプログラムを追加変更してTMR1レジスタの上位レジスタとしてT1H2、T1H3を作りそれをPICUSBIO用BASICインタプリタでアクセスできるようにしました。
このレジスタの値を読むことでTimer1のオーバーフロー回数を知ることができます。
それと同じことをTimer3についてもできるようにしました。
Timer3の場合にはTMR3レジスタの上位レジスタとしてT3H2、T3H3を追加作成しました。
もともとのTimer3レジスタは16bitです。
その下位8bitがTMR3Lで上位8bitがTMR3Hです。
今回追加したのはTimer3レジスタのさらに上位の16bitレジスタです。
その上位16bitのレジスタのうちの下位8bitがT3H2で上位8bitがT3H3です。
上位レジスタからT3H3、T3H2、TMR3H、TMR3Lというように並べると連続した32bitレジスタになります。
[第84回]で作成したTimer1用のプログラムをTimer3用に書き換えました。
Timer1からTimer3への変更部分がわかるように先にTimer1用のプログラムをLOADしてそのあとで今回作成したTimer3用のプログラムをLOADしました。
Timer1用のプログラムの10行がスクロールで消えてしまいましたが10行は下のTimer3用のプログラムと同じです。
右側のコマンドプロンプトのBASICプログラムは今までのCAPTUREテストプログラムにTimer3の割り込み回数をカウントするレジスタの値も表示するように追加変更したプログラムです。
Timer3の割り込みを有効にするにはINTCONのbit7とbit6を1にする(10行)とともにPIE2のbit1を1にします。
PIE2は[第98回]で説明をしています。
[第84回]でも書きましたがTimer3の割り込みに加えてCCP1の割り込みも必要なことがわかりましたので50行ではPIE1のbit2(CCP1IE)とPIE2のbit1(TMR3IE)の両方を1にしています。
70行と90行のCCP1IFレジスタに関しては[第84回]で書いていますのでそちらを参照してください。
110行のT3H3とT3H2は上に書きましたようにTimer3のオーバーフロー回数をカウントするレジスタです。
T3H3が上位8ビット、T3H2が下位8ビットです。
ともにCCP1割り込みでラッチされます。
CCPR1割り込みでTimer3カウンタのTMR3H(上位8ビット)がCCPR1HにラッチされTMR3L(下位8ビット)がCCPR1Lにラッチされますから、T3H3、T3H2、CCPR1H、CCPR1Lをその順に並べると32ビットの連続したカウンタになります。
120行のprint文はその順に表示します。
プログラムを実行しました(Timer1のプログラムの実行は[第85回]で行ないました)。
左側のプログラムは今までと同じです。
T0CONに$85を設定しています。
プリスケーラは1:64です。
左側のPICも右側のPICもプログラムのもとになるクロックは12MHzです。
左側のPICが送出するパルスの1周期は12MHzをカウントするTimer0が64*2=128回オーバーフローする時間です。
右側のPICも入力パルスの1周期の期間にTimer3がそれと同じだけの回数オーバフローします。
右側のプログラムの実行によって表示されたオーバーフロー回数が計算通りの値になっているかどうか確認してみます。
右側のプログラムでは入力パルスの立下りごとにラッチされたTimer3の値が表示されます。
Timer3は16ビットのカウンタですがオーバーフローのたびに+1される上位16ビットのレジスタも同時に表示されます。
合わせて32ビットの値です。
表示は上位桁から8ビットごとに区切って16進数で表示されています。
ひとつ前の値を引いた差が入力パルスの1周期間にTimer3がカウントした総カウント数になります。
下にひとつ前の値との差を計算で求めて追記しました。
89221BB8
89A21CB3 008000FB
8A221DAF 008000FC
8AA21EAA 008000FB
8B221FA6 008000FC
8BA220A2 008000FC
追記した値の上位16ビットはオーバーフロー回数でもあります。
それを見ると全て0080(10進数の128)です。
計算通りの値です。
下位16ビットは00FB(10進数の251)か00FC(10進数の252)になっていますが本来は0000であるべき値です([第85回]では00EAでした)。
これは水晶発振の誤差と考えられます([第82回]参照)。
PIC−USBIO using BASIC[第101回]
2022.11.16upload
前へ
次へ
ホームページトップへ戻る