[1.1] OS : Windows7
[1.2] コンパイラ名 : High-performance Embedded Workshop
[2] その他
・CPU : RY_R8C38 Ver1.1
[3] 質問文
今自分は、MCRというものを作っています。
で、それに使う自作サーボのボリュームのデーターをP7_2に入力しているのですが、正常に動かなかったので、P7_2の電圧を測ったら、4.9V出力
していました。 プログラム内では、入力としているはずなのに。。。なぜなんでしょうか?
ちなみにA/D変換しているポートはAN12(P7_0)~AN15(P7_3)の4 端子で試しにP7_3を測ったらしっかり入力されていました。
[4]プログラム(anaservo_ver3_38a.c)
/*======================================*/
/* インクルード */
/*======================================*/
#include <stdio.h>
#include "sfr_r838a.h" /* R8C/38A SFRの定義ファイル */
#include "types3_beep.h" /* ブザー追加 */
/*======================================*/
/* シンボル定義 */
/*======================================*/
/* 定数設定 */
#define TRC_MOTOR_CYCLE 20000 /* 左前,右前モータPWMの周期 */
/* 50[ns] * 20000 = 1.00[ms] */
#define TRD_MOTOR_CYCLE 20000 /* 左後,右後,サーボモータPWMの周期 */
/* 50[ns] * 20000 = 1.00[ms] */
#define FREE 1 /* モータモード フリー */
#define BRAKE 0 /* モータモード ブレーキ */
/*======================================*/
/* プロトタイプ宣言 */
/*======================================*/
void init( void );
unsigned char sensor_inp( void );
unsigned char center_inp( void );
unsigned char startbar_get( void );
unsigned char dipsw_get( void );
unsigned char dipsw_get2( void );
unsigned char pushsw_get( void );
unsigned char cn6_get( void );
void led_out( unsigned char led );
void motor_r( int accele_l, int accele_r );
void motor2_r( int accele_l, int accele_r );
void motor_f( int accele_l, int accele_r );
void motor2_f( int accele_l, int accele_r );
void motor_mode_r( int mode_l, int mode_r );
void motor_mode_f( int mode_l, int mode_r );
void servoPwmOut( int pwm );
int check_crossline( void );
int getServoAngle( void );
int getAnalogSensor( void );
void servoControl( void );
int diff( int pwm );
/*======================================*/
/* グローバル変数の宣言 */
/*======================================*/
int pattern; /* マイコンカー動作パターン */
int crank_mode; /* 1:クランクモード 0:通常 */
unsigned long cnt1; /* タイマ用 */
/* エンコーダ関連 */
int iTimer10; /* 10msカウント用 */
long lEncoderTotal; /* 積算値保存用 */
int iEncoder; /* 10ms毎の最新値 */
unsigned int uEncoderBuff; /* 計算用 割り込み内で使用 */
/* サーボ関連 */
int iSensorBefore; /* 前回のセンサ値保存 */
int iServoPwm; /* サーボPWM値 */
int iAngle0; /* 中心時のA/D値保存 */
/* センサ関連 */
int iSensorPattern; /* センサ状態保持用 */
/* TRCレジスタのバッファ */
unsigned int trcgrb_buff; /* TRCGRBのバッファ */
unsigned int trcgrd_buff; /* TRCGRDのバッファ */
/* モータドライブ基板TypeS Ver.3上のLED、ディップスイッチ制御 */
unsigned char types_led; /* LED値設定 */
unsigned char types_dipsw; /* ディップスイッチ値保存 */
/* 内輪差値計算用 各マイコンカーに合わせて再計算して下さい */
const int revolution_difference[] = { /* 角度から内輪、外輪回転差計算 */
100, 98, 97, 95, 94,
92, 91, 89, 88, 87,
85, 84, 82, 81, 80,
78, 77, 76, 74, 73,
72, 70, 69, 68, 66,
65, 64, 62, 61, 60,
58, 57, 56, 54, 53,
52, 50, 49, 48, 46,
45, 43, 42, 40, 39,
38 };
/************************************************************************/
/* メインプログラム */
/************************************************************************/
void main( void )
{
省略
}
/************************************************************************/
/* R8C/38A スペシャルファンクションレジスタ(SFR)の初期化 */
/************************************************************************/
void init( void )
{
int i;
/* クロックをXINクロック(20MHz)に変更 */
prc0 = 1; /* プロテクト解除 */
cm13 = 1; /* P4_6,P4_7をXIN-XOUT端子にする*/
cm05 = 0; /* XINクロック発振 */
for(i=0; i<50; i++ ); /* 安定するまで少し待つ(約10ms) */
ocd2 = 0; /* システムクロックをXINにする */
prc0 = 0; /* プロテクトON */
/* ポートの入出力設定 */
/* PWM(予備) 左前M_PMW 右前M_PWM ブザー
センサ左端 センサ左中 センサ右中 センサ右端 */
p0 = 0x00;
prc2 = 1; /* PD0のプロテクト解除 */
pd0 = 0xf0;
/* センサ中心 スタートバー RxD0 TxD0
DIPSW3 DIPSW2 DIPSW1 DIPSW0 */
pur0 |= 0x04; /* P1_3~P1_0のプルアップON */
p1 = 0x00;
pd1 = 0x10;
/* 右前M_方向 ステアM_方向 ステアM_PWM 右後M_PWM
右後M_方向 左後M_PWM 左後M_方向 左前M_方向 */
p2 = 0x00;
pd2 = 0xff;
/* none none none none
none none none エンコーダA相 */
p3 = 0x00;
pd3 = 0xfe;
/* XOUT XIN ボード上のLED none
none VREF none none */
p4 = 0x20; /* P4_5のLED:初期は点灯 */
pd4 = 0xb8;
/* none none none none
none none none none */
p5 = 0x00;
pd5 = 0xff;
/* none none none none
none none none none */
p6 = 0x00;
pd6 = 0xff;
/* CN6.2入力 CN6.3入力 CN6.4入力 CN6.5入力
none(アナログ予備) 角度VR センサ_左アナログ センサ_右アナログ */
p7 = 0x00;
pd7 = 0x00;
/* DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED
DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED */
pur2 |= 0x03; /* P8_7~P8_0のプルアップON */
p8 = 0x00;
pd8 = 0x00;
/* - - プッシュスイッチ P8制御(LEDorSW)
右前M_Free 左前M_Free 右後M_Free 左後M_Free */
p9 = 0x00;
pd9 = 0x1f;
/* タイマRBの設定 */
/* 割り込み周期 = 1 / 20[MHz] * (TRBPRE+1) * (TRBPR+1)
= 1 / (20*10^6) * 200 * 100
= 0.001[s] = 1[ms]
*/
trbmr = 0x00; /* 動作モード、分周比設定 */
trbpre = 200-1; /* プリスケーラレジスタ */
trbpr = 100-1; /* プライマリレジスタ */
trbic = 0x06; /* 割り込み優先レベル設定 */
trbcr = 0x01; /* カウント開始 */
/* A/Dコンバータの設定 */
admod = 0x33; /* 繰り返し掃引モードに設定 */
adinsel = 0x90; /* 入力端子P7の4端子を選択 */
adcon1 = 0x30; /* A/D動作可能 */
asm(" nop "); /* φADの1サイクルウエイト入れる*/
adcon0 = 0x01; /* A/D変換スタート */
/* タイマRG タイマモード(両エッジでカウント)の設定 */
timsr = 0x40; /* TRGCLKA端子 P3_0に割り当てる */
trgcr = 0x15; /* TRGCLKA端子の両エッジでカウント*/
trgmr = 0x80; /* TRGのカウント開始 */
/* タイマRC PWMモード設定(左前モータ、右前モータ) */
trcpsr0 = 0x40; /* TRCIOA,B端子の設定 */
trcpsr1 = 0x33; /* TRCIOC,D端子の設定 */
trcmr = 0x0f; /* PWMモード選択ビット設定 */
trccr1 = 0x8e; /* ソースカウント:f1,初期出力の設定 */
trccr2 = 0x00; /* 出力レベルの設定 */
trcgra = TRC_MOTOR_CYCLE - 1; /* 周期設定 */
trcgrb = trcgrb_buff = trcgra; /* P0_5端子のON幅(左前モータ) */
trcgrc = trcgra; /* P0_7端子のON幅(予備) */
trcgrd = trcgrd_buff = trcgra; /* P0_6端子のON幅(右前モータ) */
trcic = 0x07; /* 割り込み優先レベル設定 */
trcier = 0x01; /* IMIAを許可 */
trcoer = 0x01; /* 出力端子の選択 */
trcmr |= 0x80; /* TRCカウント開始 */
/* タイマRD リセット同期PWMモード設定(左後モータ、右後モータ、サーボモータ) */
trdpsr0 = 0x08; /* TRDIOB0,C0,D0端子設定 */
trdpsr1 = 0x05; /* TRDIOA1,B1,C1,D1端子設定 */
trdmr = 0xf0; /* バッファレジスタ設定 */
trdfcr = 0x01; /* リセット同期PWMモードに設定 */
trdcr0 = 0x20; /* ソースカウントの選択:f1 */
trdgra0 = trdgrc0 = TRD_MOTOR_CYCLE - 1; /* 周期設定 */
trdgrb0 = trdgrd0 = 0; /* P2_2端子のON幅(左後モータ) */
trdgra1 = trdgrc1 = 0; /* P2_4端子のON幅(右後モータ) */
trdgrb1 = trdgrd1 = 0; /* P2_5端子のON幅(サーボモータ) */
trdoer1 = 0xcd; /* 出力端子の選択 */
trdstr = 0x0d; /* TRD0カウント開始 */
}
/************************************************************************/
/* タイマRB 割り込み処理 */
/************************************************************************/
#pragma interrupt /B intTRB(vect=24)
void intTRB( void )
{
unsigned int i;
asm(" fset I "); /* タイマRB以上の割り込み許可 */
cnt1++;
/* サーボモータ制御 */
servoControl();
/* ブザー処理 */
beepProcessS();
/* 10回中1回実行する処理 */
iTimer10++;
switch( iTimer10 ) {
case 1:
/* エンコーダ制御 */
i = trg;
iEncoder = i - uEncoderBuff;
lEncoderTotal += iEncoder;
uEncoderBuff = i;
break;
case 2:
/* スイッチ読み込み準備 */
p9_4 = 0; /* LED出力OFF */
pd8 = 0x00;
break;
case 3:
/* スイッチ読み込み、LED出力 */
types_dipsw = ~p8; /* ドライブ基板TypeS Ver.3のSW読み込み*/
p8 = types_led; /* ドライブ基板TypeS Ver.3のLEDへ出力*/
pd8 = 0xff;
p9_4 = 1; /* LED出力ON */
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
/* iTimer10変数の処理 */
iTimer10 = 0;
break;
}
}
/************************************************************************/
/* タイマRC 割り込み処理 */
/************************************************************************/
#pragma interrupt intTRC(vect=7)
void intTRC( void )
{
trcsr &= 0xfe;
/* タイマRC デューティ比の設定 */
trcgrb = trcgrb_buff;
trcgrd = trcgrd_buff;
}
省略