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;
}
}
|