تایمر/کانتر صفر به صورت 8 بیتی است و حالت تایمر، کلاک خود را از کلاک اصلی سیستم و یا تقسیمی از آن می گیرد و در حالت کانتر، کلاک آن از بیرون و از طریق پایه T0(Portb.0) تامین می کند.
هنگامی که از تایمر/کانتر صفر در مدهای تولید موج مربعی (PWM or CTC) استفاده می شود پایه Portb.3 به نام Oc0 محل ظاهر شدن موج مربعی بر روی آن خواهد بود.
پیکر بندی تایمر/کانتر صفر به صورت تایمر
Config timer0 = timer , prescal=1|8|64|256|1024
در این حالت کلمه پیکر بندی به صورت بالا نوشته می شود و ضریب پیش تقسیم کننده می تواند یکی از حالت های 1 یا 8 یا 64 یا 256 یا 1024 انتخاب گردد.
در حالت 1 می توان برای محاسبه تاخیرهای زمانی کوتاه استفاده نمود اما برای تاخیرهای زمانی طولانی از 1024 به عنوان پیش تقسیم کننده استفاده می شود.
زمانی که تایمر شروع می شود با آخرین مقدار قرار داده شده در ثبات Tcnt0 یا timer0 شروع به شمارش می کند و با وقوع سر ریز (رسیدن به FF و صفر شدن مجدد) پرچم Ovf0 را یک می کند. ضمنا از دستور start timer برای راه اندازی و شروع شمارش و از دستور stop timer برای توقف تایمر می توان استفاده نمود.
همچنین در صورتی که وقفه سراسری فعال نموده باشیم و وقفه سر ریز تایمر نیز فعال شده باشد، تایمر به محض وقوع سر ریز، وقفه نیز خواهد داد و زیر برنامه مربوط به وقفه اجرا خواهد شد.
برای فعال نمودن وقفه سر ریز تایمر می توان از دستور Enable ovf0 استفاده نمود. و برای مشخص نمودن آدرس زیر برنامه وقفه از دستور On ovf0 L1 که L1 برچسب زیر برنامه وقفه می باشد، استفاده می شود.
پیکر بندی تایمر/کانتر صفر به صورت کانتر
Config timer0 = counter , Edge=rising|falling
در این پیکر بندی، تایمر/کانتر صفر به صورت کانتر استفاده می شود و شمارش از طریق کلاک اعمال شده به پایه T0 صورت می گیرد.
با انتخاب falling اعمال هر لبه پایین رونده به پایه T0 باعث افزایش مقدار شمارنده و با انتخاب rising، اعمال هر لبه بالا رونده به پایه T0 باعث افزایش مقدار شمارنده می شود.
نکته: چه در حالت تایمر و چه در حالت کانتر می توان در حین کار از مقدار تایمر/کانتر مطلع شد بدین صورت که مقدار Tcnt0 یا timer0 را در صورت نیاز در هر لحظه می توان در یک متغییر ذخیره نمود بدون آنکه لطمه ای به شمارش تایمر/کانتر بزند.
مثال:
می خواهیم یک LED که به پایه porta.0 وصل است را با فواصل زمانی 250ms روشن و خاموش کنیم و فرکانس داخلی میکرو را بر روی 1MHz تنظیم می کنیم.
برای این کار باید فرکانس کاری میکرو که 1MHz است را بر 1024 تقسیم کنیم که تقریبا 1ms می شود حال باید مقدار تایمر را به گونه ای انتخاب کنیم که بعد از 250 بار شمارش، سر ریز شود تا پرچم سر ریز تایمر 1 شود و سپس پایه مربوط را toggle می کنیم.
$regfile=”m32def.dat” $crystal=1000000 Config porta.0=output Config timer0=timer , prescale=1024 L2: Timer0=6 Start timer0 L1: If ovf0=0 then goto L1 Ovf0=0 Toggle porta.0 Goto L2
این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست بهروزرسانیهای سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال میشیم به ما اطلاع بدهید.