اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام
    من اینتراپت ارسال رو راه انداختم.ولی الان با اینتراپت دریافت مشکل دارم.همین که (interupt enableregister)ier رو یک میکنم بدون اینکه داده ای دریافت بشه وارد حلقه ی اینتراپت میشه و در نمیاد.

    کسی می دونه باید چه کار کنم؟
    مشکل از keil نیست؟

    #2
    پاسخ : مشکل با وقفه دریافت ارتباط سریال

    سلام
    شما نوع میکروتونو نگفتید ولی فکر کنم از سری AT91SAM است. اما در مورد AIC در این میکروها اگر شما به درستی وقفه ارسال را راه انداخته باشید وقفه دریافت هم کاملا مشابه آن می باشد چون منبع وقفه برای USART یکی می باشد و چه برای ارسال و چه برای دریافت برنامه به یک روتین پرش می کند. برای فعال کردن وقفه باید مراحل زیر را انجام دهید.
    در روتین main:
    1- تنظیمات USART را باید انجام دهید.
    2- رجیستر AIC_SVR را مقدار دهی نمایید.
    3- رجیستر AIC_SMR را مقدار دهی نمایید.
    4- توسط رجیستر AIC_ICCR وقفه مربوط به USART با توجه به PID آن USART را پاک نمایید.
    5- توسط رجیستر US_IER باید وقفه مورد نظر را فعال نمایید به طور مثال برای دریافت باید بیت RXRDY را فعال نمایید.
    6- توسط رجیستر AIC_IECR وقفه مربوط به USART با توجه به PID آن USART را فعال نمایید.
    در روتین وقفه:
    باید رجیستر US_CSR خوانده شود و با توجه به یک بودن هر بیت عملیات مربوطه را انجام داد. حال برای دریافت اطلاعات وقتی اطلاعاتی دریافت شود بیت RXRDY یک می شود پس برای پاک کردن این بیت که در وقفه بعدی آن یک شود و وقفه راه اندازی شود باید رجیستر US_RHR خوانده شود و اطلاعات جدید دریافت شده را مورد استفاده قرار داد. و در روتین وقفه احتیاجی نیست اصلا به رجیسترهای AIC کاری داشت با پاک نمودن بیت RXRDY در رجیستر US_CSR که توسط خواندن رجیستر US_RHR انجام می شود وقفه برای راه اندازی مجدد تنظیم می شود.

    دیدگاه


      #3
      پاسخ : مشکل با وقفه دریافت ارتباط سریال

      برنامم اینه.
      قبل از اینکه داده بیاد میره تو اینتراپت.
      کد:
      #include "AT91SAM7x256.h"
      #include "usart.h"
      #include "delay.h"
      #include <stdio.h>
      //#include "lib_AT91SAM7S64.h"
      unsigned char data , b;
      
      
      void us_tx_int(void) __irq
      {
      
      //	AT91C_BASE_AIC->AIC_EOICR =1;
      	* AT91C_PIOB_SODR = 0x80000 ; 
      	delay_ms(1); 
      	*AT91C_PIOB_CODR = 0x80000; 
      	delay_ms(1);
       data=*AT91C_US0_RHR;
      
      
      AT91C_BASE_AIC->AIC_EOICR = 1; 
      
      AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_US0); /* Interrupt Ack*/
      
      *AT91C_AIC_EOICR = 0; /* End of Interrupt*/
      
      }
      
      int main(void)
      {
      
      
      
      * AT91C_PIOB_PER = 0x80000 ;
      * AT91C_PIOB_OER = 0x80000 ;
      USART(18432000,9600,0);
      usart0_init();
      
      
      AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_US0);
      AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned long) us_tx_int;
      AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] =(AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x4) ;
      AT91C_BASE_AIC->AIC_ICCR=0XFFFFFFFF;
      *AT91C_US0_IER = 0x3;
      AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_US0);
      
      
      
      
      
       
      while(1)
      {
      
      
      AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_US0);
      
      sendchar(0x55);
      delay_ms(100);
      }
      }

      دیدگاه


        #4
        پاسخ : مشکل با وقفه دریافت ارتباط سریال

        اصلا وارد حلقه while نمیشه.

        دیدگاه


          #5
          پاسخ : مشکل با وقفه دریافت ارتباط سریال

          من یه نگاهی به دیتاشیت کردم

          طبق این خط
          *AT91C_US0_IER = 0x3;
          شما وقفه آماده بودن خط ارسال و دریافت رو فعال کردی.

          بعد از اینکه برنامه وارد حلقه میشه، داده ارسال میکنه و بعد از ارسال، وقفه TXRDY فعال میشه. برنامه وقفه کامل نیست. باید رجیستر وضعیت رو بخونی تا هم بفهمی کدوم وقفه از سریال فعال شده و هم اینکه بیت وقفه مورد نظر پاک بشه تا بشه وقفه بعدی رو دریافت کرد. اما چون شما اینکارو نکردی و با توجه به اینکه وقفه حساس به سطح هست، بعد از خروج از وقفه، دوباره سطح یک بیت پاک نشده وقفه تشخیص داده میشه و دوباره وارد روتین وقفه میشه.

          (این تاپیک باید منتقل بشه به بخش atmel)
          https://www.linkedin.com/in/mohammadhosseini69

          http://zakhar.blog.ir

          دیدگاه


            #6
            پاسخ : مشکل با وقفه دریافت ارتباط سریال

            شما با نوشتن این خط
            کد:
            AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_US0);
            یعنی اینکه خودت داری قبل از اینکه اتفاقی بیفته یه اینتراپت سریال ایجاد می کنی . و این کار رو در یه حلقه انجام دادی یعنی اینکه میکرو همش می ره تو اینتراپت و دوباره می یاد بیرون و هیچ کار دیگه رو انجام نمی ده .
            این خط رو تو برنامه خودت پاک کن . چون اصلا بدرد نمی خوره .این رجیستر همان رجیستر فلگ اینتراپت است که هم قابل خواندن و هم قابل نوشتن است . و فقط در مواقعی که می خواهند برنامه را تست کنند و یا عملکرد اینتراپت را شبیه سازی کنند استفاده می شود .
            موفق باشید .

            دیدگاه


              #7
              پاسخ : مشکل با وقفه دریافت ارتباط سریال

              سلام
              من این برنامه زیر را نوشتم و تست کردم.(کامپایلر IAR ، میکرو AT91SAM7S64 ، فرکانس کاری 48MHZ) همانطور که می بینید واحد USART1 را با نرخ انتقال 19200 و 2 بیت توقف و توازن فرد تنظیم شده است. در حلقه while پایه PA0 خاموش و روشن می شود با یک تاخیر که به خوبی این خاموش و روشن شدن دیده می شود. یک مسئله جالب اینجا هست که وقتی اطلاعات دریافت می شود و وقفه می خورد و به روتین وقفه می رود بر روی LCD اطلاعات دریافتی نمایش داده می شود. اما دیگه به حلقه while بر نمی گردد و خاموش و روشن شدن LED را دیگه مشاهده نمی کنیم انگار میکرو هنگ می کند و باید ریستش کرد. من همینطور که الان وقفه را برای دریافت اطلاعات نوشتم برای سایر قسمت ها هم نوشتم و به درستی کار می کنه و هیچ مشکلی نداره این برام جالبه که در این وضعیت میکرو هنگ می کند . می خوام با Debug کردن ببینم چه اتفاقی می افتد که میکرو دیگه کار نمی کند.
              کد:
              #include <Atmel/ioat91sam7s64.h>
              #include <intrinsics.h>
              #include "LCD.h"
              #define LED1ON		AT91C_BASE_PIOA->PIO_CODR=(1<<0);
              #define LED1OFF		AT91C_BASE_PIOA->PIO_SODR=(1<<0);
              void delay (void);
              //-----------------------------------------------------
              void usart1_irq_handler(void)
              {
              unsigned int dummy;
              dummy=AT91C_BASE_US1->US_CSR;
              dummy=AT91C_BASE_US1->US_RHR; 
              lcd_putchar(dummy);
              }
              //------------------------------------------------------
              void main()
              {
              //--------------------start up--------------------------
              AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
              AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
              //--------------------speed up--------------------------
              AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
              AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
              AT91C_BASE_PMC->PMC_MCKR = 0x3;
              AT91C_BASE_PMC->PMC_SCER = 0x1;
              //-----------------------------------------------------
              AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2 
              AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1); // AT91C_ID_US1=7
              //-----------------------------------------------------
              AT91C_BASE_PIOA->PIO_PER=(1<<0);
              AT91C_BASE_PIOA->PIO_OER=(1<<0);
              LED1OFF;
              lcd_pininit (16,15,5,6,7,8,26,27,28,29);
              lcd_init (); 
              AT91C_BASE_PIOA->PIO_PDR = (1<<21|1<<22);
              AT91C_BASE_PIOA->PIO_MDER = (1<<21|1<<22);
              AT91C_BASE_PIOA->PIO_ASR = (1<<21|1<<22);
              AT91C_BASE_US1->US_CR=0x4;
              AT91C_BASE_US1->US_MR=0x822D0;
              AT91C_BASE_US1->US_BRGR=0x27;
              AT91C_BASE_US1->US_CR=0x10;
              AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US1] = (unsigned int) usart1_irq_handler;
              AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US1] = 0x5;
              AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_US1);
              AT91C_BASE_US1->US_IER=0x1;
              AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_US1);
              __enable_interrupt();
              while (1)
               {
               LED1ON;
               delay();
               LED1OFF;
               delay(); 
               }
              }
              //--------------------------------------------------------
              void delay (void)
              {
              unsigned int i,j;
              for (i=0;i<0xfffff;i++)
               {
               j=AT91C_BASE_PMC->PMC_SCSR;
               j=j;
               }
              }

              دیدگاه


                #8
                پاسخ : مشکل با وقفه دریافت ارتباط سریال

                نوشته اصلی توسط مهدی کربلایی
                این خط رو تو برنامه خودت پاک کن . چون اصلا بدرد نمی خوره .این رجیستر همان رجیستر فلگ اینتراپت است که هم قابل خواندن و هم قابل نوشتن است . و فقط در مواقعی که می خواهند برنامه را تست کنند و یا عملکرد اینتراپت را شبیه سازی کنند استفاده می شود .
                موفق باشید .
                اشتباه می کنی! این رجیستر فلگ نیست! برای فعال کردن اینتراپت مربوط به هر پریفرال حتما باید مقداردهی بشه. اگه نه AIC اصلا وقفه رو نمی بینه. البته نه اونطوری تو حلقه! فقط یک بار. ضمنا قابل خوندنم نیست!


                آقا حامد AT91C_AIC_EOICR رو آخر روتین وقفه فراموش کردی.
                https://www.linkedin.com/in/mohammadhosseini69

                http://zakhar.blog.ir

                دیدگاه


                  #9
                  پاسخ : پاسخ : مشکل با وقفه دریافت ارتباط سریال

                  نوشته اصلی توسط محمد حسینی
                  آقا حامد AT91C_AIC_EOICR رو آخر روتین وقفه فراموش کردی.
                  من این رجیستر هم مقداردهی کردم ولی مشکل حل نشد. به طور مثال در برنامه زیر تایمر صفر را در مد Capture تنظیم کرده ام و هر یک ثانیه PA0 را روشن و خاموش می کند البته به کمک AIC این برنامه به درستی اجرا می شود و مشکلی هم ندارد رجیستر AIC_EOICR را هم مقدار دهی نکرده ام و مشکلی پیش نمی آید و برنامه به خوبی کار می کند.
                  کد:
                  #include <Atmel/ioat91sam7s64.h>
                  #include <intrinsics.h>
                  #define LED1ON		AT91C_BASE_PIOA->PIO_CODR=(1<<0);
                  #define LED1OFF		AT91C_BASE_PIOA->PIO_SODR=(1<<0);
                  void timer0_irq_handler(void)
                  {
                  unsigned int dummy;
                  dummy = AT91C_BASE_TC0->TC_SR;
                  dummy = dummy;
                  if ((AT91C_BASE_PIOA->PIO_ODSR&0x1)!=0)
                   {
                   LED1ON;
                   }
                   else
                   {
                   LED1OFF;
                   }
                  }
                  void main()
                  {
                  //--------------------start up--------------------------
                  AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
                  AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
                  //--------------------speed up--------------------------
                  AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
                  AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
                  AT91C_BASE_PMC->PMC_MCKR = 0x3;
                  AT91C_BASE_PMC->PMC_SCER = 0x1;
                  //-----------------------------------------------------
                  AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2
                  AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_TC0 ); // AT91C_ID_TC0=12
                  //-----------------------------------------------------
                  AT91C_BASE_PIOA->PIO_PER=(1<<0);
                  AT91C_BASE_PIOA->PIO_OER=(1<<0);
                  LED1OFF;
                  AT91C_BASE_TC0->TC_CMR = 0x4004;
                  AT91C_BASE_TC0->TC_RC = 46928;
                  AT91C_BASE_TC0->TC_CCR = 0x5;
                  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) timer0_irq_handler;
                  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = 0x7;
                  AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_TC0);
                  AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; // AT91C_TC_CPCS=(1<<4)
                  AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_TC0);
                  __enable_interrupt();
                  while (1);
                  }

                  دیدگاه


                    #10
                    پاسخ : مشکل با وقفه دریافت ارتباط سریال

                    نوشته اصلی توسط حامد AT91
                    سلام
                    من این برنامه زیر را نوشتم و تست کردم.(کامپایلر IAR ، میکرو AT91SAM7S64 ، فرکانس کاری 48MHZ) همانطور که می بینید واحد USART1 را با نرخ انتقال 19200 و 2 بیت توقف و توازن فرد تنظیم شده است. در حلقه while پایه PA0 خاموش و روشن می شود با یک تاخیر که به خوبی این خاموش و روشن شدن دیده می شود. یک مسئله جالب اینجا هست که وقتی اطلاعات دریافت می شود و وقفه می خورد و به روتین وقفه می رود بر روی LCD اطلاعات دریافتی نمایش داده می شود. اما دیگه به حلقه while بر نمی گردد و خاموش و روشن شدن LED را دیگه مشاهده نمی کنیم انگار میکرو هنگ می کند و باید ریستش کرد. من همینطور که الان وقفه را برای دریافت اطلاعات نوشتم برای سایر قسمت ها هم نوشتم و به درستی کار می کنه و هیچ مشکلی نداره این برام جالبه که در این وضعیت میکرو هنگ می کند . می خوام با Debug کردن ببینم چه اتفاقی می افتد که میکرو دیگه کار نمی کند.
                    کد:
                    #include <Atmel/ioat91sam7s64.h>
                    #include <intrinsics.h>
                    #include "LCD.h"
                    #define LED1ON		AT91C_BASE_PIOA->PIO_CODR=(1<<0);
                    #define LED1OFF		AT91C_BASE_PIOA->PIO_SODR=(1<<0);
                    void delay (void);
                    //-----------------------------------------------------
                    void usart1_irq_handler(void)
                    {
                    unsigned int dummy;
                    dummy=AT91C_BASE_US1->US_CSR;
                    dummy=AT91C_BASE_US1->US_RHR; 
                    lcd_putchar(dummy);
                    }
                    //------------------------------------------------------
                    void main()
                    {
                    //--------------------start up--------------------------
                    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
                    AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
                    //--------------------speed up--------------------------
                    AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
                    AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
                    AT91C_BASE_PMC->PMC_MCKR = 0x3;
                    AT91C_BASE_PMC->PMC_SCER = 0x1;
                    //-----------------------------------------------------
                    AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2 
                    AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1); // AT91C_ID_US1=7
                    //-----------------------------------------------------
                    AT91C_BASE_PIOA->PIO_PER=(1<<0);
                    AT91C_BASE_PIOA->PIO_OER=(1<<0);
                    LED1OFF;
                    lcd_pininit (16,15,5,6,7,8,26,27,28,29);
                    lcd_init (); 
                    AT91C_BASE_PIOA->PIO_PDR = (1<<21|1<<22);
                    AT91C_BASE_PIOA->PIO_MDER = (1<<21|1<<22);
                    AT91C_BASE_PIOA->PIO_ASR = (1<<21|1<<22);
                    AT91C_BASE_US1->US_CR=0x4;
                    AT91C_BASE_US1->US_MR=0x822D0;
                    AT91C_BASE_US1->US_BRGR=0x27;
                    AT91C_BASE_US1->US_CR=0x10;
                    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US1] = (unsigned int) usart1_irq_handler;
                    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US1] = 0x5;
                    AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_US1);
                    AT91C_BASE_US1->US_IER=0x1;
                    AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_US1);
                    __enable_interrupt();
                    while (1)
                     {
                     LED1ON;
                     delay();
                     LED1OFF;
                     delay(); 
                     }
                    }
                    //--------------------------------------------------------
                    void delay (void)
                    {
                    unsigned int i,j;
                    for (i=0;i<0xfffff;i++)
                     {
                     j=AT91C_BASE_PMC->PMC_SCSR;
                     j=j;
                     }
                    }
                    آقا من اشکال خودم رو متوجه شدم که چرا میکرو انگار هنگ می کرد مشکل از تنظیمات در IAR بود که من در برنامه های قبلی خود این تنظیم رو درست انجام می دادم اما امروز که یک پروژه جدید برای این موضوع ایجاد کردم این گزینه را تنظیم نکرده بودم. برنامه بالا به درستی انجام می شود و کاراکتر دریافتی را بر روی LCD نمایش می دهد و هیچ مشکلی ندارد. فایل Cstartup.s که در IAR برای وقفه باید به پروژه خود اضافه کنیم به زبان ARM نوشته شده بود و من در تنظیمات IAR کامپایلر رو در حالتی قرار داده بودم که برنامه را به دستورات THUMB تبدیل کند. و وقتی برنامه کامپایل می شد و در میکرو آنرا پروگرم می کردم به این مشکل بر می خوردم همانطور که در شکل می بینید با انتخاب گزینه Generate ... مشکل حل شد و برنامه به درستی کار می کند. لینک زیر هم پروزه کامل به همراه همه فایل ها برای IAR می باشد.
                    http://hotfile.com/dl/104108067/7239206/test.rar.html

                    دیدگاه


                      #11
                      پاسخ : مشکل با وقفه دریافت ارتباط سریال

                      میشه کمکم کنید؟
                      این برنامه ی منه
                      کد:
                      #include "AT91SAM7x256.h"
                      #include "usart.h"
                      #include "delay.h"
                      #include <stdio.h>
                      void us_tx_int(void) __irq
                      {
                      unsigned int dummy;
                      dummy=AT91C_BASE_US0->US_CSR;
                      dummy=AT91C_BASE_US0->US_RHR; 
                      AT91C_BASE_AIC->AIC_EOICR = 1;
                      }
                       
                      
                      int main(void)
                      {
                      
                      * AT91C_PIOB_PER = 0x80000 ;
                      * AT91C_PIOB_OER = 0x80000 ;
                      
                      AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
                      USART(18432000,9600,0);
                      *AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0);//Disable I/O,PA5=RXD0,PA6=TXD0
                      *AT91C_PIOA_ASR|=(AT91C_PIO_PA0 | AT91C_PIO_PA1); // defin peripheral A select regidtry
                      *AT91C_US0_CR=0XAC;					//RESET UART
                      *AT91C_US0_MR =0;
                      *AT91C_US0_IDR = 0xFFff; // all usart0 interrupts disabled
                      *AT91C_US0_BRGR=BARD_RATE0;			
                      *AT91C_US0_CR=0X50;//SET UART
                      *AT91C_US0_RTOR = 0; // receiver time-out (disabled)
                      *AT91C_US0_TTGR = 0; // transmitter timeguard (disabled)
                      *AT91C_US0_FIDI = 0; // FI over DI Ratio Value (disabled)
                      *AT91C_US0_IF = 0; // IrDA Filter value (disabled)
                      *AT91C_US0_IDR = 0xFFff; // all usart0 interrupts disabled
                      *AT91C_PMC_PCER|=(1<<AT91C_ID_US0);
                      
                      AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned long) us_tx_int;
                      AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] =(AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x4) ;
                      AT91C_BASE_AIC->AIC_ICCR = (1<<AT91C_ID_US0);
                      *AT91C_US0_IER = 0x3;
                      AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_US0);
                      
                      
                       
                      while(1)
                      {
                      
                      sendchar(0x55);
                      delay_ms(100);
                      }
                      }

                      دیدگاه


                        #12
                        پاسخ : مشکل با وقفه دریافت ارتباط سریال

                        وارد برنامه ی اینتراپت میشه ولی در نمی یاد.
                        ضمناً کلا وارد while نمیشه.

                        دیدگاه


                          #13
                          پاسخ : مشکل با وقفه دریافت ارتباط سریال

                          من با keil اصلا کار نمی کنم و تنظیماتشو هم بلد نیستم و با IAR کار می کنم. بهتر همین برنامه من را در KEIL بنویسید ببینید نتیجه چی می شود. در while هم مثل من یک led را خاموش روشن کنید و داده ای را نمی خواد ارسال کنید دقیقا متوجه بشید که میکرو به while بر می گرده یا نه. تنظیمات usart هم به صورت دستی انجام دهید و از آن کتابخانه استفاده نکنید شاید چیزی در آن کتابخانه فعال یا غیر فعال بشود که برنامه شما را به مشکل می اندازد. در IAR برای فعال کردن وقفه و استفاده از آن چند تا فایل مثل Cstartup.s و Cstartup_SAM7.c و ... باید استفاده کرد و به پروژه اضافه کرد شاید برای keil هم نیاز به همچین فایل هایی باشد. اگر IAR را بر روی سیستم خود دارید می توانید این برنامه که من لینک آنرا گذاشتم را تست کنید و ببینید که درست جواب می دهد و بعد آنرا برای keil راحتتر انجام دهید.

                          دیدگاه


                            #14
                            پاسخ : مشکل با وقفه دریافت ارتباط سریال

                            IER رو بجای 3، 1 بذار. (دفعه قبل هم گفتم اما تغییر ندادی!!)

                            ضمنا رجیستر وضعیت وقفه رو که خوندی، اگه باهاش کاری نکنی ممکنه به علت بهینه سازی حذف بشه. بعد از خوندن بذارش تو یه شرط.
                            https://www.linkedin.com/in/mohammadhosseini69

                            http://zakhar.blog.ir

                            دیدگاه


                              #15
                              پاسخ : مشکل با وقفه دریافت ارتباط سریال

                              سلام
                              اقایون من یه کد نوشتم به شرح زیر و یه ال ای دی به پورت b.0 گیرنده زدم وقتی که 1 ارسال میشه ال ای دی روشن و 2 ارسال شد خاموش میشه ولی یه مشکل واقعا مسخره وجود داره اینه که برای اولین بار خودم روشن خاموش میکنم بعدش خودش روشن و خاموش میشه

                              فرستنده:
                              #include <mega8.h>
                              #include <stdio.h>
                              #include <delay.h>

                              void main(void)
                              {

                              UCSRA=0x00;
                              UCSRB=0x8;
                              UCSRC=0x86;
                              UBRRH=0x00;
                              UBRRL=0x33;
                              DDRB=0b00000000;
                              while (1)
                              {

                              if(PINB.0==1)
                              {
                              putchar('1'
                              }
                              delay_ms(50);

                              if(PINB.1==1)
                              {
                              putchar('2'
                              }
                              delay_ms(50);
                              }
                              }


                              گیرنده:
                              #include <mega8.h>
                              #include <stdio.h>
                              #include <delay.h>


                              void main(void)
                              {
                              char input;

                              UCSRA=0x00;
                              UCSRB=0x10;
                              UCSRC=0x86;
                              UBRRH=0x00;
                              UBRRL=0x33;
                              DDRB=11111111;

                              while (1)
                              {
                              input=getchar();

                              if(input=='1&#039
                              {
                              PORTB.0=1;
                              }

                              if(input=='2&#039
                              {
                              PORTB.0=0;
                              }

                              }
                              }

                              دیدگاه

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