「周辺機能」を学ぼう:2 of 6

マイコンを使うためには、避けては通れない必須の周辺機能を解説しています。プログラムはルネサスのRX63Nマイコンを搭載しているGR-SAKURAボードのライブラリを例にして解説しています。ぜひ、一度お試しください。

時間・時刻に関わる処理を一手に引き受ける!

マイコンでは、「○月○日○時○分」という時刻はもちろん、経過時間や一定周期といった形の時間が頻繁に使われます。例えば、「このプログラムが動き始めてから、どれだけの時間が経過したか」、「毎秒128回の信号を送る」といったものです。その他にも、「指定した時間を待つ」、「指定した時間が経ったら、次の処理に移る」といった事もよく行われます。これらの時間・時刻に関わる処理を行う周辺機能がタイマです(図1)。

図1:時間・時刻に関わる処理はタイマの仕事

図1:時間・時刻に関わる処理はタイマの仕事

周辺機能(ハードウェア)のタイマを使わずに、ソフトウェアで時間を計る、ということも可能です。右の図2のソフトウェアで、ループ(繰り返し)部分の処理に1µs(マイクロ秒:100万分の1秒)かかるとしましょう。このループを1000回繰り返して1ms(ミリ秒:1000分の1秒)を、100万回繰り返して1秒を数えることが可能です。つまり、「ループ処理で指定時間が過ぎるのを待つ」ことで時間を計るわけです。しかし、それでは、CPUが時間を数える処理に集中してしまい、他の処理が出来なくなります。また、一つの刻み幅を持った時間しか数えられません。現実には、マイコンは0.1秒や1/1024秒などのさまざまな刻み幅の時間に対応する必要があります。

さらに、ソフトウェアには、CPUのクロック周波数(駆動速度)が影響します。100MHz駆動のCPUを50MHz駆動に変更すれば、ループ1回分の処理にかかる時間が2倍になります。そのため、時間を計るソフトウェアの修正が必要になります。このように、管理に手間が掛かる上にミスが起きやすいので、ソフトウェアによって時間を計ることは極力避けています。

図2:ソフトウェアによるタイマの例

図2:ソフトウェアによるタイマの例

割り込みのお話を少しだけ……

ここで、タイマに関わりが深い技術である「割り込み」を簡単にお話しします。マイコンにおける割り込みとは、あるプログラムの実行中に、何らかの原因で送られる「別の処理を始めて」という要求の事を指します。割り込みが使えることで、CPUは一つのことに集中しなくて済みます。

私たちの生活の中で、割り込みをイメージしてみましょう。カップ麺にお湯を入れて、3分経つまで時計をじっと見つめていると、その間には他の事は出来ません。しかし、キッチンタイマに3分と時間をセットしておけば、アラームが鳴るまでは他の事が出来ます。この例では、「時計をじっと見つめている」が先の章で示した「ループ処理で指定時間が過ぎるのを待つ」に相当します。処理が終わるまでは、他の事が出来ませんね。一方、キッチンタイマのアラームは、割り込みに相当します。割り込みが起きるまでは他の事をしていられます。

マイコンの周辺機能にはさまざまなタイマがありますが、これらは指定時間が経過したり、処理が終わったりした時に割り込み信号をCPUに送ります。タイマに限らず、多くの周辺機能は「変化が生じた」、「処理が始まった/終わった」などの情報を割り込みによってCPUに伝えます。これにより、CPUは割り込みがあるまでは別の仕事をして、作業効率を高めることが可能になります。割り込みについての詳細は、本シリーズの第4回「外部割り込みIRQ」で詳しく説明します。本稿では、「周辺機能からは、割り込みという形でCPUに情報を伝える」ということを理解しておきましょう。

さまざまなタイマ、「番犬」もいます!

マイコンの周辺機能で最もお世話になるタイマは、指定時間までを数えるタイマと一定時間ごとに割り込みを発生させるタイマでしょう。さらに、ルネサスのRX63Nには、サーボモータを制御するためのパルス幅変調(PWM)信号を生成するタイマ、入力信号の間隔を測るタイマ、現在時刻を刻んでいるRTC(リアルタイムクロック)などのさまざまなタイマが搭載されています。

タイマの中でも異色と言えるのは、WDT(ウォッチドッグタイマ)でしょう。その名のウォッチドッグタイマ=Watchdogとは「番犬」を意味し、プログラムの暴走を見張るのが仕事です。WDTによって見張られるプログラムは、あらかじめ決められた値をWDTに書き込んで起動します。WDTは一定時間ごとに書き込まれた値を減らしていき、プログラムが正常に動作しているときは、処理が完了する直前にWDTをクリアして終了します。しかし、プログラムが暴走(予期せぬ繰り返し状態に入り込み止まらないこと)し、WDTに書き込まれた値が0より小さくなる(アンダーフローと呼ぶ)と割り込みにより、プログラムの異常をCPUに知らせます。フリーズが許されないような重要なシステムでは、マイコンに搭載している「番犬」―WDTが大活躍します。

お手軽にタイマを試してみよう!

さて、実際のプログラムでタイマを使ってみましょう……と言いたいところですが、実のところ、タイマを使いこなすには、マイコンのマニュアルを理解する必要があります。また、ソフトウェアによる操作手順だけでなく、マイコンのハードウェア(構造)や使用している部品の仕様についても理解していなければなりません。

そこで、困った時のお助けプログラムである「ライブラリ」を使うことにしましょう。RX63Nマイコンを搭載しているGR-SAKURAボードには、時間・時刻に関わるいくつかのライブラリ(下記のリンクを参照)が用意されています。

SAKURAスケッチリファレンス:桜ライブラリ 時間

今回のプログラムは、GR-SAKURA上のLEDを一定の周期で一定時間光らせる、というものです。非常に単純な動作ですが、正確な周期で光らせるにはタイマの利用が必須となります。上記の、桜ライブラリの「時間」の項には経過時間を測るものがありますので、これを使いましょう。

プログラムを図3に示します。14行目のmillis関数は、プログラム開始時からの経過時間をms(ミリ秒:1000分の1秒)単位で返してくれます。引数はありません。この関数を使って、最初の測定(14行目)との差を取ることで1秒後、2秒後を知ります。while文でループを作りaの値から1秒または2秒経つのを待っています(15行目、19行目)。こうして1秒後にLED0(GR-SakuraボードのD1)を点灯、2秒後に消灯しています。消灯後loop関数を終えますが、再びこれが実行されて繰り返し継続します。なお、millis関数は、符号なしlong型の整数を返します。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
#include <rxduino.h>

#define WAIT_TIME   1000UL

void setup()
{
    pinMode( PIN_LED0, OUTPUT);
}

void loop()
{
    unsigned long  a;

    a = millis();     //Get time since program start
    while( ( millis() - a) < WAIT_TIME) { }     //Wait 1 second

    digitalWrite( PIN_LED0, 1);     //Turn LED on

    while( (millis() - a) < WAIT_TIME + WAIT_TIME) { }     //Wait another second

    digitalWrite( PIN_LED0, 0);     //Turn LED off

}
 

図3:タイマ機能を使って、LEDを光らせるプログラム。 この例では、1秒間周期で点滅します。

※//~はコメントのため、プログラムの実行に影響はありません

※原理を理解するためのプログラムのため、厳密な実装ではありません。

プログラムをWebコンパイラに入力し、コンパイルしてできあがったバイナリファイルをGR-SAKURAに転送しましょう。転送が終了すると、4つのLEDがいったん消灯した後に実行が始まり、LED0(GR-SakuraボードのD1)が点滅を始めます。

今回は、必須周辺機能の一つ「タイマ」を解説しました。時間・時刻に係わる処理は、さまざまな場面で必要になると思います、ぜひこれを機会にいろいろなライブラリを試してみてください。

ところで、文中に「毎秒128回」や「1/1024秒」といった数字が、突然出てきて驚かれましたか?128は2の7乗、1024は2の10乗です。1/128秒ごとに割り込みを入れる機能がRTCにあったり……マイコンの世界ではよくお目にかかる数字です。

次回はシリアル通信のUART(ユーアート)を解説します。お楽しみに!

「周辺機能」を学ぼう

  1. GPIO
  2. タイマ
  3. シリアル通信
  4. 割り込み
  5. プログラミング(前編)
  6. プログラミング(後編)