メインプログラム:T_SIG.c
プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているT_SIG.cのみを記述します。踏切遮断機用信号出力を追加しました。
メインプログラムは以下の関数から構成されます。
宣言部について
PORTB割込み処理関数
ISR(SENCE)
POARTB入力がLowになるとポート割込みが発生。割込みベクターで設定された、この関数に飛んできます。
どのセンサーに反応して割込みが発生したかを確認して、割込みフラグをセットして戻ります。但し、踏切下のCROSSセンサーが反応した時は割込みフラグをセットせずに、信号官制区間内に列車が存在する事を示すREDフラグをセットします。列車がENTRY/EXITセンサー上に停止してそのまま引き返した場合、信号官制区間に列車が存在している事になってしまい、信号は永久に赤のままとなってしまいます。リセットボタンを設ける事も考えましたが、レイアウトの場合面倒なことになりますので、赤信号でも列車が一度、正しく信号官制区間を通過すれば元に戻るようにしました。
/************************
* POART B割込み処理関数 *
************************/
ISR(SENCE)
{
ENTRY = IN_GetVal();
EXIT = OUT_GetVal();
CROSS = CROSS_GetVal();
/***** 進入センサーに反応 *****/
if(ENTRY == 0)
{
while(!ENTRY) ENTRY = IN_GetVal(); // センサー通過待ち
FLG = 1; // 割込みフラグをセット
}
/***** 退出センサーに反応 *****/
if(EXIT == 0)
{
while(!EXIT) EXIT = OUT_GetVal(); // センサー通過待ち
FLG = 1; // 割込みフラグをセット
}
/***** 踏切センサーに反応 *****/
if(CROSS == 0)
{
while(!CROSS) CROSS = CROSS_GetVal(); // センサー通過待ち
RED = 1; // 誤動作のリセット
}
/***** 割込み処理 *****/
PTBSC_PTBACK = 1; // PTB割込みフラグPTBIFをクリア
PTBSC_PTBIE = 1; // 割込み許可
}
メイン関数
void main(void)
初期設定
TRIM設定はOSBDMでデバックする場合、プログラムで設定します。工場設定値を読み取るか、内部基準クロックを31.25kHzになるように調整したトリム値設定します。
測定方法についてはHCS08QGのICSの項目をご覧ください。
モジュロタイマー設定
内部固定クロックの周波数は内部基準クロックの1/2になります。プリスケーラは1/256とし周期は16.4mSになります。
モジュロ値は信号が黄〜青に変わるまでの時間2秒に設定しています。
割込み設定
KBIに似た機能でPin Interruptを使用します。磁気スイッチが接続されているポートB0から2のみを割込み要因とします。立下りエッジのみを対象に設定します。
メインループ
メインループは割込みフラグがセットされなければ、何もせずに繰り返しループします。割込みフラグがある場合、REDフラグがセットされていなければ列車の進入と判断し、赤信号を点灯してREDフラグをセットします。REDフラグがセットされている間は信号官制区間内に列車が存在することを意味します。再び列車がセンサーを通過して割込みフラグがセットされるとREDフラグもセットされているので、信号官制区間から列車が退出したと判断し、黄信号を点灯させます。モジュロータイマーをスタートさせて、カウンターがモジュロ値(2秒)に達するまで待ちます。その後青信号を点灯させ、REDフラグをクリアして信号官制区間に列車が存在しない状態に戻します。
2008.12.9 追加 : 踏切遮断機作動信号出力としてPTA5をオープンドレイン出力する。
赤信号時は遮断機→閉(PTAD5=1)、黄信号と青信号時は遮断機→開(PTAD5=0)
/*************
* メイン関数 *
*************/
void main(void)
{
/* Write your local variable definition here */
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
/* For example: for(;;) { } */
/***********
* 初期設定 *
***********/
/***** TRIM設定 *****/
ICSTRM = 0xB0; // 内臓基準クロックのトリム設定
ICSSC_FTRIM = 0; // 内臓基準クロックのファイントリム設定
/***** モジュロタイマー設定 *****/
MTIMSC = 0x10; // モジュロタイマー停止
MTIMCLK = 0x18; // 固定内部クロック15.625kHz/256=61.04Hz(16.4mS)
MTIMMOD = 122; // 2sec(タイムアウトは122*16.384mS=2.0sec)
/***** 割込み設定 *****/
PTBES = 0; // 立下りエッジ
PTBPS = 7; // PTB0,PTB1,PTB2のみ割込み対象
PTBSC_PTBMOD = 0; // エッジのみ
PTBSC_PTBIE = 1; // 割込み許可
/***** 起動処理 *****/
SIGNAL_PutVal(6); // 赤信号1秒点灯
Cpu_Delay100US(10000);
SIGNAL_PutVal(5); // 黄信号1秒点灯
Cpu_Delay100US(10000);
SIGNAL_PutVal(3); // 青信号点灯
/***** メインループ *****/
for (;;)
{
if(FLG == 1)
{
/***** 進入処理 *****/
if(RED == 0)
{
SIGNAL_PutVal(6); // 赤信号点灯
PTAD_PTAD5 = 1; // 遮断機→閉 12009.12.10追加
RED = 1;
FLG = 0; // 割込みフラグをクリア
}
/***** 退出処理 *****/
else
{
FLG = 0; // 割込みフラグをクリア
RED = 0; // 赤信号フラグクリア
SIGNAL_PutVal(5); // 黄信号点灯
PTAD_PTAD5 = 0; // 遮断機→開 12009.12.10追加
MTIMSC_TRST = 1; // カウンタリセット
MTIMSC_TSTP = 0; // カウンタスタート
while(!MTIMSC_TOF); // 2sec待ち
SIGNAL_PutVal(3); // 青信号点灯
MTIMSC_TSTP = 1; // カウンタストップ
}
}
}
/*** Don't write any code pass this line, or it will be deleted during code generation. ***/
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;){}
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
/* END T_SIG */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.06 [04.26]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/