PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第104回]
●PICUSBIO−03(53)Timer2(2)TMR2IF
Timer0、Timer1、Timer3のテストではまず最初にTimerの値をPORTCに出力してその波形をオシロで観測しました。
しかしTimer2は直接その値をソフトウェアで取り出すことができません。
そうするとその次に考えられるテストはオーバーフローフラグを読んでPORTCの出力を反転させることです。
そのテストはTimer0では[第66回]で行ないました。
Timer1では[第73回]で、timer3では[第97回]で行いました。
ところが前回書きましたようにTimer2にはそのオーバーフローフラグもありません。
その代わりにコンパレータによってTMR2の値とPR2の値が一致したときにTMR2IFがセットされます。
それを利用すればオーバーフローフラグを使ったプログラムに近いプログラムが作れそうです。
TMR2IFはPIR1レジスタにあります。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
bit1がTMR2IFです。
TMR2用のテストプログラムは[第73回]で作ったTMR1用のプログラムの一部を変更して作りました。
下はもとになったTimer1用のプログラムです。
このプログラムの20行と40行をTimer2用に書き換えます。
今回のプログラムではPR2に値の設定も必要です。
下はそのように作業して作成したTimer2用のプログラムです。
15行を追加します。
PR2にTMR2と比較するカウント上限値として$FFをセットします。これだとオーバーフローよりも1カウント少なくなりますがTimer2ではこれが上限です。
20行でプリスケーラを1:16にポストスケーラも1:16に設定します。
そのようにすることで1回のカウント総数は16×255×16=65280になります。
Timer1などの16bitカウンタでのオーバーフローの場合にはカウント回数は65536ですからそれよりも256カウント少なくなります。
30行でTMR2IFをクリアします。
40行ではPIR1レジスタを読み込んでTMR3IFがセットされているかどうかをチェックします。
セットされていたら50行以下を実行します。
50行ではPORTCの出力ラッチ(LATC)を読み込んでbit7を反転させた値を変数cにいれます。
60行でその値をPORTCから出力します。
70行で30行に戻って繰り返します。
[第73回]のTimer1のテストプログラムではシステムクロックの1/4のクロックをプリスケーラで1:8に分周してそれをTimer1の入力クロックにしました。
今回のTimer2のテストプログラムでもプリスケーラ、ポストスケーラを使っていますがTimer1が16ビットカウンタであるのに対してTimer2は8ビットカウンタです。
上で計算しましたようにプリスケーラとポストスケーラの値を最大にしてもTimer1でプリスケーラを使わない設定よりも256カウント少ない値にしかなりません。
Timer1のテストではプリスケーラを1:8にしたときでもPORTCから出力される波形はUSB(HID)の通信速度の影響でデューティ比が50%にはなりませんでした。
そのときのPORTCから出力されたパルスの周期は87.38msecでした。
今回はそれよりもかなり短い周期になりそうです。
念のために計算してみました。
Timer2にはシステムクロック(48MHz)の1/4(12MHz)をプリスケーラで1/16にしたクロックが入力されます。
そのクロックを255回カウントするごとにPR2と一致した信号が(内部的に)出力されますがそれをポストスケーラで1:16分周したときにTMR2IFがセットされます。
上で計算しましたようにプリスケーラとポストスケーラも含めた総カウント数は65280ですから
12000KHz/65280=0.1838235(183.8235Hz)
TMR2IFがセットされる間隔はその逆数になりますから1/0.1838235=5.44msecです。
5.44msecごとにRC7の出力が反転しますから周期はその2倍の10.88msecです。
これは短いです。
これではUSB(HID)の通信速度の影響をもろに受けてしまいそうです。
まあしかしせっかくプログラムを作ったことですからとにかくプログラムを実行してみました。
CH1はRC7の出力波形です。
計算では約11msecの周期になるはずなのですが40msecほどになってしまいました。
やっぱりこれは無理でした。
これではTimer2が働いているらしいということぐらいしかわかりません。
PIC−USBIO using BASIC[第104回]
2022.11.19upload
前へ
次へ
ホームページトップへ戻る