Micom Car Rally NET
MCR - Micom Car Rally
2015大会 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
アプリケーション
R8C/M12A 技術情報
上位入賞マイコンカー
参加者レポート
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
R8CM12A基板 10ピンコネクタ(CN2、CN3)を使って、データの入出力をする

R8CM12A基板は、10ピンコネクタを2個搭載できます。このコネクタを使った入出力について説明します。

CN2とCN3のピン配置
CN2とCN3のピン番号と、接続信号を下記に示します。

ピン番号(bit) CN2 CN3
1ピン 電源電圧(Vcc) 電源電圧(Vcc)
2ピン(bit7) P1_7 P3_3
3ピン(bit6) P1_6 P3_4
4ピン(bit5) P1_5 P3_5
5ピン(bit4) P1_4 P3_7
6ピン(bit3) P1_3 P4_7
7ピン(bit2) P1_2 P4_6
8ピン(bit1) P1_1 P4_5
9ピン(bit0) P1_0 P4_2
10ピン GND GND

CN2は、ポート1のbit7〜0なので簡単に入出力可能です。CN3は、ポート3とポート4が混ざっているので簡単に入出力することはできません。今回は簡単に入出力できる関数を作ります。

CN2:IN、CN3:OUTのときのプログラム

接続図
実習基板Ver.2を使ったときの結線を下図に示します。
R8CM12A基板のCN2(IN)と実習基板Ver.2のLED部、R8CM12A基板のCN3(OUT)と実習基板Ver.2のスイッチ部をフラットケーブルでつなぎます。

図

ワークスペース

r8cm12a_cn3_out_100.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。

プログラム

init関数で、ポート1を入力、ポート3、ポート4を出力に設定します。
/***************************************************/
/* R8C/M12A スペシャルファンクションレジスタ(SFR)の初期化        */
/***************************************************/
void init( void )
{
    /* ポートの入出力設定 */
    pd1 = 0x00;            /* ポート1の入出力設定  */
    pd3 = 0xff;            /* ポート3の入出力設定  */
    pd4 = 0xff;            /* ポート4の入出力設定  */
    pda = 0xff;            /* ポートAの入出力設定  */
}

CN3コネクタへ信号を出力する、専用の関数を作ります。
引数の値を1bitずつチェックして、px_yの形式で1bitずつ、出力します。
/***************************************************/
/* CN3コネクタへ信号出力                           */
/* 引数  0〜255                                   */
/* 戻り値 なし                                     */
/***************************************************/
void cn3_out( unsigned char in )
{
    p3_3 = (in & 0x80) != 0 ? 1 : 0;  /* 引数のbit7を、P3_3へ */
    p3_4 = (in & 0x40) != 0 ? 1 : 0;  /* 引数のbit6を、P3_4へ */
    p3_5 = (in & 0x20) != 0 ? 1 : 0;  /* 引数のbit5を、P3_5へ */
    p3_7 = (in & 0x10) != 0 ? 1 : 0;  /* 引数のbit4を、P3_7へ */
    p4_7 = (in & 0x08) != 0 ? 1 : 0;  /* 引数のbit3を、P4_7へ */
    p4_6 = (in & 0x04) != 0 ? 1 : 0;  /* 引数のbit2を、P4_6へ */
    p4_5 = (in & 0x02) != 0 ? 1 : 0;  /* 引数のbit1を、P4_5へ */
    p4_2 = (in & 0x01) != 0 ? 1 : 0;  /* 引数のbit0を、P4_2へ */
}

見慣れない形式が出てきました。「?」と「:」を使って演算を行う形式を、条件演算子、または三項演算子といいます。例えば、下記の様なプログラムがあったとします。
    if( a > 0 ) {
        b = 1;
    } else {
        b = 2;
    }

条件演算子は「(条件式)(成り立つなら)(成り立たなければ)」という形式で使います。上記のif文を条件演算子を使うと次のようになります。
        b = a > 0 ?  1   :    2;
             ↑     ↑       ↑
         条件式   成り立  成り立た
                  つなら  ないなら
このプログラムは『条件式「a > 0」が成り立つならば「1」を結果とする、成り立たなければ「2」を結果とする、それをb変数に代入する』という意味になります。

今回のプログラムに当てはめると、次のような意味になります。
        p3_3 = (in & 0x80 ) != 0 ? 1 : 0;
このプログラムは『条件式「(in & 0x80 ) != 0」が成り立つならば「1」を結果とする、成り立たなければ「0」を結果とする、それをp3_3に代入する』という意味になります。条件式は「in変数のbit7のみ有効にして、その値が0以外なら」という意味になります。結果、ここで実行している内容は「in変数のbit7の値をp3_3に代入する」ということになります。p3_3はCN3のbit7なのでin変数のbit7の値を代入チェックします。同様にin変数のbit6〜bit0もチェックして、マイコンの端子の出力を設定します。

main関数では、p1の値を変数dに読み込み、その値をcn3_out関数を使って、CN3に接続されてる実習基板Ver.2のLED部へ出力します。
/***************************************************/
/* メインプログラム                                */
/***************************************************/
void main( void )
{
    unsigned char d;

    init();           /* 初期化                    */

    while( 1 ) {
        d = p1;
        cn3_out( d );
   }
}

CN3:IN、CN2:OUTのときのプログラム

接続図
実習基板Ver.2を使ったときの結線を下図に示します。
R8CM12A基板のCN3(IN)と実習基板Ver.2のLED部、R8CM12A基板のCN2(OUT)と実習基板Ver.2のスイッチ部をフラットケーブルでつなぎます。

図

ワークスペース

r8cm12a_cn3_in_100.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。

プログラム

init関数で、ポート3、ポート4を入力、ポート1を出力に設定します。
/***************************************************/
/* R8C/M12A スペシャルファンクションレジスタ(SFR)の初期化        */
/***************************************************/
void init( void )
{
    /* ポートの入出力設定 */
    pd1 = 0xff;            /* ポート1の入出力設定  */
    pd3 = 0x00;            /* ポート3の入出力設定  */
    pd4 = 0x00;            /* ポート4の入出力設定  */
    pda = 0xff;            /* ポートAの入出力設定  */
}

CN3コネクタから信号を入力する、専用の関数を作ります。
CN3のbit7〜bit0の端子を1bitずつチェックして、ret変数に代入していきます。
/***************************************************/
/* CN3コネクタの信号入力                           */
/* 引数  なし                                     */
/* 戻り値 0〜255                                   */
/***************************************************/
unsigned char cn3_in( void )
{
    unsigned char ret;

    ret  = p3_3 << 7;
    ret |= p3_4 << 6;
    ret |= p3_5 << 5;
    ret |= p3_7 << 4;
    ret |= p4_7 << 3;
    ret |= p4_6 << 2;
    ret |= p4_5 << 1;
    ret |= p4_2;

    return ret;
}

「<<」や「>>」は、シフト演算子といい、「<<」は左に指定した数字分、「>>」は右に指定した数字分、シフトさせます。例えば、「ret = p3_3 << 7;」は、p3_3の値を左に7ビットシフトしてret変数に代入します。
「|=」はOR演算をして代入するという意味です。「ret |= p3_4 << 6;」は、p3_4の値を左に6ビットシフトして、ret変数と今回の結果をOR演算して、ret変数に代入するという意味です。
これをCN3のbit7〜bit0に接続されている8端子分繰り返して、ret変数に代入、戻り値とします。

main関数では、cn3_in関数でCN3の信号を変数dに読み込み、その値をCN2のポート1に接続されている実習基板Ver.2のLED部へ出力します。
/***************************************************/
/* メインプログラム                                */
/***************************************************/
void main( void )
{
    unsigned char d;

    init();           /* 初期化                    */

    while( 1 ) {
        d = cn3_in();
        p1 = d;
    }
}

BACK