1

私は現在、cytron の PIR モーション センサーという 2 つのセンサーを組み合わせたプロトタイプを作成しています。

およびフォトダイオード (小型、3 本足、モデルは不明)

プロトタイプは、光がなく、動きがある場合、LED がオンになるように機能します。そうしないと、オフになります。

両方のセンサーを別々にテストするコードを書きましたが、問題なく動作します。

2つのコードを組み合わせると、ledの出力の問題に直面します。以下に示すとおりです。

//  include
//==========================================================================

 # include <pic.h>

 # include <htc.h>

//  configuration
//==========================================================================
__CONFIG (0x3F32);

//  define
//==========================================================================
 #define    sensor   RB3    
 #define    led      RA5
 #define led2    RB7
 #define light   RB5
 #define _XTAL_FREQ 4000000
 #define delay ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

//  main function
//==========================================================================

void main(void)
{
//  unsigned long delay_time=5000;

TRISA = 0b00000000;
TRISB = 0b01111111;             //Configure Port B     as Input

ADCON1   =0B00000110;

led=0;
led2=0;
int i;

while(1)                    //Infinity Loop
{

    if(!light)
    {   
        if(sensor)
        {
            for(i=5;i>0;i--)
            {
                led2=0;
                led=1;
                __delay_ms(10000);
            }   
        }

        else if(!sensor)
        {   
            if (i>0)
            {   for(i=5;i>0;i--)
                {
                    led2=0;
                    led=1;
                    __delay_ms(10000);
                }
            }
            else if(i<=0)
            {
                led=0;  
                led2=1;
            }
        }
    }

    else if(light)
    {
        led=0;  
        led2=1;
    }

}
}

よろしくお願いします。助けてください。ありがとうございました。

4

4 に答える 4

1

変数iを宣言しますが、それを値に初期化しないでください(Cコンパイラーも変数iを0に初期化するとは思わないので、わかりません)。そうでない場合は、次のシナリオを想像してください。実行の最初の開始時に、(!light)と(!sensor)であり、i>0またはi<= 0の比較を開始しますが、私は最初に??

if(センサー)本体がiに初期値を与えるために少なくとも1回実行されたと仮定するだけです。プログラムの要件やフローの詳細はわかりませんが、これは安全ではなく、隠れたバグだと思います。

于 2012-11-13T21:41:06.760 に答える
0

アセンブリ言語を使用して pic24 ファミリで作業していたときに、2 つのポートを連続して割り当てる必要がある場合、2 番目の割り当てが機能しないことが判明しました (トライステート バッファを使用していない限り...正確な理由はわかりませんが、それがケース...).とにかく...私が言おうとしているのは、次のような各LED値の割り当ての後に数ミリ秒の遅延を与えることです:

        for(i=5;i>0;i--)
        {
            led2=0;
            _delay_ms(50);
            led=1;
            __delay_ms(10000);
        }
于 2012-11-13T08:42:49.327 に答える
0

次のようなものはどうですか:

while (1)
{
    led_on = 0;

    if (!light && !sensor)
    {
        if (led_on == 0)
        {
            /* Turn on LED... */
            led_on = 1;
        }
    }
    else if (led_on == 1)
    {
        /* Turn off LED... */
        led_on = 0;
    }
}
于 2012-11-13T08:38:54.363 に答える