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


PIC−USBIO using BASIC

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

[第105回]



●PICUSBIO−03(54)Timer2(3)割り込みを使う

[第69回]でTimer0のオーバーフロー割り込みプログラムをPIC18F13K50に組み込んで、PICUSBIO用BASICインタプリタでテストプログラムを作成して動作テストを行いました。
Timer1では[第74回]で同じことを行ないました。
Timer3では[第98回]で同じことを行ないました。
いずれもカウンタがオーバーフローしたときに割り込みが発生します。
Timer2ではオーバフロー割り込みではなくてコンパレータによってTMR2の値とPR2の値が一致したときに割り込みフラグがセットされます。
PR2にカウンタの上限値を設定することで任意のカウント数で割り込みを発生させられますからオーバーフロー割り込みよりも柔軟な使い方ができるとも考えられます。
今回は今までのTimerの割り込みプログラムと同じようにTimer2の割り込みが発生するごとにPORTCのビット出力を反転させる割り込みプログラムをPICUSBIO−03のPIC18F13K50に組み込みました。
コンパレータによってTMR2とPR2が一致することでプリスケーラ、ポストスケーラに設定された分周比にしたがって割り込みが発生します。
割り込みが許可されていれば割り込みプログラムによってPORTCのビット1(RC1)の出力が反転します。
Timer0、Timer1、Timer3の割り込みプログラムと同様にこの機能はあくまでオプションとしてそれを使う使わないはBASICプログラムで指定することができます。
具体的にはPORTCのビット1(RC1)を出力に指定しかつTimer2の割り込みを有功にしたときだけ上記の動作をします。
割り込みを有功にしない場合にはTMR2とPR2が一致してTMR2IFがセットされてもそのままではPORTCの出力は変化しません(今回の割り込み機能を組み込む前の機能と同じです)。

Timer2の割り込み許可フラグはPIE1レジスタにあります。

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

bit1のTMR2IEがTimer2の割り込み許可フラグです。
TMR2IEを1にすることでTimer2の割り込みが有効になりますが、それだけでは実際にオーバーフロー割り込みは発生しません。
INTCONレジスタのbit7(GIE)とbit6(PEIE)も1にする必要があります。
INTCONレジスタは[第66回]にDatasheetからのコピーがあります。

割り込みを有効にしたTimerのBASICプログラムはTimer0、Timer1、Timer3のいずれもほぼ同じです。
今回はTimer1用に作ったプログラムをもとにしてTimer2用のプログラムを作りました。
下は[第74回]で作ったTimer1の割り込み動作テストプログラム(tmr1t4.txt)です。


上のプログラムの一部を書き換えてTimer2用の割り込みテストプログラムを作成しました。

20行と50行を書き換えて15行を追加しました。
20行と15行は前回のプログラムと同じです。
50行ではPIE1のビット1(TMR1IE)を1にしました。

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

CH1はRC1の出力波形です。
割り込みが発生する間隔は前回の条件と同じですから約5.5secに1回です。
割り込みが発生するごとにRC1の出力が反転します。
ですから出力波形の周期はその倍の約11msecです。
今回は割り込みプログラムのみが実行されてUSB通信の影響はありませんから計算通りの出力波形が得られました。

プリスケーラとポストスケーラを1:1にしてみました。

20行のT2CONの値を$04にしました。
プリスケーラもポストスケーラもありませんからTMR2のカウント値がPR2と一致するたびに割り込みが発生します。
その間隔を計算してみました。
12000/255=47.0588(KHz)
ですからその逆数は0.02125msec(21.25μsec)になります。
21.25μsecごとに割り込みが発生します。
割り込みが発生するごとにRC1の出力が反転しますから出力波形の周期はその倍の42.5μsecです。

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

計算通りの出力波形が得られました。

PR2はTMR2のカウント上限値(リミット値)を規定するレジスタとして働きます。
PR2に任意の値を設定することで割り込みの周期を可変にすることができます。
プログラムのPR2の値を変更してそのことを確かめてみます。
今まではPR2の値を$FF(255)にしていました。
それを約1/2の$80(128)にしてみます。

そのように変更したときの割り込みの発生間隔を計算してみます。
12000/128=93.75(KHz)
ですからその逆数は0.010667msec(10.667μsec)になります。
10.667μsecごとに割り込みが発生します。
割り込みが発生するごとにRC1の出力が反転しますから出力波形の周期はその倍の21.33μsecです。

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

計算通りの出力波形が得られました。

PR2の値をさらに1/2の$40(64)にしてみました。

割り込みの発生間隔を計算してみます。
12000/64=187.5(KHz)
ですからその逆数は0.00533msec(5.33μsec)になります。
5.33μsecごとに割り込みが発生します。
割り込みが発生するごとにRC1の出力が反転しますから出力波形の周期はその倍の10.66μsecです。

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

計算通りの出力波形が得られました。

PIC−USBIO using BASIC[第105回]
2022.11.20upload

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