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

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

自動的にLEDの明るさを変更するソース・コード

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

#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機能を使用しない)
//==============================================================

//==============================================================
//  PTADDレジスタの設定
//  PTA0, PTA1, PTA4, PTA5を出力に設定します。
//==============================================================
const byte PTADD_INIT
     = 0b00110011;
//       |||||||+-- PTADD0=1  (PTA0を出力にする)
//       ||||||+--- PTADD1=1  (PTA1を出力にする)
//       ||||++---- Reserved
//       |||+------ PTADD4=1  (PTA4を出力にする)
//       ||+------- PTADD5=1  (PTA5を出力にする)
//       ++-------- Reserved
//
//==============================================================
//  LEDの名前をつける
//==============================================================
#define     LED_1       PTAD_PTAD0
#define     LED_2       PTAD_PTAD1
#define     LED_3       PTAD_PTAD4
#define     LED_4       PTAD_PTAD5
//==============================================================

//==============================================================
//  MTIMCLKレジスタの設定
//  MTIMモジュールのクロックとして周波数500kHz、周期2usecの
//  クロックを使用します。
//==============================================================
const byte MTIMCLK_INIT
     = 0b00000011;
//       ||||++++-- PS=0011   (x8 プリスケーラを使用する)
//       ||++------ CLKS=00   (BUSCLKを使用する)
//       ++-------- Reserved
//==============================================================

//==============================================================
//  MTIMMODレジスタの設定
//  MTIMモジュールのイベント発生周期を約80usecに設定します。
//    2usec * 40 = 80usec
//==============================================================
const byte MTIMMOD_INIT         = 40-1;
//==============================================================

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


//==============================================================
//  変数の宣言
//==============================================================
byte    duty_1;                 // LED1のデューティ
byte    duty_2;                 // LED2のデューティ
byte    duty_3;                 // LED3のデューティ
byte    duty_4;                 // LED4のデューティ

//==============================================================
//  初期設定
//==============================================================
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;      // タイマを起動する
  // PWM出力の設定 
  duty_1    = 0;                // LED1を消灯する
  duty_2    = 0;                // LED2を消灯する
  duty_3    = 0;                // LED3を消灯する
  duty_4    = 0;                // LED4を消灯する
}

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


//==============================================================
//  PWM出力処理
//==============================================================
void pwm_cycle(void) {
  byte i;               // 局所ループカウンタ

  // パルス始めの処理
  if (duty_1 > 0) {     // LED1のデューティが"0"でなければ、
    LED_1 = 1;          // LED1を点灯する
  }
  if (duty_2 > 0) {     // LED2のデューティが"0"でなければ、
    LED_2 = 1;          // LED2を点灯する
  }
  if (duty_3 > 0) {     // LED3のデューティが"0"でなければ、
    LED_3 = 1;          // LED3を点灯する
  }
  if (duty_4 > 0) {     // LED4のデューティが"0"でなければ、
    LED_4 = 1;          // LED4を点灯する
  }
  // パルス終端の処理
  for (i = 1; i <= 100; i++) {
    wait_moment();      // 時間待ち
    if (i >= duty_1) {  // LED1のデューティに達したら
      LED_1 = 0;        // LED1を消灯する
    }
    if (i >= duty_2) {  // LED2のデューティに達したら
      LED_2 = 0;        // LED2を消灯する
    }
    if (i >= duty_3) {  // LED3のデューティに達したら
      LED_3 = 0;        // LED3を消灯する
    }
    if (i >= duty_4) {  // LED4のデューティに達したら
      LED_4 = 0;        // LED4を消灯する
    }
  }
}


//==============================================================
//  PHASE-1 : LED1を増光する
//    全消灯からLED1を増光していく
//==============================================================
void phase_1(void) {
  byte i;               // 局所ループカウンタ
  
  duty_1 =   0;         // LED1を消灯
  duty_2 =   0;         // LED2を消灯
  duty_3 =   0;         // LED3を消灯
  duty_4 =   0;         // LED4を消灯
  // LED1の増光ループ
  for (i = 0; i < 100; i++) {
    pwm_cycle();        // PWM出力処理
    duty_1++;           // LED1を1レベル増光
  }
}

//==============================================================
//  PHASE-2 : LED2を増光、LED1を減光する
//    LED1点灯からLED2を増光、LED1を減光していく
//==============================================================
void phase_2(void) {
  byte i;               // 局所ループカウンタ
  
  duty_1 = 100;         // LED1を点灯
  duty_2 =   0;         // LED2を消灯
  duty_3 =   0;         // LED3を消灯
  duty_4 =   0;         // LED4を消灯
  // LED2増光、LED1減光ループ
  for (i = 0; i < 100; i++) {
    pwm_cycle();        // PWM出力処理
    duty_2++;           // LED2を1レベル増光
    duty_1--;           // LED1を1レベル減光
  }
}

//==============================================================
//  PHASE-3 : LED3を増光、LED2を減光する
//    LED2点灯からLED3を増光、LED2を減光していく
//==============================================================
void phase_3(void) {
  byte i;               // 局所ループカウンタ
  
  duty_1 =   0;         // LED1を消灯
  duty_2 = 100;         // LED2を点灯
  duty_3 =   0;         // LED3を消灯
  duty_4 =   0;         // LED4を消灯
  // LED2増光、LED1減光ループ
  for (i = 0; i < 100; i++) {
    pwm_cycle();        // PWM出力処理
    duty_3++;           // LED3を1レベル増光
    duty_2--;           // LED2を1レベル減光
  }
}

//==============================================================
//  PHASE-4 : LED4を増光、LED3を減光する
//    LED3点灯からLED4を増光、LED3を減光していく
//==============================================================
void phase_4(void) {
  byte i;               // 局所ループカウンタ
  
  duty_1 =   0;         // LED1を消灯
  duty_2 =   0;         // LED2を消灯
  duty_3 = 100;         // LED3を点灯
  duty_4 =   0;         // LED4を消灯
  // LED4増光、LED3減光ループ
  for (i = 0; i < 100; i++) {
    pwm_cycle();        // PWM出力処理
    duty_4++;           // LED4を1レベル増光
    duty_3--;           // LED3を1レベル減光
  }
}

//==============================================================
//  PHASE-5 : LED1を増光、LED4を減光する
//    LED4点灯からLED1を増光、LED4を減光していく
//==============================================================
void phase_5(void) {
  byte i;               // 局所ループカウンタ
  
  duty_1 =   0;         // LED1を消灯
  duty_2 =   0;         // LED2を消灯
  duty_3 =   0;         // LED3を消灯
  duty_4 = 100;         // LED4を点灯
  // LED1増光、LED4減光ループ
  for (i = 0; i < 100; i++) {
    pwm_cycle();        // PWM出力処理
    duty_1++;           // LED1を1レベル増光
    duty_4--;           // LED4を1レベル減光
  }
}

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

  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  initialize();         // 初期設定
  phase_1();            // LED1を増光する
  for(;;) {
    phase_2();          // LED2を増光、LED1を減光する
    phase_3();          // LED3を増光、LED2を減光する
    phase_4();          // LED4を増光、LED3を減光する
    phase_5();          // LED1を増光、LED4を減光する
  } /* loop forever */
  /* please make sure that you never leave main */
}

 前回のプログラムから変更があったのは、 五つのフェーズの処理とそれらを呼び出すメイン関数の部分だけです。


 今回は、ソース・コードを公開しました。 次回は、ソース・コードの解説を行います。

田中範明

トラックバック

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

コメントを投稿

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

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

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

Powered by
Movable Type 4.1