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

プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているT_CROSSING.cのみを記述します。信号機のソースプログラム変更が必要です。詳しくは「鉄道模型信号機の製作」をご覧ください。

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

/** ###################################################################
** Filename : T_crossing.C
** Project : T_crossing
** Processor : MC9S08SH8CSC
** Version : Driver 01.11
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2009/12/09, 20:55
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE T_crossing */


/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "Bit1.h"
#include "Bit2.h"
#include "Bit3.h"
#include "PWM1.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"

/* User includes (#include below this line is not maintained by Processor Expert) */

【宣言部】
パルス幅データレジスタ PWMCNTを16ビット整数として定義します。初期値は4000

/****************************************************
* *
* Filename : T_crossing.c *
* Version : 01.00 *
* Compiler : CodeWarrior HCS08 C Compiler *
* Date/Time : 2009/12/9, 0:00 *
* *
* 踏切遮断機制御プログラム *
* *
* Copyright : n.Tanaka *
* *
****************************************************/

/***** 宣言部 *****/
unsigned int PWMCNT = 4000;

【メイン関数】
PE_low_level_init()関数でプロセッサーエキスパートで自動生成した初期設定を全て実施します。

/*************
* メイン関数 *
*************/
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設定はOSBDMでデバックする場合、プログラムソースで記述します。設定値はデバイスのアドレスFFAEとFFAFに書き込まれているデータを読み取って記述しました。
起動待機で起動時3秒間待機します。これはスマートサーボが起動時にリセット動作を行うので、その期間パルス幅データを変化させないための時間です。パルス幅を変更してもサーボは反応しません。
PWMパルス幅設定レジスタTPM1C0Vにパルス幅データを代入します。初期値は4000なのでパルス幅は4000×0.25uS=1mSとなりサーボが動作して、遮断機を閉じます。

/***********
* 初期設定 *
***********/

/***** TRIM設定 *****/
  ICSTRM = 0x9E; // 内臓基準クロックのトリム設定
  ICSSC_FTRIM = 1; // 内臓基準クロックのファイントリム設定

/***** 起動待機 *****/
  Cpu_Delay100US(30000); // 起動時3秒待機
  TPM1C0V = PWMCNT; // 遮断機→閉(パルス幅1mS)

【メインループ】
信号機から入力されるPTA3は赤信号時=Hi、黄および青信号時=LowとなりますのでPTA3の状態により処理が分岐します。

赤信号の場合
警報ランプの点滅は左右で反転しているので、一方が点灯している時は他方は消灯している事になります。点滅間隔は0.5秒程度です。
モジュロタイマーは500mSでオーバーフローフラグMTMSC_TOFがセットされますので警報ランプ右が接続されているPTA1を反転します。警報ランプ左が接続されているPTA2はPTA1の逆にします。1なら0、0なら1です。これで0.5秒間隔で左右のランプが点滅します。

遮断機はスマートサーボにより開閉します。サーボはパルス幅で制御します。1.5mSを中心に±0.5mSが基本です。スマートサーボは遮断機を1mSで全閉。2mSで全開にします。メインループで赤信号の時は毎回、パルス幅データレジスタ PWMCNTはデクリメントを4000まで繰り返します。TPM1C0VにPWMCNTのデータをコピーしてパルス幅を変更します。300uSの待機は遮断機がゆっくり動くように設定しました。8000から4000まで4000回で遮断機が閉じるので4000×300uS=1.2秒となります。もっとゆっくり動かした方がリアリティーが出ますが、遮断機が閉まる前に電車が来てしまっては、お話にならないので実際に電車を走らせて設定しました。

/***** メインループ *****/
  for(;;)
  {
/***** 赤信号時処理 *****/
    if(PTAD_PTAD3 == 1) // 信号機マイコンから入力 Hi
    {
      if(MTIMSC_TOF == 1) // モジュロタイマオーバーフロー処理
      {
        MTIMSC_TRST = 1; // モジュロタイマリセット
        PTAD_PTAD1 = !PTAD_PTAD1; // PTA1出力反転
        PTAD_PTAD2 = !PTAD_PTAD1; // PTA2出力をPTA1と逆にする。
      }
      if(PWMCNT>4000) // PWMパルス幅を4000×0.25uS=1mSになるまで毎回デクリメント
      {
        Cpu_Delay100US(3); // 300uS待機
        PWMCNT = PWMCNT-1; // パルス幅データをデクリメント
        TPM1C0V = PWMCNT; // パルス幅データを出力
      }
    }

黄/青信号の場合
警報ランプは左右とも消灯にします。遮断機は赤信号時と逆に8000×0.25uS=2mSまでインクリメントを繰り返します。
最後の緑文字はプロセッサーエキスパートが自動生成したソースです。

/***** 黄/青信号処理 *****/
    if(PTAD_PTAD3 == 0) // 信号機マイコンからの入力 Low
    {
      PTAD_PTAD1 = 0; // PTA1→Low
      PTAD_PTAD2 = 0; // PTA2→Low
      if(PWMCNT<8000) // PWMパルス幅を8000×0.25uS=2mSになるまで毎回インクリメント
      {
        Cpu_Delay100US(3); // 300uS待機
        PWMCNT = PWMCNT+1; // パルス幅データをインクリメント
        TPM1C0V = PWMCNT; // パルス幅データを出力
      }
    }
  }

/*** 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_crossing */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.07 [04.34]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/

TOP BACK NEXT