割り込みテクニックでタイマを使おうイチから作って丸ごと学ぶ! H8マイコン道(10)(2/3 ページ)

» 2010年01月26日 00時00分 公開

 それでは、C言語によるタイマAの制御を考えてみます。

 タイマAの機能は、図2の「タイマモードレジスタA(TMA)」によって設定します。

 TMAは、メモリの「0xffa6」番地にあるので、


#define TMA (*(volatile unsigned char *)0xffa6) 

と定義します。

 1秒間隔の周期イベントを発生させるには、TMAの第3ビットを「1」にセットして、時計用サブクロックを選択し、さらにTMAの第2ビットから第0ビットを「000」とすることで周期を1秒に設定します。なお、TMAの第7ビットから第5ビットはクロック出力のためのものなので今回は使用しません。

 以上の設定をC言語では、

    TMA = 0x18; 

と記述します。

タイマモードレジスタA(TMA) 図2 タイマモードレジスタA(TMA)

 さて、タイマAの発生する周期イベントは、図3のようにIRRTAフラグによって通知されます。IRRTAフラグは「割り込みフラグレジスタ1(IRR1)」の第6ビットにあります。

割り込みフラグレジスタ1(IRR1) 図3 割り込みフラグレジスタ1(IRR1)

 IRR1は、メモリの「0xfff6」番地にあるので、

#define IRR1 (*(volatile unsigned char *)0xfff6) 

と定義します。

 そしてIRRTAフラグを、

#define IRRTA 0x40 

と定義します。

 IRRTAフラグは、タイマカウンタがオーバフローすると「1」にセットされますが、IRRTAフラグを解除するのはプログラムの仕事です。その方法はC言語で、

    IRR1 &= ~IRRTA; 

です。

 プログラムは次のようになります(ソースコード2)。

/*  1秒間隔でカウント表示する。
 *
 */
#define PCR5 (*((volatile unsigned char *)0xffe8))
#define PDR5 (*((volatile unsigned char *)0xffd8))
#define PCR8 (*((volatile unsigned char *)0xffeb))
#define PDR8 (*((volatile unsigned char *)0xffdb))
#define TMA (*(volatile unsigned char *)0xffa6)
#define IRR1 (*(volatile unsigned char *)0xfff6)
#define IRRTA 0x40
 
int main(void)
{
    unsigned char LED[] = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int count;
 
    PDR5 = 0xfe;
    PCR5 = 0x03;
    PCR8 = 0xff;
    TMA = 0x18;
    IRR1 &= ~IRRTA;
 
    count = 0;
    PDR8 = LED[count];
    for (;;) {
        while ((IRR1 & IRRTA) == 0) ;
        IRR1 &= ~IRRTA;
        if (count < 9)
            count++;
        else
            count = 0;
        PDR8 = LED[count];
    }
    return 0;
} 
ソースコード2

  • ソースコード2のダウンロード(seccnt1.lzh

タイマは割り込みで使え!

photo

おー。すごい!!


タイマを使えば時間は正確だね。


photo

そうよ。だって時計と同じなんだから。


photo

ところで、H8/3664には3つのタイマがあるけど、これってマイコンによって違うの?


photo

タイマは周期的なイベントを発生するだけでなく、パルスの計測や生成など応用範囲が広いので種類もたくさんあるの。


photo

うは〜。


それじゃあ、ますます勉強しなくちゃ。


トホホ……。


photo

そうよ。ワタシとデートしたいんなら勉強もできなくっちゃ!!


いまの健一君じゃ、まだまだね。


それはともかく、早速“割り込み”やってみようよ!


photo

エッ!? なっ、何ですかそれ?



――タイマが使えるようになって、健一君も大喜び。けれども晴子さんとのデートはおあずけのままです。実はタイマで周期的な処理を行うには、割り込みと連携するのが一般的です。ここではC言語による割り込み処理について解説します。

 ソースコード2では、IRRTAフラグを常時監視して、タイマAの周期イベントをキャッチしていました。そのフローチャートは図4のようになります。

ポーリングによるプログラム 図4 ポーリングによるプログラム

 以上のようなイベント監視の手法は、制御プログラムではよく使われていて、「ポーリング」と名付けられています。図4の赤線で囲まれた部分がポーリングで、ループによりフラグを常時監視するのです。

 しかし、この方法ではフラグを監視している間、CPUがほかの処理を行うことができません。そこで考え出されたのが「割り込み(Interrupt)」です。割り込みの場合、イベント発生したときに、マイコンが処理プログラムを自動的に呼び出してくれるのです。

 割り込みを用いた場合のフローチャートを図5に示します。

タイマA割り込みによるプログラム 図5 タイマA割り込みによるプログラム

 main関数はタイマAを初期化し、IRRTAフラグに伴う割り込みを許可して、ほかの処理を行います(ここでは無限ループ)。

 タイマカウンタがオーバフローし、IRRTAフラグがセットされると、マイコンは割り込み処理シーケンスを遂行します。すなわち、いまのプログラムの実行を中断して、割り込み処理の実行を開始するのです。

 割り込み処理が終了すると、マイコンは中断されていた処理の実行を再開します。

Copyright © ITmedia, Inc. All Rights Reserved.