AVR, آموزش, توصیه شده, مقاله

آموزش میکروکنترلر AVR قسمت 8: خواندن و نوشتن رجیسترهای 16 بیتی و توضیح Status Register

آموزش میکروکنترلر AVR قسمت هشتم

آموزش میکروکنترلر 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  بود.

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 از طریق این بیت می‌تواند از نتیجه عملیات اطلاع پیدا کند. به مثال زیر توجه کنید:

LBS

در عملیات جمع یک 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 یا سرریز اتفاق می‌افتد. برای درک بیشتر مطلب به مثال زیر توجه کنید:

OverFlow

اگر دو عدد -128 به صورت علامتدار با هم جمع شوند حاصل آن صفر خواهد شد و یک carry flag  ایجاد خواهد شد که در flag مربوط به آن تاثیر می‌گذارد و آن را یک می‌کند، حاصل این جمع به ظاهر عدد مثبتی است زیرا 8 بیت آن مورد نظر است. در چنین شرایطی یک سرریز اتفاق می‌افتد زیرا حداکثر ظرفیت یک عدد هشت بیتی منفی،-128 است و جمع این دو عدد با هم از این ظرفیت بیشتر می‌شود، پس یک سرریز اتفاق می‌افتد:

سرریز (carry flag )

حاصل جمع دو عبارت بالا -128 است در این حالت نیز overflow اتفاق می‌افتد. بنابراین cpu از طریق overflow flag متوجه می‌شود که این عدد معتبر نیست.

SIGN FLAG: وظیفه این FLAG نشان دادن علامت واقعی عدد است. در مبانی دیجیتال برای NOT کردن یک بیت، آن بیت را با یک XOR می‌کنیم. با توجه به فرمول S=N⊕V اگر سرریز اتفاق نیفتاده باشد و overflag صفر باشد عبارت برابر با خود عدد است، یعنی اگر عدد به ظاهر منفی باشد علامت آن عدد هم منفی می‌شود. ولی اگر Overflow اتفاق بیفتد جواب این عبارت not آن عدد خواهد شد، یعنی اگر عدد مورد نظر مثبت باشد، به دلیل وجود سرریز علامت آن منفی خواهد شد و در sing flag تاثیر خواهد گذاشت.

SIGN 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 صفر خواهد شد و هیچ وقفه دیگری تا زمانی که وقفه تمام شود اجازه وقوع پیدا نخواهد کرد. بعد از اتمام وقفه یک دستور اسمبلی اجرا می‌شود سپس وقفه بعدی اجرا خواهد شد.

 

در قسمت نهم آموزش میکروکنترلر AVR پشته و مقدمه ای از تایمرها را بیان می کند. با سیسوگ همراه باشید.
سری مقالات آموزش میکروکنترلر AVR توسط آقای مهندس کی‌نژاد  تهیه شده است.


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *