連載
» 2010年01月26日 00時00分 UPDATE

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

制御プログラミングで欠かせない割り込み処理。今回は、C言語によるタイマA割り込みプログラムについて詳しく解説する

[横田一弘 埼玉県立新座総合技術高等学校 教諭,@IT MONOist]

前回のあらすじ

――晴子さんの“ワナ”にはまりつつも、何とかスイッチ入力にかかわるプログラミング、プログラムによるチャタリング対策までを理解した健一君。マイコン制御プログラミングの奥深さを肌で感じ、その面白さに気が付きはじめたようです。さて、今回は晴子さんのどんなスパルタが待ち受けているのでしょうか? そして、今度こそ宿題で満点を取れるのでしょうか? 頑張れ健一君!前回へ

 さて、そろそろ健一君の授業が終わるころですが……。


本連載の登場人物

ay_S_icon_ani.gif
佐藤 健一(さとう けんいち)
電子工学を専攻している大学2年生。ロボットサークルに参加している。最近、やっと電子工作ができるようになったが……。

ay_H_icon_ani.gif
岡野 晴子(おかの はるこ)
健一君が所属するサークルの先輩。組み込みソフトウェアを研究しており、サークルでも中心的な存在。活発で頼れる(健一君あこがれの)女性。



※注:本連載では、筆者が実際にH8Tiny-USBを制作し、動作確認を行った内容を掲載していますが、読者個人で作成したH8Tiny-USBの動作保証や、H8Tiny-USBを使用したことによる、損害・損失については一切保証できません。すべての作業は自己責任で行ってください。よろしくお願いします。


H8Tinyのタイマを使おう

ここは健一君が所属する大学のサークル部屋。また、いつもの足音が聞こえてきました……。

photo

あー。今日も疲れた。


photo

またどうせ居眠りしていたくせに!!


ところで、今回はワタシの宿題ちゃんとやってきたわよね。


photo

へへっ〜。


カウント表示くらい簡単、簡単!


photo

あら今回はずいぶん自信があるのね。


じゃあ、健一君のプログラム見せてよ。


photo

ほいっ。


photo

どれどれ……。


ちょっと! 何これ!!


“タイマ”を使っていないじゃないの。


これじゃあ正確な時間を刻むのは無理よ!


photo

え〜。


やっぱりダメか……。


photo

は〜。


仕方ない。今日もはじめるわよ!



――あらあら健一君、今回も晴子さんにダメ出しを食らっています。でも何の解説もなしに「タイマ」を使うのは、健一君でも大変です……。ということで、今回は時計用ベースのタイマである「タイマA」について解説します。

 それでは、前回同様、健一君が作ってきたプログラムを見てみましょう(ソースコード1)。

/*  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))
 
void wait(long);
 
int main(void)
{
    unsigned char LED[] = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int count;
 
    PDR5 = 0xfe;
    PCR5 = 0x03;
    PCR8 = 0xff;
 
    count = 0;
    PDR8 = LED[count];
    for (;;) {
        wait(500000);
        if (count < 9)
            count++;
        else
            count = 0;
        PDR8 = LED[count];
    }
    return 0;
}
 
void wait(long times)
{
    while (--times) ;
} 
ソースコード1 健一君が作ったプログラム

  • ソースコード1のダウンロード(seccnt0.lzh

 なるほど、健一君のプログラムではwait関数を使いCPUの処理時間を浪費することで1秒間隔のカウント表示を実現しています。50万カウントで約1秒というわけですね。

 wait関数のような空ループはマイコン制御のプログラムでCPUの処理を一定時間待機したいときによく用いる手法です。しかし、この手法では“正確な”待機時間を得るのは難しいでしょう。それに、Cコンパイラによって生成するコードは異なるので、50万カウントで約1秒さえも保証できません。

 そこで、晴子さんが話していた「タイマ」の登場です。

 晴子さんの宿題(3)のように、制御プログラムでは“周期的な処理”を行うことが多いので、すべてのマイコンといっていいほど、マイコンには「タイマ機能」が搭載されています。

 それでは、「H8/3664」のタイマを使って晴子さんの宿題(3)を問いてみましょう。

 H8/3664には表1のように3つのタイマが搭載されています。今回使用するのは時計向きの「タイマA」です。

名称         機能
タイマA      インターバルタイマ/時計用タイムベース機能を内蔵した8ビットのタイマ
タイマV      外部イベントのカウントが可能な8ビットタイマ。コンペアマッチ信号により任意の周期割り込み要求、任意のデューティ比のパルス出力などが可能
タイマW      アウトプットコンペア機能、インプットキャプチャ機能を内蔵した16ビットのタイマ。外部イベントのカウントが可能なほか、任意のデューティ比のパルス出力が可能な多機能タイマ
表1 H8/3664に搭載されているタイマ

 図1にタイマAの機能を示します。

タイマAの機能イメージ 図1 タイマAの機能イメージ

 タイマAの中核は8ビットのアップカウンタ(TCA)で、TCAに供給するクロックを選択することで周期的なイベントを発生させる機能を持っています。

 タイマAは、16MHzのシステムクロックと32.768kHzの時計用サブクロックの2種類のクロック源を持ち、それぞれのクロックは分周器によって周波数が分周されます。

 TCAは入力されるクロックによりカウントアップされ、カウンタ値が「255」になった後、クロックが入力されると、「タイマA割り込み要求フラグ(IRRTA)」が「1」にセットされます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.