آموزش جامع میکروکنترلر AVR – قسمت هشتم;
سیسوگ در قسمت هفتم آموزش میکروکنترلر AVR به بررسی منابع کلاک در AVR پرداخت، حال در قسمت هشتم آموزش میکروکنترلر AVR به 3 مبحث اشاره می کند;
1-خواندن و نوشتن در رجیسترهای داخلی خانواده AVR که دارای طول 16 بیت هستند.
2-status register
3-SREG
1.خواندن و نوشتن در رجیسترهای داخلی خانواده AVR
بعضی از رجیسترهای داخلی خانواده AVR هستند که نوشتن در آنها روی بخشی از سخت افزار تاثیر می گذارد و خواندن از آنها مقادیر سخت افزار را منعکس میکند مانند رجیستر تایمرها.
برای نوشتن برنامه بر روی این رجیسترها حتما باید روال برنامه نویسی رعایت شود، این نکات عبارتند از: در زمان نوشتن برنامه ابتدا HIGH BYTE یا بایت با ارزش بالاتر نوشته شود و سپس بایت با ارزش پایین تر نوشته شود. همچنین این مورد در زمان خواندن نیز به صورت عکس انجام می گیرد بدین صورت که در زمان خواندن، ابتدا بایت با ارزش پایین تر و سپس بایت با ارزش بالاتر خوانده میشود. حالت دوم برای رجیسترهای ADC به کار میرود.
این موارد در خانواده XAMEGA نیز وجود دارد با این تفاوت که چه در مواقع خواندن و چه در موقع نوشتن، بایت با ارزش پایین تر، اول خوانده یا نوشته میشود و سپس بایت با ارزش بالاتر.
2-STATUS REGISTER
این رجیستر، رجیستر بسیار مهمی است که نتیجه عملیات مختلف بر روی بیت های آن منعکس میشود و CPU میتواند از این طریق مطلع شود. گرچه در برنامه نویسی HIGH LEVEL برنامه نویس به صورت مستقیم با بیت های داخلی رجیستر به جز بیت شماره 7 سر و کار ندارد. از آنجا که این جیستر از اهمیت بالایی برخوردار است به توضیحات تکمیلی آن میپردازیم.
این رجیستر دارای 8 بیت است که به صورت زیر مقدار دهی میشوند:
00000000=0
111111111=255
10000000=-128 (منفی ترین)
01111111=+127 (مثبت ترین)
پس یک عدد هشت بیتی اگر بدون علامت تفسیر شود محدوده بین 0 تا 255 را پوشش میدهد و اگر علامت دار تفسیر شود محدوده آن بین -128 تا +127 است.
محاسبات علامتدارها روش های مختلفی دارند، مثلا برای تبدیل یک عدد مثبت به منفی، ابتدا عدد را متمم نموده و با یک جمع میکنند.
برای 16 بیت هم به همین ترتیب است. یک عدد 16 بیتی بدون علامت در محدوده 0 تا 65535 است و محدوده همین عدد به صورت علامت دار از -32768 تا +32767 است.
این توضیحات مقدمه ای برای درک بهتر status register بود.
C=carry
Z=zero
N=negative
V=overflow
S=sign
H=half carry
T=transfer bite
I=Global interrupt enable/disable
بیت سمت راست یا LSB در بسیاری از عملیات ریاضی (مانند ضرب،تقسیم،جمع و …) روی آن تاثیر گذاشته میشود و CPU از طریق این بیت میتواند از نتیجه عملیات اطلاع پیدا کند. به مثال زیر توجه کنید:
در عملیات جمع یک carry حاصل میشود و در عملیات تفریق یک barrow یا قرض به وجود میآید که در carry flag تاثیر میگذارد. از موارد دیگری که در carry flag تاثیر میگذارد، عملیات انتقال یا شیقت به چپ و راست است. به این ترتیب که اگر عددی به راست شیفت پیدا کند LSB آن عدد وارد carry flag میشود و و یک صفر از سمت راست وارد میشود. در شرایطی که شیفت به چپ مورد نظر باشد صفر از سمت راست وارد میشود و محتویات MSB وارد carry flag میشود.
در عملیات چرخش هم به همین صورت انجام میگیرد.اگر قرار باشد چرخشی در عدد ایجاد شود:اگر چرخش به سمت راست باشد LSB وارد carry flag میشود و سپس وارد MSB میشود. در جهت معکوس هم به همین صورت است.
ZERO FLAG: اگر حاصل عملیات صفر شود و تمام بیتهای آن صفر باشند بر روی این FLAG تاثیر میگذارد و برابر یک میشود.
NEGATIVE FLAG: اگر MSB یک عدد برابر با یک باشد این FLAG برابر با یک میشود. بدین معنا که به صورت ظاهری این عدد یک است.
OVERFLOW: اگر دو عدد مثبت جمع شوند و حاصل آن منفی شود و یا اگر دو عدد منفی جمع شوند و حاصل آن عدد مثبتی شود، OVER FLOW یا سرریز اتفاق میافتد. برای درک بیشتر مطلب به مثال زیر توجه کنید:
اگر دو عدد -128 به صورت علامتدار با هم جمع شوند حاصل آن صفر خواهد شد و یک carry flag ایجاد خواهد شد که در flag مربوط به آن تاثیر میگذارد و آن را یک میکند، حاصل این جمع به ظاهر عدد مثبتی است زیرا 8 بیت آن مورد نظر است. در چنین شرایطی یک سرریز اتفاق میافتد زیرا حداکثر ظرفیت یک عدد هشت بیتی منفی،-128 است و جمع این دو عدد با هم از این ظرفیت بیشتر میشود، پس یک سرریز اتفاق میافتد:
حاصل جمع دو عبارت بالا -128 است در این حالت نیز overflow اتفاق میافتد. بنابراین cpu از طریق overflow flag متوجه میشود که این عدد معتبر نیست.
SIGN FLAG: وظیفه این FLAG نشان دادن علامت واقعی عدد است. در مبانی دیجیتال برای NOT کردن یک بیت، آن بیت را با یک XOR میکنیم. با توجه به فرمول S=N⊕V اگر سرریز اتفاق نیفتاده باشد و overflag صفر باشد عبارت برابر با خود عدد است، یعنی اگر عدد به ظاهر منفی باشد علامت آن عدد هم منفی میشود. ولی اگر Overflow اتفاق بیفتد جواب این عبارت not آن عدد خواهد شد، یعنی اگر عدد مورد نظر مثبت باشد، به دلیل وجود سرریز علامت آن منفی خواهد شد و در sing flag تاثیر خواهد گذاشت.
HALF CARRY FLAG: اگر در هنگام انجام عملیات بین بیت 3 و 4، carry حاصل شود این بیت یک خواهد شد که در انجام عملیات bcd بیشتر مورد استفاده قرار میگیرد.
TRANSFER BIT FLAG: برای ذخیره سازی و مقدار دهی به تک بیت ها در رجیسترهای r0 تا r31 از طریق دستورات Bit store و bit load در سطح اسمبلی مورد استفاده قرار میگیرد.
GLOBAL INTERRUPT ENABLE/DISABLE: میتوان از این FLAG به عنوان فلگ مجوز وقفه در AVR نام برد. برای استفاده از وقفه دو مرحله باید انجام شود:
1-بیت مربوط به مجوز وقفه در بایت های مشخصی از فضای حافظه باید یک شود.
2-FLAG مربوط به وقفه باید یک شود.
برای یک کردن این FLAG در سطح اسمبلی دستورات sei و cli مورد استفاده قرار میگیرد. در کدویژن #asm(“sei”) و #asm(cli) استفاده میشود. همچنین در بسکام از دستور Enable interrupts و Disable interrupts استفاده میشود.
گاهی لازم است که در حین اجرای برنامه وقفه غیرفعال شود و مجدداً فعال شود پس بنابراین بحث disable و cli مطرح میشود.
هرگاه وقفه ای در خانواده avr پذیرفته شود به صورت خودکار flag I صفر خواهد شد و هیچ وقفه دیگری تا زمانی که وقفه تمام شود اجازه وقوع پیدا نخواهد کرد. بعد از اتمام وقفه یک دستور اسمبلی اجرا میشود سپس وقفه بعدی اجرا خواهد شد.
این رجیستر دارای 8 بایت است!!!
سلام دوست عزیز
ممنون از تذکر شما 🙂