آموزش میکروکنترلر AVR
در قسمت هشتم آموزش میکروکنترلر AVR به بررسی خواندن و نوشتن رجیسترهای 16بیتی و Status Register پرداختیم، در این جلسه از آموزش میکروکنترلرAVR به صحبت راجعبه stack یا پشته و مقدمهای بر تایمرها و کانترها میپردازیم. درشرایطی درحین اجرای برنامه نیاز است سابروتینها یا زیر روالهایی احضار شوند و یا وقفه اتفاق بیفتد. سابروتینها: گاهی درطول اجرای برنامه بخشهایی هستند که نیاز است چندینبار اجراشوند، برای صرفهجویی در حافظه فلش بهتر است، قسمت موردنظر بهصورت سابروتین نوشتهشود. آنگاه درطول اجرای برنامه هرکجا به سابروتین نیاز باشد به آن مراجعه میشود و بعداز اجرا، به ادامه برنامه برگشت داده میشود. برای انجام آن لازماست، CPU از آدرس محلی که سابروتین در آن call میشود، اطلاعداشتهباشد و زمانی که به انتهای سابروتین رسید، بداند که به کجا برگشت داده شود. بدینمنظور در حافظه SRAM، فضایی بهنام stack یا پشته اختصاصیافتهاست. از کاربردهای این فضا، ذخیرهکردن آدرس محل برگشت از سابروتین است که بهعنوان stack در فضای SRAM ذخیره میشود. حال این سوال پیش میآید که محل stack در SRAM کجاست؟ جواب این است که اگر برنامه توسط زبان اسمبلی نوشته میشود، محل باید بهوسیله برنامهنویس تعیینشود و اگر بهوسیله کامپایلر highlevel نوشته میشود، خود کامپایلر بهصورت پیشفرض stack را مشخص میکند. خاصیت stack در Last in first out) LIFO) بودن آن است. همانطورکه از اسم آن مشخص است. درحین بازیابی و فراخوانی، آخرین چیزی که وارد فضای stack میشود ابتدا از آن خوانده شده است برای مثال تعدادی کتاب روی همدیگر قرار دارند، درهنگام برداشتن و خواندن این کتابها، آخرین کتابی که قرارگرفتهاست، ابتدا برداشتهو خوانده میشود. در نقطه مقابل first in first out است. برای مثال افرادحاضر در یک صف،کسیکه نفر اول وارد صف شدهاست نفر اول هم از آن صف خارج میشود. مکان معمول stack در انتهای SRAM تعریف میشود. اگر فضای SRAM را درنظربگیریم در انتهای SRAM، ابتدای stack تعریف میشود. اصطلاح top of stack یعنی بالای stack و جایی که قرار است اطلاعات در آنجا ذخیرهشود. در مقداردهی اولیه اگر stack را در انتهای SRAM فرضکنیم،اطلاعات آن توسط CPU بهصورتزیر نوشتهوخوانده میشوند.
اگر قرارباشد یک سابروتین اجرا شود، باید آدرس محلی که بعداز اجرای سابروتین به آن بازگشت داده میشود، بهصورت خودکار توسط cpu در stack ذخیرهشود. حال اگر چندین سابروتین، یعنی داخل یک سابروتین، سابروتین بعدی و بههمینترتیب، وجودداشتهباشد، بههمین روال آدرس آن در stack ذخیره میشود و درهنگام بازگشت آخرین اطلاعاتی که ذخیرهشدهاست، در ابتدا بازیابی میشود.
این مساله برای وقفهها هم برقرار است. فرضبر این است که یک کد در حافظه flash درحال اجرا است و درحین اجرا وقفه اتفاق میافتد. در این حین روند اجرای برنامه متوقف میشود و به آدرس مشخصی در حافظه flash پرش داده میشود و آن کد اجرا میشود، پساز پایان وقفه به برنامه اصلی برگشت داده میشود. وقتی وقفه پذیرفته میشود آدرس محل برگشت بهصورت خودکار توسط cpu در stack ذخیره میشود. بنابراین در هنگام برگشت از وقفه آن آدرس بازیابی میشود. برگشت از سابروتین ها با دستور اسمبلی RET و برگشت از وقفه با دستور RETI انجام میگیرد. فرق این دو دستور ازنظر بازگشت از وقفه بغیر از بازیابی آدرس بازگشت این است که، با دستور RETI ،فلگ I که در جلسه قبل توضیح داده شد اگر قبلاز اجرای دستورالعمل یک باشد مجددا یک میشود، به اینمعنا که اگر وقفهها مجوز وقوع داشتهباشند زمانیکه برنامه به این دستور میرسد علاوهبراینکه به آدرسی که در stack بهصورت خودکار ذخیرهشدهاست برگشت داده میشوند، فلگ I که مجوز وقوع وقفه است یک خواهد شد. برحسب مدیریتی که برروی حافظه انجام میشود ممکناست محل ذخیرهسازی STACK توسط کامپایلر بهجای انتهای SRAM در نقاط دیگری تعریفشود. اگر نوع برنامهنویسی بهصورت غیراصولی باشد و سابروتینها بیشاز حدمعمول بهصورت تودرتو تعریفشدهباشند حالت STACK OVER FLOW پیش میآید. بدینمعناکه اگر سابروتینها از حدمجاز تجاوز کنند با برنامه اصلی در حافظه تداخل ایجاد میشود و واردشدن این دو اطلاعات بههم منجربه عدم عملکرد صحیح میشود. در کامپایلرهای مختلف بستهبه تعریف متغییرها نوع فضای اشغالشده در SRAM فرق میکند. ظرفیت SRAM در شمارههای مختلف، متفاوتاست بدینصورتکه ممکناست شمارهای ازنظر تعداد پایهها، سختافزارهای داخلی و… کفایتکند ولی ازنظر فضای SRAM کافی نباشد، باید شماره دیگری را درنظرگرفت. بنابراین در کاربرد باتوجهبه نوع برنامه و عملکرد آن فضای SRAM میتواند بسیارمهم باشد. یک پین علاوهبر وظیفه I/O میتواند نقشهای دیگری اعم از وظیفه ورودی و خروجی اتصالات جانبی به سختافزارهای داخل میکروکنترلر را نیز داشتهباشد.
تایمر و کانتر:
در خانوادهAVR تایمرها به دوصورت ۸بیتی و ۱۶بیتی وجود دارند به اینمعناکه یک تایمر و یا یک کانتر به طول ۸یا ۱۶بیت تعبیهشدهاست که میتواند کلاک خود را بهصورت داخلی و درشرایط دیگری خارجاز میکروکنترلر تأمینکند. زمانی که کلاک از خارج میکروکنترلر تأمین میشود اصطلاحاً به آن کانتر گفته میشود و اگر با کلاک مشخصی کانتر تغذیه شود به آن تایمر گفته میشود. اگر میزان کلاک یک شمارنده مشخص و ثابت باشد میتوان از تغییرات آن شمارنده به گذشت زمان پی برد از همینرو نام تایمر به آن اطلاق میشود، اما زمانیکه پالسی از بیرون به میکروکنترلر وارد شود بهدلیل نامعلومبودن فاصله زمانی پالسها به آن کانتر یا EVENT COUNTER گفته میشود که اتفاقهای بیرون از میکروکنترلر را قرائت میکند. در خانواده AVR کانتر بهصورتUP COUNTER عمل میکند، یعنی اصولاً با واردشدن هر کلاک یک شماره به تایمر اضافه میشود. حداکثر مقداری که یک تایمر ۸بیتی میتواند در خود جایدهد از صفر تا ۲۵۵ است. (یا بهصورت هگزا دسیمال از 0X00 تا 0XFF). در اینجا برای رسیدن تایمر به مقدار۲۵۵، تعداد ۲۵۵کلاک باید وجودداشتهباشد و برای دوباره صفرشدن نیازبه یک کلاک بیشتر یعنی مقدار ۲۵۶ است.
همچنین این مقدار برای یک تایمر ۱۶بیتی از 0X0000 تا 0XFFFF یعنی از ۰ تا ۶۵۵۳۵ وجود دارد. برای حرکت از حداکثر مقدار به حداقل مقدار یک کلاک نیاز است. طبق گفتههای جلسات قبل کلاک از منابعمختلفی ازجمله کلاک داخل میکروکنترلر یا تقسیمشدههای آن و یا منابع بیرونی تامین میشود. در بعضیاز شمارهها ممکناست یک کریستال فرکانس پایین با فرکانس ۳۲۷۶۸هرتز وجودداشتهباشد که تأمینکننده نوسان فرکانس اسیلاتوری است و میتواند مقدار تایمر را تغییردهد. در مواردخاص که نیازبه زمانبندی دقیق است میتوان از آن استفادهکرد. تایمرها حالتهای متفاوتی دارند و بستهبهاینکه از چهنوع حالت یا MODE استفاده میشود، میتوان محدوده تغییرات آن را تغییرداد. لزوم وجود تایمر در کنار CPU، محولکردن عملیات زمانگیری توسط سختافزار تایمر است. درطول اجرای برنامه، تایمرها توسط کدهای برنامهنویسی درحالتی که قرار است انجام وظیفه کنند تنظیم میشوند و بعداز آن وظیفه سختافزاری خود را انجام میدهند، حسن اینکار کمترشدن بار پردازشی CPU است. برایمثال لازماست بدانیم هرموقع تایمر ۱۶بیتی به مقدار حداکثر خود رسید و با یک کلاک صفر شد، نیاز است CPU اطلاع حاصلکند که تایمرOVER FLOW شدهاست. تا قبلاز این مقدار CPU هیچگونه دخالتی در جریان این کار ندارد و به انجام کارهای دیگری میپردازد. پساز رسیدن تایمر به مقدار مشخص فلگ مربوطبه فضای I/O یک میشود و اگر مجوز وقوع وقفه وجود داشتهباشد وقفه ایجاد میشود و توسط CPU به آدرس مربوطه پرش ایجاد میکند و برنامه موردنظر اجرا میشود. یا بهوسیله روش polling یا مراجعه مکرر CPU به بیت مشخص، از تغییرات آن اطلاعحاصلکند. درنتیجه پی میبریم که وجود تایمرها باعث میشود بخشی که مربوطبه زمانبندی و یا شمارش باشد بهجای انجام در CPU به تایمرها محولشود و بار پردازشی CPU کمترشود. در قسمت دهم آموزش میکروکنترلر AVR به شیوه استفادهاز تایمرها و جزئیات آنها و همچنین وقفهها میپردازیم. با ما همراه باشید.
منبع: سیسوگ