در فایل اصلی برنامه قبل از اعلان کتابخونه delay باید CoreClock رو مقدار بدین.
کد:
#define CoreClock 60000000
#include "delay.h"
این عدد فرکانس cpu هست نه کریستال.
تابع delay_ms
کد:
void delay_ms(unsigned long t)
{
unsigned long cnt;
do
{
for(cnt=0;cnt<(CoreClock/8000);cnt++);
t--;
}
while(t>0);
}
تابع delay_ms که مشکل خاصی نداره و برای دقت بالاتر میشه عدد 8000 رو مقدار کمی کم و زیاد کرد.
بحث اصلی سر تابع delay_us هست.
کد:
void delay_us(unsigned long t)
{
unsigned long cnt;
#if CoreClock==60000000
for(cnt=0;cnt<7;cnt++);
cnt++;
for(;t>1;t--)
{
for(cnt=0;cnt<9;cnt++);
cnt++;cnt++;cnt++;
}
#endif
}
وقتی تابع فراخونی میشه و متغیر cnt معرفی میشه و هنگام برگشت از تابع، مقداری از زمان پردازنده استفاده میشه. جمع این زمانها و زمان صرف شده در حلقه ی For اول میشه 1 میکرو ثانیه. حلقه ی for دوم هم که فقط برای تاخیرهای بزرگتر از 2 میکروثانیه اجرا میشه، بقیه تاخیرها رو ایجاد میکنه. این همون نکته ی دقیق بودنه. علاوه بر اینا cnt++ هم برای دقیقتر کردن زمان تاخیر استفاده میشه.
نحوه ی کالیبره کردن برای فرکانسهای دیگه هم بعدا میگم