ایجاد تاخیر ۱ ثانیه با استفاده از چک مداوم در تایمر صفر محتوای پوشه (TimersTimer 0 (8bit)1sec delay chek)

تمامی مراحل مربوط به محاسبات تایمر دقیقا شبیه به مثال قبلی می باشد. اما منظور از چک مداوم چیست؟ در اینجا چون ما از وقفه استفاده نکرده ایم باید میکروکنترلر را وارد یک حلقه بینهایت کنیم و تنها شرط خروج از این حلقه را یک شدن پرچم سریز، تایمر صفر قرار دهیم. اما در این حلقه بینهایت چه مسائلی باید توسط برنامه نویس رعایت شود!
void delay_1s(){
for(c=0; c<=250; c++){
CCR0=0x03;
TCNT0=0x06;
OCR0=0x00;

while(!(TIFR & 0x02)){//wait for 1s
//other program with out delay
};
TCCR0=0x00; //timer0 off
TIFR|=0x02; //default flag timer0 ==> change to 1
}
}

برای راحتی کار ما مراحل ایجاد مدت زمان ۱ ثانیه را در یک تابع به نام delay_1s برنامه نویسی میکنیم. در مثال قبلی ما با استفاده از دستور if مقدار c را برای ۲۵۰ شدن برسی می کردیم ولی در اینجا با کمک یک حلقه for این شمارش را انجام می دهیم. ابتدا تایمر را روشن میکنیم و بعد از اتمام نیز آن را خاموش می کنیم، تنها نکته آن در درحلقه بینهایت می باشد یعنی TIFR، همانطور که می دانیم این رجیستر مربوط به پرچم های تایمرهای ۰ و ۱ و۲ میکرو می باشد، یعنی در هر کدارم از تایمر ها که سریز شمارش رخ دهید در این رجیستر بیت مربوطه آن یک می شود. حال در تایمر صفر پرچم سرریز تایمر صفر بیت دوم می باشد که مقدار آن ۰۲ می شود. با استفاده از دستور AND بیتی یعنی TIFR & 0x02 تنها بیت دوم رجیستر TIFR یعنی (TOV0) مورد برسی قرار میگیرد و در صورتی که این بیت یک شود طبق شرط حلقه ! مخالف آن یعنی صفر است و حلقه شکسته خواهد شد. اما در صورتی که بیت TOV0 صفر باشد ! مخالف آن یک می شود و حلقه ادامه می یابد. بعد از حلقه بینهایت تایمر را خاموش می کنیم و رجیستر TIFR‌را OR بیتی می کنیم یعنی تنها بیت TOV0 صفر خواهد شد و دستور بر روی مابقی بیت ها تاثیری نخواهد داشت.

نکته: بیت TOV0 در هنگام فعال بودن وقفه بعد از رخ دادن وقفه و یک شدن آن به صورت اتوماتیک صفر خواهد شد. اما در حالت چک مداوم باید توسط برنامه نویس این بیت صفر شود تا تایمر برای سرریز بعدی آماده باشد.