0
votes

i am in troble with when using two ulrasonic sensores, but when working with one sensore, code is working fine. please help me to attach two ultarsnic sensores (HC-SR04) to my code and make this worke fine,

here i am tring to do thing is i want to keep a object with in the range and if the object move LED lights need to be on.

i am using the PIC 16F877A

Working code for one ultrasonic sensor

    void main()

    {

     int a;

      int b;


      TRISB = 0b00010000;           //RB4 as Input PIN (ECHO)

      TRISC = 0;           //C as Output PINs (LED)


      T1CON = 0x10;                 //Initialize Timer Module


      TRISD  = 1;   // 1 input 0 output ,related to LED (display)


      while(1)

      {

        for(b=1; b<3; b++){


           if (b=2){


                            TMR1H = 0;                  //Sets the Initial Value of Timer

                            TMR1L = 0;                  //Sets the Initial Value of Timer



                            PORTB.F1 = 1;               //TRIGGER HIGH

                            Delay_us(10);               //10uS Delay

                            PORTB.F1 = 0;               //TRIGGER LOW




                            while(!PORTD.F0);           //Waiting for Echo

                            T1CON.F0 = 1;               //Timer Starts


                            while(PORTD.F0);            //Waiting for Echo goes LOW

                            T1CON.F0 = 0;               //Timer Stops




                            a = (TMR1L | (TMR1H<<8));   //Reads Timer Value

                            a = a/58.82;                //Converts Time to Distance

                            a = a + 1;                  //Distance Calibration\
                                     //formular s=ut

                      if(a != 4 ){


                              PORTC = 0b01111111;               // turn on LEDs in the PIC

                              Delay_ms(5);

                              PORTC = 0;               // turn on LEDs in the PIC


                          } else  {

                              //out of range

                              PORTC = 0b00000000;

                          }



                }


              }


      }

    }

not working code for two ultarsonic sensers

    void main()

    {

     int a;

      int b;


      TRISB = 0b00010000;           //RB4 as Input PIN (ECHO)

      TRISC = 0;           //C as Output PINs (LED)


      T1CON = 0x10;                 //Initialize Timer Module


      TRISD  = 1;   // 1 input 0 output ,related to LED (display)


      while(1)

      {

        for(b=1; b<3; b++){


              if(b=1){



                    TMR1H = 0;                  //Sets the Initial Value of Timer

                    TMR1L = 0;                  //Sets the Initial Value of Timer



                    PORTB.F0 = 1;               //TRIGGER HIGH

                    Delay_us(10);               //10uS Delay

                    PORTB.F0 = 0;               //TRIGGER LOW




                    while(!PORTD.F1);           //Waiting for Echo

                    T1CON.F0 = 1;               //Timer Starts


                    while(PORTD.F1);            //Waiting for Echo goes LOW

                    T1CON.F0 = 0;               //Timer Stops




                    a = (TMR1L | (TMR1H<<8));   //Reads Timer Value

                    a = a/58.82;                //Converts Time to Distance

                    a = a + 1;                  //Distance Calibration\
                                   //formular s=ut

                    if(a != 4 ){
            //        PORTB.F3 = 1;
              //      PORTD = 0xFC;              // display number two in LED displa
                //    Delay_ms(5);
                  //  PORTB.F3 = 0;


                            PORTC = 0b00000011;               // turn on LEDs in the PIC

                            Delay_ms(5);

                            PORTC = 0;               // turn on LEDs in the PIC


                        } else  {

                            //out of range

                            PORTC = 0b00000000;

                        }


                }


                else if (b=2){


                      TMR1H = 0;                  //Sets the Initial Value of Timer

                      TMR1L = 0;                  //Sets the Initial Value of Timer



                      PORTB.F1 = 1;               //TRIGGER HIGH

                      Delay_us(10);               //10uS Delay

                      PORTB.F1 = 0;               //TRIGGER LOW




                      while(!PORTD.F0);           //Waiting for Echo

                      T1CON.F0 = 1;               //Timer Starts


                      while(PORTD.F0);            //Waiting for Echo goes LOW

                      T1CON.F0 = 0;               //Timer Stops




                      a = (TMR1L | (TMR1H<<8));   //Reads Timer Value

                      a = a/58.82;                //Converts Time to Distance

                      a = a + 1;                  //Distance Calibration\
                                     //formular s=ut

                      if(a != 4 ){


                              PORTC = 0b01111111;               // turn on LEDs in the PIC

                              Delay_ms(5);

                              PORTC = 0;               // turn on LEDs in the PIC


                          } else  {

                              //out of range

                              PORTC = 0b00000000;

                          }



                }


              }


      }

    }
2
Please format the code as readable text and post as such. The line spacing makes it almost unreadable. Also, without direct access to your hardware and debugger, it is very difficult for SO users to fix your code. It's MUCH easier for you to do it yourself. 'not working' is unhelpful as a description of your problem.ThingyWotsit
if (b=1) is probably wrong, and you probably want if (b==1). You have several of this issues.linuxfan says Reinstate Monica
Ok thingy I will update this. Linuxfan you are coreect about the if condition. Soon I will update the post with correct code.Buddhika Alwis

2 Answers

1
votes

Because of all the blocking waits on signal values to change, what you have effectively done is to use only one sensor at a time. If you want to use multiple sensors at the same time, you'll need to either interleave the logic for both sensors or use interrupts.

Additionally, depending on the scale of the distances being measured, the cut off point of distance between object and sensor should be adjusted to take the relative distance between sensors themselves into account.

1
votes

Here is the answer code for two ultrasonic sensors

    void main()

    {

     int a;

      int b;


      TRISB = 0b00011000;           //RB4 and RB5 as Input PIN (ECHO)
      TRISC = 0;           //C as Output PINs (LED)
      T1CON = 0x10;                 //Initialize Timer Module


      TRISD  = 1;   // 1 input 0 output ,related to LED (display)

      while(1)

      {
        for(b=1; b<3; b++){

              if(b==1){

                    TMR1H = 0;                  //Sets the Initial Value of Timer
                    TMR1L = 0;                  //Sets the Initial Value of Timer



                    PORTB.F0 = 1;               //TRIGGER HIGH
                    Delay_us(10);               //10uS Delay
                    PORTB.F0 = 0;               //TRIGGER LOW




                    while(!PORTB.F4);           //Waiting for Echo
                    T1CON.F0 = 1;               //Timer Starts

                    while(PORTB.F4);            //Waiting for Echo goes LOW
                    T1CON.F0 = 0;               //Timer Stops


                    a = (TMR1L | (TMR1H<<8));   //Reads Timer Value
                    a = a/58.82;                //Converts Time to Distance
                    a = a + 1;                  //Distance Calibration\
                                   //formular s=ut

                    if(a != 4 ){           

                            PORTC = 0b00000011;               // turn on LEDs in the PIC

                            Delay_ms(5);
                            PORTC = 0;               // turn on LEDs in the PIC


                        } else  {

                            //out of range

                            PORTC = 0b00000000;

                        }


                }


                else if (b==2){


                      TMR1H = 0;                  //Sets the Initial Value of Timer

                      TMR1L = 0;                  //Sets the Initial Value of Timer



                      PORTB.F1 = 1;               //TRIGGER HIGH

                      Delay_us(10);               //10uS Delay

                      PORTB.F1 = 0;               //TRIGGER LOW


                      while(!PORTB.F5);           //Waiting for Echo

                      T1CON.F0 = 1;               //Timer Starts


                      while(PORTB.F5);            //Waiting for Echo goes LOW

                      T1CON.F0 = 0;               //Timer Stops



                      a = (TMR1L | (TMR1H<<8));   //Reads Timer Value
                      a = a/58.82;                //Converts Time to Distance
                      a = a + 1;                  //Distance Calibration\
                                     //formular s=ut

                      if(a != 4 ){


                              PORTC = 0b01111111;               // turn on LEDs in the PIC
                              Delay_ms(5);
                              PORTC = 0;               // turn on LEDs in the PIC

                          } else  {

                              //out of range
                              PORTC = 0b00000000;

                          }



                }


              }


      }

    }