اطلاعیه

Collapse
No announcement yet.

فعال کردن همزمان USART1 و SPI در Atmega128

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

    فعال کردن همزمان USART1 و SPI در Atmega128

    با سلام، من با استفاده از رابط SPI در میکرو ATmega128 تونستم این میکرو رو در Master و برای ارسال اطلاعات به یه آسیس دیگه راه اندازی کنم و هیچ مشکلی نداشتم، بر روی پایه های SCK و SS هم سیگنالهای لازم را داشتم، ولی در ادامه کارم بعد از اتصال FT232r برای ارتباط USB و فعال کردن USART1 ، دیگر روی پایه های SCK و SS سیگنالی ندارم (با اسکوپ بررسی کردم) ..یعنی وقتی ارتباط با USB فعال میشه دیگه سیگنالهایی که یا SPI فعال کردم از بین میروند و احتمالا SPI غیر فعال میشه...کسی میدونه چراا؟ من میخام دو تای این ارتباطها رو داشته باشم هم SPI و هم USART1........چیکار باید بکنم؟

    #2
    پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

    وقت بخیر

    دقت کنید ببینید پایه های مشترک با عملکرد متفاوت نیستند !!

    دیدگاه


      #3
      پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

      تشکر،
      نه پایه ها مشکلی نداشتند...
      اشکال از دستور getchar1 () بود :surprised:....وقتی از کدم حذفش کردم روی SCK سیگنال داشتم :eek:....ظاهرا وجودش توی کد همراه spi باعث ایجاد مشکل میشه ولی مگه دستور معادلی هم برای اون در کدویژن وجود داره؟!!!به جای getchar1 از چه دستوری استفاده کنم؟

      دیدگاه


        #4
        پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

        از UDR1 استفاده کنید
        www.gam-co.blogsky.com

        دیدگاه


          #5
          پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

          دستور getchar1 خودش شامل UDR1 می شود:

          char getchar1(void)
          {
          char status,data;
          while (1)
          {
          while (((status=UCSR1A) & RX_COMPLETE)==0);
          data=UDR1;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
          return data;
          }
          }

          کسی میدونه چرا grtchar1 وقتی spi فعال میشه باعث خراب شدن پالس روی SCK میشه و مقدارشو همیشه یک میکنه؟

          دیدگاه


            #6
            پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

            اینجا رو بخونید :
            http://www.eca.ir/forum2/index.php?t...6810#msg726810
            ببینید توی میکروی AVR چیزی به اسم همزمان نداریم. یعنی دستورات با تاخیری هر چند ناچیز اجرا میشن. شما از دستور getchar استفاده می کنی، این دستور به روش pooling دیتا رو از جای دیگه میگیره. یعنی چی ؟
            یعنی اینکه تا دیتایی نیاد، میکرو از این دستور عبور نمی کنه و در نتیجه شما نمی تونی به ارتباط SPI برسی. و در نتیجه چون دیتایی نمی فرستی کلاکی هم نخواهی داشت.
            راه حل: از روش وقفه برای دریافت دیتا توی ارتباط سریال استفاده کن.
            ---------
            .
            .
            ...........

            دیدگاه


              #7
              پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

              ممنون
              میشه یه مثال از این وقفه بزنید؟

              دیدگاه


                #8
                پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

                نوشته اصلی توسط Soheilas
                ممنون
                میشه یه مثال از این وقفه بزنید؟
                شما باید مثل همون تابع getchar که گزاشتی UDR رو بخونی
                اما چه زمانی!
                زمانی که پرچم RXC رفت بالا
                این پرچم یه وقفه داره باید بیتش فعال ساز وقفش رو یک کنی و بعد :
                interrupt [USART_RXC] void usart_rx_isr(void)
                تابع وقفه رو به صورت بالا بنویسی و درونش UDR رو بخونی و دستورات لازم دیگه ای که نیاز میدونی باید بلا فاصله اجرا بشه رو بنویسی


                مثلا این یه مثاله که بعد از اینکه گرفته خطاش رو چک کرده و بعد یه بافر نرم افزاری هم ساخته تا ازش استفاده کنه
                ------
                کد:
                interrupt [USART_RXC] void usart_rx_isr(void)
                {
                char status,data;
                status=UCSRA;
                data=UDR;
                if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                  {
                  rx_buffer[rx_wr_index]=data;
                  if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                  if (++rx_counter == RX_BUFFER_SIZE)
                   {
                   rx_counter=0;
                   rx_buffer_overflow=1;
                   };
                  };
                }
                -------

                اخبار فناوری - راز روز

                http://razerooz.com

                دیدگاه


                  #9
                  پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128

                  تشکر..
                  اینتراپت رو فعال کردم و کدشو به برنامم اضافه کردم...الان این کد کفایت میکنه؟ دیگه نباید از دستور دیگه ای استفاده کنم؟ ممنون میشم راهنمایی کنید.

                  دیدگاه

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