آموزش میکروکنترلر AVR
در قسمت هفتم آموزش میکروکنترلر AVR به بررسی منابع کلاک در AVR پرداختیم، حال در قسمت هشتم آموزش میکروکنترلر AVR به ۳مبحث اشاره میکنیم:
- خواندنو نوشتن در رجیسترهای داخلی خانواده AVR که دارای طول ۱۶بیت هستند.
- status register
- SREG
1.خواندنو نوشتن در رجیسترهای داخلی خانواده AVR: بعضی از رجیسترهای داخلی خانواده AVR هستند که نوشتن در آنها روی بخشیاز سختافزار تاثیر میگذارد و خواندن از آنها مقادیر سختافزار را منعکس میکند مانند رجیستر تایمرها. برای نوشتن برنامه برروی این رجیسترها حتما باید روال برنامهنویسی رعایتشود، این نکات عبارتند از: در زمان نوشتن برنامه ابتدا HIGH BYTE یا بایت با ارزش بالاتر نوشتهشود و سپس بایت با ارزش پایینتر نوشته شود. همچنین این مورد در زمان خواندن نیز بهصورت عکس انجام میگیرد بدینصورت که در زمان خواندن، ابتدا بایت با ارزش پایینتر و سپس بایت با ارزش بالاتر خوانده میشود. حالت دوم برای رجیسترهای ADC بهکار میرود. این موارد در خانواده XAMEGA نیز وجود دارد با اینتفاوتکه چه درمواقع خواندنو چه درموقع نوشتن، بایت با ارزش پایینتر، اول خوانده یا نوشته میشود و سپس بایت با ارزش بالاتر.
2-STATUS REGISTER: این رجیستر، رجیستر بسیارمهمی است که نتیجه عملیات مختلف برروی بیتهای آن منعکس میشود و CPU میتواند از اینطریق مطلعشود. گرچه در برنامهنویسی HIGH LEVEL برنامهنویس بهصورتمستقیم با بیتهای داخلی رجیستر بهجز بیت شماره۷ سروکار ندارد. از آنجاکه این جیستر از اهمیتبالایی برخوردار است به توضیحاتتکمیلی آن میپردازیم.
این رجیستر دارای ۸بایت است که بهصورتزیر مقداردهی میشوند:
00000000=0
111111111=255
10000000=-128 (منفی ترین)
01111111=+127 (مثبت ترین)
پس یک عدد ۸بیتی اگر بدونعلامت تفسیر شود محدوده بین ۰ تا ۲۵۵ را پوشش میدهد و اگر علامتدار تفسیر شود محدوده آن بین -۱۲۸ تا +۱۲۷ است. محاسبات علامتدارها روشهای مختلفی دارند، مثلا برای تبدیل یک عددمثبت به منفی، ابتدا عدد را متمم نموده و با یک جمع میکنند. برای ۱۶بیت هم بههمینترتیب است. یک عدد ۱۶بیتی بدونعلامت در محدوده ۰ تا ۶۵۵۳۵ است و محدوده همین عدد بهصورت علامتدار از -۳۲۷۶۸ تا +۳۲۷۶۷ است. این توضیحات مقدمهای برای درکبهتر 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 یا سرریز اتفاق میافتد. برای درکبیشتر مطلب بهمثالزیر توجهکنید:
سرریز: اگر دو عدد -۱۲۸ بهصورت علامتدار باهم جمعشوند حاصل آن صفر خواهد شد و یک carry flag ایجادخواهدشد که در flag مربوطبه آن تاثیر میگذارد و آنرا یک میکند، حاصل این جمع بهظاهر عدد مثبتی است زیرا ۸بیت آن مورد۸نظر است. درچنینشرایطی یک سرریز اتفاق میافتد زیرا حداکثر ظرفیت یک عدد ۸بیتی منفی، -۱۲۸ است و جمع این دوعدد باهم از این ظرفیت بیشتر میشود، پس یک سرریز اتفاق میافتد:
حاصلجمع دو عبارتبالا -۱۲۸ است در اینحالت نیز overflow اتفاق میافتد. بنابراین cpu ازطریق overflow flag متوجه میشود که این عددمعتبر نیست.
SIGN FLAG: وظیفه این FLAG نشاندادن علامت واقعی عدد است. در مبانیدیجیتال برای NOTکردن یک بیت، آن بیت را با یک XOR میکنیم. باتوجهبه فرمول S=N⊕V اگر سرریز اتفاق نیفتادهباشد و overflag صفر باشد عبارت برابربا خود عدد است، یعنی اگر عدد بهظاهر منفی باشد علامت آن عدد هم منفی میشود. ولی اگر Overflow اتفاق بیفتد جواب این عبارت not آن عدد خواهدشد، یعنی اگر عدد موردنظر مثبت باشد، بهدلیل وجود سرریز علامت آن منفی خواهد شد و در sing 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 پشته و مقدمهای از تایمرها را بیان می کنیم. با ما همراه باشید.
منبع: سیسوگ