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


PIC−USBIO using BASIC

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

[第66回]



●PICUSBIO−03(15)Timer0(3)TMR0IF

前回はPICUSBIO用BASICではPICプログラムの割り込みは使いませんと書きました。
Timer0は8ビットモードではカウンタの値がFFから00に変わったとき、16ビットモードではFFFFから0000に変わったときにオーバーフロー割り込みが発生します。
その割り込みを使わないということになるとカウンタとしてはかなり不便です。
実はPICの場合割り込みを使わない設定にした場合でも割り込み条件が発生したことを知ることができる仕組みが用意されています。
今回はそれを使ってみます。
下は割り込みについての設定をするINTCONレジスタです。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

bit7とbit6で割り込みの有効、無効を指定します。
PICUSBIOボードでは割り込みは使いませんからここは0にします。
bit5はTimer0のオーバーフロー割り込みの有効、無効を指定するTMR0IEビットです。
ここを1にすると割り込みが有効になり0にすると無効になります。
ただしbit7の設定が優先されますからbit5を1にしてもbit7が0ならばTimer0の割り込みは無効になります。
ですからbit7が0ならばbit5は1でも0でもよいわけですがまぎらわしいのでここも0にしておきます。
今回注目するのはbit2のTMR0IFです。
このビットはTimer0でオーバーフローが発生したときにセットされます。
割り込みを有効にしたときだけオーバーフローが発生した時にこのビットがセットされるように思えますが、じつはこのビットは割り込みを無効にしている場合(bit7=0、bit5=0)でもオーバーフローが発生した場合にセットされます。
割り込みを使わなくてもこのビットを読むことでオーバーフローが発生したことを知ることができます。
このビットはあらかじめソフトウェアでクリアしておく必要があります。
またこのビットが1になったことを確認したら次にまたオーバーフローしたことを知ることができるようにこのビットをクリアします。

TMR0IFがセットされたらPORTCのビットを1にすることでPORTCからパルスを出力するように考えたプログラムです。

上側がそのプログラムで下側はそのパルスを読んでカウントをするプログラムです。
上側のプログラムの説明です。
10行でPORTCを出力に設定します。
20行は下側のプログラムの実行結果と対比するために変数aを初期クリアします。
30行でTimer0を前回と同じ設定にします(プリスケーラの分周比を1:64に設定します。詳細は前回を参照してください)。
40行でINTCONをクリアします。
割り込みを無効にするとともにTMR0IFビットをクリアします。
50行ではTMR0IFビットをチェックし0ならばPORTCをクリアし、TMR0IFビットが1になるまでそれを繰り返します。
TMR0IF=1のときに次の60行が実行されます。
60行ではPORTCのビット5(RC5)に1を出力しaを+1するとともにaの値を表示します。
そのあと40に戻って繰り返します。
ここでRC5からパルスを出力するようにしたのは、下側のプログラムでTimer0のクロックをRC5からの入力に設定することでTimer0の外部入力カウンタモードの動作テストが行なえるようにするためです。
上側のコマンドプロンプトのPICUSBIO−03と下側のコマンドプロンプトのPICUSBIO−03とはフラットケーブルで接続しています([第56回]参照)。

続いて下側のプログラムの説明です。
10行でTimer0を8ビットカウンタ、外部入力カウンタモードに設定します。
プリスケーラは使いません。
Time0の設定について詳しくは[第64回]を参照してください。
外部入力カウンタモードのときはPORTCのビット5は入力に設定する必要があります。
PICは起動時にはI/Oポートの向きを入力に初期設定しますから、この場合にはあらためてPORTCの設定をする必要はありません。
20行でTMR0Lをクリアします。
30行は同じ値を重ねて表示しないための初期設定です。
40行でTMR0Lの値を変数aに読み込みます。
50行で読み込んだaの値を確認しそれがすでに表示済みの値と同じならば40行に戻って繰り返します。
同じでなければ次の60行を実行します。
60行ではaの値をaaに入れるとともにその値を表示します。
そのあと40行に戻って繰り返します。

下は上側のコマンドプロンプトのPICUSBIO−03のPORTCビット5からの出力波形です。

350msecごとにTimer0(16ビットモード)がオーバフローしていることが波形から確認できます(周期が350msecであることについては前回プリスケーラを1:64に設定したときの計算を参照してください)。

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

上側のPICUSBIO−03のTimer0がオーバーフローするたびにRC5から出力されるパルスを下側のPICUSBIO−03のTimer0がRC5から入力してカウントしている様子が画像から確認できます。
右下に時刻が表示されています。
17時31分ちょうどにプログラムをスタートしました。

2分後にストップしました。

うっかりしてストップした直後に画面をコピーするのを忘れたため時刻の表示が進んでしまいました。
実際は17時33分ちょうどに[Ctrl][B]を入力してプログラムの実行を中止しました。
上側の表示は343で止まっています。
下側の表示は途中255から0に戻っています。
下側のプログラムではTMR0L(8ビット)の値を読んでいますから255、256、257と進んでいくところが256のときに0になります。
最後の値は87ですが上記の理由で下位8ビットの値だけが表示されています。
実際のカウント値は256+87=343です。
上側の値と一致しました。

2分の間に周期350msecのパルスをカウントしましたからそのカウントパルス数は
120/0.35=342.86です。
計算結果と上の画面の表示とが一致しました。

PIC−USBIO using BASIC[第66回]
2022.10.2upload

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