اطلاعیه

Collapse
No announcement yet.

چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

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

    چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

    سلام به همه :mrgreen:
    صورت سوال رو که نوشتم:
    یه جایی توی جزوه آقای سپاسیار دیدم که بیت مورد نظر رو( با استفاده از عملگر | ) با یک or بیتی می کنه. میشه دقیقا بگید چی به چیه؟

    یه سوال دیگه در زبان سی عملگر <- کارش چیه دقیقا؟

    ممنون
    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    #2
    پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

    اول سوال دوم رو جواب میدم :biggrin:
    عملگر <- رو وقتی استفاده میکنید که بخواید به محتویات یه اشاره گر از نوع ساختمان یا کلاس دسترسی داشته باشید مثلا یه ساختمان (struct یا ساختار یا هر پی ...) دارید که یه متغیر از نوع int و با نام myint داره. حالا اگه شما آدرس یه متغیر از این ساختمان رو در اشاره گر مثلا ptr داشته باشید اگه بخواید به اون اینته بود!!!! دسترسی پیدا کنید مینویسید
    ptr->myint
    اما سوال اول : 1- خود آقای سپاسیار سر و مر گنده تشریف دارن جواب میدن در ثانی شماره صفحه بدین ببینیم موضوع از چه قرار بوده

    دیدگاه


      #3
      پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

      ممنونم :biggrin:
      آقا mojalan صفحه 61 رو ببینید]مثال یک از مثالهای عملکرد تایمر صفر، برای ایجاد تاخیر نوشته شده:
      void delay()
      {
      TCCR0=0B00000010; // Timer Clock = CLK/8
      while(!TIFR&0x01); // Wait Until Overflow
      TIFR=TIFR|0B00000001; // Clear TOV0
      TCCR0=0x00; // Stop Timer0
      }

      خب ؟ حالا نظرتون چیه؟
      :biggrin:

      جواب سوال دومم رو هم دادید، ولی راستش درست متوجه نشدم :redface: این موضوع کلا با دسترسی به متغیر یه ساختار فرق می کنه،نه؟ من زبان c رو با تطبیق دادن با C++ یاد گرفتم. در c++ مثلا اگر ساختاری داشتیم به نام grade و math یکی از متغیرهای آن بود می نوشتیم:grade.math درسته؟

      بی نهایت سپاس گزارم :biggrin:
      همیشه بزرگوار تر از آن باشید که برنجید
      و نجیب تر از آن باشید که برنجانید!

      دیدگاه


        #4
        پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

        نوشته اصلی توسط جعفری
        ممنونم :biggrin:
        آقا mojalan صفحه 61 رو ببینید]مثال یک از مثالهای عملکرد تایمر صفر، برای ایجاد تاخیر نوشته شده:
        void delay()
        {
        TCCR0=0B00000010; // Timer Clock = CLK/8
        while(!TIFR&0x01); // Wait Until Overflow
        TIFR=TIFR|0B00000001; // Clear TOV0
        TCCR0=0x00; // Stop Timer0
        }
        1+1=10
        اگر بیت وقفه فعال شود از حلقه خارج شود


        خب ؟ حالا نظرتون چیه؟
        :biggrin:

        جواب سوال دومم رو هم دادید، ولی راستش درست متوجه نشدم :redface: این موضوع کلا با دسترسی به متغیر یه ساختار فرق می کنه،نه؟ من زبان c رو با تطبیق دادن با C++ یاد گرفتم. در c++ مثلا اگر ساختاری داشتیم به نام grade و math یکی از متغیرهای آن بود می نوشتیم:grade.math درسته؟

        بی نهایت سپاس گزارم :biggrin:

        دیدگاه


          #5
          پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

          توجه داشته باشید که تو مثالی که زدید grade یه متغیر هست حالا اگه آدرس اونو بریزید تو اون ptr اینطوری
          ptr=&grade;
          اونوقت به جای grade.math میتونید بنویسید ptr->math
          اما در مورد این برنامه من یه ایراد از اون میگیرم اول اینکه فکر کنم اولویت ! نسبت به & برابر باشه در نتیجه باید اینطور نوشته بشه while(!(TIFR&0x01)); // Wait Until Overflow
          (ویرایش: برنامه آقای سپاسیار درسته ولی اینطور که من نوشتم فکر میکنم مرسوم تر و مفهوم باشه)
          و در مورد یک کردن فلگ برای پاک کردن اون توضیحات همین فلگ رو از دیتا شیت atmega32 برات کپی میکنم که علت رو توش واضخ توضیح داده
          Bit 0 – TOV0: Timer/Counter0 Overflow Flag
          The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
          when executing the corresponding interrupt handling vector. Alternatively, TOV0 is cleared
          by writing a logic one to the flag
          .

          دیدگاه


            #6
            پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

            ممنون علی آقا :biggrin:
            ولی گمون نکنم این 1|1 با 1+1 یه معنی داشته باشه:به نظر من 1|1=1 .
            اینطور نیست؟

            آقا mojalan سپاس :biggrin:
            توضیحاتتون راجع به عملگر <- خیلی خوب بود.
            در مورد اولویت !و & ، گمونم حق با شماست و فکر کنم ! از همه عملگرها اولویت بالاتری داره که باعث اشتباه شدن شرط while میشه.
            اما در مورد پاک کردن نرم افزاری پرچم وقفه، توضیحات دیتا شیت رو هم قبلا به طور کامل خونده بودم، ولی باز ....
            ببینید مگر وقتی وقفه ای رخ میده بیت متناظر با اون یک نمی شه و حالا اگر ما روتین وقفه رو اجرا کرده باشیم پس از اجرای روتین وقفه این بیت به طور سخت افزاری صفر(پاک) میشه. دیتا شیت میگه اگر در پرچم مقدار یک رو بنویسیم پرچم وقفه پاک میشه. نمی تونم بین این دو مورد هماهنگی لازم رو ایجاد کنم !:redface:
            :question: :question: :question:
            همیشه بزرگوار تر از آن باشید که برنجید
            و نجیب تر از آن باشید که برنجانید!

            دیدگاه


              #7
              پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

              نوشته اصلی توسط جعفری
              مگر وقتی وقفه ای رخ میده بیت متناظر با اون یک نمی شه و حالا اگر ما روتین وقفه رو اجرا کرده باشیم پس از اجرای روتین وقفه این بیت به طور سخت افزاری صفر(پاک) میشه. دیتا شیت میگه اگر در پرچم مقدار یک رو بنویسیم پرچم وقفه پاک میشه. نمی تونم بین این دو مورد هماهنگی لازم رو ایجاد کنم !:redface:
              :question: :question: :question:
              پاک شدن هرکدام از پرچم های وقفه در اثر نوشتن 1 بر روی آن احتمالاً تدبیری بوده که Atmel برای جلوگیری از وقفه های ناخواسته به کار برده. بدین صورت شما قادر نخواهید بود تا زمانی که یک درخواست واقعی وقفه از طرف سخت افزار اتفاق افتاده باشد وارد روتین وقفه شوید.
              به طور کلی در AVR تمامی بیتهای پرچمی(بیت های اعلان وضعیت) که قابل نوشتن هستند توسط کاربر فقط قابل پاک شدن هستند(با نوشتن یک یر روی آن) و به صورت نرم افزاری نمیتوان آنها را Set کرد.

              دیدگاه


                #8
                پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

                نوشته اصلی توسط Perfect
                پاک شدن هرکدام از پرچم های وقفه در اثر نوشتن 1 بر روی آن احتمالاً تدبیری بوده که Atmel برای جلوگیری از وقفه های ناخواسته به کار برده. بدین صورت شما قادر نخواهید بود تا زمانی که یک درخواست واقعی وقفه از طرف سخت افزار اتفاق افتاده باشد وارد روتین وقفه شوید.
                به طور کلی در AVR تمامی بیتهای پرچمی(بیت های اعلان وضعیت) که قابل نوشتن هستند توسط کاربر فقط قابل پاک شدن هستند(با نوشتن یک یر روی آن) و به صورت نرم افزاری نمیتوان آنها را Set کرد.
                سپاس فراوان از علی آقا و آقایperfect
                :biggrin:

                اما...
                مشکل من دقیقا همینه، وقتی وقفه ای رخ میده پرچم مربوطه یک میشه، برای پاک شدنش باید صفر بشه مگه نه؟ حالا یا سخت افزار اینکارو میکنه یا ما باید نرم افزاری اینکار رو انجام بدیم، چرا نباید به جای نوشتن یک روی پرچم، صفر نوشت؟
                علی آقا میگن 1|1=1+1=10 به نظر شما این درسته؟ اگر علی آقا درست بگن با این کار پرچم صفر میشه، ولی تکیف رقم دوگان که یک شده چی میشه؟آیا این رقم روی بیت یک از بایت TIFR تاثیر نمیذاره؟

                مشکل اصلی من اینه که چطور با نوشتن یک روی پرچمی که یکه، پرچم پاک میشه! :question:
                همیشه بزرگوار تر از آن باشید که برنجید
                و نجیب تر از آن باشید که برنجانید!

                دیدگاه


                  #9
                  پاسخ : چرا برای پاک کردن پرچم وقفه به صورت نرم افزاری باید روی بیت مورد نظر 1 نوشت؟

                  نوشته اصلی توسط جعفری

                  علی آقا میگن 1|1=1+1=10 به نظر شما این درسته؟
                  خیر. مفهوم OR با ADD متفاوت است. حاصل OR دو رقم 1 با هم، یک رقم 1 بدون کری است.

                  نوشته اصلی توسط جعفری
                  ولی تکیف رقم دوگان که یک شده چی میشه؟آیا این رقم روی بیت یک از بایت TIFR تاثیر نمیذاره؟
                  مشکل اصلی من اینه که چطور با نوشتن یک روی پرچمی که یکه، پرچم پاک میشه! :question:
                  ببینید، اصلاً کری یا رقم دوگان و.. در کار نیست. مکانیزم سخت افزار طوری است که با نوشتن 1 بر روی پرچم، آن را ریست میکند. میتوانید اینطور برداشت کنید که برای هر پرچم یک Flip Flop در نظر گرفته شده که با نوشتن 1 در پایه ریست آن، پرچم صفر میشود. اگر صفر بنویسید پرچم پاک نخواهد شد.

                  دیدگاه

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