در قسمت دهم آموزش میکروکنترلر AVR به بررسی شیوه استفاده از تایمرها و جزئیات آنها و همچنین، وقفهها پرداختیم. در این قسمت از آموزش AVR، تایمر کانترها و عملکرد تایمر کانتر شماره صفر در ATMEGA32 را بررسی خواهیم کرد.
تایمر کانتر 0
در این خانواده، تایمر کانتر شماره صفر، هشت بیتی هست. (اغلب در شمارههای مختلف AVR، شماره صفر تایمر کانترها، هشت بیتی هستند). رجیستر تایمر کانتر صفر رجیستری هست که محتویات تایمر کانتر را که تحت کلاک نمودار آن تغییر میکند، نگهداری میکند.
مقدار رجیستر OCR0 بهصورت دائمی با تایمر کانتر صفر و با محتویات آن مقایسه میشود و در صورت برابری میتواند منجر به یک شدن فلگ OCF0 شود. در قسمت قبل درمورد این موارد توضیح داده شد، سرریز و شرایط اُورفِلو منجر به یک شدن این فلگ میشود.
دو بیت پایین (در دقیقه ۱:۲۰ ویدئو) که در قسمت قبل توضیح داده شد، بیتهای مجوز وقفه هستند که در صورت یک بودن هر کدام از این بیتها و یک بودن فلگ i که مجوز وقفه سراسری هست، آن وقفه اتفاق میافتد و روتین وقفه که توسط برنامهنویس نوشته میشود، اجرا میشود و وقفه پاسخ داده میشود.
رجیستر TCCR0
در این قسمت از آموزش AVR، رجیستری تحت عنوان TCCR0 بررسی خواهد شد که این رجیستر تعیینکننده مد عملکرد تایمر کانتر صفر هست. همچنین، اعدادی که در آن نوشته میشود، تعیینکننده نحوه عملکرد این تایمر کانتر و نوع تأثیری هست که تایمر کانتر روی سختافزار دارد که در ادامه این قسمت توضیح داده میشود.
ابتدا، سه بیت CS00 و CS01 و CS02 را بررسی میکنیم. این سه بیت تعیینکننده منبع کلاک تایمر کانتر هستند که هشت وضعیت را شامل میشود که اینجا نمایشدادهشده است. اگر مقدار این سه بیت صفر باشد که بهصورت پیشفرض صفر است، کلاکی به تایمر کانتر وارد نخواهد شد؛ بنابراین تایمر کانتر متوقف است. اگر مقدار یکدهم (۰.۱) قرار بگیرد، کلاک I/O و سایر تقسیمات آن یعنی ۸، ۶۴، ۲۵۶ و ۱۰۲۴ بر حسب مقادیر بعدی، این امکان را دارند که به تایمر کانتر شماره صفر اعمال شوند.
دو وضعیت دیگر وجود دارد: پین شماره یک در ATMEGA32 که نام دیگر آن T0 است. پورت B پین شماره صفر، یکی از وظایف آن عملکرد به عنوان T0 هست که T0 آن پینی است که امکان وارد شدن کلاک به تایمر کانتر صفر را از بیرون فراهم میکند. اگر در مقدار ۰ـ۱ـ۱، این سه بیت قرار بگیرد، لبه پایین رونده T0 منجر به عملکرد تایمر کانتر و وارد شدن کلاک به تایمر کانتر خواهد شد و وضعیت آخر هم لبه بالارونده است. (فلش هایی که به سمت پایین و بالا کشیده شده اند، لبه پایین رونده و لبه بالارونده هستند.) پس هشت وضعیت توسط این سه بیت تامین می شود که در یک وضعیت هیچ کلاکی به تایمر کانتر وارد نمی شود. در ۵ وضعیت، کلاک IO یا تقسیم شده های آن و در دو وضعیت کلاکی از بیرون مجموعه میکروکنترلر وارد می شود و در این حالت تایمر کانتر به عنوان یک کانتر یا ایونت کانتر عمل خواهد کرد.
این سه بیت (دقیقه ۴:۲۵ ویدئو) تعیینکننده وضعیت منبع کلاک هستند.
به این نکته توجه کنید که در جدولی که در ویدئو کشیده شده است، (دقیقه ۴:۴۰ ویدئو) اگر ایندکس 00 و 01 را درنظر بگیریم، مرتبه آن ها در این رجیستر، نسبت به قرار گرفتن در این جدول متفاوت است؛ یعنی ایندکس 01 عملا دارای ارزش مکانی پایین تری است.
دراینخصوص، باید مراقب باشید، نامگذاری ای که شرکت اتمل بهاینترتیب انجام داده است، شما را بهاشتباه نیندازد. این دو بیت که چهار مد عملکرد رو برای تایمر کانتر صفر تأمین میکند، شامل مدهای NORMAL, Phase correct PWM, CTC و Fast PWM هستند که در ادامه به توضیح آنها خواهیم پرداخت.
مد نرمال
مد نرمال وضعیتی است که تایمر از مقدار صفر شروع به شمارش میکند و به مقدار FF میرسد و مجدداً صفر میشود. زمانی که تایمر در حداکثر مقدار خود قرار میگیرد که حداکثر مقدار آن FF هست، اگر یک کلاک دیگر به آن وارد شود، مقدار آن از FF به 00 می رسد.
باید به این نکته اشاره کنیم که اگر مقدار تایمر کانتر در FF قرار داشته باشد، اُورفِلو و سرریزی اتفاق نخواهد افتاد؛ در آن لحظه تا زمانی که کلاک بعدی وارد نشود و همزمان با 00 شدن مقدار تایمر کانتر، فلگ اُورفِلو در TIFR یک خواهد شد. توجه داشته باشید که رسیدن به حداکثر مقدار باعث یک شدن این فلگ نخواهد شد؛ بلکه گذر از حداکثر این مقدار یعنی زمانی که از این مقدار عبور کنیم و به صفر برسیم، شرایط سرریز را ایجاد می کند.
حداکثر کلاکی که لازم است که یک سیکل تایمر طی شود، 256 کلاک هست. همین طور، یک نکته ای در رابطه با OCR0 هست که بعد از اینکه بقیه مدها را توضیح دادیم، به آن اشاره میکنیم. پس حداکثر مقدار اینجا FF هست یا 255.
مد CTC
اکنون CTC را بررسی میکنیم، CTC مخفف clear timer counter یا clear timer on comple mach است؛ به این معنی که حداکثر مقدار تایمر کانتر FF نخواهد بود؛ بلکه رجیستر OCR0 خواهد بود که دائماً در حال مقایسه با تایمر کانتر هست؛ یعنی این مقدار در وضعیت CTC برابر خواهد بود با OCR0 و بعد از رسیدن به OCR0، صفر خواهد شد؛ باتوجهبه اینکه OCR0 میتواند یک مقدار متغیر باشد، بنابراین حداکثر مقدار تایمر کانتر در این مورد، یک مقدار متغیر هست؛ درحالیکه در بقیه موارد، عدد 255 است.
در جدول موردنظر، در این ستون ملاحظه میکنید (دقیقه ۹ ویدئو) که نوشته شده فوراً و فوراً؛ درحالیکه در دو سطری که مربوط به مدهای PW هست، مقدار OCR0 بهصورت فوراً نوشته نشده است. دراینخصوص، باید بگوییم که اگر در زمان عملکرد تایمر کانتر، مقدار OCR0 توسط خطوط نرمافزار تغییر کند، در مد اول که نرمال است و مد CTC فوراً مقدار OCR0 اعمال میشود؛ بهعبارتدیگر، فوراً در محل رجیستر OCR0 نوشته میشود. اما در مدهای PWM این اتفاق نخواهد افتاد؛ یعنی در یک مکان مشخصی از شمارش تایمر مقدار OCR0 آپدیت خواهد شد.
اما دلیل این امر چی هست؟ دلیل آن، این است که در مدهای PWM که معمولاً برای ایجاد شکل موجهایی روی پین خروجی به کار میروند یا روی پینهای خروجی به کار میروند، اگر مقدار OCR0 یا سایر OSRها در تایمر کانترهای دیگر در زمانی غیرمشخص تغییر کند، ممکن است شکل موجهایی ناخواسته در خروجی ایجاد کند؛ بنابراین در مدهای PWM همیشه آپدیت شدن مقدار آن کامپر رجیستر در یک وضعیت مشخصی از شکل موج هست و اگر قرار باشد، مثل مد CTC یا مد نرمال بخواهد فوراً تغییر کند، میتواند منجر به ایجاد شکل موجهایی در خروجی شود که ناخواسته هست و از نظر تولید شکل موج، مدنظر برنامهنویس نیست.
یک نکته دیگر در مورد OCR0 و استفاده از CTC، این است که در کاربردهایی که ما یکزمان دقیق یا یک تولید زمان بدون خطایی ناشی از نرمافزار مدنظرمان هست، معمولاً باید در برنامهنویسی، از مد CTC استفاده کنیم. زیرا اگر بخواهیم از مد نرمال در برنامهنویسی استفاده کنیم، با فرض اینکه برای ساخت زمان موردنظر بهصورت خیلی دقیق، باید از یک مقدار مشخصی بهجای مقدار صفر استفاده کنیم، چون حداکثر مقدار در مد نرمال 255 است؛ بنابراین اگر بخواهیم یک زمان مشخصی تولید کنیم، باید از یک مقدار مشخصی شروع شود و به یک مقدار حداکثر برسد.
هنگامی وقفه ای در مقدار 00 ایجاد می شود و آن مقدار مشخص توسط نرم افزار، مقدار دهی می شود که این یک مقدار دقیق باشد. در این خصوص، در سطح برنامه نویسی اسمبیلی و با حساب کردن تک تک دستورالعمل ها، آن تاخیری که ناشی از مقداردهی به مقدار تایمر کانتر هست، باید محاسبه شود و در مقداردهی لحاظ شود. یعنی مدت زمانی که طول می کشد تا این مقدار به حداکثر خود برسد، از زمانی که صفر می شود تا وقفه ایجاد و وارد روتین وقفه شود و یک جهشی در این مقدار ایجاد شود، به صورت نرم افزاری برای مقداردهی ثبت می شود؛ این مدت زمان، می تواند در برنامه نویسی خطا ایجاد کند؛ مگر اینکه ما طول تک تک دستورالعمل ها را حساب کنیم و این را در مقدار اولیه لحاظ کنیم که این کار را نمی توان در برنامه نویسی های لول و آنچه که مدنظر ما است، انجام داد.
بنابراین، از مد CTC استفاده میکنیم. بهاینترتیب که مقدار اولیه تایمر کانتر صفر هست و مقدار نهایی آن هم مشخص هست؛ در این صورت، این خطایی که پیشتر گفته شد، به وجود نمیآید؛ یعنی تایمر کانتر همواره از مقدار صفر شروع به حرکت میکند و سپس به OCR0 و میرسد و مجدداً صفر میشود و به همین روال ادامه دارد.
پس باتوجهبه اینکه در تایمر کانتر برای مقدار ابتدا و انتها، زمانی مصرف نمیشود و بهصورت سختافزاری این کار انجام میشود، حتی اگر وقفهای ایجاد شود و با تأخیر این وقفه انجام شود، این تأخیر همواره مساوی است؛ یعنی همیشه با یک تأخیری نسبت به حرکت OCR0 به صفر، آن وقفه اجرا میشود؛ بنابراین خطایی ایجاد نمیشود.
پس به این نکته توجه کنید که برای ساخت زمانهای دقیق باید بهجای مد نرمال از مد CTC استفاده کنیم. این یک روش است که باید در برنامهنویسی برای جلوگیری از ایجاد خطا، اجرا میشود.
مدهای PWM
بحث بعدی مدهای PWM است. در مدهای PWM، در مد fast PWM همان روال موج دندانارهای و در Fhese Correct PWM موج مثلثی اجرا خواهد شد. همانطور که گفته شد، مقداردهی به رجیستر OCR0 در این دو مد (دقیقه ۱۵:۱۵ ویدئو) در لحظات خاصی از شکل موج اتفاق میافتد. اگر فرض کنیم که به OCR0 توسط نرمافزار مقدار داده شود، تا زمانی که مقدار آن به حداکثر نرسد، شکل موج آن مقدار اعمال نخواهد شد.
در اینجا ممکن است یک سؤال مطرح شود که چه تفاوتی بین fast PWM و مد نرمال وجود دارد؟ یک مورد را که توضیح دادیم. تفاوت دیگر در نوع شکل موج است. ممکن است در اینجا یک سؤال مطرح شود که اُورفِلو در این حالت به چه معنی است. ما در اینجا سرریز به آن معنا نداریم. بلکه مقدار آن به FF میرسد و مجدداً صفر میشود؛ ولی اینجا زمانی که مقدار آن به FF (255) میرسد، با کلاک بعدی مقدار آن، ۲۵۴ خواهد شد.
پس نوع تعریف سرریز در اینجا، متفاوت است؛ بهاینترتیب که استثنائاً سرریز در این محل تعریف میشود و ملاحظه میکنید که در این جدول هم نوشته شده است (دقیقه ۱۷ ویدئو) که در حداقل مقدار خودش و در پایین شکل موج overflow اتفاق خواهد افتاد؛ یعنی کلاک که وارد میشود، از صفر تا ۲۵۵ حرکت میکند.
زمانی که مقدار تایمر کانتر از یک به صفر میرسد، فلگ اورفلو یک خواهد شد. در این حالت، یک نکته وجود دارد که باتوجهبه اینکه در مد نرمال، بین دو اورفلو متوالی، ۲۵۶ سیکل طول میکشد، مثلاً اینجا، ۵۱۰ کلاک یعنی ۲۵۵ برای از صفر تا ۲۵۵ و دوباره ۲۵۵ کلاک برای ۲۵۵ به صفر. پس حداکثر زمانی که تایمر میتواند در مد Fhese Correct PWM تولید کند، ۵۱۰ کلاک است. پس از این طریق میتوان زمانهای بزرگتری تولید کرد.
مورد بعدی بحث تولید شکل موج توسط مدهای PWM است. البته توسط مدهای غیر PWM هم این شکل موج میتواند تولید شود که هر دوی این موارد توسط این دو بیت مهم (دقیقه ۱۸:۲۳ ویدئو) قابلتعریف است. این دو بیت چهار وضعیت میتواند تولید کند.
تفکیک مدهای PWM و غیر PWM
در اینجا یک تفکیکی بین مدهای غیر PWM و مدهای PWM ایجاد میشود. در اینجا، دو مد غیر PWM وجود دارد: مد نرمال و مد CTC. همچنین، دو مد PWM وجود دارد: مد Fhese Correct و fast PWM. به این نکته توجه کنید که رجیسترهای مختلف یک مقدار پیشفرض دارند که در دیتاشیت ذکر شده است و ما همیشه باید توجه کنیم که مقدار پیشفرض هر رجیستری چه عددی است. در مدهای غیر PWM وضعیت 00 که مقدار پیش فرض هست، به این معنی است که هیچ شکل موجی ایجاد نخواهد شد؛ اکنون ممکن است این سوال مطرح شود که شکل موج در کجا و چه محلی است؟ پاسخ این است که در ATMEGA32 اگر از صفر شماره گذاری کنیم، پین شماره چهار، pb3 خواهد شد. pb3 که پین شماره چهار میکروکنترلر است، به نام OC0 خوانده میشود و پینی است که برای تولید شکل موجها توسط تایمر کانتر شماره صفر برای این خانواده پیش بینی شده است.
اگر مقدار 00 در این دو بیت قرار گیرد، روی OC0 شکل موجی ایجاد نخواهد شد. به این نکته هم باید اشاره کنیم که برای اینکه شکل موج روی OC0 تولید شود، حتماً باید جهت پین قبل از آن به صورت خروجی تعریف شود؛ یعنی باید در رجیستر DDRB، پین متناظر با pb3 یک شده باشد تا از قبل، امکان ایجاد هر نوع شکل موجی ایجاد شود.
اگر این دو بیت در وضعیت 01 باشند، هر نوع برابری مقدار تایمر کانتر با رجیستر OCR0 منجر به تاگل شدن یا نات شدن این بیت خواهد شد. موارد گفته شده مربوط به مدهای غیر PWM یعنی مد نرمال و CTC است؛ یعنی هر بار برابری منجر به شکل موجی خواهد شد که دائماً تاگل می شود.
set شدن به چه معناست؟
در قسمتهای قبلی این آموزش، به عبارت set اشاره کردیم و گفتیم که رجیستر set میشود و ممکن است این برداشت شده باشد که صفر میشود، اما set شدن به معنای یک شدن است.
اگر پین OC0 در وضعیت 01 باشد، clear خواهد شد؛ یعنی مقدار آن، صفر خواهد شد و صفر هم خواهد ماند.
اکنون ممکن است این سؤال پیش بیاید که کاربرد این چیست؟ از جمله کاربردهایش این است که با یک برابری، پین بهصورت سختافزاری و توسط تایمر کانتر بهصورت مستقل صفر میشود؛ مثلاً وقفهای طراحی شود که در آن، ادامه کار پیگیری شود و set شدن هم به معنا این است که اگر مقدار صفر باشد، یک خواهد شد و اگر یک باشد، همان یک خواهد ماند.
در هر صورت، این وضعیت عملکرد مد غیر PWM روی پین OC0 است. بر اساس وضعیت این دو بیت، ادامه این بحث را در قسمت های بعدی بررسی خواهیم کرد.
در قسمت دوازدهم آموزش میکروکنترلر AVR، به ادامه بررسی تایمر 0 در ATMEGA32 با جزئیات بیش تر، خواهیم پرداخت. با سیسوگ همراه باشید.
سری مقالات آموزش میکروکنترلر AVR توسط آقای مهندس کینژاد تهیه شده است.