![]()
スタートビットの入力を検知後、0.83[ms]ごとに”1”、”0”を判定し、入力されたキーを判別します。それに応じて梵天丸のモータを動作させます。 効率の良いコーディングではないので、修正を検討しています。 |
|
//******************************************************************************
//* bon_key スタートビット検出+リモコンデータ検出 *
//* パソコンのキーボードを押すと梵天丸移動(W↑A←S→Z↓) *
//******************************************************************************
#include <16f84a.h> // 使用デバイスの定義情報をインクルードする。
#fuses HS, NOWDT, NOPROTECT // コンフィグレーションの設定(HSモード,WDTなし,プロテクトなし)
#use delay (clock=8000000) // 梵天丸の発振子の周波数8MHz 時間待ち関数(delay)の設定
//-----------------------------------------------------------------------------
// I/Oポートの定義
//-----------------------------------------------------------------------------
#byte RA = 5 // ポートAのアドレス5番地をRA:文字変数に設定する。
#byte RB = 6 // ポートBのアドレス6番地をRB:文字変数に設定する。
#bit start_bit = RA.4 // 赤外線の入力ポートRA4をstart_bit:文字変数に設定する。
//-----------------------------------------------------------------------------
// メイン関数
//-----------------------------------------------------------------------------
main(){
byte flag, cnt, i; // byte型変数(符号なし8ビット)
byte data1, data2, data3, data4, data5, data6, data7, data8, data9;
byte rcv;
set_tris_a(0x10); // ポートAはRA4のみ入力に設定。(1:Input) 他は出力に設定。(0:Output)
set_tris_b(0xff); // ポートBはすべて入力に設定(1:Input)
data1 = 0x01; // 前左 パターン 0000 0001 モータ動作データ
data2 = 0x03; // 前進 パターン 0000 0011 リモコンのボタンとdataの番号が対応
data3 = 0x02; // 前右 パターン 0000 0010 下位4ビットが
data4 = 0x09; // 左転 パターン 0000 1001 (MSB)左逆転 右逆転 左正転 右正転(LSB)
data5 = 0x00; // 停止 パターン 0000 0000
data6 = 0x06; // 右転 パターン 0000 0110
data7 = 0x04; // 後左 パターン 0000 0100
data8 = 0x0c; // 後進 パターン 0000 1100
data9 = 0x08; // 後右 パターン 0000 1000
RA = 0x00; // 電源オン時、モータを停止状態にしておく
while(1){
while(start_bit!=0) {} // スタートビット(1:H)が入力されるまで待つ
flag = 0;
for (i=1;i<=4;i++) // スタートビット検出
{ // 100μs×4=400μsのうちに
delay_us(100); // RA4の"L"レベルの回数を検出
if (input(PIN_A4)==0)
flag = flag + 1;
}
if (flag >=3) // 3回以上検出した場合
{
delay_us(830);
rcv = 0;
if (input(PIN_A4)==1) // RA4の"L"レベルの回数を検出(1bit)
{
rcv = rcv + 1; // 検出の場合 rcv値+1
}
else
{
rcv = rcv + 0; // 未検出の場合 rcv値+0
}
delay_us(830);
if (input(PIN_A4)==1) //2bit
{
rcv = rcv + 2;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //3bit
{
rcv = rcv + 4;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //4bit
{
rcv = rcv + 8;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //5bit
{
rcv = rcv + 16;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //6bit
{
rcv = rcv + 32;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //7bit
{
rcv = rcv + 64;
}
else
{
rcv = rcv + 0;
}
delay_us(830);
if (input(PIN_A4)==1) //8bit
{
rcv = rcv + 128;
}
else
{
rcv = rcv + 0;
}
}
switch(rcv) // キー検出結果
{
case 87 : RA = data2; // キー"W"押す 前進
break;
case 65 : RA = data4; // キー"A"押す 左
break;
case 32 : RA = data5; // キー" "押す 停止
break;
case 83 : RA = data6; // キー"S"押す 右
break;
case 90 : RA = data8; // キー"Z"押す 後進
break;
}
delay_ms(100);
} // 無限ループで繰り返し
}
|
平成17年6月10日作成