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


PIC−USBIO using BASIC

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

[第69回]



●PICUSBIO−03(18)Timer0(5)割り込みを使う

PICUSBIO用BASICでは割り込みは使いません、と今まで書いてきました。
しかしTimer0についての動作テストをやっているうちに「もう少しなんとかしたいなあ」という気持ちになってきました。
Timer0の機能を十分に使おうとするとPICUSBIO用BASICインタプリタのアクセス速度が遅いことが足かせになります。
それは当初から書いていますようにHID型のUSB通信を使っている以上仕方がないことです。
仕方がないことなのですけれど、たとえばこのところの動作テストのようにTimer0のオーバーフローフラグを読んでPORTCからパルスを出力するという動作などは本来はPICのプログラムとして組み込んでしまいたい動作です。
そうすればその部分はUSB通信を経由することなくTimer0とPORTCを直結する形で実行できますからUSBの足かせを外すことができます。
今までのBASICプログラムと同じようにTMR0IFを読んでPORTCからパルスを出力するプログラムをPICのプログラムとして組み込めばもっと短い周期(高い周波数)のパルスを出力することができます。
そういうことならば。
普通のPICプログラムではなくてさらに一歩進んで割り込みを使うべきでありましょう。

ということでPIC18F13K50にTimer0の割り込みプログラムを組み込んでしまいました。
Timer0のオーバーフローが発生するたびにPORTCのビット4(RC4)の出力が反転するように仕込みました。
[第67回]のテストプログラムと同じ動作です。
しかし今回PICに組み込んだ機能はTimer0とPORTCを強制的に結びつけるものですから本来フリーであるべき機能の一部を制約することになります。
ですからこの機能はあくまでオプションとしてそれを使う使わないはBASICプログラムで指定することができるようにしました。
具体的には、PORTCのビット4(RC4)を出力に指定しかつTimer0のオーバーフロー割り込みを使う設定にしたときだけ上記の動作をします。
そのように指定しない場合にはTimer0がオーバフローしてTMR0IFがセットされてもそのままではPORTCの出力は変化しません(今回の割り込み機能を組み込む前の機能と同じです)。

割り込みを有効にして[第67回]のテストプログラムと同じ動作をさせてみました。

たったこれだけのプログラムになってしまいました。
10行でPORTCを出力に設定しています。
必要なのはビット4(RC4)を出力にすることだけですがここでは全ビットを出力に設定しています。
20行はTimer0の設定です。
ここは[第67回]のプログラムと同じです。
30行で割り込みを有効にしています。
[第67回]のプログラムではINTCONを0にしていましたが、今回はTimer0のオーバーフロー割り込みを有効にするためにINTCONのビット7(GIE)とビット5(TMR0IE)を1にしています。

上のプログラムを実行した結果です。

CH1はPORTCのビット4(RC4)の出力です。
[第67回]と同じ周期700msecの方形波が出力されています。

今までのプログラムではUSB経由でPICにアクセスするのに数ミリ秒の時間が加算されるためにPORTCから出力するパルスの周期を短くする(周波数を高くする)と正確なデューティ比50%の方形波ではなくなってしまいます。
今回は割り込みを使えるようにしましたから高い周波数のパルスを出力することができるようになりました。
下は上のプログラムの20行を書き換えることでTimer0のオーバーフロー間隔を短くしてPORTCから出力するパルスの周波数を高くしたプログラムです。

T0CONのビット6を1にしてTimer0を8ビットカウンタに設定しビット3を1にしてプリスケーラを使わない設定にしました。
この場合Timer0は入力信号を256回カウントするごとにオーバーフローします。

上のプログラムを実行した結果です。

Timer0の入力周波数はシステムクロック(48MHz)の1/4の12MHzですからTimer0(8ビットカウンタに設定)がオーバーフローする間隔は
12MHz/256=46.875(KHz)
です。
周期は1/46.875=21.3(μsec)ですがオーバーフローするごとにRC4の出力が反転しますからRC4の出力パルスの周期はその倍の42.6μsecになります。
上の画像のパルス出力は割り込みを使っていますから計算通りの結果が得られています。

PIC−USBIO using BASIC[第69回]
2022.10.6upload

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