اطلاعیه

Collapse
No announcement yet.

مقدار دهی رجیسترهای AVR در کدویژن

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

    مقدار دهی رجیسترهای AVR در کدویژن

    سلام
    از دوستان و اساتید بزرگوار چند سوال داشتم:

    1. چرا کدویزارد زمانی که وقفه را فعال می کند رجیستر GICR را OR می کند و مستقیم آن را مساوی با مقدار لازم قرار نمی دهد؟

    2. دلیل اینکه در هنگام فعالسازی وقفه رجیستر GIFR هم باید مقدار دهی شود چیست؟

    3. در مقایسه کننده آنالوگ اگر بیت 7 رجیستر ACSR صفر شود مقایسه کننده فعال می شود و باتوجه به اینکه مقدار اولیه آن صفر هست آیا مقایسه کننده به طور پیش فرض فعال است؟

    4. در این انجمن بحث هایی راجع به نحوه پاک کردن پرچم ها در AVR را خواندم لیکن متوجه نشدم. چرا و چگونه پرچم ها با نوشتن یک پاک می شوند؟

    5. در مورد مقدار دهی رجیستر ها به صورت Bit Position لطفا توضیح دهید و مزیت آنرا نسبت به مساوی قرار دادن رجیستر با اعداد را هم بفرمایید.

    از همه شما سپاسگزارم.

    اضافه شده در تاریخ :
    oo:

    #2
    پاسخ : مقدار دهی رجیسترهای AVR در کدویژن

    1- برای اینکه بیت های نامربوط رو که ممکنه مقدار داشته باشند دستکاری نکنه ... و فقط بیت های مورد نیاز خودش رو یک کنه
    2- نیازی نیست
    3-بله
    4-دلیل دقیق اینو منم نمیدونم ولی معماری avr جوری هست که واسه پاک کردن فلگ باید یک بنویسید ...
    5-وقتی یک دیجیستر رو با عدد مساوی قرار میدید به ناچار بقیه بیت هایی که نمیخواید تغییر بدید هم تغییر میکنن
    برای یک کردن یک یا تعدادی بیت خاص باید اونها رو با 1 or کنید و بقیه بیت ها هم صفر باشن
    برای صفر کردن یک یا تعدادی بیت خاص باید اونها رو با 0 and کنید و بقیه بیت ها هم یک باشن
    برای toggle کردن یک یا تعدادی بیت خاص باید اونها رو با 1 xor کنید و بقیه بیت ها هم صفر باشن
    اینجوری بقیه بیت ها مقدارشون رو حفظ میکنن
    مثلا میخواهید DDRB1 و DDRB5 رو یک کنید
    کد:
    DDRB |= 0x22
    و واسه صفر کردنشون
    کد:
    DDRB &= 0xDD
    و واسه تاگل کردن
    کد:
    DDRB ^= 0x22
    با سپاس

    دیدگاه


      #3
      پاسخ : مقدار دهی رجیسترهای AVR در کدویژن

      خیلی ممنون آقای علی پور
      فقط چند تا سوال دیگه:
      نوشته اصلی توسط علی علی پور ریکنده
      1- برای اینکه بیت های نامربوط رو که ممکنه مقدار داشته باشند دستکاری نکنه ... و فقط بیت های مورد نیاز خودش رو یک کنه
      در مورد سوال اولم که پاسخ فرمودید کد ویزارد چرا با بقیه رجیستر ها اینطوری رفتار نمی کنه؟
      و در مورد سوال آخر منظورم ر شاید درست نگفتم. منظور من همون روشی است که نام تک تک بیت ها ر یک واحد شیفت میدن
      کد:
      DDRA = (1 << DDA1) | (1 << DDA3) | (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);

      دیدگاه


        #4
        پاسخ : مقدار دهی رجیسترهای AVR در کدویژن

        1- چون این ریجیستر فقط مربوط به فعال کردن وقفه نیست ، بیت های دیگه ای هم داره مثلا تعیین ادرس بردار وقفه و ...
        یا مثلا شما نمیتونی واسه پاک کردن فلگ i کل sreg رو مقدار بدی ...
        ولی بعضی ریجیستر ها مخصوص یک عمل خاصی هستند مثلا DDR یا ...
        ----
        این روش نیاز به bit definition داره و ممکنه رو همه کمپایلر ها جواب نده و باید حتما فایل bit definition مربوط به شماره مورد نظر به پروژه اضافه بشه ...
        که در اون فایل هر کدوم از عبارت هایی که میبینید مثلا DDA5 به صورت ماکرو تعریف شدند و با شماره بیت متناظرتون در ریجیستر مورد نظر تعویض میشن ، مثلا به جای DDA5 5 قرار داره میشه و 1 به اندازه 5 واحد به سمت چپ شیفت داده میشه
        در عمل فرقی با مساوی قرار دادن ریجیستر ها با اعداد نداره و فقط یکم فهم واسه برنامه نویس رو راحتر میکنه ...
        با سپاس

        دیدگاه

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