اطلاعیه

Collapse
No announcement yet.

ارتباط سریال در pic

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : ارتباط سریال در pic

    سلام دوستان
    میشه لطف کنید و منم راهنمایی بفرمایید.
    می خواستم با pic یه rfid راه بندازم. بدون استفاده از وقفه پورت سریال با دستور getc راحت کد تک را دریافت می کردم اما وقتی خواستم با وقفه پورت سریال کار کنم به مشکل بر خوردم.اولا که کد تک را به درستی نشون نمی داد. دوما یه چند تا عدد عجیب غریب هم روی lcd نشون میداد. درضمن اصلا اعداد پاک هم نمی شدن.
    این برنامه را هم که اینجا قراردادین تست کردم اما جواب نداد.لطفا اگه امکانش هست راهنماییم بفرمایید
    با تشکر

    اینم کد:
    [code=c]
    #include <18f4550.h>
    #use delay(int=8mhz)
    #use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7)
    #define use_portd_lcd true
    #include <lcd.c>

    char c;
    char buffer[32];
    int i=0;
    #int_RDA
    void serial_isr() {

    c=getc();
    buffer[i]=c;
    i++;
    if(i==31)
    {
    i=0;
    }
    }
    void main()
    {

    enable_interrupts(int_rda);
    enable_interrupts(GLOBAL);
    lcd_init();
    while(true)
    {
    lcd_gotoxy(1,1);


    printf(lcd_putc,"%c",buffer);
    delay_ms(2000);
    lcd_init();
    }
    }
    [/code]

    دیدگاه


      #17
      پاسخ : ارتباط سریال در pic

      با سلام
      نکته اول اینکه کد رو با تگ کد وارد کنید تا بشه خوندش، اینطوری به هم میریزه(لطفا ویرایش کنید)
      دوم اینکه خیلی سطحی نگاه کردم 4 تا تا ایراد داشت
      اول اینکه
      کد:
      buffer = c;
      دقیقا یعنی چی؟ تعجب می کنم اررور نداده، کد صحیح
      کد:
      buffer[i] = c;
      دوم اینکه چرا تو while هی lcd_init میکنید، یه بار قبل حلقه انجام بدین و بعدش lcd_clear کنید
      سوم اینکه تو printf با c% کاراکتر نشون میدن، برای جمله از s% استفاده میشه
      چهارم، برای کار با توابع رشته باید حتما آخر ارایه رشته کاراکتر null یا همون 0x00 قرار بگیره و گرنه تضمینی برای اجرای صحیح نیست
      برای حل مشکل isr رو اینطور تغییر بدین
      کد:
      c = getc();
      buffer[i++] = c;
      buffer[i] = 0x00;//null termination character
      if(i == 30)
      {
      	i = 0;
      	buffer[i] = 0x00;//string with zero length
      }
      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

      دیدگاه


        #18
        پاسخ : ارتباط سریال در pic

        دوست عزیز خیلی ممنونم.این برنامه فقط برای بار اول درست کار کرد بعدش دوباره مثل دفعه ی قبل شد. احتمالا بافرش خالی نمیشه.حتی با روشن و خاموش کردن هم درست نمی شه.
        اگه میشه لطف کنید یه نگاهی بهش بندازید.
        کد:
        #include <18f4550.h>
        #use delay(int=8mhz)
        #use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7) 
        #define use_portd_lcd true
        #include <lcd.c>
        
        char c;
        char buffer[30];
        int i;
        #int_RDA
        void serial_isr() {
        c = getc();
        buffer[i++] = c;
        buffer[i] = 0x00;//null termination character
        if(i == 30)
        {
          i = 0;
          buffer[i] = 0x00;//string with zero length
        }
        } 
        void main()
        {
        
        enable_interrupts(int_rda);
        enable_interrupts(GLOBAL); 
        lcd_init();
        while(true)
        {
        lcd_gotoxy(1,1);
        printf(lcd_putc,"%s",buffer);
        
        }
        }

        دیدگاه


          #19
          پاسخ : ارتباط سریال در pic

          دوست عزیز، چرا طول بافر رو کم کردی؟ هموم 32 بذار بمونه
          در ضمن یک delay هم تو while بذار باشه، مثلا 500 میلی(بعد از lcd)
          برای احتیاط موقع تعریف i مقدارشو مساوی 0 بذار
          انجام بده بگو ببینیم چه تغییری کرد
          The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

          دیدگاه


            #20
            پاسخ : ارتباط سریال در pic

            حسام جان من قبلا هم بخاطر پروژه sim900 مزاحمت شده بودم.
            البته اینبار هم برای همون sim900 است :biggrin: اما این بار با pic.
            با RFID هم دارم کار با پورت سریال را یاد می گیرم که برای SIM900 زیاد به مشکل بر نخورم.
            الان تقریبا بهتر شده امابازم بافر خالی نمیشه
            بار اول که تگ را جلوی ماژول می گیرم کدش را بدرستی نشون میده اما برای بار دوم به بعد کدها را ناقص نشون میده(مثلا دو رقم اول یا چند رقم آخر را نشون میده) البته بعد از 6 یا 7 بار که تگ را جلوش بگیرم ، دوباره به حالت اول بر می گرده و دقیقا کدها را مثل حالت اول نشون میده. انگار توی یه چرخه افتاده :surprised:
            همچنین می خوام کاری کنم که کد تگ هر بار فقط برای یک ثانیه نشون داده بشه که اینم نمیشه :cry2:
            بازم ممنون
            کد:
            #include <18f4550.h>
            #use delay(int=8mhz)
            #use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7) 
            #define use_portd_lcd true
            #include <lcd.c>
            
            char c;
            char buffer[32];
            int i=0;
            #int_RDA
            void serial_isr() {
            
            c = getc();
            buffer[i++] = c;
            buffer[i] = 0x00;//null termination character
            if(i == 32)
            {
              i = 0;
              buffer[i] = 0x00;//string with zero length
            }
            } 
            void main()
            {
            
            enable_interrupts(int_rda);
            enable_interrupts(GLOBAL); 
            lcd_init();
            while(true)
            {
            lcd_gotoxy(1,1);
            printf(lcd_putc,"%s",buffer);
            delay_ms(1000);
             lcd_putc('\f'); 
            
            }
            }
            برای پاک کردن آرایه بافر از دستور زیر استفاده کردم که بازم جواب نداد.
            کد:
            printf(lcd_putc,"%s",buffer);
            delay_ms(1000);
             lcd_putc('\f'); 
            
            for(i=0;i<32;i++)
            {
             buffer[i] =0;
            }

            دیدگاه


              #21
              پاسخ : ارتباط سریال در pic

              بله خاطرم هست، رفت و امد خانوادگی دارم بنده با پورت سریال کلا :biggrin:
              از اول می گفتین پروژه رو
              اولا برادر من، عزیز من، نکن، طول بافر رو بذار 32 باشه، عدد شرط تو isr رو بذار 30 باشه،
              اینکه بعد 6 یا 7 بار درست میشه، به خاطر این هست که مقدار i تو isr از شرط بالا تر میره و صفر میشه و همه چی میشه مثل اولش،
              حالا راه حل
              ثانیا، این تگ ها من کار نکردم، اما راهی هست که بشه فهمید، الان id کامل دریافت شده؟مثلا از روی طول یا ارسال کاراکتر خاص مثل enter؟
              اگه بله، یک فلگ گلوبال با مقدار صفر تعریف کنید، تو isr چک کن ببین id کامل دریافت شده یا نه، اگه اره فلگ رو یک کن، تو while قبل از اینکه تو lcd نمایش بدی فلگ رو چک کن، اگه یک بود نمایش بده، یک ثانیه تاخیر و بعدش هم فلگ رو صفر کن هم بافر رو خالی کن،
              برای خالی کردن بافر کد زیر کافیه
              کد:
              buffer[0] = 0;
              ------------------
              یه نکته، کد دوم که بالا قرار دادی، درسته و هر چند روش خوبی نیست اما باید در حد دم دستی کار کنه، اما چرا نمی کنه؟ چون شما میای از i که تو isr ازش برای تعیین محل نوشتن تو بافر استفاده میشه، تو while برای صفر کردن بافر استفاده میکنی، و در حقیقت دست میزنی و گم میکنی i رو اگه مثلا از j استفاده میکیردی، مشکل حل بود

              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

              دیدگاه


                #22
                پاسخ : ارتباط سریال در pic

                داداش عدد شرط تو isr رو 30 گذاشتم.
                اما:
                این بافر پاک بشو نیست.
                بازم همون مشکل قبل.
                این تگ ها آخرشون کد اینتر است.
                اما من فعلا می خواستم فقط بافر پاک بشه. چون با خالی شدن بافر میکرو به همون حالت اول برمی گرده .

                دیدگاه


                  #23
                  پاسخ : ارتباط سریال در pic

                  دوست من اقا محمد جواد، یکبار پاشو دست و رو تو بشور دوباره به کد نگاه کن، اشتباهاتی به نظرم داری
                  --با صفر گذاشتن بایت اول بافر بدون شک پاک میشه
                  --بافر اگه پاک بشه، اما ال سی دی پاک نشه، ال سی دی همون مقدار قبلی رو نشون میده
                  --حواست باشه بافر از دو جا کنترل میشه، یه جا که پاکش میکنی، یکی هم تو isr، فک کن بایت اول بافر رو صفر کنی ولی i رو دست نزنی، چی میشه؟ مثلا i تو اون لحظه 10 بوده، اینقدر isr باید اجرا شه تا به ائن شرط برسه و i = 0 شه تا برنامه درست اجرا شه، پس هر جا بافر رو پاک میکنی، یادت نره i = 0 هم بذاری.
                  --با پاک شدن بافر میکرو به حالت اول بر نمیگرده، السی دی یا هموم i که گفتم، مقدارشون سر جاشه و شما باید حواست به اونا هم باشه

                  ----عجله نکن، مشکل شماست که باید حل شه، اما فقط حل این مشکل نیست، یاد گرفتن روش برای گیر نکردن تو مشکلات بعدی هم هست، با حوصله کد رو بخون و تغییر بده، اشکالات کوچیک الان نمیذاره این برنامه شما درست کار کنه
                  The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                  دیدگاه


                    #24
                    پاسخ : ارتباط سریال در pic

                    سلام
                    با عرض پوزش متاسفانه دیروز فرصت نشد دوباره برنامه را تست کنم.
                    خوشبختانه درست شد. فقط کافی بود شمارنده صفر بشه(i=0)
                    حالا فکر کنم وقتشه با sim900 تست کنم
                    حسام جان دستت درد نکنه.از راهنمایی های صبورانت ممنونم.

                    کد:
                    #include <18f4550.h>
                    #use delay(int=8mhz)
                    #use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7) 
                    #define use_portd_lcd true
                    #include <lcd.c>
                    
                    char c;
                    char buffer[32];
                    int i=0;
                    int j=0;
                    #int_RDA
                    void serial_isr() {
                    c = getc();
                    
                    buffer[i++] = c;
                    buffer[i] = 0;//null termination character
                    if(i == 30)
                    {
                     buffer[0] = 0;
                     i = 0;
                     //buffer[i] = 0x00;//string with zero length
                    }
                    
                    }
                    void main()
                    {
                    
                    enable_interrupts(int_rda);
                    enable_interrupts(GLOBAL); 
                    lcd_init();
                    while(true)
                    {
                    lcd_gotoxy(1,1);
                    printf(lcd_putc,"%s",buffer);
                    delay_ms(1000);
                    i=0;
                    }
                    }

                    دیدگاه

                    لطفا صبر کنید...
                    X