モジュロ・タイマの設定について
このアプリケーションでは、LEDの点滅を目で確認します。 そのため、モジュロ・タイマは、ゆっくりとした周期で動作させます。
//==============================================================
// MTIMCLKレジスタの設定
// MTIMモジュールのクロックとして周波数122Hz、周期8.192msecの
// クロックを使用します。
//==============================================================
const byte MTIMCLK_INIT
= 0b00010111;
// ||||++++-- PS=0111 (x128 プリスケーラを使用する)
// ||++------ CLKS=01 (XCLKを使用する)
// ++-------- Reserved
//==============================================================
//==============================================================
// MTIMMODレジスタの設定
// MTIMモジュールのイベント発生周期を約500msecに設定します。
// 8.192msec * 61 = 499.7msec
//==============================================================
const byte MTIMMOD_INIT = 61-1;
//==============================================================
モジュロ・タイマのMTIMCLKレジスタは、以下のように設定されています。
| レジスタ名 | ビット位置 | 設定値 | 詳細 |
|---|---|---|---|
| CLKS | 5:4 | 01 | このビットは、基準クロックの元になるクロックを設定します。 このアプリケーションでは、長い周期を使いたいので、 比較的低速なXCLKを使用します。 XCLKは、デフォルト状態では15.625kHzのクロックです。 |
| PS | 3:0 | 0111 | このビットは、プリスケーラの分周比を決定します。 このアプリケーションでは、122Hz周期のクロックを使用するために、 1/128の分周比を指定します。 |
モジュロ・タイマには、122Hzのクロックが与えられます。 さらにMTIMMODには、60が与えられているので、そのクロックの61周期分、 すなわち約0.5秒ごとにLEDが移動します。
初期設定関数の解説初期設定関数initialize(void)では、 モジュロ・タイマの設定が追加されています。
//==============================================================
// 初期設定
//==============================================================
void initialize(void) {
ICSTRM = NVICSTRM; // TRIMレジスタを設定する
ICSSC = NVFTRIM; // FTRIMレジスタを設定する
SOPT = SOPT_INIT; // SOPTレジスタを初期化する
MTIMCLK = MTIMCLK_INIT; // MTIMCLKレジスタを初期化する
MTIMMOD = MTIMMOD_INIT; // タイマの周期を設定する
MTIMSC = MTIMSC_INIT; // タイマを起動する
led_index = 0; // LED0を点灯させる
}
点灯位置を移動する関数の解説
関数move_led(void)では、 LEDの点灯位置を一つだけ移動します。
//==============================================================
// LEDの点灯位置を移動させる
//==============================================================
void move_led(void) {
led_index++; // 点灯位置を隣に移動する
if (led_index >= 6) { // 点灯位置が大きくなりすぎたら
led_index = 0; // 点灯位置をLED0に戻す
}
}
この関数は、フローチャートをそのまま書き下したものです。
メイン関数の解説メイン関数main(void)は、 フローチャートを忠実に再現した記述になっています。
//==============================================================
// メイン関数
//==============================================================
void main(void) {
EnableInterrupts; /* enable interrupts */
/* include your code here */
initialize(); // 初期設定
for(;;) {
wait_moment(); // 時間待ち
put_led(); // 選択したLEDを点灯させる
move_led(); // 点灯位置を移動する
} /* loop forever */
/* please make sure that you never leave main */
}
次回は、プログラムをマイコンに書き込み、実行します。
田中範明
