PDA

View Full Version : مشکل delay در چراغ چشمک زن



javady_joon
شنبه 05 مهر 1393, 13:19 عصر
سلام
من با کد ویژن یه برنامه چراغ چشمک زن نوشتم
و هرعددی رو بریا 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);
}
}
}

مهدی کرامتی
شنبه 05 مهر 1393, 18:55 عصر
فکر می کنم فیوز بیت ها رو موقع پروگرام کردن بردتون ست نکرده اید.

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

farzadsw
یک شنبه 06 مهر 1393, 10:15 صبح
سلام
من با کد ویژن یه برنامه چراغ چشمک زن نوشتم
و هرعددی رو بریا 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);
}
}
}





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

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

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


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

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

x_force
جمعه 23 آبان 1393, 13:49 عصر
#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
چهارشنبه 12 فروردین 1394, 02:21 صبح
این ساده تره :



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

delay_ms(500);
}
}



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

alireza_g698
پنج شنبه 10 اردیبهشت 1394, 23:23 عصر
سلام
تو برنامتون مقدار 5 برای delay خیلی خیلی کمه که اصلا به چشم نمیاد. 5میلی ثانیه!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

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

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