اطلاعیه

Collapse
No announcement yet.

مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

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

    مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

    سلام و وقت بخیر به مهندسین عزیز.
    سوالی داشتم که شاید شما بتونید کمکم کنید. من از اتمل استودیوی ۷ استفاده می کنم اما یه ایراد عجیب دیدم یه برنامه ی بسیار ساده رو در نظر بگیر که فقط یه کاراکتر را از پورت سریال دریافت می کند البته از وقفه ی دریافت سریال هم استفااده شده و ایراد اینه که مثلا در روتین وقفه یه متغیر char یا unsigned char یا هر نوع دیگر را 1 می کنم و سپس در whileبعد از main آن را چک می کنم که آیا 1شده یا نه دستور شرطی عمل نمی کند مگر اینکه یک delay قبل و یا بعدش گذاشته شود و یا یک دستور غیر شرطی مثلا ست کردن یک پورت انجام شود آنگاه دستور شرطی عمل می کند .مشکل از کجاست ؟ البته دقیقا همین برنامه را با کدویژن تست کردم و به درستی عمل کرد اما در اتمل استودیو مشکلی که شرح دادم را دارد

    #2
    پاسخ : مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

    نوشته اصلی توسط ahmadmedusa نمایش پست ها
    سلام و وقت بخیر به مهندسین عزیز.
    سوالی داشتم که شاید شما بتونید کمکم کنید. من از اتمل استودیوی ۷ استفاده می کنم اما یه ایراد عجیب دیدم یه برنامه ی بسیار ساده رو در نظر بگیر که فقط یه کاراکتر را از پورت سریال دریافت می کند البته از وقفه ی دریافت سریال هم استفااده شده و ایراد اینه که مثلا در روتین وقفه یه متغیر char یا unsigned char یا هر نوع دیگر را 1 می کنم و سپس در whileبعد از main آن را چک می کنم که آیا 1شده یا نه دستور شرطی عمل نمی کند مگر اینکه یک delay قبل و یا بعدش گذاشته شود و یا یک دستور غیر شرطی مثلا ست کردن یک پورت انجام شود آنگاه دستور شرطی عمل می کند .مشکل از کجاست ؟ البته دقیقا همین برنامه را با کدویژن تست کردم و به درستی عمل کرد اما در اتمل استودیو مشکلی که شرح دادم را دارد
    سلام
    حداقل کد رو قرار میدادید. اینطور توضیح دادن فایده نداره

    Sent from my LG-H870S using Tapatalk

    دیدگاه


      #3
      پاسخ : مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

      سلام مجدد این هم حداقل کدی که استفاده شده است.


      #define F_CPU 11059200UL
      #include <avr/io.h>
      #include <avr/interrupt.h>
      #include <avr/delay.h>
      #define BAUDRATE 9600


      unsigned char cr;
      uint8_t x=0;






      ISR(USART_RXC_vect){
      while((UCSRA & (1<<RXC))==0){};
      cr = UDR;
      x=1;

      }






      int main(void)


      {


      // Port B initialization
      // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
      DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
      // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T
      PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: On
      // USART Transmitter: On
      // USART Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
      UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
      UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
      UBRRH=0x00;
      UBRRL=0x47;

      sei();

      while (1)
      {

      if (x==1)PORTB=1;

      }//End While()



      }//End Main()

      دیدگاه


        #4
        پاسخ : مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

        نوشته اصلی توسط ahmadmedusa نمایش پست ها
        سلام مجدد این هم حداقل کدی که استفاده شده است.


        #define F_CPU 11059200UL
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <avr/delay.h>
        #define BAUDRATE 9600


        unsigned char cr;
        uint8_t x=0;






        ISR(USART_RXC_vect){
        while((UCSRA & (1<<RXC))==0){};
        cr = UDR;
        x=1;

        }






        int main(void)


        {


        // Port B initialization
        // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
        DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
        // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T
        PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 9600
        UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
        UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
        UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
        UBRRH=0x00;
        UBRRL=0x47;

        sei();

        while (1)
        {

        if (x==1)PORTB=1;

        }//End While()



        }//End Main()
        خوب اول از همه اینکه دفعات بعد حتما از تگ ++C برای قراردادن کد در انجمن استفاده کنید تا کد به شکل زیر توی انجمن قابل خوندن بشه:
        #define F_CPU 11059200UL
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <avr/delay.h>
        #define BAUDRATE 9600




        unsigned char cr;
        volatile uint8_t x=0;


        ISR(USART_RXC_vect)
        {
        while((UCSRA & (1<<RXC))==0){};
        cr = UDR;
        x=1;
        }




        int main(void)
        {
        // Port B initialization
        // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
        DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);


        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 9600
        UCSRB=(1<<RXCIE) | (1<<RXEN) | (1<<TXEN);
        UCSRC=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
        UBRRH=0x00;
        UBRRL=0x47;


        sei();


        while (1)
        {


        if (x==1)PORTB=1;


        }//End While()


        }//End Main()

        دوم هم اینکه قبل از تعریف x مثل کد بالا از کلمه volatile استفاده کنید. احتمالا اینطوری درست کار خواهد کرد.
        جدیدترین ویرایش توسط hossein.m98; ۱۹:۵۱ ۱۳۹۸/۰۶/۱۶.

        دیدگاه


          #5
          پاسخ : مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

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

          دیدگاه


            #6
            پاسخ : مشکل در بررسی ست شدن متغیر بعد از بازگشت از وقفه ی دریافت سریال در اتمل استودیوی ۷

            نوشته اصلی توسط ahmadmedusa نمایش پست ها
            سلام مجدد بر مهندس عزیز .متشکرم ازراهنمایی شما بله با راهنمایی شما کد درست عمل کرد و اجرا شد. خیلی ممنونم وقتتون رو در اختیار من گذاشتید و ضمنا بابت تذکرتون هم جهت نحوه ی به اشتراک گذاری سوال سپاسگزام . لطفا در صورت امکان منبعی معرفی کنید که چنین مسائلی را بیشتر بتوان در آن مطالعه کرد.مانند مورد بنده که به فرموده ی شما نوع داده ی
            volatile مشکل رو حل کرد.
            مگه منبعی بالاتر از تجربه داریم؟ من که منبع دیگه ای سراغ ندارم! یا باید دنبال منابع زبان اصلی باشید، یا مثل من تجربی یاد بگیرید.

            دیدگاه

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