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


PIC−USBIO using BASIC

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

[第90回]



●PICUSBIO−03(39)Timer1(21)COMPAREモード(2)テストプログラム(1)

今回はCOMPAREモードの動作を確認します。
前回の説明にしたがってプログラムを作りました。
bit3−bit0を0010に設定します。
CCPR1の設定値とTimer1のカウント値が一致するとCCP1端子の出力が反転する設定です。
今まで2台のPICUSBIO−03ボードを接続して左側のPICUSBIO−03からパルスを出力して、右側のPICUSBIO−03でカウントするという方法でテストをしてきました。
今回もその方法でテストをします。

左側のプログラムでT0CONに$82を設定しています。
プリスケーラは1:8に設定されます。
出力パルスの周期は約87msecです([第81回]参照)。
ちょっとゆっくりしたパルスですがあまり速いパルスにすると右側のテストプログラムで取りこぼしがおきたりしてテストに支障が出ます。
テストですから確実なクロックということでこの速さのパルスにしました。

右側がCOMPAREモードのテストプログラムです。
10行でTRISCに$DFを設定しています。
CCP1端子はPORTCのRC5端子と多重化されています。
CCP1端子から信号を出力するためにはTRISCのビット5を0にしなければなりません。
またTimer1は20行でクロックを外部入力端子(T13CKI)から入力するように設定しています(T1CONのbit1=1)。
T13CKI端子から入力されるクロックの立ち上がりでTimer1がカウントアップします([第70回]Datasheet参照)。
T13CKIはPORTCのRC6と多重化されています。
ですからTRISCのビット6は1にしなければなりません。
PORTCのそのほかの端子は使わないので入力に設定しておきます。
PIC18F13K50の端子図は[第72回]にあります。

30行でCCP1CONに2を設定しています(bit3−bit0を0010に設定)。
40行、50行でCCPR1に$000Aを設定しています。
CCPR1には$FFFFまで設定できるのですがTimer1が入力パルスをカウントしてその設定値と一致したときにCCP1出力が反転するところをオシロで確認するつもりですから余り設定値が大きい(カウント数が多い)とオシロでは目視できません。
オシロで入力パルスの数を簡単に確認できるように$000A(十進数の10)にしました。
Timer1が入力パルスを10回カウントしたところでCCPR1と一致するはずです。
オシロで観察する場合には波形が繰り返し入力されないとうまく観察できません。
そこで一致したときにはCCP1IFがセットされることを利用してプログラムを繰り返し実行するようにします。
CCP1IFはPIR1レジスタのbit2です([第73回]Datasheet参照)。
CCP1IFは毎回クリアが必要です。
本当はPIR1のbit2だけをクリアすべきなのですがこのプログラムではPIR1のほかのフラグビットをクリアしても問題はありませんからPIR1そのものをクリアします(60行)。
COMPAREモードは1回しか実行されません。
繰り返し実行するためには毎回Timer1をクリアする必要があります(70行、80行)。
90行ではCCP1IFがセットされるのを待っています。
本当はPIR1のbit2のみを確認するべきですがこのプログラムではPIR1のほかのビットは立ちませんからこれで大丈夫です。
PIR1が0ではなくなったら(CCP1IF=1になったら)次の行(100行)を実行します。

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

上側(CH1)がT13CKI端子の入力パルスです。
下側(CH2)がCCP1端子の出力です。
入力パルスの立上りに同期して出力が変化しています。
その直後にTimer1がクリアされますからTimer1はまた0からカウントを始めます。
次の入力パルスの立上りから数えて10個目の立上りで出力が反転しています。

PIC−USBIO using BASIC[第90回]
2022.11.3upload

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