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


PIC−USBIO using BASIC

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

[第100回]



●PICUSBIO−03(49)Timer3(7)CAPTUREモード(1)テストプログラム

CAPTUREモードについては[第79回]で説明をしています。
Timer1を使ったCAPTUREモードのテストは[第80回]で行いました。
今回はそこで作ったプログラムをTimer3用に書き換えて同じテストをします。
PICUSBIO−03を2台使って#30のボードから方形波を出力してそれを#31で受けてCAPTUREモードでカウントします。
下の画像がテストプログラムです。

左側のプログラムは[第69回]で作ったプログラムです。
RC4から周期が約700msecの方形波を出力します。
プログラムの動作、周期の計算については[第80回]を参照してください。
この方形波を右側のPICUSBIO−03 #31のCCP1端子に入力してCAPTUREモードでカウントします。
CCP1はRC5と端子を共用しています。
上記のテストは左側のRC4と右側のRC5とを接続して行ないます。

右側のプログラムの説明です。
[第80回]で作ったTimer1のプログラムと比較できるように先にそのときのプログラム(ccpt3b.txt)をLOADしました。
その下にLOADしたccpt9.txtが今回作成したTimer3用のテストプログラムです。
10行はTimer1の設定なので削除しています。
20行でT3CONレジスタに$89を設定しています。
T3CONについては[第94回]を参照してください。
プリスケーラは使わずシステムクロックの1/4(12MHz)をカウントします。
bit3=1にしています。
CAPTUREモードのTimerとしてTimer3を使う設定です。
30行でCCP1CONレジスタに$04を設定しています。
CCP1端子から入力される信号の下がりエッジでCCP1IFフラグがセットされます。
CCP1CONについては[第78回]を参照してください。
40行でCCP1IFフラグをクリアしています。
CCP1IFはPIR1レジスタのビット2です。
PIR1レジスタについては[第73回]を参照してください。
本来ならPIR1レジスタのビット2のみをクリアすべきところですがプログラムを簡単にするためにPIR1の全ビットをクリアしています。
20行を実行するとTimer3はカウントを開始します(カウントはエンドレスです)。
30行を実行するとCAPTUREモードが開始されます。
50行ではCCP1IFをチェックしています。
CCP1IFがセットされたら次の行(60行)を実行します。
60行でTMR3L、TMR3H、CCPR1L、CCPR1Hの値を読み込みます。
CCPR1レジスタの値は入力信号の次の下がりエッジが来るまでラッチされています。
プログラムとしてはCCPR1レジスタの値を読むだけでよいのですがTimer3が作動していることを確認するためにTMR3レジスタの値も読んでいます。
70行ではCCPR1H、CCPR1L、PIR1、TMR3H、TMR3Lの各値を表示します。
PIR1以外は16進数表示です。
PIR1はCCP1IFの状態を確認するために入力し表示しています。
80行で40行に戻って繰り返します。
上にも書きましたようにCCP1はRC5(PORTCのbit5)と端子を共用しています。
CAPTUREモードではCCP1から信号を入力しますからRC5を入力に設定する必要があります。
PORTCはリセットによって入力に設定されますから今回のプログラムではTRISCの設定はしていません。

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

右側に表示されている数値は前からCCPR1H、CCPR1L、PIR1、TMR3H、TMR3Lです。
CCPR1の値とTMR3の値が全く合っていません。
CCPR1の値は少しずつ変わっていますがTMR3の値はかなり大きく変動しているように見えます。
その理由については[第80回]に書いていますので参照してください。
このテストの場合CCPR1レジスタの値は変動しないはずですが少しずつ変わっています。
そのことについても[第80回]に書いています。
その変動の原因については[第82回]あたりに書いています。
[第80回]ではまだ原因不明の変動でしたから原因を解明するための参考にするためにどのくらい変動しているか表示された値の差を計算しました。
参考までに今回も同じように差を計算してみました。
下は前の値と次の値との差を計算した結果です。

CF7C
D084 108
D18D 109
D295 108
D39E 109
D4A6 108

16進数表示で109(10進数では265)か108(10進数では264)です。
[第80回]でのテストでは104(260)か103(259)でした。
[第80回]のテストは10月20日ごろに行ないました。
前回と今回の差はTimer1とTimer3の差ではなくて多分温度が関係していると思われます。
そのときはまだ暖房はしていませんでしたがさすがに今は寒くなりましたので暖房しています。
水晶発振は高精度ですが発振周波数はわずかですが温度によって変化します。
そのあたりのことについては[第82回]に書きましたのでご参照ください。

[第80回]では左側のプリスケーラの値を変えてテストをしました。
ことのついでですので今回も同じことをやってみました。

さきほどはT0CONに$85を設定していましたが今度は$84を設定しました。
$85はプリスケーラが1:64ですから出力パルスの1周期は699msecです。
今回は$84にしましたからプリスケーラは1:32です。
出力パルスの1周期はさきほどの1/2の349.5msecになります。
さきほどと同じように前の値と次の値との差を計算してみました。

26E6
276B 85
27EF 84
2874 85
28F8 84
297D 85

16進数表示で85(10進数では133)か84(10進数では132)ですからこちらもさきほどの1/2です。
ちなみに[第80回]では83(10進数では131)でした。

PIC−USBIO using BASIC[第100回]
2022.11.15upload

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