メインプログラム:RC_TX.c
プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。初期設定は全て完了していますのでMAIN関数の含まれているRC_TX.cのみを記述します。
メイン関数
void main(void)
薄く表示した部分はPEが自動生成した物なので書き込んでもコンパイルする時に消されてしまうので注意しましょう。PE_low_level_init()関数でプロセッサーエキスパートで設定した内容が全て記述されていますので初期設定は内臓基準クロックのトリム設定だけです。このままでも問題はありませんが詳しく知りたい方は、HCSQGのICSに記述していますのでご覧ください。
実験したところ、XBeeにシリアルデータを送る時電源投入後10mS以上の待機時間が必要なようです。初期設定の終わりに待機時間として10mSのCPUDelay関数を入れます。
メインループは各チャンネルをAD変換して送信を繰り返し、トグルスイッチもポートとして読み込んで送信します。最後に電源電圧をAD変換して2.1V以下ならLEDを点滅させる事を繰り返します。
メインループの最初はカスタムコードです。カスタムコードは受信機にも同じコードを埋め込むことで他の送信機からの制御を拒否します。1バイトでお好きな数値を設定して下さい。SCIS1_TDREは送信データレジスタエンプティーフラグです。0の時はデータ送信できませんので1になるまで待ちます。送信したいデータをSCID(送信データレジスタ)に代入すれば送信してくれるので次の作業に取り掛かれます。
AD1_MeasureChan(0,0)関数で指定チャンネルのAD変換が実施され変換が完了すると10ビットのADCRレジスタに変換値が格納されます。上位バイトと下位バイトに分けて、上位バイトから送信します。トグルスイッチはBits1_GetVal()関数で一気に読み込んで送信します。電源電圧は1/2VCCがAD変換されますので5Vであれば2.5Vとなります。約2.1Vより低下した場合はメインループをカウントして25回ごとにLEDがON/OFFを繰り返しますので約0.5秒間隔の点滅となります。
/** ###################################################################
** 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 "Bits1.h"
#include "Bit1.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 : 2009/11/27, 0:00 *
* *
* ラジコン送信機制御プログラム *
* *
* Copyright : n.Tanaka *
* *
****************************************************/
/***** 宣言部 *****/
char ERR,i; // エラーコードレジスタ
unsigned char CH1_H,CH1_L; // CH1 AD変換値格納レジスタ
unsigned char CH2_H,CH2_L; // CH1 AD変換値格納レジスタ
unsigned char CH3_H,CH3_L; // CH1 AD変換値格納レジスタ
unsigned char CH4_H,CH4_L; // CH1 AD変換値格納レジスタ
unsigned char CUSTOMCODE = 0x78;// カスタムコード
unsigned int POWER_V; // 電源電圧値レジスタ
char SW_DATA; // スイッチデータレジスタ
/*************
* メイン関数 *
*************/
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 = 0xA0; // 内臓基準クロックのトリム設定
ICSSC_FTRIM = 0; // 内臓基準クロックのファイントリム設定
Cpu_Delay100US(100);
/***** メインループ *****/
for (;;)
{
while(!SCIS1_TDRE); // 送信バッファ待機
SCID = CUSTOMCODE; // カスタムコード送信
/***** CH1 *****/
ERR = AD1_MeasureChan(0,0); // ADP0 AD変換開始
CH1_H = ADCRH; // 変換値を格納(上位バイト)
CH1_L = ADCRL; // 変換値を格納(下位バイト)
while(!SCIS1_TDRE); // 送信バッファ待機
SCID = CH1_H; // 上位バイト送信
while(!SCIS1_TDRE); // 送信バッファ待機
SCID = CH1_L; // 下位バイト送信
/***** CH2 *****/
ERR = AD1_MeasureChan(0,1); // ADP1 AD変換開始
CH2_H = ADCRH;
CH2_L = ADCRL;
while(!SCIS1_TDRE);
SCID = CH2_H;
while(!SCIS1_TDRE);
SCID = CH2_L;
/***** CH3 *****/
ERR = AD1_MeasureChan(0,2); // ADP2 AD変換開始
CH3_H = ADCRH;
CH3_L = ADCRL;
while(!SCIS1_TDRE);
SCID = CH3_H;
while(!SCIS1_TDRE);
SCID = CH3_L;
/***** CH4 *****/
ERR = AD1_MeasureChan(0,3); // ADP3 AD変換開始
CH4_H = ADCRH;
CH4_L = ADCRL;
while(!SCIS1_TDRE);
SCID = CH4_H;
while(!SCIS1_TDRE);
SCID = CH4_L;
/***** SW *****/
SW_DATA = Bits1_GetVal(); // ポート読み込み
while(!SCIS1_TDRE);
SCID = SW_DATA; // SWデータ送信
/***** 電源電圧 *****/
ERR = AD1_MeasureChan(0,4); // ADP4 AD変換開始
POWER_V = ADCR; // 変換値格納
if(POWER_V > 650) // 電源電圧は2.1V以上?
{
PTCD_PTCD3 = 1; // Yes POWER LED点灯
}
else // No
{
i = i+1;
if(i > 25)
{
PTCD_PTCD3 = !PTCD_PTCD3; // POWER LEDを点滅!
i = 0;
}
}
Cpu_Delay100US(50); // 5mS待機
}
/*** 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.
**
** ###################################################################
*/