# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > AVR >  مشکل delay در چراغ چشمک زن

## javady_joon

سلام 
من با کد ویژن یه برنامه چراغ چشمک زن نوشتم 
و هرعددی رو بریا delay_ms میدم
اصلا برای delay اهمیتی قائل نیست و باز همون آهنگ خاموش روشن شدن خود رو دنبال میکنه
ممنون میشم کمک کنید اینم سورس

#include <mega16.h>
#include <delay.h>

 void main ()
{
PORTA=0x00;
DDRA=0xFF;
for(;;)
{
if(PORTA.0==0)
{
PORTA.1=1;
delay_ms(5);
}
if(PORTA.1==1)
{
PORTA.0=0;
}
if(PORTA.1==0)
{
PORTA.0=1;
delay_ms (5);
}
}
}

----------


## مهدی کرامتی

فکر می کنم فیوز بیت ها رو موقع پروگرام کردن بردتون ست نکرده اید.

شما میبایست با ست کردن فیوزبیت ها مشخص کنید که میکروکنترلر از اسیلاتور داخلی استفاده کند یا از اسیلاتور متصل به میکرو بر روی برد (اگر چنین قطعه ای در مدارتان وجود دارد).

----------


## farzadsw

> سلام 
> من با کد ویژن یه برنامه چراغ چشمک زن نوشتم 
> و هرعددی رو بریا delay_ms میدم
> اصلا برای delay اهمیتی قائل نیست و باز همون آهنگ خاموش روشن شدن خود رو دنبال میکنه
> ممنون میشم کمک کنید اینم سورس
> 
> #include <mega16.h>
> #include <delay.h>
> 
> ...


اگه میخواید چشمک زن بنویسید چرا پیچیدش کردید؟ الگوریتم برنامتون مشکل داره:

 پورت a رو خروجی تعریف کردید و از 2 تا پایه اش استفاده کردید. اول چک می کنه پایه 0 خاموشه (که هست) بعد میاد پایه 1 رو روشن می کنه، بعد بررسی میکنه پایه 1 روشنه (که همین الان روشن شده!) در نتیجه پایه 0 رو خاموش میکنه (که لازم هم نیست چون از اول خاموش بوده). بعد چک میشه که پایه 1 خاموشه (که نیست!) و میره اول لوپ.

در واقع این شرطهایی که گذاشتید اضافی هستند.پس برنامه شما درواقع اینه:


void main ()
{
PORTA=0x00;
DDRA=0xFF;
for(;;)
{
PORTA.1=1;
delay_ms(5);
 }
}

با این برنامه ای که شما اینجا گذاشتید اصلا نباید چشمک بزنه!؟

----------


## x_force

#include <mega16.h>
#include <delay.h>

 void main ()
{
PORTA=0x00;
DDRA=0xFF;
PORTA.0=0;
while(1)
{
PORTA.0=1;
delay_ms(500)
PORTA.0=1;
delay_ms(500);
}
}

این ساده ترین روش برای چشمک زدن ال ای دی :لبخند گشاده!:

----------


## yashar666

این ساده تره :


void main ()
{
PORTA=0x00;
DDRA=0x01;
while(1)
{
PORTA.0=~(PORTA.0);

delay_ms(500);
}
}



 قیوز بیتاسیلاتور  چک کن درست ست کرده باشی

----------


## alireza_g698

سلام
تو برنامتون مقدار 5 برای delay خیلی خیلی کمه که اصلا به چشم نمیاد.  5میلی ثانیه!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

از 1000 میلی استتفاده کنید که بشه 1 ثانیه

----------


## sba.saeed

از آنجا که چشم انسان قادر به دیدن تغییرات زیر 20ms نمی باشد در نتیجه شما احساس می کنید که هیچ تغییری در روند برنامتون ایجاد نمیشه . از همین ضعف انسان هست که فیلمسازان قادرند فیلم را برای ما به نمایش بذارند و یا اینکه فیلمی که با دوربین خودتون میگیرید رو مشاهده می کنید.(تحقیقات در این مورد رو میذرام به عهده خودتون)
 مطلب بعدی که باید مد نظر داشته باشی اینه که نباید توقع داشته باشید عینه همون delay که شما تو برنامتون استفاده میکنید در عمل هم همون میزان تاخیر ایجاد بشه!!!!!!!! مثلاً اگر برا 1 ثانیه تاخیر نوشتید delay_ms(1000) مطمئناً تو عمل درست در نمیاد.!!! چون با توجه به فرکانس کاری میکرو و زمانی که هر دستور برا اجرا نیاز داره باعث ایجاد اختلاف خواهد شد که برا رفع این مورد یعنی دقیقتر شدن میتونید خودتون یه تابع جدید بنویسید که در اون تاخیر رو ایجاد کنید یا اینکه از تایمر میکرو استفاده کنید.

امیدوارم نوش دارو بعداز مرگ سهراب نبوده باشه :قهقهه:

----------

