メインプログラム:LAMP.c
プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているLAMP.cのみを記述します。
【宣言部】
Types definition
今まで使っていたchar型やint型などのデータ型をunsibned intと書くのは長いのでwordとする宣言文です。
LIGHT LEVEL:ボリュームをAD変換した結果を格納するレジスタです。
WD_CNT:モーションセンサーが人を感知してから10秒間カウントするウェイトカウンタレジスタです。センサーが反応するたびに0にクリアされます。
/* Types definition */
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];
/***** 宣言部 *****/
word LIGHT_LEVEL; // ボリュームのAD変換値レジスタ
byte WD_CNT; // ウェイトカウンタレジスタ
【初期設定】
お馴染みの内臓クロックトリムの設定とモジュロタイマー初期設定です。
//*********************************************************
//* 初期設定
//*********************************************************
/***** TRIM設定 *****/
ICSTRM = 0xA1;
ICSSC_FTRIM = 0;
/***** 初期設定 *****/
MTIMSC_TSTP = 0; // モジュロタイマーイネーブル
MTIMSC_TRST = 1; // モジュロタイマーリセット
WD_CNT = 0; // ウェイトカウンタリセット
【メインループ】
最初のif文がモーションセンサーの分岐で、OFFならPWMデューティーは0%で消灯します。ONではウェイトカウンターをリセットしてスタートさせ、whileでウェイトカウンタが10秒になるまで待ちます。
待っている間はボリュームをAD変換して0〜1023の値を40倍して0〜40920にしてPWM幅設定レジスタTPM1C1Vに代入します。PWM幅の可変範囲は0〜40000までです。
ボリュームで制御できる範囲は0〜1000までという事になります。1001〜1023までは変化しませんが全体の制御範囲の0.02%なので無視します。ウェイトカウンターが1秒をカウントする度にモーションセンサーをチェックしてONであればウェイトカウンターをクリアしてまた0秒からカウントします。人が動いている間はカウンタをクリアしてライトを消さないようにしています。
モーションカウンタが10秒以上ONにならなければウェイトカウンタが10に達するのでwhile文を抜けます。以上を繰り返します。
//*********************************************************
//* メインループ
//*********************************************************
for(;;)
{
if(PTCD_PTCD1 == 0) // モーションセンサーON
{
WD_CNT = 0; // ウェイトカウンタクリア
MTIMSC_TRST = 1; // モジュロタイマーリセット
while(WD_CNT != 10)
{
ADCSC1 = 0; // AD変換スタート
while (!ADCSC1_COCO); // AD変換終了待ち
LIGHT_LEVEL = ADCR;
TPM1C1V = (LIGHT_LEVEL * 40); // AD変換値 0〜1000→PWM幅設定値 0〜40000
if(MTIMSC_TOF) // 1秒経過
{
MTIMSC_TOF = 0; // オーバーフローフラグクリア
WD_CNT++; // ウェイトカウンタインクリメント
if(PTCD_PTCD1 == 0) WD_CNT = 0; // モーションセンサーONなのでウェイトカウンタをクリア
}
}
}
else TPM1C1V = 0; // PWM幅デューティー0%(LAMP OFF)
}