PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل در keil



هنرفر
19-05-2010, 18:54
سلام دوستان من اولین برنامه ای را که در مجله شماره 9 بود در keil نوشتم ولی وقتی کامپایلش کردم داخل شبیه ساز فقط خروجی یک بود و صفر نمیشد.مشکل از کجاست؟

#include <LPC23xx.h>
void wait(void)
{
long int i ;
for(i=0;i<4000000;i++);
}
int main(void)
{
FIO0DIR =1;
FIO0SET = 1;
wait();
FIO0CLR = 1;
wait();
}

Aghaeifar
19-05-2010, 21:20
عجب من هم دقیقا اومدم سایت این رو بپرسم که تاپیک تو رو دیدم
شکل زیر رو ببنید مال من همش صفر مونده بود

در ضمن من برای تابع تاخیر داشتم کار می کردم اون جایی که دایره قرمز کشیدم خودش زمان رو نوشته این دوبرابر چیزی هست که در مجله 9 گفته شده بود

نوشته مثلا فلان تایع چند بار فراخوانی شده و چقدر زمان گرفته

You can see links before reply

Division
20-05-2010, 01:11
با سلام

متاسفانه برنامه نوشته شده در مجله درست نيست !
البته منم وقتي مجله رو قبل از انتشار يه دور خوندم به اين برنامه دقت نكردم . ( اين برنامه رو من ننوشته بودم:0013:)

اما مشكل از كجاست ؟؟

اين برنامه نوشته شده به طوره كلي سه تا اشكال اساسي داره !!!

1- چون از پورت P0 به صورت Fast GPIO استفاده شده مي بايستي بيت صفرم رجيستري SCS يك بشه

2- براي محاسبه زمان هاي روند بايد فركانس انتخابي به طوري باشه كه بعد از انجام مراحل تقسم فركانسي و محاسبه زمان عدد حاصله، اعشاري محاسبه نگردد، بدين منظور با در نظر گرفتن اسيلاتور داخلي و مقدا دهي 4 مگ به عوض 12 مگ (زمان دسترسي به پورت ها از طريق Fast GPIO به دو سيكل مي باشد ) فركانس كاري پورت ها مي شود 2 مگاهرتز .
با يه طرفين وسطين ساده بايد براي ايجاد يك ثانيه تاخير، 2000000 پالس را ايجاد كنيم پس شرط داخل دستور for را به مقدار 2000000 تغيير دهيد .

3- مي بايستي دستور صفر كردن FIOCLR0 و دستور يك كردن FIOSET0 در داخل يك حلقه قرار گيرند پس از حلقه while استفاده كنيد .

برنامه لازم براي توليد پالس با ديوتي سايكل يك ثانيه اي به صورت زير مي باشد


#include <LPC23xx.h>
void wait(void)
{
long int i ;
for(i=0;i<2000000;i++) ;
}

int main(void)
{
SCS=1;
FIO0DIR =1;
while (1)
{
FIO0SET = 1;
wait();
FIO0CLR = 1;
wait();
}
}

Aghaeifar
20-05-2010, 13:54
در کج نوشته شد که هر مقداری که در حلقه for می ذاریم به اندازه x مقدار تاخیر داره ؟
این رو تجربی به دست اومده ؟ یا در کاتالوگی چیزی اومده
منظورم همون

2000000 رو چطور برات حاصل شده ؟ تجربی ؟
چون برای من مهمه که بتونم تاخیر دقیق ایجاد کنم اون هم بدون تایمر

Division
20-05-2010, 14:47
من توضيح ندادم چون فكر كردم خودتون متوجه قضيه ميشين ولي الان توضيح ميدم .

فرض كن داري از منبع اسيلاتور داخلي استفاده مي كني كه فركانسش 4 مگاهرتزه اگه واحد PLL خاموش باشه و تقسيم كننده فركانس CPU مقدار صفر (پيش فرض) رو به خودش بگيره هيچ تقسيم فركانسي در كلاك اعمالي به CPU صورت نمي گيره و CPU همون فركانس 4 مگاهرتز رو مي بينه .
چون شما داري از پورت P0 از طريق باس پرسرعت local بش دسترسي پيدا مي كني تو ديتا شيتش نوشته تو دو تا كلاك پالس CPU مي توني به باس لوكال و در نهايت به پورت P0 دسترسي داشته باشي پس با اين حساب فركانس كاري پورتت ميشه 2 مگاهرتز .

ههمون مي دونيم كه عكس فركانس همون زمانه عكس 2 مگاهرتز ميشه 0.5 ميكروثانيه اين يعني اينكه 0.5 ميكرو ثانيه طول ميكشه كه يه بيتي رو صفر يا يك كني (البته از طريق همين باس local) و از طرفي باز تو ديتا شيت مشخصه كه دسترسي پردازنده به واحد حافظه از طريق همين باس لوكال هستش (اينو تو مجله بش اشاره كردم اگه به دقت خونده باشي) و پردازنده هميشه تو دوتا سيكل به حافظه فلش متصل ميشه و باز همين جريان تكرار ميشه ....
خب الان يه تناسب ساده بايد ببندي به اينصورت كه 0.5 ميكرو ثانيه طول ميكشه كه يه دستور از حافظه واكشي و اجرا بشه و الان كه شما مثلا يك ثانيه تاخير لازم داري چند دستور بايد اجرا بشه ؟؟ كه ميشه دقيقا 2000000 دستور يا سيكل اجرائي مفيد .

الان به راحتي با پيكربندي يه شمارنده نرم افزاري ميتوني اين موضوع رو عمليش كني و يك ثانيه تاخير رو از سيستمت انتظار داشته باشي و در ادامه براي توليد تاخير هاي بيشتر بهترين و اصولي ترين روش استفاده از for هاي تودرتو هست به اين صورت كه يك ثانيه رو به صورت يك كميت كوانتيده در نظر بگيري زمان هاي دقيقه اي يا ساعتي رو ايجاد كني .

البته اين روش اصلا اصولي و حرفه اي نيست و بهترين روش استفاده از خود تايمرها هستش كه به اين موضوع تو مجله بعدي اشاره خواهم كرد .

در ضمن هر حرفي كه من ميزنم از خودم نيست ميتوني بري و از ديتا شيت اصلي خوده تراشه كه 706 صفحه است بخوني .

Pardazesh-Gar
20-05-2010, 21:24
پیدا کردن هدر ها تو سایت از نوشتنشون سخت تر شده. خیلی برام عجیب این همه زحمت کشیده شد تا گره گشای مشکلات دیگران باشه اما مطالب خوب دسته بندی نشدند و نقص دارند. این باعث تلف شدن زمان میشه.
همه جا به جای AT91F_PIO_CfgInput دستور AT91F_PIO_GetInput قرار دادید. حداقل تو PMM2,3 که به این شکل بوده. خیلی شانس آوردم میکروم هنوز سالمه.
البته فرصت برای اصلاح وجود داره. یک مقدار زحمت داره البته زحمتی بیش از نوشتن کل مطالب نیست.

Aghaeifar
21-05-2010, 00:32
ممنون از توضیحاتت افشین

چیز هایی که زحمت کشیدی رو دیده بودم منظورم از سوال این بود چون ما به زبان c می نویسم نه اسمیلی در مراحل کامپایل و لینک کردن مونده چقدر بهینه به فایل هگز تبدیل بشه برای همین اطمینانی بر این که مثلا فقط 2 کلاک بخواد رو چطور می شه حاصل کرد
در خود دتاشیت فقط پورت های پرسرعت و معمولی رو اشاره می کنه خودش میگه وقتی با اسمبلی بنویسی می بینی که پر سرعته 3 برابر سرعتش بیشتره نه به زبان c

دستت درد نکنه توضیحات خوبی دادی

Division
21-05-2010, 05:36
در زبان سي تنها موردي كه نسبت به زبان اسمبلي متفاوت است پيكربندي دستور يا دستورات اجرائي هستش من بت اثبات مي كنم كه محاسباتي كه براي ايجاد يه تاخير مثلاً يك ثانيه اي تو زبان سي انجام ميديم دقيقا همون مقدار تو زبان اسمبلي هم صادقه اصلا اسمبلي و سي فرقي به لحاظ فنداسيون باهم ندارن و نهايتا سي به اسمبلي تبديل ميشه .

اوني كه شما داري بش اشاره مي كني پيكربنديه اوليه براي اجراي برنامه هست كه تو زبان سي يكم طول ميكشه ولي وقتي كنترل فرمان وارد برنامه اصلي شد ديگه تعداد كلاك پالس هاي حساب شده براي هر دو زبان برنامه نويسي يكي هستن .
اگه شما همين برنامه رو به زبان اسمبلي بنويسي مي بيني مدت زمان به استيبل رسيدن تو اسمبلي زودتر رخ ميده و ديتا شيت قطعه با اين موضوع اشاره داره اگه بحث تعريف و پيكربندي يه سري متغير ها رو تو زبان سي ناديده بگيري سي با اسمبلي به لحاظ كلاك پالس اجرايي براي ديكد يه دستور تك فازه فرقي نمي كنه .

moraj
05-03-2011, 13:52
با سلام
این برنامه اصلاح شده (پورت 0 gpio) باز هم کار نمی کنه لطفا یه برنامه تست شده رو قرار بدین

moraj
09-03-2011, 10:32
لطفا یکی به سوال ما جواب بده

t.o.e
09-03-2011, 19:47
سلام:

من این برنامه رو هم کپی کردم و هم نوشتم تو keil و عملی هم جواب گرفتم.
آقا کسی می تونه منو تو پورت سریال کمک کنه؟
پست هم گذاشتم ولی هنوز خبری نیست.

t.o.e
09-03-2011, 20:47
لطفا یکی به سوال ما جواب بده
سلام:
به سوال شما جواب داده شد.

amirmozaffari
22-05-2014, 12:37
سلام!
من هم برنامه ای که خودتون نوشته بودین رو کپی پیست کردم تو keil. ولی خروجیم همواره 1 هست و مطلقا هم صفر نمیشه!
ممنون میشم از راهنماییتون.

sadeghbakhshi
22-05-2014, 23:06
سلام!
من هم برنامه ای که خودتون نوشته بودین رو کپی پیست کردم تو keil. ولی خروجیم همواره 1 هست و مطلقا هم صفر نمیشه!
ممنون میشم از راهنماییتون.
سلام رفیق
شما قبل از هرچیز به تاریخ پست قبلیتون یه نگاهی بندازید
سپس سوالتون رو به طور کامل مطرح کنید
برای این سوالتون هم فایل پروژه رو اپلود کنید تا بتونید بهتر و سریع تر جواب بگیرید :0013: