اطلاعیه

Collapse
No announcement yet.

کمک برای حل مشکل uart سریال

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

    کمک برای حل مشکل uart سریال

    سلام ؛من یک سوال در مورد پورت سریال داشتم ممنون میشم اگه کسی راهنماییم کنه
    سوالم اینه که من یک ارم lpc1768 دارم واسه همین فروشگاه ولی وقتی برنامه ی پورت سریال رو پروگرم می کنم همه چی درسته ولی وقتی که به کامپیوتر وصل می کنم و با نرم افزارهایی مثل هایپر ترمینال داده های پورت سریال رو چک می کنم می بینم که به جای شکل درست کلمات حروف نامشخصی به نمایش در می اد
    البته چون من شنیده بودم که هایپر ترمینال برای ویندوز 7 ناقص است از نرم افزار های دیگر استفاده کردم ولی باز همین مشکل بود
    در ضمن من با برد gsm تونستم خوب کنترل کنم ولی ارم اذیت می کنه و حروف نامعلومی رو نمایش میده
    خواهشا کمک کنید علت از چی میتونه باشه؟
    البته می دونم که وقت امتحانات هست و وقتتون رو می گیرم ولی شرمنده لازم دارم
    پیروزی یعنی : توانایی رفتن از یک شکست ، به شکستی دیگر بدون از دست دادن اشتیاق . . .
    ------------------------------------------------------------ - - -
    صبرت که تمام شد نرو!
    "معرفت"
    تازه از آن لحظه آغاز می شود...

    #2
    پاسخ : کمک برای حل مشکل uart سریال

    ی سوال؟
    زمین میکرو و PC رو یکی کردی؟
    معمولا اگه یکی نکنی این مشکل پیش میاد
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


      #3
      پاسخ : پاسخ : کمک برای حل مشکل uart سریال

      نوشته اصلی توسط علی ایمانی فر
      ی سوال؟
      زمین میکرو و PC رو یکی کردی؟
      معمولا اگه یکی نکنی این مشکل پیش میاد
      بله من از rs232 برای اتصال سریال استفاده می کنم و در اون هم پایه های زمین با کامپیوتر یکی شدند
      فقط ممکنه مشکل از باود ریت باشه؟
      اگه مشکل از اون باشه چه طوری میتونم به طور دقیق باودریت میکرو رو روی 115200 دقیقا تنظیم کنم؟
      پیروزی یعنی : توانایی رفتن از یک شکست ، به شکستی دیگر بدون از دست دادن اشتیاق . . .
      ------------------------------------------------------------ - - -
      صبرت که تمام شد نرو!
      "معرفت"
      تازه از آن لحظه آغاز می شود...

      دیدگاه


        #4
        پاسخ : کمک برای حل مشکل uart سریال

        100 درصد مشکل از باود ریت. من برنامم میذارم، با این جواب گرفتم. شایدم از رجیستر FDR استفاده نکردی و باود ریت دقیق نیست.

        اینم برنامه : فایل Serial.c

        کد:
        #include "LPC17xx.H"             /* LPC17xx definitions      */
        #include "Serial.h"
        
        #ifdef __DBG_ITM
        volatile int ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* CMSIS Debug Input    */
        #endif
        
        #define __UART0
        
        #ifdef __UART0
         #define UART  LPC_UART0
        #else
         #define UART  LPC_UART1
         aa
        #endif
        
        
        /*----------------------------------------------------------------------------
         Initialize UART pins, Baudrate
         *----------------------------------------------------------------------------*/
        void SER_Init (void) {
        #ifndef __DBG_ITM
        
        #ifdef __UART0               /* UART0 */
         LPC_SC->PCONP |= ((1 << 3) | (1 << 15)); /* enable power to UART0 & IOCON  */
        
         LPC_PINCON->PINSEL0 |= (1 << 4);    /* Pin P0.2 used as TXD0      */
         LPC_PINCON->PINSEL0 |= (1 << 6);    /* Pin P0.3 used as RXD0      */
        #else                   /* UART1 */
         LPC_SC->PCONP |= ((1 << 4) | (1 << 15)); /* enable power to UART1 & IOCON  */
        
         LPC_PINCON->PINSEL4 |= (2 << 0);    /* Pin P2.0 used as TXD1      */
         LPC_PINCON->PINSEL4 |= (2 << 2);    /* Pin P2.1 used as RXD1      */
        #endif
        
         UART->LCR  = 0x83;           /* 8 bits, no Parity, 1 Stop bit  */
         UART->DLL  = 9;            /* 115200 Baud Rate @ 25.0 MHZ PCLK*/
         UART->FDR  = 0x21;           /* FR 1,507, DIVADDVAL=1, MULVAL=2 */
         UART->DLM  = 0;            /* High divisor latch = 0     */
         UART->LCR  = 0x03;           /* DLAB = 0            */
        
        #endif
        }
        
        
        /*----------------------------------------------------------------------------
         Write character to Serial Port
         *----------------------------------------------------------------------------*/
        int SER_PutChar (int c) {
        
        #ifdef __DBG_ITM
          ITM_SendChar(c);
        #else
         while (!(UART->LSR & 0x20));
         UART->THR = c;
        #endif
         return (c);
        }
        
        
        /*----------------------------------------------------------------------------
         Read character from Serial Port  (blocking read)
         *----------------------------------------------------------------------------*/
        int SER_GetChar (void) {
        
        #ifdef __DBG_ITM
         while (ITM_CheckChar() != 1) __NOP();
         return (ITM_ReceiveChar());
        #else
         while (!(UART->LSR & 0x01));
         return (UART->RBR);
        #endif
        }

        دیدگاه


          #5
          پاسخ : کمک برای حل مشکل uart سریال

          نوشته اصلی توسط fedora
          100 درصد مشکل از باود ریت. من برنامم میذارم، با این جواب گرفتم. شایدم از رجیستر FDR استفاده نکردی و باود ریت دقیق نیست.

          اینم برنامه : فایل Serial.c

          کد:
          #include "LPC17xx.H"             /* LPC17xx definitions      */
          #include "Serial.h"
          
          #ifdef __DBG_ITM
          volatile int ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* CMSIS Debug Input    */
          #endif
          
          #define __UART0
          
          #ifdef __UART0
           #define UART  LPC_UART0
          #else
           #define UART  LPC_UART1
           aa
          #endif
          
          
          /*----------------------------------------------------------------------------
           Initialize UART pins, Baudrate
           *----------------------------------------------------------------------------*/
          void SER_Init (void) {
          #ifndef __DBG_ITM
          
          #ifdef __UART0               /* UART0 */
           LPC_SC->PCONP |= ((1 << 3) | (1 << 15)); /* enable power to UART0 & IOCON  */
          
           LPC_PINCON->PINSEL0 |= (1 << 4);    /* Pin P0.2 used as TXD0      */
           LPC_PINCON->PINSEL0 |= (1 << 6);    /* Pin P0.3 used as RXD0      */
          #else                   /* UART1 */
           LPC_SC->PCONP |= ((1 << 4) | (1 << 15)); /* enable power to UART1 & IOCON  */
          
           LPC_PINCON->PINSEL4 |= (2 << 0);    /* Pin P2.0 used as TXD1      */
           LPC_PINCON->PINSEL4 |= (2 << 2);    /* Pin P2.1 used as RXD1      */
          #endif
          
           UART->LCR  = 0x83;           /* 8 bits, no Parity, 1 Stop bit  */
           UART->DLL  = 9;            /* 115200 Baud Rate @ 25.0 MHZ PCLK*/
           UART->FDR  = 0x21;           /* FR 1,507, DIVADDVAL=1, MULVAL=2 */
           UART->DLM  = 0;            /* High divisor latch = 0     */
           UART->LCR  = 0x03;           /* DLAB = 0            */
          
          #endif
          }
          
          
          /*----------------------------------------------------------------------------
           Write character to Serial Port
           *----------------------------------------------------------------------------*/
          int SER_PutChar (int c) {
          
          #ifdef __DBG_ITM
            ITM_SendChar(c);
          #else
           while (!(UART->LSR & 0x20));
           UART->THR = c;
          #endif
           return (c);
          }
          
          
          /*----------------------------------------------------------------------------
           Read character from Serial Port  (blocking read)
           *----------------------------------------------------------------------------*/
          int SER_GetChar (void) {
          
          #ifdef __DBG_ITM
           while (ITM_CheckChar() != 1) __NOP();
           return (ITM_ReceiveChar());
          #else
           while (!(UART->LSR & 0x01));
           return (UART->RBR);
          #endif
          }
          دست شما درد نکنه کاملا حق باشماست
          من از رجیستر FDR استفاده کردم با باود 115200 هم محاسبه کردم حل شد ولی حتی با رجیستر FDR هم عدد کاملا دقیق در نمیومد ولی خیلی تاثیر داشت رو خطاش ، خیلی کمتر از 5 صدم درصد شد ولی بدون این رجیستر یکهو 3 الی 4 درصد خطا می اورد!! اصلا کلا نمیشه باودریت میکرو رو دقیق دقیق وارد کرد؟؟
          پیروزی یعنی : توانایی رفتن از یک شکست ، به شکستی دیگر بدون از دست دادن اشتیاق . . .
          ------------------------------------------------------------ - - -
          صبرت که تمام شد نرو!
          "معرفت"
          تازه از آن لحظه آغاز می شود...

          دیدگاه


            #6
            پاسخ : کمک برای حل مشکل uart سریال

            خوب با این فرکانس هایی که بلوک های جانبی ARM باهاش کار میکنن، طبیعی که باود ریت دقیق نشه. با AVR فرکانس کریستالها جوری بود که خطا کاملا صفر میشد. مثلا 3.5745 یا 7.145 یا 11.059200 و ... . ولی همین رجیستر FDR خودش نعمتیه!

            دیدگاه


              #7
              پاسخ : کمک برای حل مشکل uart سریال

              نوشته اصلی توسط fedora
              خوب با این فرکانس هایی که بلوک های جانبی ARM باهاش کار میکنن، طبیعی که باود ریت دقیق نشه. با AVR فرکانس کریستالها جوری بود که خطا کاملا صفر میشد. مثلا 3.5745 یا 7.145 یا 11.059200 و ... . ولی همین رجیستر FDR خودش نعمتیه!
              اتفاقا من دقیقا می خواستم همین رو بگم که چرا در AVR اینطوری بود البته خیلی مطمین نیستم که اینطوری بود یا نه چون من قبلا AVR رو با بسکام کار می کردم و باودش رو فقط به صورت یک عدد می نوشتم و کلا دیگه با چیزی کاری نداشتیم (منظور زیر تابع و...) فقط علتش رو شما بالا گفتین ولی من درست متوجه نشدم ،منظورتون این بود که در avr خودش کریستال داخلی داشت؟ یا عدد کریستال رو خودش می ساخت؟ اصلا AVR مثل ARM افزایش دهنده و تقسیم کننده pll یا فرکانس رو داره؟؟
              پیروزی یعنی : توانایی رفتن از یک شکست ، به شکستی دیگر بدون از دست دادن اشتیاق . . .
              ------------------------------------------------------------ - - -
              صبرت که تمام شد نرو!
              "معرفت"
              تازه از آن لحظه آغاز می شود...

              دیدگاه


                #8
                پاسخ : کمک برای حل مشکل uart سریال

                نه ببینید برای محاسبه باود ریت یه عدد اعشاری یا به اصطلاح خورده بدست میاریم. که این اعشارش تو AVR با اعشار فرکانس کریستال اصلاح میکردیم ولی تو ARM این کارو با یه رجیستر مقسم کسری که اعشارش اصلاح میکنه. چون وقتی تو AVR از کریستال مثلا 11.059200 مگاهرتز استفاده میکردیم، اونوقت دیگه نمیشد تاخیر کاملا دقیق 1 ثانیه ای ایجاد کرد چرا؟ چون فرکانس کریستال، کلاک همه بلوک های جانبی رو تامین میکرد. ولی تو ARM یه بخش کلاک جداگانه گذاشتن تا این عیب رو برطرف کنن. خوب بالاخره به همین دلیله که ARM اینقدر تو پروژه های صنعتی و پزشکی و یا حتی نظامی جا باز میکنه.

                دیدگاه


                  #9
                  پاسخ : کمک برای حل مشکل uart سریال

                  خیلی ممنون جناب fedora
                  اتفاقا من هم به همین فکر می کردم , یعنی در ARM فرکانس ها به فرکانس های دیگری تبدیل میشه (زیاد و تقسیم میشه و...) ولی در AVR فقط کل کلاک میکرو و ادوات جانبی با کریستال خارجی یعنی مثلا 16 مگا هرتز که ما گذاشتیم کار می کنه؟؟ یعنی کلا در arm یک قسمت اختصاص داده شده برای کلاک ولی در avr مستقیم هست؟
                  در ضمن شما فرمودین در ای وی ار از کریستال 11.059200 استفاده می کنیم ولی من همیشه در ای وی ار از کریستال 8 مگاهرتز داخلی استفاده می کردم ,ممنون میشم یکم توضیح بدین
                  پیروزی یعنی : توانایی رفتن از یک شکست ، به شکستی دیگر بدون از دست دادن اشتیاق . . .
                  ------------------------------------------------------------ - - -
                  صبرت که تمام شد نرو!
                  "معرفت"
                  تازه از آن لحظه آغاز می شود...

                  دیدگاه


                    #10
                    پاسخ : کمک برای حل مشکل uart سریال

                    تو arm برای هر قسمت مثلا usb یا can یا ethernet یه بلوک کلاک جداگانه میذارن که به کلاک اصلی وابسته نباشه. این چند تا مزیت داره یکی اینکه مثلا با pll فرکانسشون تا مقدار دلخواه زیاد کنن . که در اینصورت نیازی نیست فرکانس اصلی را بالا ببریم. دوم با این کار مصرف تراشه رو پایین میاریم. یعنی یه فرکانس پایه تولید میکنیم و اونو میان بلوک های مختلف تقسیم تا بر حسب نوع نیازشون ازش استفاده کنن. تو avr فرکانس 12MHz که داشتیم، به همه بلوکا تزریق میشد که این خودش برا پروسسورهای صنعتی که باید خیلی انعطاف پذیر باشن یه ایراد بزرگه، به همین دلیل مدل های معمولی avr جایگاه خاصی تو صنعت ندارن. که البته این ایرادو رو تو سری Xmega به طور کامل برطرف کردن ولی قیمتش بالا بردن.

                    در مورد کریستال 11.059200 اگر زمانی بخواین یه ارتباط سریال بدون خطا داشته باشین دیگه مجبوریم از این کریستال با عدد اعشاری استفاده کنیم چون در غیر اینصورت خطا داریم. وگرنه در مواردی که نیاز به ارتباط سریال نداریم. میتونیم از کریستالا دیگه استفاده کنیم. ولی تو arm فقط با یه کریستال 12 می تونیم هم ارتباط بدون خطای سریال داشته باشیم هم کلاک بقیه بلوکا رو تامین کنیم.

                    دیدگاه


                      #11
                      پاسخ : کمک برای حل مشکل uart سریال

                      کریستال 11 بزن بادریت هم زیر 57600 بصورت پیش فرض 9600 هست که بمون همون باشه تو یرعت ارتباط هم خیلی تاثیر نمیگذاره من تست کردم میکرو کم میاره و فکر نمیکنم تو پروژه شما هم زیاد سرعت مهم باشه اما من فکر میکنم چون شما دارین از ارم بصورت هگز میفرستی نامفهوم میاد
                      با عدد تست کن و باد ریت کم همون 9600

                      دیدگاه

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