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

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

LEDを順番に点灯させるソース・コード

 フローチャートに従って、ソース・コードを記述します。 ここでは、C:\Projects\CW\RS08C14という場所に RS08C14というプロジェクトを作成して プログラムを記述していきます。 プロジェクトの作成および設定は、これまでと同じなので、省略します。

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */


//==============================================================
//  V6.0対応パッチ
//==============================================================
#ifndef NVICSTRM
#define _NVICSTRM \
  (*(const NV_ICSTRMSTR *__paged) CONVERT_TO_PAGED(0x00003FFA))
#define NVICSTRM  _NVICSTRM.Byte
#define _NVFTRIM \
  (*(const NV_FTRIMSTR *__paged)  CONVERT_TO_PAGED(0x00003FFB))
#define NVFTRIM   _NVFTRIM.Byte
#endif
//==============================================================


//==============================================================
//  SOPTレジスタの設定
//==============================================================
const byte SOPT_INIT
    = 0b00100010;
//      |||||||+-- RSTPE=0  (PTA2をRESET*として使用しない)
//      ||||||+--- BKGDPE=1 (PTA3をBKGDとして使用する)
//      |||+++---- Reserved
//      ||+------- STOPE=1  (STOP命令を使用可能にする)
//      |+-------- COPT=0   (COPの周期)
//      +--------- COPE=0   (COP機能を使用しない)
//==============================================================


//==============================================================
//  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;
//==============================================================


//==============================================================
//  MTIMSCレジスタの設定
//  MTIMモジュールを起動します。
//==============================================================
const byte MTIMSC_INIT
    = 0b00000000;
//      ||||++++-- Reserved
//      |||+------ TSTP=0     (MTIMを起動します)
//      ||+------- TRST=0     (カウンタをリセットしません)
//      |+-------- TOIE=0     (割り込みは使用しません)
//      +--------- TOF=0      (書き込み無効)    
//==============================================================


//==============================================================
//  変数の宣言
//==============================================================
byte            led_index;      // 点灯させるLEDの場所


//==============================================================
//  初期設定
//==============================================================
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を点灯させる
}


//==============================================================
//  時間待ち
//==============================================================
void wait_moment(void) {
  // MTIMモジュールによる時間待ち
  while (!MTIMSC_TOF) ; // TOFフラグがセットされるのを待つ
  MTIMSC_TOF = 0;       // TOFフラグをクリアする
}


//==============================================================
//  選択したLEDを点灯させる
//==============================================================
void put_led(void) {
  switch (led_index) {
    case 0:                     // LED0を点灯させる
      PTAD  = 0b00010000;       // PTA5=L, PTA4=H, PTA1=Z
      PTADD = 0b00110000;
      break;
    case 1:                     // LED1を点灯させる
      PTAD  = 0b00100000;       // PTA5=H, PTA4=L, PTA1=Z
      PTADD = 0b00110000;
      break;
    case 2:                     // LED2を点灯させる
      PTAD  = 0b00000010;       // PTA5=Z, PTA4=L, PTA1=H
      PTADD = 0b00010010;
      break;
    case 3:                     // LED3を点灯させる
      PTAD  = 0b00010000;       // PTA5=Z, PTA4=H, PTA1=L
      PTADD = 0b00010010;
      break;
    case 4:                     // LED4を点灯させる
      PTAD  = 0b00100000;       // PTA5=H, PTA4=Z, PTA1=L
      PTADD = 0b00100010;
      break;
    case 5:                     // LED5を点灯させる
      PTAD  = 0b00000010;       // PTA5=L, PTA4=Z, PTA1=H
      PTADD = 0b00100010;
      break;
    default:                    // 全部消灯する
      PTAD  = 0b00000000;       // PTA5=L, PTA4=L, PTA1=L
      PTADD = 0b00110010;
  }
}


//==============================================================
//  LEDの点灯位置を移動させる
//==============================================================
void move_led(void) {
  led_index++;                  // 点灯位置を隣に移動する
  if (led_index >= 6) {         // 点灯位置が大きくなりすぎたら
    led_index = 0;              // 点灯位置をLED0に戻す
  }
}


//==============================================================
//  メイン関数
//==============================================================
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/1519

コメントを投稿

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

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

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

Powered by
Movable Type 4.1