پاسخ : کوچ کردن از کدویژن به AtmelStudio
تاکنون فرصت نشده بود محتوای این تاپیک را ببینم و در همینجا از جناب مرتضوی بابت صرف زمان و قرار دادن پاسخ های بسیار مفید تشکر می کنم. در فرصت جاری، چند صفحه ابتدایی تاپیک را مرور کردم و در پست شماره 44، پاسخی داده شده که تا حدی نیاز به تجدید نظر و توضیح بیشتر دارد. سوال شده:
(در متن سوال UCSRB نوشته شده که UCSRA صحیح است). در پاسخ نوشته شده:
هرچند پاسخ داده شده بصورت عمومی صحیح است. اما برای رجیسترهایی که flag هایی در آنها وجود دارد که با نوشتن 1 پاک می شوند (از جمله TXC در UCSRA ) باید به یک مسئله مهم توجه شود. اگر این flag از قبل یک شده باشد، اجرای دستور
علاوه بر یک کردن MPCM باعث صفر شدن و تغییر وضعیت بیت TXC هم می شود. در حالیکه هدف از اجرای این دستور فقط مقداردهی به MPCM بوده و نه تغییر وضعیت TXC.
این یک قاعده کلی برای مقدار دهی به رجیستر های محتوای flag ها است که اگر احتمال یک بودن هر یک از آن flag ها وجود داشته باشد و از نوعی باشند که نوشتن 1 در محل آنها باعث پاک شدن بیت متناظر در رجیستر شود، نباید از اپراتور =| برای مقدار دهی برای این نوع رجیسترها استفاده شود. زیرا اگر این بیت از قبل 1 شده باشد، خواندن و OR کردن آن بیت با خود باعث 0 شدن ناخواسته flag می شود (مگر اینکه چنین منظوری بصورت عمدی وجود داشته باشد). برای چنین رجیسترهایی در صورت وجود چنین شرایطی فقط باید از اپراتور = استفاده شود و در محل بیت هایی که احتمال 1 بودن آنها وجود دارد، باید 0 نوشته شود تا تغییری در وضعیت این نوع بیت ها بوجود نیاید.
بنابراین در این مورد به خصوص، دستور اول MPCM را یک و U2X را صفر می کند، اما بقیه بیت هایی که از نوع flag هستند، بدون تغییر باقی می مانند. دستور دوم هم می تواند بنا به توضیحات داده شده باعث تغییر TXC شود. (از جهت دیگری هم استفاده از اپراتور =| برای این رجیستر مجاز نیست و آن لزوم نوشتن 0 در برخی بیت های آن بنا به تصریح datasheet است.)
تاکنون فرصت نشده بود محتوای این تاپیک را ببینم و در همینجا از جناب مرتضوی بابت صرف زمان و قرار دادن پاسخ های بسیار مفید تشکر می کنم. در فرصت جاری، چند صفحه ابتدایی تاپیک را مرور کردم و در پست شماره 44، پاسخی داده شده که تا حدی نیاز به تجدید نظر و توضیح بیشتر دارد. سوال شده:
تفاوت این دو چیه
کد:
UCSRA=(1<<MPCM) UCSRA|=(1<<MPCM)
نوشته اصلی توسط RubeuS
کد:
UCSRA|=(1<<MPCM)
علاوه بر یک کردن MPCM باعث صفر شدن و تغییر وضعیت بیت TXC هم می شود. در حالیکه هدف از اجرای این دستور فقط مقداردهی به MPCM بوده و نه تغییر وضعیت TXC.
این یک قاعده کلی برای مقدار دهی به رجیستر های محتوای flag ها است که اگر احتمال یک بودن هر یک از آن flag ها وجود داشته باشد و از نوعی باشند که نوشتن 1 در محل آنها باعث پاک شدن بیت متناظر در رجیستر شود، نباید از اپراتور =| برای مقدار دهی برای این نوع رجیسترها استفاده شود. زیرا اگر این بیت از قبل 1 شده باشد، خواندن و OR کردن آن بیت با خود باعث 0 شدن ناخواسته flag می شود (مگر اینکه چنین منظوری بصورت عمدی وجود داشته باشد). برای چنین رجیسترهایی در صورت وجود چنین شرایطی فقط باید از اپراتور = استفاده شود و در محل بیت هایی که احتمال 1 بودن آنها وجود دارد، باید 0 نوشته شود تا تغییری در وضعیت این نوع بیت ها بوجود نیاید.
بنابراین در این مورد به خصوص، دستور اول MPCM را یک و U2X را صفر می کند، اما بقیه بیت هایی که از نوع flag هستند، بدون تغییر باقی می مانند. دستور دوم هم می تواند بنا به توضیحات داده شده باعث تغییر TXC شود. (از جهت دیگری هم استفاده از اپراتور =| برای این رجیستر مجاز نیست و آن لزوم نوشتن 0 در برخی بیت های آن بنا به تصریح datasheet است.)
دیدگاه