C-01チュートリアルで、定間隔のLED点滅方法を説明した。しかし、この第1プログラム最大の問題点は、CPUパワーがほぼ100%タイミングのみに使用されることである。本チュートリアルではタイマーを使用しプロセッサの負荷率を減らす方法を説明する。

タイマーについて

プロセサーには通常タイマーがついている。では、タイマーとは何か?それは、特殊機能を持つカウンターである。カウンターは所定の値までカウントして終了時に割込みを発生させるように設定できる。先ずタイマーのカウント機能について解説する。

MSP430のタイマー

MSP430にはTA0、TA1、 TA2、 TBという4つのタイマーがある。このカウント機能は全タイマーに共通である。特定のイベント(例:カウント終了)が発生した場合、対応する関数の呼び出し設定が可能である。本カウンターを例にとると、カウント上限を設定し、カウンターを動かす。カウンターがこの上限に到達した時に割り込みを発生させる。割り込み(「Interrupt」)によりISR(「Interrupt Service Routine」)という特殊関数が呼ばれ、実際に指定の動作が行われる。

必要な手順は以下の通り:

  • 割込み付きタイマーを任意の値に設定する
  • タイマー終了毎に呼び出されるISRを定義する

MSP430のデフォルトクロックは1MHzになっている。タイマーの上限値を50000にするとLEDの状態は1秒に20回位切り替わるので周期は0.05秒(20Hz)前後になる。

プログラムは以下の通り

 

--------------------

#include <msp430F5659.h>

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
    P2DIR |= 0x03;                          // P2.0 output + P2.1 output (oscillo)
    TA0CCTL0 = CCIE;                        // CCR0 interrupt enabled
    TA0CCR0 = 50000;
    TA0CTL = TASSEL_2 + MC_1 + TACLR;       // SMCLK, upmode, clear TAR
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0, enable interrupts
}

// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) {
    P2OUT |= 0x02;
    P2OUT ^= 0x01;                          // Toggle P1.0
    P2OUT &= ~0x02;
}

--------------------

上記のようにわずかな設定の後、プロセッサはスリープモードにはいる。プロセッサはほぼスリープ状態であるが、LED 状態を反転させるため定期的に起動し、またスリープ状態に戻る。これが割込みの最大の利点で、処理が不要の時にCPUは使用されない。ポート2のビット1も使用されているが、目的はプロセッサーの負荷率を測定することである。オシロスコープをポート2.1に接続すると、以下の結果となる:

Hima

ご覧のように、タイマーの周期と比較し非常に処理時間が非常に短いので、可視化のため画面の輝度を100%に上げる必要がある。

ポート2.1のパルス間隔は約48msである。

パルスのズームにより、その幅が7µs前後であると測定できる。従って、CPUは48µs毎に7µs動いており、その負荷率は0.1〜0.2%の範囲である。

 

 

 

 

 新たな点滅プログラムの他の利点は以下の通り:

  • この技術により、 クロック消費の必要性がなくなる
  • プロセッサーの負荷率が非常に低い
  • タイミングが処理に依存しない。ISRでタスクを増やしても周期は一切変わらない(※)

※ ISRの処理時間がタイマー1周期未満の場合のみ

次の課題

当プログラムは、 CPUパワーを節約する方法を示す。しかし、タイミングがあまり正確ではないことに留意すべきだ。デフォルトクロックは1MHz前後だが、正確に1MHzの場合には50000のタイマー使用により50ミリセカンド近い周期となる。実際の測定では48msだった。

次のチュートリアルでは、プロセッサーの実時間クリスタル時計を使用した正確なタイミングの実現方法を解説する。