制御プログラミングで欠かせない割り込み処理。今回は、C言語によるタイマA割り込みプログラムについて詳しく解説する。
――晴子さんの“ワナ”にはまりつつも、何とかスイッチ入力にかかわるプログラミング、プログラムによるチャタリング対策までを理解した健一君。マイコン制御プログラミングの奥深さを肌で感じ、その面白さに気が付きはじめたようです。さて、今回は晴子さんのどんなスパルタが待ち受けているのでしょうか? そして、今度こそ宿題で満点を取れるのでしょうか? 頑張れ健一君! (前回へ)
さて、そろそろ健一君の授業が終わるころですが……。
ここは健一君が所属する大学のサークル部屋。また、いつもの足音が聞こえてきました……。
あー。今日も疲れた。
またどうせ居眠りしていたくせに!!
ところで、今回はワタシの宿題ちゃんとやってきたわよね。
へへっ〜。
カウント表示くらい簡単、簡単!
あら今回はずいぶん自信があるのね。
じゃあ、健一君のプログラム見せてよ。
ほいっ。
どれどれ……。
ちょっと! 何これ!!
“タイマ”を使っていないじゃないの。
これじゃあ正確な時間を刻むのは無理よ!
え〜。
やっぱりダメか……。
は〜。
仕方ない。今日もはじめるわよ!
――あらあら健一君、今回も晴子さんにダメ出しを食らっています。でも何の解説もなしに「タイマ」を使うのは、健一君でも大変です……。ということで、今回は時計用ベースのタイマである「タイマ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 健一君が作ったプログラム |
なるほど、健一君のプログラムでは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の中核は8ビットのアップカウンタ(TCA)で、TCAに供給するクロックを選択することで周期的なイベントを発生させる機能を持っています。
タイマAは、16MHzのシステムクロックと32.768kHzの時計用サブクロックの2種類のクロック源を持ち、それぞれのクロックは分周器によって周波数が分周されます。
TCAは入力されるクロックによりカウントアップされ、カウンタ値が「255」になった後、クロックが入力されると、「タイマA割り込み要求フラグ(IRRTA)」が「1」にセットされます。
Copyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク