今回は、ソース・コードの後半部分を解説します。
初期設定関数の解説関数initialize(void)では、 レジスタと変数の初期化を行っています。
//==============================================================
// 初期設定
//==============================================================
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; // タイマを起動する
// ソフトウェアタイマの設定
count_1 = 0; // タイマ1のカウンタをリセットする
period_1 = 20; // タイマ1の周期を設定する
count_2 = 0; // タイマ2のカウンタをリセットする
period_2 = 20; // タイマ2の周期を設定する
count_3 = 0; // タイマ3のカウンタをリセットする
period_3 = 20; // タイマ3の周期を設定する
count_4 = 0; // タイマ4のカウンタをリセットする
period_4 = 20; // タイマ4の周期を設定する
}
ここで初期設定されているいずれのレジスタも、 すでに音を出すプログラムで解説したものばかりです。
ソフトウェア・タイマの周期の初期値は、いずれも20としてあります。 この値は、後でデバッガから変更して、点滅周期の変化を確認します。
ソフトウェアタイマ処理関数の解説4系統あるソフトウェア・タイマは、すべて同じ構成になっています。 ここでは、ソフトウェア・タイマ1についてだけ解説します。
//==============================================================
// ソフトウェアタイマ1の処理
//==============================================================
void timer1_proc(void) {
if (count_1 > 0) {
// 残り時間あり
count_1--; // 残り時間を減らす
} else {
// 時間切れ
PTAD_PTAD0 = ~PTAD_PTAD0; // 出力を反転する
count_1 = period_1 - 1; // 残り時間を設定する
}
}
この部分のソース・コードは、 タイマ処理部のフローチャートに従って書かれています。
残り時間を設定する際には、 カウンタcount_1に 周期period_1の値そのものではなく "1"だけ少ない値が代入されています。
これは、 period_1の値を 厳密な意味での周期としたかったための工夫です。 上の図の例のように、period_1 = 8のときには count_1には、初期値として"7"が代入されます。 すると、ソフトウェア・タイマのイベント周期は、 ちょうどMTIMタイマ・イベント8回分になるというわけです。
period_1の値が"0"のときには、 8ビット変数であるcount_1の初期値は255になります。 結果として、ソフトウェア・タイマの周期は、 MTIMタイマ・イベント256回分になります。
メイン関数の解説メイン関数main(void)は、 フローチャートを忠実に再現した記述になっています。
//==============================================================
// メイン関数
//==============================================================
void main(void) {
EnableInterrupts; /* enable interrupts */
/* include your code here */
initialize(); // 初期設定
for(;;) {
wait_moment(); // 時間待ち
timer1_proc(); // タイマ1の処理
timer2_proc(); // タイマ2の処理
timer3_proc(); // タイマ3の処理
timer4_proc(); // タイマ4の処理
} /* loop forever */
/* please make sure that you never leave main */
}
時間待ち関数の呼び出しに続いて、 四つのソフトウェア・タイマの処理が続きます。
今回は、関数の解説を行いました。 次回からは、プログラムをマイコンに書き込んで実行します。
