0

私は、受信した値を cm として PIC18f2520 用の HC SR04 の単純なコードを 1 つ開発しています。状況は、私は間違った値を受け取っており、近似で変化していません。センサーは意味をなさない値を与えます。内部水晶 8Mhz、16 ビットの TIMER1、1:8 プリスケーラ、および TMR1CS =0 = 内部クロック (FOSC/4) を使用しています。ms と us の遅延はコンパイラ コードです。また、TRIGER ピンは RA2 で、ECHO ピンは RA5 です。誰かが私を助けることができますか?

#define TRIG RA2
#define echo RA5

void main(void)
{
   unsigned char duraca=0,duraca1=0,duraca2=0,duraca3=0;
   unsigned char distanci=0;
   int i;

   Config_micro();
   serialBegin();
   TRIG=0;
   TMR1L=0;
   TMR1H=0;
   while(1)
   {
      TRIG=1;
      DelayUs(10);
      TRIG=0;

      while(echo==1);
      TMR1ON = 1;
      while(echo==0);
      TMR1ON = 0;

      duraca1=(TMR1L+(TMR1H<<8));
      duraca2=(duracao1<<2);
      distanci=((duraca1)/58);
      printf("distancia: %2d cm\n\r",distanci);
      __delay_ms(90);
      __delay_ms(90);
      __delay_ms(90);
   }
}
4

1 に答える 1

3

問題は、それほど多くのデータを含めることができない変数に、より多くのデータを格納したいということです

duraca1=(TMR1L+(TMR1H<<8));

duraca1 は次のunsigned char duraca1=0;ように定義されているため、幅はわずか 8 ビットです。
TMR1H を 8 シフトすると、範囲外になります。
それが正しくないので、以下も正しくありません。 ショートの代わりに
試してみ てください。幅は 16 ビットであり、問​​題を解決するはずです。unsigned short duraca=0,duraca1=0,duraca2=0,duraca3=0;
unsigned char duraca=0,duraca1=0,duraca2=0,duraca3=0;

于 2014-04-25T12:16:30.607 に答える