メインプログラム:T_CROSS2.c

プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているT_CROSS2.cのみを記述します。

【メインプログラム】
緑文字部分はプロセッサーエキスパートが自動生成したソースです。

/** ###################################################################
** Filename : T_CROSS2.C
** Project : T_CROSS2
** Processor : MC9S08SH8CPJ
** Version : Driver 01.11
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2010/05/27, 14:39
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE T_CROSS2 */


/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "LAMP_OUT.h"
#include "TCS_IN.h"
#include "SIG_OUT.h"
#include "PWM1.h"
#include "PWM2.h"
#include "IV1.h"
#include "FC1.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"

【宣言部】
typedefはcharやintの代わりにbyteやwordを使えるように宣言します。
byteは8ビット、wordは16ビット、dwordは32ビットとして扱われます。
PWMCNTはサーボを制御するパルス幅を格納するレジスタで、PWMのクロックは0.25uSですからサーボのj標準制御範囲、パルス幅1.0mSで4000〜2.0mSで8000です。
TCS_DATAはTCSセンサーによる割込みが発生した時に全ての4つのTCSセンサーの状態を一時格納するレジスターです。
REDは官制区間に電車が進入して赤信号状態である間、”1”に設定されます。
FLGは割込みが発生した時、セット(1)されます。メインループで必要な処理が終了したらクリア(0)されます。
TIME_CNTはフリーカウンターが0.5秒計測するごとに加算して時間を計測する時に使用するカウンターです。
DELAYは警報ランプが点滅を始めてから遮断機が閉じ始めるまでの時間を設定します。0.5秒単位に設定できます。
SPEEDは遮断機の動く速度を設定します。数値が大きくなると遅くなります。
使用するサーボやリンケージにより遮断機の開放位置と閉鎖位置は変わるので、設定できるようにします。但し、スマートサーボはパルス幅1mS〜2mS以上は受け付けないので4000〜8000となります。
OPENが遮断機開放位置のPWM_CNTレジスタに設定する値です。
CLESEは遮断機閉鎖位置のPWM_CNTレジスタに設定する値です。
YEL_TIMEは黄色信号の保持時間を設定します。

/* User includes (#include below this line is not maintained by Processor Expert) */
//*********************************************************
//
// Filename : T_CROSS2.c
// Version : 01.00
// Compiler : CodeWarrior HCS08 C Compiler
// Date/Time : 2010/05/30, 0:00
//
// 信号機と踏切遮断機制御プログラム
//
// Copyright : n.Tanaka
//
//*********************************************************
/* Types definition */
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];

/***** 宣言部 *****/
#define bit0 0x01
#define bit1 0x02
#define bit2 0x04
#define bit3 0x08

word PWMCNT = 4000;   // PWMパルス幅レジスタ
byte TCS_DATA;       // TCSセンサー取得データレジスタ
byte RED;           // 赤信号フラグ
byte FLG;           // 割込み発生フラグ
byte TIME_CNT;       // タイムカウンタ
byte DELAY = 4;      // 遮断機閉鎖開始遅延時間設定レジスタ
byte SPEED = 10;     // 遮断機開閉速度設定レジスタ
word OPEN = 8000;    // 遮断機サーボ開方向終点設定値レジスタ
word CLOSE = 4000;   // 遮断機サーボ閉方向終点設定値レジスタ
byte YEL_TIME = 3;    // 黄信号保持時間設定レジスタ

【割込み処理】
PEで割込みベクタをポートAの立下りでSENSという名前に指定したのでこの割込みが発生すると、プログラムカウンターがこの関数に飛んできます。
TCS_IN_GetVal()関数はTCS_IN.cにPEが自動生成した関数で指定された4ビットの値が戻ってきますのでTCS_DETAレジスタに格納します。
格納したデータの各ビットの状態から官制信号区間に電車が進入したのか、退出したのかを判断します。判断結果はREDレジスタが”1”なら官制区間内に電車がいる事を表します。FLGをセットして割込みが発生した事を表します。

//*********************************************************
//* PORT A 割込み処理関数
//*********************************************************
ISR(SENCE)
{
  TCS_DATA = TCS_IN_GetVal();      // 全TCSセンサーの状態を取得→TCS_DATAレジスタに格納
  if((TCS_DATA & bit0) == 0) RED = 1;  // 進入センサーに正方向で進入→赤信号フラグセット
  if((TCS_DATA & bit1) == 0) RED = 0;  // 進入センサーに逆方向で進入→赤信号フラグクリア
  if((TCS_DATA & bit2) == 0) RED = 0;  // 退出センサーに正方向で進入→赤信号フラグクリア
  if((TCS_DATA & bit3) == 0) RED = 1;  // 退出センサーに逆方向で進入→赤信号フラグセット
  FLG = 1;
  PTASC_PTAACK = 1; // PORT A 割込みフラグPTAIFをクリア
}

【メイン関数】
メイン関数はPEによって自動生成されます。PEが自動生成した各種デバイス設定初期化を行います。

【初期設定】
TRIM設定はOSBDMで書き込みを行う場合、プログラムで設定する必要があります。内部クロックの発振周波数を補正します。
POART A割込み設定で割込みに必要な設定をレジスタに書き込みます。
待機動作は電源起動時スマートサーボの場合、サーボのリセットのために1度大きくサーボを動かす動作があります。この動作が終了するまで余計な制御をサーボに送らないための待機時間を3秒間作っています。

//*********************************************************
//* メイン関数
//*********************************************************
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 = 0x9E;
ICSSC_FTRIM = 1;

/***** PORTA割込み設定 *****/
PTASC_PTAMOD = 0;  // 0=エッジのみ、1=エッジとレベル
PTAPS = 0x0F;      // PORTAのbit0〜bit3の割込み許可端子設定 1=許可、0=禁止
PTAES = 0;        // 割込みエッジ方向設定 0=立上がり、1=立下り
PTASC_PTAIE = 1;   // PORTA割込み許可

/***** 起動待機 *****/
Cpu_Delay100US(30000); // 起動時3秒待機
TPM1C1V = PWMCNT;  // 遮断機→閉(パルス幅1mS)
TPM2C1V = PWMCNT;  // 遮断機→閉(パルス幅1mS)
PTBD_PTBD3 = 1;     // 警報音OFF

【メインループ】
メインループは永久ループです。
【進入、退出処理】
割込みが発生した後、最初に進入処理にプログラムカウンターが来るとREDフラグの値により分岐します。REDフラグがセットされていれば信号出力ポートを赤点灯にします。
進入中は警報音をONにする為、ポートB3をLowにする。退出したら警報音をOFFにします。
REDフラグがクリアされている場合は信号出力ポートを黄点灯にします。

/***** メインループ *****/
for(;;)
{
/***** 進入処理 *****/
  if(FLG)
  {
    if(RED)
    {
      SIG_OUT_PutVal(0b0111);   // 赤信号点灯
      PTBD_PTBD3 = 0;       // 警報音ON
      FLG = 0;             // 割込みフラグをクリア
      TIME_CNT = 0;
    }
/***** 退出処理 *****/
    else
    {
      FLG = 0;             // 割込みフラグをクリア
      SIG_OUT_PutVal(0b1011);  // 黄信号点灯
      PTBD_PTBD3 = 1;       // 警報音OFF
      MTIMSC_TOF = 0;       // カウンタリセット
      TIME_CNT = 0;
    }
  }


【赤信号処理】
REDフラグがセットされている間、この処理が繰り返されます。モジュロタイマーはフリーカウンターで500mS経過する度にオーバーフローします。オーバーフローする度に警報灯出力ポートを変化させて0.5秒ごとに点滅させます。更にTIME_CNTがDELAYの設定値を超えたらPWMCNTをデクリメントして遮断機サーボを閉じる方向に1つづつCLOSE設定値に達するまで変化させます。CLOSE設定値を変えるとサーボの閉側エンドポイントを調整する事が出来ます。SPEEDレジスタの値×100uS待機して繰り返すのでSPEEDレジスタの値を大きくすると時間をかけて遮断機サーボは動きます。

/***** 赤信号時処理 *****/
  if(RED)
  {
    if(MTIMSC_TOF)               // モジュロタイマオーバーフロー処理
    {
      MTIMSC_TOF = 0;            // モジュロタイマリセット
      PTBD_PTBD6 = !PTBD_PTBD6;   // PTA1出力反転
      PTBD_PTBD7 = !PTBD_PTBD6;   // PTA2出力をPTA1と逆にする。
      TIME_CNT = TIME_CNT + 1;
    }
    if(TIME_CNT > DELAY)
    {
      if(PWMCNT > CLOSE)       // PWMパルス幅をCLOSE設定値×0.25uS=1mSになるまで毎回デクリメント
      {
        Cpu_Delay100US(SPEED);  // SPEED設定値×100uS待機
        PWMCNT = PWMCNT-1;   // パルス幅データをデクリメント
        TPM1C1V = PWMCNT;    // パルス幅データを出力
        TPM2C1V = PWMCNT;    // パルス幅データを出力
      }
    }
  }

【黄/青信号処理】
赤信号で無い時はこの処理を繰り返します。警報灯出力ポートをクリアして消灯する。更にPWMCNTをデクリメントして遮断機サーボを開く方向に1つづつOPEN設定値に達するまで変化させます。OPEN設定値を変えるとサーボの開側エンドポイントを調整する事が出来ます。更に黄信号点灯後2秒間待機して信号出力ポートを青点灯にします。

/***** 黄/青信号処理 *****/
  else
  {
    PTBD_PTBD6 = 0; // PTA1→Low
    PTBD_PTBD7 = 0; // PTA2→Low
    if(PWMCNT < OPEN) // PWMパルス幅をOPEN設定値×0.25uS=2mSになるまで毎回インクリメント
    {
      Cpu_Delay100US(SPEED); // SPEED設定値×100uS待機
      PWMCNT = PWMCNT+1; // パルス幅データをインクリメント
      TPM1C1V = PWMCNT; // パルス幅データを出力
      TPM2C1V = PWMCNT; // パルス幅データを出力
    }
    if(MTIMSC_TOF) // 2sec待ち
    {
      MTIMSC_TOF = 0; // モジュロタイマリセット
      if(TIME_CNT > YEL_TIME)
      {
        SIG_OUT_PutVal(0b1101); // 青信号点灯
      }
      TIME_CNT = TIME_CNT + 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_CROSS2 */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.07 [04.34]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/

TOP BACK NEXT