اطلاعیه

Collapse
No announcement yet.

ارسال با spi

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

    ارسال با spi

    سلام
    من با میکرو مگا32 کار میکنم.
    زمانی که از spi این قطعه استفاده میکنم ، به هنگام ارسال دیگه برنامه اجرا نمیشه!
    ایراد کار از وقفه spi هست . چون زمانی که وقفه رو کلا از کار می اندازم (با کد#asm("cli")) برنامه در حلقه while درست اجرا میشه.
    در محیط کد ویژن برنامه اجرا میشه.
    لطفا راهنمایی کنید

    #2
    پاسخ : ارسال با spi

    سلام
    دوست عزیز روتین وقفه رو cpu اجرا میکنه.بنابراین باید از حلقه while تا اتمام روتین وقفه خارج بشه.بنابراین دستورات حلقه اصلی رو تو این زمان انجام نمیده.به خاطر همینه که نباید تو روتین وقفه کد زیادی بنویسیم.
    [آموزشی] کنترل رله با پیامک توسط sim800l
    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
    صفحه اینستاگرام : ecdco_ir

    دیدگاه


      #3
      پاسخ : ارسال با spi

      نوشته اصلی توسط سید رضا باباتبار نمایش پست ها
      سلام
      دوست عزیز روتین وقفه رو cpu اجرا میکنه.بنابراین باید از حلقه while تا اتمام روتین وقفه خارج بشه.بنابراین دستورات حلقه اصلی رو تو این زمان انجام نمیده.به خاطر همینه که نباید تو روتین وقفه کد زیادی بنویسیم.
      سلام استاد گرامی آقای بابا تبار
      روتین وقفه من زیاد نیست فقط مشکل اینجاست که هر وقت درون حلقهwhile از کد ;(c)spiاستفاده میکنم دیگه برنامه ادامه پیدا نمیکنه .
      امتحان کردم تمام دستورات داخل while تاقبل از رسیدن به کد;(c)spi اجرا میشوند.
      احتمالا موقع رفتن به روتین وقفه دچار خطا میشه یا موقع برگشت . مطمئنم از وقفه ایجاد خطا میشه. کد وقفه هم در زیر مشاهده میکنید:interrupt [SPI_STC] void spi_isr(void)
      { // Place your code here
      unsigned char data;

      data=SPDR;

      if(TCNT1L==1)
      {delay_ms(100);
      #asm
      in r30,spsr
      #endasm

      PORTA=SPDR;
      TCNT0=1;
      }


      }

      دیدگاه


        #4
        پاسخ : ارسال با spi

        نوشته اصلی توسط mostafa+m نمایش پست ها
        سلام استاد گرامی آقای بابا تبار
        روتین وقفه من زیاد نیست فقط مشکل اینجاست که هر وقت درون حلقهwhile از کد ;(c)spiاستفاده میکنم دیگه برنامه ادامه پیدا نمیکنه .
        امتحان کردم تمام دستورات داخل while تاقبل از رسیدن به کد;(c)spi اجرا میشوند.
        احتمالا موقع رفتن به روتین وقفه دچار خطا میشه یا موقع برگشت . مطمئنم از وقفه ایجاد خطا میشه. کد وقفه هم در زیر مشاهده میکنید:interrupt [SPI_STC] void spi_isr(void)
        { // Place your code here
        unsigned char data;

        data=SPDR;

        if(TCNT1L==1)
        {delay_ms(100);
        #asm
        in r30,spsr
        #endasm

        PORTA=SPDR;
        TCNT0=1;
        }


        }
        من روتین وقفه رو دیدم.
        شما میدونید رجیستر r30 تو این روتین استفاده نشده؟با توجه به بررسی کد اسمبلی این کار رو کردید؟
        رجیستر های r30 و r31 رجیستر data indirect Z هستند که اعمال تغییرات در این رجیستر ها به صورت ناخواسته میتونه موجب بروز مشکل بشه.(هرچند این رجیستر ها معمولاً در ابتدای برنامه push و در آخر pop میشوند،مگر اینکه قرار باشد با خروج از روتین مقدار جدید را حفظ کنند.)
        درضمن لطفاً وقتی کدی رو میفرستید همشو انتخاب کنید و از منوی بالا علامت هشتک رو بزنید تا خوب نمایش داده بشه.
        ممنون
        جدیدترین ویرایش توسط سید رضا باباتبار; ۲۲:۰۱ ۱۳۹۶/۰۸/۰۲.
        [آموزشی] کنترل رله با پیامک توسط sim800l
        [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
        [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
        [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
        صفحه اینستاگرام : ecdco_ir

        دیدگاه


          #5
          پاسخ : ارسال با spi

          الان که بیشتر بررسی کردم احتمال 99درصد مشکلتون به خاطر دستکاریه همین رجیستر r30 هستش.
          [آموزشی] کنترل رله با پیامک توسط sim800l
          [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
          [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
          [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
          صفحه اینستاگرام : ecdco_ir

          دیدگاه


            #6
            پاسخ : ارسال با spi

            سلام
            بابت نمایش کد عذر خواهی میکنم.
            استاد علت استفاده رجیستر r30 در برنامه این بود که میخواستم به spdr دسترسی داشته باشم.
            در کتاب مرجع میکروکنترولرهای AVR (نوشته پرتوی فر،مظاهریان،بیانلو) صفحه 308 گفته: بیت spif با اولین خواندن رجیستر spsr پاک شده و سپس می توان به رجیستر داده (spdr) دسترسی یافت.

            دیدگاه


              #7
              پاسخ : ارسال با spi

              نوشته اصلی توسط mostafa+m نمایش پست ها
              سلام
              بابت نمایش کد عذر خواهی میکنم.
              استاد علت استفاده رجیستر r30 در برنامه این بود که میخواستم به spdr دسترسی داشته باشم.
              در کتاب مرجع میکروکنترولرهای AVR (نوشته پرتوی فر،مظاهریان،بیانلو) صفحه 308 گفته: بیت spif با اولین خواندن رجیستر spsr پاک شده و سپس می توان به رجیستر داده (spdr) دسترسی یافت.
              به هر حال با توجه به اینکه تو سطح c دارید برنامه مینویسید توصیه اکید میکنم به هیچ وجه رجیستر های کاربردی رو دستکاری نکنید.
              [آموزشی] کنترل رله با پیامک توسط sim800l
              [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
              [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
              [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
              صفحه اینستاگرام : ecdco_ir

              دیدگاه


                #8
                پاسخ : ارسال با spi

                نوشته اصلی توسط سید رضا باباتبار نمایش پست ها
                الان که بیشتر بررسی کردم احتمال 99درصد مشکلتون به خاطر دستکاریه همین رجیستر r30 هستش.
                سلام
                استاد در حلقه while فقط متوقف میشد ولی از زمانی که مستقیم در spdrنوشتم حالا درست کار میکنه وقفه spi هم برای اتمام کار انجام میشه و بعد ادامه برنامه من رو پی میگیره.
                فکر میکنم که کدویژن با تابع ()spi در داخل حلقه while مشکل داره .شاهد این حرفم پستهای زیادی هست که بقیه دوستان در مواجهه با همین مشکل تو نت قرار دادن.

                دیدگاه

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