製品紹介 カスタマイズ パーツ販売 共同開発 技術サポート 技術情報 お問合せ 会社案内

周期割込み

 ここでは、周期割込みについて説明します。飛行機や自動車、船など 移動体の運動を制御する場合、一定の時間間隔で操作量を計算し、 サーボの操作量やモーターの回転数などを変化させる必要があります。 これを行うのが周期割込みです。その名の通り、一定の周期で 割込みを入れることができます。つまり、一定の周期で、関数を実行 することができます。

 ここでは、sample1と同様にAP-CORE-Aを使い、 下図のように、50Hz(20msecに1回の割合)で変数をカウントアップし、 それをPCに送信してターミナルソフトに表示します。シリアル通信を使用 しますので、sample1をまだ実行されていない 場合は、先にこちらで機能確認されることを お勧めします。


ハードウェア接続

 今回のハードウェア接続は、sample1と同じです。こちら を参考にして、電源(J1)とシリアルポート(J6)を接続し、PCとAP-COREとで、 シリアル通信ができることを確認してください。


ソフトウェア

 プログラムの説明の前に、タイマーについて理解しておきましょう。 AP-CORE-A/Bに搭載されているH8S/2638 CPUには、16ビットタイマパルスユニット が搭載されています。タイマーとは、正確な時計だと思ってください。 一定の時間間隔で、カウンタの数字が、0から65535(16bit)までカウントアップされ、 これを繰り返します。タイマーは、大きく分けて2つの機能があります。 「コンペアマッチ機能」と「インプットキャプチャ機能」です。

コンペアマッチ機能

 コンペアマッチ機能は、下図のように、カウントアップされるカウンタが ある値(タイマジェネラルレジスタ、TGR)になったときに、割込みを入れて くれる機能です。ちょうど目覚まし時計のような使い方で、こちらは「タイマー」 という名前から想像しやすいと思います。コンペア(compare)は「比較」、 マッチ(match)は「一致する」という意味です。



インプットキャプチャ機能

 インプットキャプチャ機能は、下図のように、コンペアマッチの逆の機能で、 ある条件を満たしたときのカウントの値を、タイマジェネラルレジスタ(TGR) に記録してくれる機能です。こちらは、ストップウォッチのような使い方です。 ある条件とは、信号の立ち上がりや立下りを設定することができます。


 ここで作成する周期割込み機能は、コンペアマッチ機能を使います。 また、AP-CORE-A/Bに搭載されているH8S/2638は、6チャンネルの タイマーがあります。これはつまり、6つのタイマーを独立して使用 できるという意味です。各チャンネルは、基本的な機能は同じですが、 TGRを設定できる数が異なります。今回は、6つのチャンネルのうち、 どのチャンネルを使ってもいいのですが、チャンネル2(TPU2)を 使用します。

 ソフトウェアはここからダウンロード してください。開発環境はsample1と同様にHEWを使用しています。 他のコンパイラを使用されている方は、読み替えてご使用ください。 ここでは、プログラムの要点のみ説明します。

初期設定

 初期設定で最低限設定するレジスタは、タイマーコントロールレジスタ(TCR)、 タイマジェネラルレジスタ(TGR)、タイマインタラプトイネーブルレジスタ(TIER)、 タイマカウンタ(TCNT)、タイマスタートレジスタ(TSTR)です。 各レジスタはカウントアップが停止した状態で設定します。

TCR

 タイマーコントロールレジスタ(TCR)では、カウンタのクリア条件 (CCLR)と、カウントアップ速度(TPSC)を設定します。カウンタの クリア条件(CCLR)は、TPU2のTGRAと一致したときとします。つまり、 TGRAと一致したときに、カウントをゼロクリアします。カウントアップ速度は、 内部クロック(φ=20MHz)の1/16とします。20MHzでカウントアップすると、 1秒間で20,000,000回カウントアップされるので、65535/20000000*1000=約3msecで、 カウントが0クリアされてしまいます。今回は50Hz(20msec)で使用するので、 少なくとも20msecまでは、0クリアされては困るので、20MHzの16回に1回、 つまり20/16=1.25MHzの速度でカウントアップするように設定します。 この場合、65535/1250000*1000=約52msecとなり、50Hz(20msec)で 使用できます。

TGR

 タイマジェネラルレジスタ(TGR)は、上で説明した割込みを入れる タイミングです。この値の設定は、計算が必要です。今、カウントアップ速度 は、TCRで1.25MHzと設定しました。今回は50Hz(20msec)で割込みを入れたいので、 このときのカウンタ値(TGR)は、次式で計算できます。

 TGR/(1.25*10^6)=0.020
 TGR=0.020*1.25*10^6=25000

TIER

 タイマインタラプトイネーブルレジスタ(TIER)は、割込み許可を 設定します。

TCNT

 タイマカウンタ(TCNT)は、カウントアップされるカウントの値です。 初期値はなんでもいいのですが、0としておきます。

TSTR

 タイマスタートレジスタ(TSTR)は、カウントアップをスタートさせます。

tpu.c


割込み設定

 チャンネル2のタイマカウンタ(TCNT)がチャンネル2のタイマジェネラルレジスタ(TGRA) と一致すると、INT_TGI2A_TPU2が割込み起動されます。ここでは、 タイマステータスレジスタ(TSR)の割込みフラグ(TGFA)を0クリアして、 50Hzで起動したいfunc50hz関数を起動します。

intprg.c


50Hz周期関数

 func50hzでスタティック変数を用意して、この値をPCにシリアル送信します。 今回の周期割込みの話とはポイントがズレますが、スタティック変数をそのまま PCに送ると、ターミナルソフトでは数字が表示されません。これは、 ターミナルソフトで受信した値を、 ASCIIコードで定義される文字として表示するからです。文字の"0"は、 0x30に割り振られているので、各桁の値を0x30オフセットさせて送信しています。

sample2.c


メイン関数

 最後にメイン関数です。シリアル通信とタイマーの初期化を行い、 何も実行しない無限ループに入ります。何も実行しなくていいのか? と思うかもしれませんが、割込みが入る自動的にfunc50hz関数が 20msecに1回起動される、という仕組みです。

sample2.c



実行例

 実行例を紹介します。配線や接続の様子は、sample1 と同じです。次の動画は実行画面です。今回もターミナルソフトに 「あくのりっち」 を使用しました。1秒間に50回、数字がカウントアップされていることがわかります。

     
製品紹介 カスタマイズ パーツ販売 共同開発 技術サポート 技術情報 お問合せ 会社案内
〒890-0061 鹿児島市天保山町14-3 TEL 099-213-0511  FAX 099-213-0585