「RCサーボ」の続きです。 今回はTIMER3のオーバーフローで発生する高位割込み処理です。 ポート出力を切り替え、データ・メモリー上に予め準備されたデータをTIMER3に設定して割込み処理を抜けることで、RCサーボ制御信号を作り出します。 < PICデバイス=PIC18F1320 >

RCサーボ信号の出力端子は RB2 を使います。 データ・メモリーは下図の 5byte を使いますが、10行目の rcscnt は2個以上のRCサーボを使う時用で今回は利用しません。 他は制御信号が High 及び Low の間の TIMER3 設定値で、各々2byte 必要です。 この 4byte をメイン処理で書き換えるだけで、RCサーボの制御角を変化させることが出来ます。

rsc_symbol

下図は、TIMER3で動作する高位割込み処理のアセンブラ・ソースです。 これまでに紹介してきた汎用イベントタイマー( TIMER0 )とLCD用のタイマー( TIMER2 )は低割り込みを使っています。 高位割り込みは、低位割込み処理中にも発生しますから、TIMER3 を高位割込みに設定することで、他の割込み処理時間の影響を無くする狙いです。

inthigh_asm

今のところ、高位割込みは TIMER3 でしか発生しませんから、割込み要因による分岐はありません。 割込みフラグをクリアして、RB2の値を調べて分岐します。 分岐先ではRB2 の状態を切り替えて TIMER3 のカウンター値を書き換えた後に割込み処理を抜けます。

ここで注意したいのは TIMER3 のカウンター値変更の際には必ず上位8bitを先に設定することです。 TMR3H の値は、TMR3Lを書き換えた時に16bit同時に更新される仕組みに成っているからです。

下図は TIMER3 の初期設定を行っているアセンブラ・ソースです。 必要な設定と共にTIMER3を動作させ、最初の図に示したワークを初期化して、TIMER3 を高位割込みに設定後、割込み許可しています。

timer3_def

以上のプログラムで、既にRCサーボを制御しています。 MPLABのデバッカーで Run の後で一旦 Halt して最初の図の時間設定値(4byte)を書き換えて再び Run すればRCサーボの停止位置が変化するはずです。

RCサーボの割込み処理についての説明を終わります。

RCサーボ関連記事のインデックスはこちらです。 → RCサーボ


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。