本文へスキップ

未来の科学技術を子供たちに託す。 ジュニロボ <JRO>

〒619-0237 京都府相楽郡精華町光台8丁目

TEL. 070-5263-2200

jun@kinet-tv.ne.jp

C 言語コースREC< C-Style / C-Code >

C-Style と C-Code と比べてみましょう。

モータ関数 : motor ( ) 関数

 いきなり C 言語をお話ししても難しいと思いますので、まずは今まで勉強してきた C-Style と比較して C 言語とはどんなものかを見てみましょう。
< 下記は、拡大することができます。>

  C-Style画面の右側にあるのが            1つの命令を選択し作業エリアでクリックすると
  C-Style の命令群です。               その命令を使用することができます。
                            上記の場合は、直進(速度50%)させる。



上記 C-Style をビルドすると上記の様に C-Code が表示されています。

@ 「# include 」:インクルード

C-Code の最上部にある「#include」3行は、必ず必要な記述です。
<インクルード>と呼びますが、C言語で必要な情報を格納している「ヘッダ」の内容を取り込む命令です。
” D_Main.h " C言語の標準情報が記述されているヘッダーファイルを読み込みます。
" D_I2C.h " I2C機能を使う時に必要な情報が記述されているヘッダーファイルを読み込みます。
" D_SIO.h " SIO機能を使う時に必要な情報が記述されているヘッダーファイルを読み込みます。
I2CとかSIOを使わないプログラムを作成する場合でも、この3つのインクルド命令は無条件に記述しておきま
しょう。

A 「// 」:コメント行

次にある
  //--------
  // Program Name : TEST1.C
  //--------
ここにある // は、コメント行と呼ばれプログラムを読みやすくコメントを書く行です。
// 以降に書かれた内容は、ビルド時には無視されます。
ただ人が見やすく理解しやすくするだけですので、何を書いてもどれだけ書いてもプログラムが大きくなる事は
ありませんので、この部分のプログラムは何をしているのかを詳しくコメントしておくと時間が経ったときでも
理解することが容易になります。( ベテランのプログラマーほどコメントが多く書かれています。)

B 「void user_main ( void ) 」:メイン関数

本来のプログラムは、「void user_main(void)」から始まります。
C言語のすべての命令は、関数とよばれる命令のブロック(かたまり)の集合体で出来上がっています。
どんなに小さなプログラムでも、最低限下記の関数が必要です。( main 関数と呼びます。)
  void user_main(void) {   }
< 一般的なC言語の場合は、void main (void) {  }が使われますが、これはシステムが使っているので、
 ユーザには擬似的な関数が用意されている為、user が頭に付いていて区別されています。>

実際のロボットを動かす命令は、この user_main 命令の関数内に記述していきます。

C 「motor ( ) 」:モータ関数

さて、今回はロボットでの直進命令です。
  motor ( 50, 50 );
「motor」は、モータと呼びます。プログラムは英語で表記していきますので、そのまま英語の「motor」と書
きます。
先ほども書きましたが、C言語はすべて関数で記述するので今回も「motor」関数を使います。
関数表現は、下記の様に命令語の後に ( );を付けます。
  motor ( );
( )内には、引数と呼ばれる数値、又は変数を記述することができます。
今回はモータを動かそうとしているので、左モータ、右モータ、2個のモータを如何の様に動かすかを指示する
必要があるので、2個の値を必要とします。
  motor ( 50, 50 ); 
( 50, 50 )の左側数値が左モータへのスピード指示、右側数値が右モータへのスピード指示です。

D 「; 」:文区切り < セミコロン >

C言語では、改行<Enter>もスペースも無視されるので、文の区切りを指示する記述が「;」セミコロンです。
これを初心者は良く忘れて、ビルドエラーになる要因となっているので注意しましょう。
ただ、「 main 」関数の様な {  }で囲まれた関数の最後には、「 ; 」は必要ありません。
「:」コロンとよく間違って記述してビルドエラーを起こすのですが、見分けがつきにくいので注意が必要です


上記の motor()関数は、下記部分に実際の実行コードが記述されていますが、詳しい事は知らなくても良く
使い方だけ覚えればOKです。
上級者になってから、勉強しても遅くはありません。

C:\Daisen\C-Style for Tj3B\Build\Build_V120824\D_Main.c
//------------------------------------------------------------------------------------------------------------------
// motor speed:±100
// -100〜0〜+100 => -900〜-108/0/+108〜+900
void motor(int l_speed, int r_speed)
{
 int l_spd, r_spd;
 BYTE l_fsw, r_fsw;
 BYTE l_bsw, r_bsw;

 if (gMS[L_MS] == l_speed && gMS[R_MS] == r_speed) return;
//ck_pin(on);
 // motor all off
 setPwmDuty(0, 0);
 MOT_LF = off;
 MOT_LB = off;
 MOT_RF = off;
 MOT_RB = off;

 // 250usec Timer start
 PIE2bits.TMR3IE = 0; // タイマー3は割込み禁止
 PIR2bits.TMR3IF = 0; // Interrupt Flag Clear
 T3CONbits.TMR3ON= 0;
 TMR3H = INT_T3_250H;
 TMR3L = INT_T3_250L; // 250usec
 T3CONbits.TMR3ON = 1;

 // Left motor
 if (SPEED_STOP < l_speed){
  l_fsw = MOT_ON;
  l_bsw = MOT_OFF;
  l_spd = l_speed * 8 + 100;
 } else if (l_speed < SPEED_STOP){
  l_fsw = MOT_OFF;
  l_bsw = MOT_ON;
  l_spd = l_speed * -8 + 100;
 } else if (gIsFastStop){
  l_fsw = MOT_ON;
  l_bsw = MOT_ON;
  l_spd = 0;
 }

 // Right motor
 if (SPEED_STOP < r_speed){
  r_fsw = MOT_ON;
  r_bsw = MOT_OFF;
  r_spd = r_speed * 8 + 100;
 } else if (r_speed < SPEED_STOP){
  r_fsw = MOT_OFF;
  r_bsw = MOT_ON;
  r_spd = r_speed * -8 + 100;
 } else if (gIsFastStop){
  r_fsw = MOT_ON;
  r_bsw = MOT_ON;
  r_spd = 0;
 }
 gIsFastStop = TRUE;
 gMS[L_MS] = l_speed;
 gMS[R_MS] = r_speed;

 // 250uS Wait
 while (PIR2bits.TMR3IF == 0);
 PIR2bits.TMR3IF = 0;// Interrupt Flag Clear

 // set motor
 setPwmDuty((UINT)l_spd, (UINT)r_spd);
 MOT_LF = l_fsw;
 MOT_LB = l_bsw;
 MOT_RF = r_fsw;
 MOT_RB = r_bsw;
//ck_pin(off);
}
//------------------------------------------------------------------------------------------------------------------


時間待ち関数 : wait_ms ( ) 関数

C-Styleの砂時計マークの命令は、C-codeでは wait_ms(時間待ち)と書きます。
一般的なC-codeでは、wait のみですが、TJ3Bコンパイラでは時間単位である ms(ミリセック)を加えていま
す。< ユーザー解放用、擬似コマンド >
ms は、sec(秒)の1/1000の時間です。< 1sec = 0.001 ms >


















C-Styleをビルドすると、上記C-Codeが表示されます。

wait_ms(); ウエイト関数のカッコ内には、時間を書きます。( 単位はmsです。)
したがって上記の場合は、1000ms = 1sec (1秒 )となります。

実際の実行部分
C:\Daisen\C-Style for Tj3B\Build\Build_V120824\D_Main.c
//-------------------------------------------------------------------------------------------------------------------
// C-Style Function
//-------------------------------------------------------------------------------------------------------------------
// msec wait
//
void wait_ms(UINT wct)
{
UINT w;

INTCONbits.TMR0IE = 0;
gW_Tct = 0;
INTCONbits.TMR0IE = 1;

do {
INTCONbits.TMR0IE = 0;
w = gW_Tct;
INTCONbits.TMR0IE = 1;
} while (w < wct);
}
//-------------------------------------------------------------------------------------------------------------------

LED関数 : set_Led ( ) 関数

TJ3B上にある1個の緑色LED、3個の赤色LEDを点滅制御する為の命令です。









  緑色LEDを点灯させる命令です。









set_Led ( 0、LED_XX ) ・・・ 緑色LED  ( XX 部は、ON 又は OFF )
set_Led ( 1、LED_XX ) ・・・ 赤色LED1 ( XX 部は、ON 又は OFF )
set_Led ( 2、LED_XX ) ・・・ 赤色LED2 ( XX 部は、ON 又は OFF )
set_Led ( 3、LED_XX ) ・・・ 赤色LED3 ( XX 部は、ON 又は OFF )

C-Styleでは命令が有りませんが、下記の様にLEDが点灯しているか消滅しているのかを確認できる命令が、C_Codeでは準備されています。

実際の実行部分< 点滅制御部分と状態確認部分 >
C:\Daisen\C-Style for Tj3B\Build\Build_V120824\D_Main.c
//-------------------------------------------------------------------------------------------------------------------
// C-Style Function
//-------------------------------------------------------------------------------------------------------------------
// LED点灯制御
void set_Led(BYTE led_no, BOOL sw)
{
switch (led_no){
case LNO_GREEN: LED_GREEN= sw; break;
case LNO_RED1: LED_RED1 = sw; break;
case LNO_RED2: LED_RED2 = sw; break;
case LNO_RED3: LED_RED3 = sw; break;
}
}
//------------------------------------------------------------------------------
BOOL get_Led(BYTE led_no)
{
BOOL sw = LED_OFF;

switch (led_no){
case LNO_GREEN: sw = LED_GREEN; break;
case LNO_RED1: sw = LED_RED1; break;
case LNO_RED2: sw = LED_RED2; break;
case LNO_RED3: sw = LED_RED3; break;
}

return(sw);
}
//-------------------------------------------------------------------------------------------------------------------


































 

[ STEP 1 ]

 

 




 

[ STEP 2]

 

 























 お疲れ様でした。

 以上




  

ロボカップ関連 ――――
  

バナースペース

けいはんな
   ジュニアロボットクラブ

〒619-0237
京都府相楽郡精華町光台8丁目

TEL : 070-5263-2200
FAX : 0774-98-1100
mail : jun@kinet-tv.ne.jp