اطلاعیه

Collapse
No announcement yet.

UART1 و UART2 در mega128

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

    UART1 و UART2 در mega128

    سلام دوستان.
    چطور می شود هم از UART1 و هم از UART2 میکروی atmega128 استفاده کرد؟

    #2
    پاسخ : UART1 و UART2 در mega128

    نوشته اصلی توسط feshwari
    سلام دوستان.
    چطور می شود هم از UART1 و هم از UART2 میکروی atmega128 استفاده کرد؟
    شما از چه کامپایلری استفاده میکنید؟
    برای usart0 رجیستر های زی رو داریم:
    UCSR0A=;
    UCSR0B=;
    UCSR0C=;
    UBRR0H=;
    UBRR0L=;
    وبرای usar1 داریم:
    UCSR1A=;
    UCSR1B=;
    UCSR1C=;
    UBRR1H=;
    UBRR1L=;
    که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
    مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره


    دیدگاه


      #3
      پاسخ : UART1 و UART2 در mega128

      من با بسکام کار می کنم.

      دیدگاه


        #4
        پاسخ : UART1 و UART2 در mega128

        سلام
        خسته نباشین
        اقا ببینم اساتید به من هم کمک میکنند یا نه ؟ :cry2:
        من وقتی یه پایه از ای سی رو تحریک میکنم یه عددی رو واسه ای سی گیرنده میفرسته مثلا عدد دو رو
        اما تو گیرنده وقفه دریافت که اجرا میشه بلافاصله سع عدد دیگه هم دریافت میشند یعنی وقفه دریافت سه بار اجرا میشه در حالی که من برنامه وقفه دریافت رو اینجوری نوشتم
        dim daryaft as byte
        daryaft= udr
        نمی دونم چرا 4بار این وقفه دریافت اجرا میشه و همچنین و معمولا اعداد 13_ 48_ 10_ رو دریافت میکنه
        یه جا خوندم تا وقتی که udr خالی نشه وقف دریافت اجرا میشه من متوجه نشدم چطور میشه پس از اینکه محتویات اون. خوند صفرش کرد تا دیگه وقفه دریافت اجرا نشه تا دریافت بعد
        ضمنا یه چیزی رو یادم شد بگم اینکه ای سی دریافت اولین عددی رو که دریافت میکنه همون چیزی هست که از فرستنده ارسال میشه اما این سه عدد دیگه رو نمی دونم به چه مناسبتی دریافت میکنه :angry: :angry: :angry: :angry:
        خواهشا کمکم کنین عزیزان

        دیدگاه


          #5
          پاسخ : UART1 و UART2 در mega128

          نوشته اصلی توسط حسام هاشم
          سلام
          خسته نباشین
          اقا ببینم اساتید به من هم کمک میکنند یا نه ؟ :cry2:
          من وقتی یه پایه از ای سی رو تحریک میکنم یه عددی رو واسه ای سی گیرنده میفرسته مثلا عدد دو رو
          اما تو گیرنده وقفه دریافت که اجرا میشه بلافاصله سع عدد دیگه هم دریافت میشند یعنی وقفه دریافت سه بار اجرا میشه در حالی که من برنامه وقفه دریافت رو اینجوری نوشتم
          dim daryaft as byte
          daryaft= udr
          نمی دونم چرا 4بار این وقفه دریافت اجرا میشه و همچنین و معمولا اعداد 13_ 48_ 10_ رو دریافت میکنه
          یه جا خوندم تا وقتی که udr خالی نشه وقف دریافت اجرا میشه من متوجه نشدم چطور میشه پس از اینکه محتویات اون. خوند صفرش کرد تا دیگه وقفه دریافت اجرا نشه تا دریافت بعد
          ضمنا یه چیزی رو یادم شد بگم اینکه ای سی دریافت اولین عددی رو که دریافت میکنه همون چیزی هست که از فرستنده ارسال میشه اما این سه عدد دیگه رو نمی دونم به چه مناسبتی دریافت میکنه :angry: :angry: :angry: :angry:
          خواهشا کمکم کنین عزیزان
          بعد از ارسال باید ; رو بزاری و گرنه 13 رو ارسال می کنه


          اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

          دیدگاه


            #6
            پاسخ : UART1 و UART2 در mega128

            اقا ممنون از لطفتون که جواب دادین من این تست می کنم و خرش رو بهتون میدم ولی یه سوال دیگه
            :biggrin: :biggrin: :biggrin:
            udr رو چطور میشه صفر کرد یعنی زمانی که داده دریافتی رو دریافت کردیم این ریجستر udrچه اتفاقی سرش میاد
            چون من نوشتم
            udr=0اما نشد
            چون داخل کتاب مهندس پرتوفر نوشته تا وقتی که ریجستر udr صفر نشود بیت RXCدر UCSRA یک می شود و وقفه دریافت اجاره میشه
            من وقتی مقدار UDR رو داخل یه متغیر دیگه میریزم اما هنوز مقدار خودش رو داره UDR .
            ضمنا از RS485 استفاده کردم
            ممنون دوستان کمک کنین که این مشکل من حل بشه

            دیدگاه


              #7
              پاسخ : UART1 و UART2 در mega128

              udr زمانی که داده ای به پورت سریال میاد توی اون ریخته می شه
              یه سرچی توی همین انجمن بکن
              من خودم یکی 2 تا برنامه که وقفه سریال داشت و درست هم کار می کرد گزاشتم


              اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

              دیدگاه


                #8
                پاسخ : UART1 و UART2 در mega128

                اقا سعید ممنون خیلی با حالی .
                من اینو تست کردم ; خیلی با حال بود . ممنون از لطفت
                الان دوبار اجرا میشه یه بار صفر یه بار هم همون عددی که من می خوام .
                جون حسام اگه برنامه ای داری بذار واسم منو حواله این سرچ نکن که چندین بار اینکار رو کردم اما جوابم رو نگرفتم این رو هم محبت کن ممنونت میشم :nice: :nice: :nice: :nice: :nice:
                بهترین ها رو برات ارزو دارم
                خدانگهدار

                دیدگاه


                  #9
                  پاسخ : UART1 و UART2 در mega128

                  سلام


                  برای فعال کردن UART0 و UART1 در محیط بیسکام باید از دستورات زیر استفاده کنید:

                  برای فعال کردن UART0 فقط تعیین میزان BAUD کافی است . ولی برای فعال کردن UART1 باید دستور زیر را استفادده کنید:


                  OPEN "com1:" for binary as #1

                  برای تعیین میزان BAUD نیز به شکل زیر عمل کنید :



                  BAUD=X$
                  BAUD1=X$


                  که اولی برای UART0 و دومی برای UART1 می باشد.


                  مرجع : کتاب AVR منندس علی کاهه

                  دیدگاه


                    #10
                    پاسخ : UART1 و UART2 در mega128

                    در مورد ارسال بالا یادم رفت بگم X میزان BAUD انتخابی شماست . و دستور صحیح BUAD پایینی درسته که بدلیل اشکال تایپی کاراکتر $ اومده در انتهای خط.

                    در ضمن مهندس علس کاهه نه منندس :icon_razz: :icon_razz:

                    دیدگاه


                      #11
                      پاسخ : UART1 و UART2 در mega128

                      اقا سلام ممنون
                      چطور میشه از ارسال دوطرفه استفاده کرد
                      کسی هست که تونسته باشه این کار رو انجام داده باشه

                      دیدگاه


                        #12
                        پاسخ : UART1 و UART2 در mega128

                        سلام

                        من از Mega128 فقط در یک مدار تابلو روان استفاده کردم و در کل چون استفاده از MEGA128 یکم سخته بخاطر SMD بودنش (شاید DIPش هم باشه که من ندیدم) ولی در کل استفاده از دو UART نباید کار سختی باشه.

                        نکته ای که اهمیت داره استفاده از وقفه ها است که اگر از وقفه استفاده میکنید (که پیشنهاد میکنم حتما استفاده کنید) باید اولویت وقفه هارو مد نظر داشته باشید.

                        و چون امکان اینکه شما برای وقفه اولویت تعریف کنید نیست باید به این نکته توجه داشته باشید که هر وقفه ای در آدرس پایین تر حافظه نوشته شود دارای اولویت بالاتر است (منبع کتاب AVR مهندس علی کاهه) دیگه مشکلی برای استفاده از دو UART فکر نمیکنم وجود داشته باشه. :nice:

                        دیدگاه


                          #13
                          پاسخ : UART1 و UART2 در mega128

                          سلام :
                          من تونستم با 485 ارتباط بر قرار کنم اما به یه مشکلی برخوردم اونم اینکه وقتی اطلاعات رو ارسال میکنم منتظر وقفه اتمام ارسال میمونم usr.txc و پایه فعال کننده ای سی 485 رو غیر فعال کنم و اگه داده جدیدی رو خواستم ارسال کنم از اتمام ارسال مطمئن باشم
                          تو روال عادی اینکار به خوبی انجام میشه با سرعت خیلی خوب اما در بعضی جاها مجبورم میشم تو زیر برنامه تایمرها اینکا رو انجام بدم یعنی ارسال داده رو و منتظر اتمام ارسال میمونم نمی دونم چرا اطلاعات رو که ارسال میکنه دیگه وقفه اتمام ارسال فعال نمیشه می خوام بدونم وقتی تو زیر برنامه تایمر هستی چه تاثیر روی عملکر و وقفه سریال داره ؟ دوستان و اساتید کمک شما را خواشتار هستیم
                          پیشاپیش ممنون

                          دیدگاه


                            #14
                            پاسخ : UART1 و UART2 در mega128

                            نوشته اصلی توسط samisin
                            شما از چه کامپایلری استفاده میکنید؟
                            برای usart0 رجیستر های زی رو داریم:
                            UCSR0A=;
                            UCSR0B=;
                            UCSR0C=;
                            UBRR0H=;
                            UBRR0L=;
                            وبرای usar1 داریم:
                            UCSR1A=;
                            UCSR1B=;
                            UCSR1C=;
                            UBRR1H=;
                            UBRR1L=;
                            که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
                            مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره
                            با تشکر از پست مفید شما
                            من این رو با استفاده از همون مثالی که شما اشاره فرمودین، تکمیل کردم. تست هم شده. گفتم اینجا قرار بدم تا سایر دوستان هم استفاده کنن.
                            // Specify that a new putchar function will be used instead of the one from stdio.h
                            #define _ALTERNATE_PUTCHAR_
                            #define _ALTERNATE_GETCHAR_

                            #define USART0 0
                            #define USART1 1
                            #define USART2 2
                            #define USART3 3

                            // This variable will specify to which peripheral the output of putchar will be directed
                            unsigned char UART_sel;

                            // Define the new putchar function
                            void putchar(char c)
                            {
                            switch (UART_sel)
                            {
                            case USART0: // the output will be directed to USART0
                            while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
                            UDR0=c;
                            break;

                            case USART1: // the output will be directed to USART1
                            while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
                            UDR1=c;
                            break;
                            case USART2: // the output will be directed to USART0
                            while ((UCSR2A & DATA_REGISTER_EMPTY)==0);
                            UDR2=c;
                            break;
                            case USART3: // the output will be directed to USART0
                            while ((UCSR3A & DATA_REGISTER_EMPTY)==0);
                            UDR3=c;
                            break;

                            default:;
                            };
                            }

                            char getchar(void)
                            {
                            char status,data;
                            switch (UART_sel)
                            {
                            case USART0:
                            while (((status=UCSR0A) & RX_COMPLETE)==0);
                            data=UDR0;
                            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                            return data;
                            break;

                            case USART1:
                            while (((status=UCSR1A) & RX_COMPLETE)==0);
                            data=UDR1;
                            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                            return data;
                            break;

                            case USART2:
                            while (((status=UCSR2A) & RX_COMPLETE)==0);
                            data=UDR2;
                            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                            return data;
                            break;

                            case USART3:
                            while (((status=UCSR3A) & RX_COMPLETE)==0);
                            data=UDR3;
                            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                            return data;
                            break;

                            default:;
                            };
                            }

                            برای استفاده فقط کافیه قبل از استفاده از هر فرمان fprintf یا fscanf، بنویسین:
                            UART_sel=UARTn;
                            که n شماره UART هست (اینجا از صفر تا 3)
                            موفق باشین :smile:
                            If you don't start, it's certain you won't arrive!

                            دیدگاه


                              #15
                              پاسخ : UART1 و UART2 در mega128

                              نوشته اصلی توسط samisin
                              شما از چه کامپایلری استفاده میکنید؟
                              برای usart0 رجیستر های زی رو داریم:
                              UCSR0A=;
                              UCSR0B=;
                              UCSR0C=;
                              UBRR0H=;
                              UBRR0L=;
                              وبرای usar1 داریم:
                              UCSR1A=;
                              UCSR1B=;
                              UCSR1C=;
                              UBRR1H=;
                              UBRR1L=;
                              که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
                              مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره


                              با سلام
                              این redifine چه جوری انجام میشه میشه یکم توضیح بدهید ؟
                              من می خوام کارکتر " دونقطه " ( ارسال کنم حالا این کاراکتر با تابع putchar ارسال نمیشه ( دارم از usart1 ای سی mega128 استفاده میکنم) به همین دلیل مجبورم از puts () استفاده کنم اما این دستور فقط برای usart0 جواب میده خواهشمندم کمکم کنید .
                              با تشکر فراوان
                              داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
                              پیامبر اکرم (ص)
                              علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
                              اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)

                              دیدگاه

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