اطلاعیه

Collapse
No announcement yet.

نویز در UART

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

    #16
    پاسخ : نویز در UART

    سلام دادا.
    این شیوه کدنویسی برا دریافت کاملاً اشتباهه.
    توی این روش هر لحظه امکان تغییر اندیس آرایه وجود داره.
    به این کد یه نگاه بنداز. احتمالاً متوجه می شی چطور باید عمل کنی. البته بهتر از اینم میشه نوشت.
    کد:
    [/
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    
    interrupt [USART0_RXC] void usart0_rx_isr(void)
     {
      char status,data;
      status=UCSR0A;
      data=UDR0;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
        if (data=='I')
         {
          rx_wr_index = 1;
         }
        else if (rx_wr_index == 1 && data=='M')
         {
          rx_wr_index = 2;
         }
    
        else if (rx_wr_index > 1 && rx_wr_index < 6)
         {
          rx_buffer[rx_wr_index - 2]=data;
          rx_wr_index++;
         }
    
        else if (rx_wr_index == 6 && data=='A')
         {
          rx_wr_index = 7;
         }
    
        else if (rx_wr_index == 7 && data=='N')
         {
          rx_wr_index = 0;
          DataProcess();
         }
    
        else
         rx_wr_index=0;
    
        if (++rx_counter == RX_BUFFER_SIZE)
         {
          rx_counter=0;
          rx_buffer_overflow=1;
         };
       };
     }
    توی این بخش کد میتونی با تغییر بازه اندیس دیتا رو ذخیره کنی:

    کد:
    else if (rx_wr_index > 1 && rx_wr_index < 6)
         {
          rx_buffer[rx_wr_index - 2]=data;
          rx_wr_index++;
         }
    ایراد برنامه شما در زمان صفر کردن اندیس آرایه تونه. بهتره ابتدا کل اطلاعات مد نظر رو از سریال دریافت کنی و بعد از رسیدن آخرین دیتا یه پرچم رو یک کنی. سپس توی حلقه اصلی برنامه به محض دیدن پرچم اطلاعات رو پردازش و در انتها "پرچم رو صفر کنی".
    احتمالا توی برنامه شما اندیس آرایه overflow هم میشه که برا جلوگیری از این اتفاق بهترین کار دریافت کل اطلاعات در یه پردازش و اضافه کردن چند بایت ناقابل به آرایه اصلیه.
    ضمنا بهتره برا دسترسی به آرایه ها از اشاره گرها استفاده کنی دادا.
    تشکر لازم نیست!

    دیدگاه


      #17
      پاسخ : پاسخ : نویز در UART

      همه رو نمیتونم یهو دریافت کنم. چون طول داده های دریافتی متغیر هست
      اینجوری نوشتم:
      [code=c]interrupt [USART1_RXC] void usart1_rxc_isr(void)
      {
      char status;
      status = UCSR1A;
      if( !( status & (FRAMING_ERROR|DATA_OVERRUN) ) )
      {
      if(UDR1=='$&#039 index1=0; // First Received Character is: $
      receive1[index1] = UDR1;
      index1++;
      }
      }[/code]
      ولی کند میشه. یعنی چک کردن اطلاعات مثلا 10 تا 20 ثانیه طول میکشه. اینکه درست انجام میشه یا نه رو نمیدونم :angry:

      اصلا یه چیز دیگه
      با همون کاری که قبلا انجام میدادم، اطلاعات درست دریافت میشد
      چون وقتی اطلاعات میومد، بایت شماره 19 اش رو چک میکردم که A هست یا نه. همیشه این کار رو درست انجام میده. پس یعنی دریافتم درسته دیگه :smile:
      http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

      دیدگاه


        #18
        پاسخ : نویز در UART

        همه رو نمیتونم یهو دریافت کنم. چون طول داده های دریافتی متغیر هست
        میتونی توی هر ارسال تعداد بایت ارسالی رو هم بفرستی و توی گیرنده به همون مقدار اندیس رو set کنی.
        تشکر لازم نیست!

        دیدگاه


          #19
          پاسخ : نویز در UART

          سلام
          منم مشکل شما رو داشتم اما c رو زیاد باهاش کار نکردم واما توی بیسیک:
          زمانیکه دریافتی انجام میشه یه بیت به نام usr.rx فعال میشه و تا زمانیکه ما بافر udr رو نخونیم وقفه دریافت بازم اجرا میشه (سه بار یا بیشتر) و علتش هم اینه که اینکه در اولین بار udr مقدار واقعی دریافت شده رو داره ولی در دفعات بعد مقدارش مث همون دیتای اول نیست .حالا اگه ما با اولین دریافت گیرنده سریال رو بعد از اولین بار خوندن غیر فعال کنینم از چندین بار اجرا شدن وقفه دریافت جلوگیری میشه و بعد از اینکه udr خونده شد میتونیم دوباره اون بیت رو یک میکنین تا واسه دریافتهای بعد اماده باشه ..
          مثلا توی مدار خودم اگه اولین داده میومد اونو درست نشون می داد اما داده بعدی که میومد اولش یه کاراکتر نامفهوم اضافه میشد و باید حتما میکرو ریست میشد تا داده درست میومد...
          موفق باشی...

          دیدگاه


            #20
            پاسخ : نویز در UART

            سلام به همه
            یلدا مبارک
            ----------------------------------
            نوشته اصلی توسط سامان تقی پور
            با مقاومت های 4.7K و 10K و 47K هم pull-up و هم pull-down کردم، یکم بهتر شد، ولی درست نشد :angry:
            از pull-up داخلی هم استفاده کردم، بازم درست نشد.
            الان در یه زمان هم pullup و هم pull down هستن؟
            ---------------------------------
            میکرو داره با چه چیزی ارتباط برقرار میکنه ؟
            اونطرف میکرو ، یا یه ماژوله؟
            سرعتت رو بیار روی حدا اقل سرعت طرف مقابل بهتره زیر 9600 باشه و کریستال هم اگر ولتاژت ممکنه کمتر از 5 ولت بشه حتما از 7.3728MHz استفاده کن (البته اگر برای تستای بردت از کریستالی با همین سرعت استفاده کنی خیلی بهتره)
            ----------------------------------
            نرم افزار هایی که برای ارتباط uart با pc استفاده میشن معمولا هر کدوم دارای باگ هایی هستن
            نرم افزاری که توی ارتباط uart در حالت کد های اسکی کارش خوبه
            mikroBasic PRO for PIC
            هستش که یه بخش به عنوان ابزار کمکی داره که برای ارتباط uart هستش
            و برای ارتباط در حالت دیدن کدهای هگز بهتره که از atmel studio 6.2 به بالا استفاده کنی که اون هم به عنوان یه ابزار کمکی برای ارتباط uart چیزه خوبی داره
            ---------------------------------
            در مجموع با توجه به اینکه میگید همیشه یه متنی رو درست ارسال میکه و توی متغیر مشکل داره بنظر میرسه که مشکل از برنامه نوشته شده باشه تا از سخت افزار که با رعایت موارد بالا دیگه تقریبا مطمئن میشیم که مشکل سخت افزار نیست
            ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
            شهید دکتر مصطفی چمران
            اللهم صل علی محمد و ال محمد و عجل فرجهم
            ; C is not for children

            دیدگاه


              #21
              پاسخ : نویز در UART

              نوشته اصلی توسط مهدی رهی
              الان در یه زمان هم pullup و هم pull down هستن؟
              نه
              pull-up داخلی کردم که مقاومتش بالاس
              pull-up با مقاومت های 10K و 4.7K و 3.3K (هر کدوم جدا)
              pull-down هم کردم با مقاومت های 10K و 4.7K هر کدوم جدا)
              همزمان pull-up pull-down نکردم :redface:

              توی دیتا شیت گفته که RxD در حالت Idle مقدارش 1 هست.
              پس باید pull-up کنم دیگه. چون دیتا شیت گفته Idle اش 1 هست.

              http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

              دیدگاه


                #22
                پاسخ : نویز در UART

                نوشته اصلی توسط سامان تقی پور
                نه
                pull-up داخلی کردم که مقاومتش بالاس
                pull-up با مقاومت های 10K و 4.7K و 3.3K (هر کدوم جدا)
                pull-down هم کردم با مقاومت های 10K و 4.7K هر کدوم جدا)
                همزمان pull-up pull-down نکردم :redface:

                توی دیتا شیت گفته که RxD در حالت Idle مقدارش 1 هست.
                پس باید pull-up کنم دیگه. چون دیتا شیت گفته Idle اش 1 هست.

                با توجه به ماژولی که باهاش ارتباط داری برقرار میکنی نیازی به هیچ مقاومتی برای pull up یا pull down نیست.

                مداری که داری باهاش تست میگیری چیه؟
                pcb هستش یا روی برد برده؟
                اگز pcb هست خودت طراحیش کردی یا آماده خریدی؟
                ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                شهید دکتر مصطفی چمران
                اللهم صل علی محمد و ال محمد و عجل فرجهم
                ; C is not for children

                دیدگاه


                  #23
                  پاسخ : نویز در UART

                  روی PCB هست که خودم طراحی کردم
                  برای چک کردن، هر چند ثانیه یه بار میام و مثلا بایت شماره 20 رو چک میکنم تا ببینم درسته یا نه
                  http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                  دیدگاه


                    #24
                    پاسخ : نویز در UART

                    نوشته اصلی توسط سامان تقی پور
                    روی PCB هست که خودم طراحی کردم
                    برای چک کردن، هر چند ثانیه یه بار میام و مثلا بایت شماره 20 رو چک میکنم تا ببینم درسته یا نه
                    با توجه به عکسی که برام فرستادی چجوری اطلاعات رو میبینی؟
                    روی lcd کاراکتری چک میکنی یا همزمان هم ارتباط بین میکرو و ماژول و هم کامپیوتر برقراره؟
                    بردت باید حداقل 2 لایه باشه و بهتره از قطعات smd استفاده کرده باشی و همچنین طول ترک های uart نباید زیاد بلند باشه و بهتره که ترک های دیگه ای هم تا حد امکان از دورو ورش و زیرش رد نشده باشه یا اگر مجبور شدی رد کنی بهتره قانون 3w رو رعایت کنی و همینطور بهتره خطوطت رو Microstrip بکشی برای 100 اهم تا خطاهات کمتر بشه
                    ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                    شهید دکتر مصطفی چمران
                    اللهم صل علی محمد و ال محمد و عجل فرجهم
                    ; C is not for children

                    دیدگاه


                      #25
                      پاسخ : نویز در UART

                      LCD نیست. روی کامپیوتر میبینم
                      اطلاعات توی میکرو خراب میشن انگار
                      چون ورود و خروجشون درسته
                      برای خروج: چون یه چیز ثابت رو همیشه درست ارسال میکنه. ولی یه متغیر بعضی وقتا مقدارش تغییر میکنه
                      http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

                      دیدگاه

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