メインプログラム:RC_TX.c
プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているRC_TX.cのみを記述します。
/** ###################################################################
** Filename : RC_TX.C
** Project : RC_TX
** Processor : MC9S08SH8CPJ
** Version : Driver 01.11
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2009/11/21, 15:54
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE RC_TX */
/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "AD1.h"
#include "AS1.h"
#include "SW.h"
#include "POWER_LED.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_TX.c
* Version : 01.00
* Compiler : CodeWarrior HCS08 C Compiler
* Date/Time : 2012/12/11, 0:00
*
* ラジコン送信機制御プログラム Ver 1.2
*
* Copyright : n.Tanaka
*
****************************************************/
/***** 宣言部 *****/
#define POWER_LED PTCD_PTCD3 //
↑ポートC3をPOWER_LEDと言う名前で扱えるようにする。ポートに名前を設定しておくと後でポートを変更する際、この部分のみ変更すれば良くなるので問題が起きにくい。
#define CUSTOMCODE 0x78 // カスタムコード
byte ERR; // エラーコードレジスタ
byte CH1_H,CH1_L; // CH1 AD変換値格納レジスタ
byte CH2_H,CH2_L; // CH2 AD変換値格納レジスタ
byte CH3_H,CH3_L; // CH3 AD変換値格納レジスタ
byte CH4_H,CH4_L; // CH4 AD変換値格納レジスタ
word POWER_V; // 電源電圧値レジスタ
byte SW_DATA; // スイッチデータレジスタ
↑byteは符号なし8ビット、wardは符号無し16ビット グローバル変数宣言
/*************
* メイン関数 *
*************/
void main(void)
{
/* Write your local variable definition here */
byte i; ローカル変数宣言
/*** 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 = 0xA0; // 内臓基準クロックのトリム設定
ICSSC_FTRIM = 0; // 内臓基準クロックのファイントリム設定
Cpu_Delay100US(100); // 10mS待機
/***************
* メインループ *
***************/
for (;;)
{
while(!SCIS1_TDRE); // 送信バッファ空き待
SCID = CUSTOMCODE; // カスタムコード送信
/***** CH1 *****/
-------------------------------------------------------------------------------
AD1_MeasureChan関数について
戻り値 = AD1_MeasureChan(引数1,引数2)
戻り値はエラーコード(今回は使用しません)
引数1:AD変換完了待ちスイッチ
1=AD変換が終了してから戻る。
0=AD変換を開始した時点で戻る。変換結果はまだ出ていない。
引数2:AD変換チャンネル番号
AD変換を開始するチャンネル番号を指定する。
プロセッサーエキスパートで自動生成される関数です。
AD変換を開始する関数です。AD変換で割込みを有効にしていない場合、AD変換完了待ちスイッチ(引数1)を1に設定しないと
AD変換が終了する前に戻ってきてしまう為、AD変換結果がADCRレジスタに格納されません。
---------------------------------------------------------------------------------
ERR = AD1_MeasureChan(1,0); // ADP0 AD変換開始
CH1 = ((ADCR * 15) / 10) - 256 -33;
if (CH1 >= 1023) CH1 = 1023; // Upper limit
if (CH1 <= 0) CH1 = 0; // Lower limit
CH1_L = (byte)(CH1 & 0xff); // 16bit→8bit low byte
CH1_H = (byte)(CH1 >> 8); // 16bit→8bit high byte
while(!SCIS1_TDRE); // 送信バッファ待機 送信バッファーが開きであることを確認します。
SCID = CH1_H; // 上位バイト送信 送受信データレジスタSCIDにデータを代入すると自動的に送信されます。
while(!SCIS1_TDRE); // 送信バッファ待機
SCID = CH1_L; // 下位バイト送信
/***** CH2 *****/
ERR = AD1_MeasureChan(1,1); // ADP1 AD変換開始
CH2 = ((ADCR * 15) / 10) - 256 -15;
if (CH2 >= 1023) CH2 = 1023;
if (CH2 <= 0) CH2 = 0;
CH2_L = (byte)(CH2 & 0xff);
CH2_H = (byte)(CH2 >> 8);
while(!SCIS1_TDRE);
SCID = CH2_H;
while(!SCIS1_TDRE);
SCID = CH2_L;
/***** CH3 *****/
ERR = AD1_MeasureChan(1,2); // ADP2 AD変換開始
CH3 = ((ADCR * 15) / 10) - 256 -13;
if (CH3 >= 1023) CH3 = 1023;
if (CH3 <= 0) CH3 = 0;
CH3_L = (byte)(CH3 & 0xff);
CH3_H = (byte)(CH3 >> 8);
while(!SCIS1_TDRE);
SCID = CH3_H;
while(!SCIS1_TDRE);
SCID = CH3_L;
/***** CH4 *****/
ERR = AD1_MeasureChan(1,3); // ADP3 AD変換開始
CH4 = ((ADCR * 15) / 10) - 256 -37;
if (CH4 >= 1023) CH4 = 1023;
if (CH4 <= 0) CH4 = 0;
CH4_L = (byte)(CH4 & 0xff);
CH4_H = (byte)(CH4 >> 8);
while(!SCIS1_TDRE);
SCID = CH4_H;
while(!SCIS1_TDRE);
SCID = CH4_L;
/***** SW *****/
SW_DATA = SW_GetVal(); // ポート読み込み
while(!SCIS1_TDRE);
SCID = SW_DATA; // SWデータ送信
/***** 電源電圧 *****/
ERR = AD1_MeasureChan(1,4); // ADP4 AD変換開始
POWER_V = ADCR; // 変換値格納
if(POWER_V > 650) // 電源電圧は4.2V以上
{
POWER_LED = 1; // POWER LED点灯
}
else // 電源電圧は4.2V未満
{
タイマーを使わずにLEDを点滅させます。
ローカル変数 i はメインループを25回以上繰り返すと0にリセットされ、POWER IND LED用出力を反転します。
これによりPOWER IND LEDは点灯と消灯を繰り返します。厳密な点滅サイクルが必要でない場合、簡単にLEDの
ON/OFFが可能となります。但し、メインループの周期が変わると点滅サイクルも変わってしまうので注意してください。
MC9S08SHにはモジュロタイマーがありますのでそちらを使用しても良いでしょう。
i++;
if(i > 25)
{
POWER_LED = !POWER_LED; // POWER LEDを点滅!
i = 0;
}
}
Cpu_Delay100US(50); // 5mS待機
XBeeに連続したデータを送り続けるとバッファーに蓄積して満タンになってから送信を始めるので100mS程度の
遅延が発生してしまいます。待機期間を設けると、この期間に送信が行われるので遅延が30mS程度で済みます。
ラジコンなどのコントローラの場合、操作に対して100mSの遅延は違和感を覚えます。遅延は50mS以下に抑える事が必要です。
} // End of main loop
/*** 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_TX */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.06 [04.26]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/