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

0
180
خواندن و نوشتن رجیسترهای 16 بیتی
خواندن و نوشتن رجیسترهای 16 بیتی

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

در قسمت هفتم آموزش میکروکنترلر AVR به بررسی منابع کلاک در AVR پرداختیم، حال در قسمت هشتم آموزش میکروکنترلر AVR به ۳مبحث اشاره میکنیم:

  1. خواندن‌و نوشتن در رجیسترهای داخلی خانواده AVR که دارای طول ۱۶بیت هستند.
  2. status register
  3. SREG

1.خواندن‌و نوشتن در رجیسترهای داخلی خانواده AVR: بعضی از رجیسترهای داخلی خانواده­­­ AVR هستند که نوشتن در آنها روی بخشی‌از سخت‌افزار تاثیر می­‌گذارد و خواندن از آنها مقادیر سخت‌افزار را منعکس می­‌کند مانند رجیستر تایمرها. برای نوشتن برنامه برروی این رجیسترها حتما باید روال برنامه‌نویسی رعایت‌شود، این نکات عبارتند از: در زمان نوشتن برنامه ابتدا HIGH BYTE یا بایت با ارزش بالاتر نوشته‌شود و سپس بایت با ارزش پایین‌تر نوشته شود. هم‌چنین این مورد در زمان خواندن نیز به‌صورت عکس انجام می‌گیرد بدین‌صورت که در زمان خواندن، ابتدا بایت با ارزش پایین‌تر و سپس بایت با ارزش بالاتر خوانده می­‌شود. حالت دوم برای رجیسترهای ADC به‌کار می­‌رود. این موارد در خانواده XAMEGA نیز وجود دارد با این‌تفاوت‌که چه در‌مواقع خواندن‌و چه در‌موقع نوشتن، بایت با ارزش پایین‌تر، اول خوانده یا نوشته می­‌شود و سپس بایت با ارزش بالاتر.

2-STATUS REGISTER: این رجیستر، رجیستر بسیارمهمی است که نتیجه عملیات مختلف برروی بیت‌های آن منعکس می­‌شود و CPU میتواند از این‌طریق مطلع‌شود. گرچه در برنامه‌نویسی HIGH LEVEL برنامه‌نویس به‌صورت‌مستقیم با بیت‌های داخلی رجیستر به‌جز بیت شماره۷ سروکار ندارد. از آنجاکه این جیستر از اهمیت‌بالایی برخوردار است به توضیحات‌تکمیلی آن می‌پردازیم.
این رجیستر دارای ۸بایت است که به‌صورت‌زیر مقداردهی می‌شوند:

00000000=0

111111111=255

10000000=-128 (منفی ترین)

01111111=+127 (مثبت ترین)

پس یک عدد ۸بیتی اگر بدون‌علامت تفسیر شود محدوده بین ۰ تا ۲۵۵ را پوشش می‌دهد و اگر علامت‌دار تفسیر شود محدوده آن بین -۱۲۸ تا +۱۲۷ است. محاسبات علامت‌دارها روش‌های مختلفی دارند، مثلا برای تبدیل یک عددمثبت به منفی، ابتدا عدد را متمم نموده و با یک جمع می‌کنند. برای ۱۶بیت هم به‌همین‌ترتیب است. یک عدد ۱۶بیتی بدون‌علامت در محدوده ۰ تا ۶۵۵۳۵ است و محدوده همین عدد به‌صورت علامت‌دار از -۳۲۷۶۸ تا +۳۲۷۶۷ است. این توضیحات مقدمه‌ای برای درک‌بهتر status register بود.

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

carry flag
carry flag

 

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

LSB و MSB
LSB و MSB

 

عملیات چرخش: در عملیات چرخش هم به‌همین‌صورت انجام‌میگیرد. اگر قرارباشد چرخشی در عدد ایجاد شود: اگر چرخش‌به سمت‌راست باشد LSB وارد carry flag میشود و سپس وارد MSB می‌شود. در جهت معکوس هم به‌همین‌صورت است.

ZERO FLAG: اگر حاصل عملیات صفر شود و تمام بیت‌های آن صفر باشند برروی این FLAG تاثیر می‌گذارد و برابر ۱ می‌شود.

NEGATIVE FLAG: اگر MSB یک عدد برابربا یک باشد این FLAG برابربا یک می‌شود. بدین‌معنا که به‌صورت‌ظاهری این عدد یک است.

OVERFLOW: اگر دوعددمثبت جمع‌شوند و حاصل‌آن منفی شود و یا اگر دو عدد منفی جمع‌شوند و حاصل آن عدد مثبتی شود، OVER FLOW یا سرریز اتفاق می‌افتد. برای درک‌بیشتر مطلب به‌مثال‌زیر توجه‌کنید:

OVER FLOW
OVER FLOW

 

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

سرریز
سرریز

 

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

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

SIGN FLAG
SIGN FLAG

 

HALF CARRY FLAG: اگر درهنگام انجام عملیات بین بیت ۳ و ۴، carry حاصل‌شود این بیت یک خواهد شد که در انجام عملیات bcd بیشتر مورد‌استفاده قرارمی‌گیرد.

TRANSFER BIT FLAG: برای ذخیره‌سازی و مقداردهی به تک‌بیت‌ها در رجیسترهای r۰ تا r۳۱ ازطریق دستورات 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 پشته و مقدمه‌ای از تایمرها را بیان می کنیم. با ما همراه باشید.

 

منبع: سیسوگ

برای این مقاله نظر بگذارید:

لطفا دیدگاه خود را بنویسید
لطفا نام خود را وارد کنید