« HC08マイコンの使い方QY4A編 -《1》 HC08 QT/QY/QBマイコンの特徴 | メイン | 超Low-EndマイコンRS08を使おう - MC9RS08KA2に多くのLEDを接続する (13) »

超Low-EndマイコンRS08を使おう - MC9RS08KA2に多くのLEDを接続する (12)

モジュロ・タイマの設定について

 このアプリケーションでは、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レジスタは、以下のように設定されています。

MTIMCLKレジスタの設定値一覧
レジスタ名ビット位置 設定値詳細
CLKS5:401 このビットは、基準クロックの元になるクロックを設定します。 このアプリケーションでは、長い周期を使いたいので、 比較的低速なXCLKを使用します。 XCLKは、デフォルト状態では15.625kHzのクロックです。
PS3:00111 このビットは、プリスケーラの分周比を決定します。 このアプリケーションでは、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 */
}

 次回は、プログラムをマイコンに書き込み、実行します。

田中範明

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/1521

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1