« 超Low-EndマイコンRS08を使おう - MC9RS08KA2で4個のLEDを駆動する (8) | メイン | 超Low-EndマイコンRS08を使おう - MC9RS08KA2で4個のLEDを駆動する (10) »

超Low-EndマイコンRS08を使おう - MC9RS08KA2で4個のLEDを駆動する (9)

今回は、ソース・コードの後半部分を解説します。

初期設定関数の解説

 関数initialize(void)では、 レジスタと変数の初期化を行っています。

//==============================================================
//  初期設定
//==============================================================
void initialize(void) {
  ICSTRM    = NVICSTRM;         // TRIMレジスタを設定する
  ICSSC     = NVFTRIM;          // FTRIMレジスタを設定する
  SOPT      = SOPT_INIT;        // SOPTレジスタを初期化する
  PTAD      = 0;                // ポートPTAの初期出力値を設定する
  PTADD     = PTADD_INIT;       // ポートPTAの入出力方向を設定する
  MTIMCLK   = MTIMCLK_INIT;     // MTIMCLKレジスタを初期化する
  MTIMMOD   = MTIMMOD_INIT;     // タイマの周期を設定する
  MTIMSC    = MTIMSC_INIT;      // タイマを起動する
  // ソフトウェアタイマの設定 
  count_1   = 0;                // タイマ1のカウンタをリセットする
  period_1  = 20;               // タイマ1の周期を設定する
  count_2   = 0;                // タイマ2のカウンタをリセットする
  period_2  = 20;               // タイマ2の周期を設定する
  count_3   = 0;                // タイマ3のカウンタをリセットする
  period_3  = 20;               // タイマ3の周期を設定する
  count_4   = 0;                // タイマ4のカウンタをリセットする
  period_4  = 20;               // タイマ4の周期を設定する
}

 ここで初期設定されているいずれのレジスタも、 すでに音を出すプログラムで解説したものばかりです。

 ソフトウェア・タイマの周期の初期値は、いずれも20としてあります。 この値は、後でデバッガから変更して、点滅周期の変化を確認します。

ソフトウェアタイマ処理関数の解説

 4系統あるソフトウェア・タイマは、すべて同じ構成になっています。 ここでは、ソフトウェア・タイマ1についてだけ解説します。

//==============================================================
//  ソフトウェアタイマ1の処理
//==============================================================
void timer1_proc(void) {
  if (count_1 > 0) {
    // 残り時間あり
    count_1--;                  // 残り時間を減らす
  } else {
    // 時間切れ
    PTAD_PTAD0 = ~PTAD_PTAD0;   // 出力を反転する
    count_1 = period_1 - 1;     // 残り時間を設定する
  }
}

 この部分のソース・コードは、 タイマ処理部のフローチャートに従って書かれています。

 残り時間を設定する際には、 カウンタcount_1に 周期period_1の値そのものではなく "1"だけ少ない値が代入されています。

ソフトウェア・タイマのカウンタ値の動き

 これは、 period_1の値を 厳密な意味での周期としたかったための工夫です。 上の図の例のように、period_1 = 8のときには count_1には、初期値として"7"が代入されます。 すると、ソフトウェア・タイマのイベント周期は、 ちょうどMTIMタイマ・イベント8回分になるというわけです。

 period_1の値が"0"のときには、 8ビット変数であるcount_1の初期値は255になります。 結果として、ソフトウェア・タイマの周期は、 MTIMタイマ・イベント256回分になります。

メイン関数の解説

 メイン関数main(void)は、 フローチャートを忠実に再現した記述になっています。

//==============================================================
//  メイン関数
//==============================================================
void main(void) {

  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  initialize();      //  初期設定
  for(;;) {
    wait_moment();   //  時間待ち
    timer1_proc();   //  タイマ1の処理
    timer2_proc();   //  タイマ2の処理
    timer3_proc();   //  タイマ3の処理
    timer4_proc();   //  タイマ4の処理
  } /* loop forever */
  /* please make sure that you never leave main */
}

 時間待ち関数の呼び出しに続いて、 四つのソフトウェア・タイマの処理が続きます。


 今回は、関数の解説を行いました。 次回からは、プログラムをマイコンに書き込んで実行します。

田中範明

カテゴリ:

トラックバック

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

コメントを投稿

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

最近のエントリ

このブログのフィードを取得
[フィードとは]
会社案内
情報セキュリティおよび個人情報の取り扱いについて

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

Powered by
Movable Type 4.1