自動的に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 */
}
前回のプログラムから変更があったのは、 五つのフェーズの処理とそれらを呼び出すメイン関数の部分だけです。
今回は、ソース・コードを公開しました。 次回は、ソース・コードの解説を行います。
田中範明
