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

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

解説をソースプログラムに橙字で追記してあります。緑字はプロセッサーエキスパートが自動生成したコードです。

/** ###################################################################
** Filename : RC_RX.C
** Project : RC_RX
** Processor : MC9S08SH8CPJ
** Version : Driver 01.11
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2009/11/22, 14:50
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE RC_RX */


/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "AS1.h"
#include "PWM1.h"
#include "PWM2.h"
#include "PWM3.h"
#include "PWM4.h"
#include "FC1.h"
#include "Bits1.h"
#include "Bits2.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) */

↑ここまではプロセッサーエキスパートが自動生成します。

/****************************************************
* *
* Filename : RC_RX.c *
* Version : 01.00 *
* Compiler : CodeWarrior HCS08 C Compiler *
* Date/Time : 2009/11/22, 0:00 *
* *
* ラジコン受信機制御プログラム *
* *
* Copyright : n.Tanaka *
* *
****************************************************/

【宣言部】
プログラムで使用する変数を定義します。カスタムコードは送信機と同じ数値に設定して下さい。筆者は78hです。
受信は8ビットづつですから上位バイトと下位バイトに分けて受信します。SW DATAは1バイトですからレジスタは1つで十分です。
TEMPは仮に格納するレジスタとして定義します。CH1〜CH4は16ビットのPWM制御用レジスタとして定義します。

/***** 宣言部 *****/
unsigned char CUSTOMCODE = 0x78; // カスタムコード
unsigned char CH1_H,CH1_L;       // CH1受信データ(10bit)
unsigned char CH2_H,CH2_L;       // CH1受信データ(10bit)
unsigned char CH3_H,CH3_L;       // CH1受信データ(10bit)
unsigned char CH4_H,CH4_L;       // CH1受信データ(10bit)
char SW_DATA;                // CH4〜CH10スイッチ受信データ
char TEMP;                  // テンポラリーレジスタ
unsigned int CH1,CH2,CH3,CH4;     // PWM制御データ(16bit)

/*************
* メイン関数 *
*************/
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(;;) { } */


/***********
* 初期設定 *
***********/
OSBDMを使用する場合は内臓基準クロックトリムの設定はプログラム上で行います。
/***** TRIM設定 *****/
  ICSTRM = 0x9B; // 内臓基準クロックのトリム設定
  ICSSC_FTRIM = 1; // 内臓基準クロックのファイントリム設定

モジュロタイマーの初期設定はプロセッサーエキスパートに任せてありますので勝手に回らないように
念のため、初めに止めておきます。

/***** モジュロタイマ設定 *****/
  MTIMSC_TSTP = 1; // タイマ停止(周期は3mS)

/***** メインループ *****/
  for(;;)
  {
/***** 受信処理 *****/
RXバッファーにデータが書き込まれるとRDRFが1になるのでwhile文で待ちます。
    while(!SCIS1_RDRF);      // 受信待ち
RXバッファーSCIDに格納された受信データをTEMPレジスタにコピーします。
    TEMP = SCID;          // 受信データ格納
TEMPレジスタとカスタムコードを比較します。一致していればCH1_Hから受信します。
    if(TEMP == CUSTOMCODE) // 受信データがカスタムコードと一致
    {
/***** CH1_H *****/
タイムアウトチェック用カウンタをリセットします。タイムアウト3mSで受信は無効となり
データを変更せずに次の受信へ移行します。

      MTIMSC_TRST = 1;            // モジュロタイマリセット
タイムアウトカウンタスタート
      MTIMSC_TSTP = 0;            // モジュロタイマ開始
RXバッファーにデータが書き込まれるとRDRFが1になるのでwhile文で待ちます。
タイムアウトでもwhileから抜けます。
      while(!SCIS1_RDRF | MTIMSC_TOF);  // 受信待ちとタイマ待ち(3mS)
タイムアウトでなければ前回のデータを受信データに更新します。
      if(MTIMSC_TOF == 0) CH1_H = SCID; // 3mS未経過でデータを受信!データ更新
以上を繰り返してデータを順番に受信して行きます。
/***** CH1_L *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH1_L = SCID;

/***** CH2_H *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH2_H = SCID;

/***** CH2_L *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH2_L = SCID;

/***** CH3_H *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH3_H = SCID;

/***** CH3_L *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH3_L = SCID;

/***** CH4_H *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH4_H = SCID;

/***** CH4_L *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) CH4_L = SCID;

/***** SW_DATA *****/
      MTIMSC_TRST = 1;
      while(!SCIS1_RDRF | MTIMSC_TOF);
      if(MTIMSC_TOF == 0) SW_DATA = SCID;
    }

/***** サーボ制御 *****/
上位データ8ビットと下位データを8ビットを16ビットデータに変換します。
上位データを256倍して下位データに加算すると16ビットデータに出来ます。

PWM制御データは16ビットですから±5mS動かすためには5mS/0.25μS=4000となります。
10ビットは1024ですから4倍して0〜4096年ます。中点は512×4で2048となります。
PWMのパルス幅1.5mSは6000ですから中点2048+3952=6000としています。

    CH1 = (CH1_H * 256 + CH1_L) * 4 + 3952;
    TPM1C0V = CH1;
    CH2 = (CH2_H * 256 + CH2_L) * 4 + 3952;
    TPM1C1V = CH2;
    CH3 = (CH3_H * 256 + CH3_L) * 4 + 3952;
    TPM2C0V = CH3;
    CH4 = (CH4_H * 256 + CH4_L) * 4 + 3952;
    TPM2C1V = CH4;

/***** SW1 *****/
スイッチデータをポートに出力します。
    Bits1_PutVal(SW_DATA & 0x0F);
    Bits2_PutVal((SW_DATA & 0xF0) / 0x0F);
  }

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

TOP BACK NEXT