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 */
}
これまでのプロジェクトで使ってきた部品が、プログラムの多くの部分を占めています。
次回は、新しく登場した関数などを解説します。
田中範明
