ช่วยทีครับต่อ PIC16F877 กับ Sonar Srf05 และLCD แล้วมันไม่แสดงค่าที่วัด

กระทู้คำถาม
ผมใช้ LCD16x2 ต่อกับPIC16f877  resonator 2O Mhz แล้วก็Sonarเพื่อวัดระยะอะครับ
ตอนแรกใช้LEDเช็คว่าถ้าวัดได้เกิน10cmให้LEDดวงนึงติดอีกดวงดับ ก็เช็คได้ปกติแต่มียางทีLEDกระพริบ
แต่พอต่อLCDติดปัญหาที่ค่าที่รับจากโซนาร์แสดงผิดปกติมันโชว์เป็น 000 แทนซะงั้นตอนแรกผมเขียนฟังก์ชันรับค่าโซนาร์เป็นฟังก์ชันแยกแล้วซิมก็ออกมาแบบนั้นแต่พอลงเอามาเป็นในMainเลยมันก็หายในซิมแต่พอต่อจริงมันยังเป็นอะครับ ในซิมผมใช้วิธีต่อเป็นกดพัลส์ด้วยPush button ธรรมดานะแค่ให้มัเปลี่ยน0->1->0ได้เหมือนรับEchoดูเฉยๆ

อันนี้ผมใช้MikroCเขียน  Echo ต่อกับ C1 Trigger ต่อกับ C0
LCD
-VSSต่อ กราวด์
-VDDต่อ ไฟ 5V
-VEE ต่อ กราวด์
-RS ต่อ D0
-Eต่อ D1
R/W ต่อ กราวด์
D0-D3 ต่อกราวด์
D4-D7ก็ต่อกับD4-D7ของPicเลย

Code
char txt1[] = "Range = ";
char txt2[] = "CM";
char txt3[3];

#define echo portc.f1
#define trigger portc.f0

int range;
void trig(void);

void main()
{
   TRISC=0x02;

   Lcd_Config(&PORTD, 0, 1, 2, 7, 6, 5, 4);

   Lcd_Cmd(LCD_CLEAR);               // Clear display

   Lcd_Out(1,1,txt1);                 // Write text in first row
   Lcd_Out(1,13,txt2);                 // Write text in second row
    while(1)
  {

         unsigned int a; //variable for initial function
         tmr1h = 0x00; //initial timer1 counter set to zero
         tmr1l = 0x00;
         t1con &= 0x0f; //timer1 mode2 16 bit counter
         t1con |= 0x10;
         trigger = 0; //set logic low
         echo = 1; //set logic low
         trig(); //send to trigger
         pir1.tmr1if = 0; //clear overflow
         t1con.tmr1on = 0; //start timer1
         while(!echo); //detect rising pulse
         t1con.tmr1on = 1; //start counter timer1
         while(echo); //detect falling pulse
         t1con.tmr1on = 0; //stop timer1
         pir1.tmr1if = 0; //clear overflow
         a = tmr1h; //keep high byte
         a <<= 8; //shift to high byte
         a += tmr1l; //keep low byte
         delay_ms(10); //delay 10 millisecond
         range = (a/114); //return value cm distance  114
                BytetoStr(range,txt3)  ;

                Lcd_Out(1,9,txt3);
                Lcd_Cmd(LCD_CURSOR_OFF);

    }

}


void trig(void){
     trigger = 1;
     delay_us(10);
     trigger = 0;
     }
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่