آموزش میکروکنترلر AVR
در قسمت نهم آموزش میکروکنترلر AVR به stack یا پشته و مقدمهای بر تایمرها و کانترها پرداختیم، در این جلسه از آموزش میکروکنترلر AVR به شیوه استفادهاز تایمرها و جزئیات آنها و همچنین وقفهها میپردازیم.
تایمرها:
در خانواده AVR تایمرها به دوصورت ۸ و ۱۶بیتی وجود دارند. تعداد تایمرها در هر میکروکنترلر بسته به شماره آن متفاوت است، مثلاً در ATTINY12 فقط یک تایمر ۸بیتی و در ATMEGA2560 دو تایمر ۸بیتی و ۴تایمر ۱۶بیتی وجود دارد.
عملکرد تایمرها را براساس نمودارهای آنها بررسی میکنیم:
نوع اول:
عملکرد این نوع تایمر به اینصورت است که از صفر شروعبه افزایش میکند تا به مقدار مشخصی برسد و مجدداً صفر میشود.
نوع دوم:
عملکرد این نوع تایمرها مانند نوع اول است. با این تفاوت که نوع اول شبیه موج دندانه ارهای عمل میکند ولی نوع دوم شبیه موج مثلثی است.
صرفنظر ار نوع عملکرد، منبع کلاک تایمر کانترها میتواند ازطرق مختلفی تأمین شوند.
اگر کلاکی که سختافزارهای اطراف CPU مانند تایمر کانترها و… را تأمین میکند، کلاک I/O نام گذاری کنیم، رابطه “CLK I/O) / N)” میتواند یکیاز منابع تأمینکننده برای کلاک تایمر کانترها باشد. با تنظیمات رجیستر مربوطبه تعیینکننده نوع کلاک میتوان مقدارN را به یکیاز مقدار های ۱، ۸، ۶۴، ۲۵۶ و ۱۰۲۴ تغییر داد.
این سوال پیش میآید که N بر چهمبنایی تعیین میشود؟
پاسخ این سوال را با ذکر یک مثال توضیح میدهیم.
یک تایمر ۸بیتی برای طی یک سیکل حداکثر ۲۵۶کلاک لازم دارد(۲۵۵ کلاک از صفر تا ۲۵۵ و یک کلاک از ۲۵۵ تا صفر). اگر یک کلاک ۱MHZ که ازطریق فیوزبیت تنظیمشدهاست درنظر بگیریم، طول هر کلاک ازنظر زمانی ۱میکروثانیه است و حداکثر مقداری که یک تایمر کانتر ۸بیتی برای رسیدن از ۰ به ۲۵۵ میتواند تأمینکند و دوباره به صفر برسد ۲۵۶میکروثانیه است. حال اگر در کاربردهای مختلف مقدار ۲۵۶میکروثانیه کافی نباشد با قراردادن N روی مقادیر بزرگتر به این نتیجه میرسیم.
برای مثال اگر N را ۸ قرار دهیم، حداکثر این زمان ۸*۲۵۶ میکروثانیه خواهد شد، که بیشترین مقدار بافرض کلاک ۱MHZ برابر ۱۰۲۴*۲۵۶میکروثانیه است.
محاسبات براساس زمان و طول تایمر باید انجامشود. حداکثر زمان برای طی یک سیکل در تایمر ۱۶بیتی مقدار ۶۵۵۳۶کلاک است. بنابراین برای ساخت زمان موردنیاز، برحسب ظرفیت ۸ یا ۱۶بیتی و مقدار کلاک I/O عمل میکنیم.
اگر مقدار CLK I/O=۸MHZ باشد، زمان سپریشدن تایمر از ۰ تا ۲۵۵ و مجدداً به ۰ با سرعت ۸برابر انجام میشود.
درشرایطیکه کلاک تایمر کانتر از یک مقدار مشخصی مانند CLK I/O تأمین میشود، میتوان نام TIMER را برای آن گذاشت، زیرا زمانیکه کلاک یک تایمر کانتر مشخص باشد، از تغییرات مقدار آن میتوان زمان را اندازهگیری کرد.
در شرایطدیگر اگر کلاک میکروکنترلر از بیرون میکروکنترلر تأمینشود به آن COUNTER میگویند.
در حالتسوم که در برخی تایمر کانترها موجود است، این امکان وجود دارد که یک کریستال ۳۲۷۶۸ هرتز که کریستال ساعت نامیده میشود، به پینهای خاصی متصل شود و اسیلاتوری فعال شود که آن اسیلاتور تأمین کننده منبع کلاک است.
در شمارههای مختلف این مسأله متفاوت است، مثلاً در ATMEGA32 تایمر۲ و در ATMEGA64 تایمر۰ این امکان را فراهم میکند.
CPU به چهطریق میتواند از تایمر کانترها استفادهکند؟
روش اول:
خواندن مقدار تایمر کانتر است. نامگذاری مقدار تایمر کانترها بهصورت TCNT است. مثلاً برای تایمر کانتر ۰ که ۸بیتی است باید TCNT0 نوشتهشود و در تایمر کانترهای ۱۶بیتی ۲بایت اختصاص داده میشود و بهصورتزیر نوشته میشوند:
TCNT1L
TCNT1H
این دو، یک بایت در همان فضای I/O که در جلساتقبل توضیحدادهشد هستند و راه ارتباط با CPU ازطریق همین فضا انجام میگیرد.
روال خواندنو نوشتن در رجیسترهای ۱۶بیتی بدینصورت است که برای نوشتن ابتدا high byte و سپس low byte نوشته میشود و برای خواندن عکس این عمل انجام میشود. این کار در سطح برنامهنویسی اسمبلی انجام میشود.
از آنجاییکه تغییرات تایمر کانتر سریع است، در زمانهایی که اندازهگیری زمان و دقتبالا موردنظر باشد، خواندن این مقدار بهصورت نرمافزاری میتواند خطاهایی را ایجادکند، بنابراین امکانی در خانواده AVR تحت عنوان capture کردن تایمر پیشبینی شدهاست. عملکرد capture به اینصورت است که تحت فرمان یک پین بیرونی نمونهای از یک تایمر ذخیره میشود.
روش دوم:
ارتباط CPU با تایمر کانتر این است که توسط خطوط برنامه یک پین خارجی مربوطبه تایمر کانترها فعالشود و سپس یک نمونه از آن در محلمشخصی ذخیرهشود و CPU از این نمونه اطلاع حاصلکند و براساس آن تصمیمگیری کند.
(TIFR (TIMER INTERRUPT FLAG REGISTER:
یکیاز رجیسترهای مهم در ATMEGA32 رجیستر TIFR است. عملیات مختلف در تایمر میتواند باعث یکشدن در بیتهای آن شود. به این بیتها اصطلاحاً Flag گفته میشود.
TOV0 | OCF0 | TOV1 | OCF1B | OCF1A | ICF1 | TOV2 | OCF2 |
(TOV0 (TIMER OVER FLOW: سرریز تایمر شماره صفر
سرریزشدن تایمر شماره صفر منجربه یک شدن یک بیت میشود. همچنین در این رجیستر بیتهای متناظر با این عبارتند از : TOV1 , TOV2
ICF1:
اگر عملیات CAPTURE اتفاق بیفتد این Flag یک خواهد شد. به اینترتیب راهدوم ارتباط CPU با تایمر و اطلاع CPU از وضعیت تایمر ازطریق این رجیستر است، یعنی بهجایاینکه CPU مقدار تایمر را قرائت کند مقدار این Flag ها را بررسی میکند.
روش سوم:
صادرشدن مجوز وقفه درقبال ۱ شدن Flag مربوطه است.
TIFR
TOV0 | OCF0 | TOV1 | OCF1B | OCF1A | ICF1 | TOV2 | OCF2 |
TIMSK
TOIE0 | OCIE0 | TOIEI | OCIEB | OCIEA | TICIEI | TOIE2 | OCIE2 |
بیتهایی که در این تایمر هستند هرکدام که یک شوند، به معنای مجوز ایجادوقفه درصورت یکشدن Flag متناظر در بایت بالا است.
برای مثال اگر TOIE0=1 باشد هرزمانی که TOV0 یک شود، درصورت وجود مجوز وقفهکلی، یک وقفه تایمر یا OVERFLOW0 ایجاد میشود. در اینصورت روند اجرای برنامه متوقف میشود و پرشی در برنامه به آدرسی مشخص در حافظه انجام میشود.
حال میخواهیم براساس وقفه از تایمرصفر استفادهکنیم:
در ابتدا منبع کلاک تایمر را مشخص میکنیم و توسط خطوط اجرای برنامه مقدارمناسبی به آن میدهیم. بهصورت پیشفرض مقدارتایمر صفر است.
در مرحلهبعدی مجوز وقفه را بهصورت محلی یک میکنیم، یعنی TOIE0=1 و در انتها Flag I که در Status register توضیحدادهشد را برابر یک قرار میدهیم.
در این شرایط اگر TOV0 یک شود، پرشی به آدرس متناظر با تایمر صفر در حافظه FLASH ایجاد میشود و برنامههای که در آنجا نوشتهشده اجرا میشود.
تا قبلاز اجرای وقفه فلگ TOV0 یک است. اگر وقفهای ایجادشود، بهصورتخودکار بعداز پرش به آدرس مشخص، فلگ TOV0 پاک میشود.
به دو روش این Flag میتواند صفر یا پاک شود:
- اگر وقفه ایجاد شود و پرشی به آدرس آن وقفه انجامشود.
- به روش نرمافزاری برای پاککردن Flag باید روی آن یک بنویسیم(اگر روی Flag که مقدار آن ازقبل یک باشد، مجدداً یک بنویسیم مقدار آن برابر صفر میشود.)
آنچه در بیت پایین مشخص است مجوز وقوعوقفه است و آنجه در بیت بالایی مشخص است Flag است که CPU توسط آن میتواند از مقدار تایمر اطلاع پیدا کند.
مجوز وقوع وقفه CAPTURE ، بیت TICIEI است.
مقدار تایمرها بهصورت دائمی با رجیسترها میتواند مقایسه شوند. یک مقایسهکننده را درنظربگیرید که مقدار ۸ یا ۱۶بیتی تایمر کانتر را بهصورت دائمی با رجیستر ۸یا ۱۶بیتی مقایسه میکند. اگر تساوی برقرارشود میتواند منجربه یک شدن Flagهای OCF0 ,OCF1A ,OCFAB ,OCF2A شود. در ATMEGA32، تایمر۱ دو مقایسه کننده ۱۶بیتی وجود دارد. که بهصورتدائمی با مقدار تایمر ۱ مقایسه میشوند. اگر این دو ورودی باهم برابر شود خروجی Flag برابر ۱ میشود.
اگر تایمر کانترها تحت شرایطی پینهای بهخصوصی را high و low کنند، به این تولید شکل موج گویند. یعنی تحت برنامه کانتر تایمرها تنظیمشوند و زمانی که مقایسهکننده با پین موردنظر برابر شد پین ۱ شود.
از آنجاکه تایمرها از اهمیت بالایی برخوردار هستند در قسمتهای آتی بطور مجزا راجب تایمر۰ و تایمر۱ صحبت خواهیمکرد. در قسمت یازدهم آموزش میکروکنترلر AVR، تایمر۰ در ATMEGA32 را با جزئیات بیشتری بررسی میکنیم. با ما همراه باشید.
منبع: سیسوگ