PDA

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



agape
19-03-2010, 14:20
این برنامه رو نوشتم و کار کرد بدون هیچ مشکلی - حالا میخوام بدونم چطور میشه فرکانس کاری پردازنده رو تغییر داد

این برنامه

#include <AT91SAM7X256.H> /* AT91SAMT7X256 definitions */
#include <lib_AT91SAM7X256.h>
#include "lib/delay.h"

void wait (void) {
unsigned int n;
for (n = 0; n < 1000; n++);
}


int main(void){

AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, AT91C_PIO_PA0);

while(1){
AT91F_PIO_SetOutput (AT91C_BASE_PIOA, AT91C_PIO_PA0);
wait();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, AT91C_PIO_PA0);
wait();
}

}

اول به قسمت ویزارد استارتاپ رفتم و تنظیمات رو به این شکل در آوردم
You can see links before reply
و بعد دوباره کامپایل کردم و پرگرام کردم هیچ تغییری در سرعت چشمک زدن ایجاد نشده بود 8O
بعد تنظیمات رو به این شکل در آوردم
You can see links before reply
باز کامپایل و پرگرام و باز هیچ تغییری مشاهده نشد فکر میکنید مشکل من از کجا باشه
فرکانس یکی 48 مگا هرتز و دومی 18.432 مگاهرتز میباشد !

farzadsw
19-03-2010, 20:07
با توجه به اینکه حداکثر فرکانس کاری میکرو 55 مگاهرتز هست ، و الان میکرو داره با 48 مگاهرتز کار میکنه ، دنبال معجزه نباشید ! (به نظر من که اصلا صرف نداره)

برای تغییر فرکانس باید مقدار pll multiplier , pll divider رو تغیرر بدید .(طبق دیتا شیت یا استفاده از نرم افزار برای محاسبه مقدار هر کدوم).

Division
19-03-2010, 21:08
با سلام

وقتي شما فركانس كاري سيستم رو تغيير ميديد چون شما داريد تو كامپايلر از تابع كتابخانه اي delay استفاده مي كنيد خود كامپايلر سر ريز هاي تايمرهاتون رو كنترل مي كنه و رجيستري هاي مربوطه رو مقداردهي مي كني .

به طور مثال براي توليد 1 ثانيه تاخير در فركانس كاري 25 مگاهرتز اگه شما 10 تا سر ريز 16 بيتي لازم داشته باشين با تغيير فركانس سيستم به 50 مگاهرتز تعداد اين سر ريز ها بايد 20 سر ريز باشه كه چون شما خودت با رجيستري ها كار نمي كني خود كامپايلر اونا رو عددهي مي كنه .

نتيجه : سرعت چشمك زن تو هر دو حالت ثابت ميمونه فقط سرعت اجري دستورات رفت بالا . :0013:

agape
27-03-2010, 15:19
با توجه به اینکه حداکثر فرکانس کاری میکرو 55 مگاهرتز هست ، و الان میکرو داره با 48 مگاهرتز کار میکنه ، دنبال معجزه نباشید ! (به نظر من که اصلا صرف نداره)

برای تغییر فرکانس باید مقدار pll multiplier , pll divider رو تغیرر بدید .(طبق دیتا شیت یا استفاده از نرم افزار برای محاسبه مقدار هر کدوم).

دوست عزیز 48 مگا هرتز یعنی 48 ملیون فرمان در ثانیه یه حلقه 1000 تایی باید 20 میکرو ثانیه طولب بکشه نه اینقدر که با چشم قابل رویت باشه :mrgreen: پس حتما یه جایی یه مشکی هست حتما پردازنده با 48 مگاهرتز کلاک نمیخوره در ضمن در حالت دوم که با 18 مگا هرتز کلاک میخوره باید 3 برابر کند تر باشه سرعت چشمک زدن نه این که فرقی نکنه!



وقتي شما فركانس كاري سيستم رو تغيير ميديد چون شما داريد تو كامپايلر از تابع كتابخانه اي delay استفاده مي كنيد خود كامپايلر سر ريز هاي تايمرهاتون رو كنترل مي كنه و رجيستري هاي مربوطه رو مقداردهي مي كني .

به طور مثال براي توليد 1 ثانيه تاخير در فركانس كاري 25 مگاهرتز اگه شما 10 تا سر ريز 16 بيتي لازم داشته باشين با تغيير فركانس سيستم به 50 مگاهرتز تعداد اين سر ريز ها بايد 20 سر ريز باشه كه چون شما خودت با رجيستري ها كار نمي كني خود كامپايلر اونا رو عددهي مي كنه .

نتيجه : سرعت چشمك زن تو هر دو حالت ثابت ميمونه فقط سرعت اجري دستورات رفت بالا .

در مورد گفته شما باید بگم بهتر بود سورس رو بیشتر برسی میکردید من برای تاخیر از یه تابع که خودم نوشته بودم استفاده کردم یه حلقه 1000 تایی پس اصلا کاری به کامپایلر نداره :roll:

farzadsw
27-03-2010, 17:46
من برنامه شما ندیده بودم ، الان که دیدم :
اولا شما باید کلاک pio رو فعال کنید تو اول برنامه
ثانیا pll طبق عکس ضمیمه شده تنظیم کنید
ثالثا چرا تابع wait رو روی 1000 گذاشتید؟ منظورم اینه که شما که میدونستید 1000 تا سریع رد میشه پس چرا کم گذاشتید؟

مقدار هزار رو که تغییر میدید ، سرعت چشمک زدن فرقی میکنه؟
چشمک به صورت نصف روشن ، نصف خاموشه ؟ (اگه یکنواخت نیست ، watch dog رو فعال کردید)

اگه با دو مورد بالا مشکلتون حل نشد ، کل فولدر پروژه رو بگذارید ، شاید مشکل از کامپایلر شماست.

Ali_Salehi
27-03-2010, 19:56
همونطور که میدونین ، در قسمت pll مقدار فرکانس کریستال در دو عدد تقسیم کننده و ضرب کننده ضرب و تقسیم میشن و مقدار مورد نظری رو که میخواین میتونین بدست بیارین... من اگه به جای شما بودم به جای استارت آپ توی خود برنامه ریجستری های مربوطه رو مقدار دهی میکردم.

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

agape
28-03-2010, 12:19
من برنامه شما ندیده بودم ، الان که دیدم :
اولا شما باید کلاک pio رو فعال کنید تو اول برنامه
ثانیا pll طبق عکس ضمیمه شده تنظیم کنید
ثالثا چرا تابع wait رو روی 1000 گذاشتید؟ منظورم اینه که شما که میدونستید 1000 تا سریع رد میشه پس چرا کم گذاشتید؟

مقدار هزار رو که تغییر میدید ، سرعت چشمک زدن فرقی میکنه؟
چشمک به صورت نصف روشن ، نصف خاموشه ؟ (اگه یکنواخت نیست ، watch dog رو فعال کردید)

اگه با دو مورد بالا مشکلتون حل نشد ، کل فولدر پروژه رو بگذارید ، شاید مشکل از کامپایلر شماست.

سلام خسته نباشید :d
من چطور باید کلاک pio رو فعال کنم تو سمپل هایی که قرار دادید نیست !

farzadsw
28-03-2010, 16:53
اگه منظورتون سمپلهای وبلاگمه ، تو همشون هست.
اینم دستورشه :

AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);

omid_safari
31-03-2010, 11:39
توی این برنامه کار کلاک pio چی هست؟ تابع wait که از تایمر استفاده نمیکنه؟

farzadsw
31-03-2010, 18:55
کلاک pio یعنی قسمت pio روشن میشه !

agape
31-03-2010, 21:27
جناب تمام کار هایی که سفارش شده بود رو انجام دادم ولی انگار که نه انگار !:(
نمیدونم والا دیگه مشکل میتونه ار کجا باشه
من کل پوشه پروژه رو قرار میدم لطف کنید ببینید مشکل از کجاست

agape
03-04-2010, 23:26
یکی از دوستان اگه لطف کنه و پروژه ای رو که قرار دادم رو برسی کنه تا ببینیم مشکل از کجاست :wink:

hmg
04-04-2010, 00:24
یکی از دوستان اگه لطف کنه و پروژه ای رو که قرار دادم رو برسی کنه تا ببینیم مشکل از کجاست :wink:
سلام برنامه شما کاملا صحیح می باشد فقط باید مقدار n در تابع wait را بیشتر قرار دهید مثلا n=737280

agape
04-04-2010, 02:27
سلام برنامه شما کاملا صحیح می باشد فقط باید مقدار n در تابع wait را بیشتر قرار دهید مثلا n=737280

عزیز جان من با همین 1000 تا میتونم چشمک زدن لامپ رو ببینم - یعنی سرعت کلاک میکرو پایینه !
شما برنامه رو رو بردتون آزمایش کردید ؟!
آیا آرم ها فیوز بیت خاصی دارن که تو فایل استارت آپ نباشه !

hmg
04-04-2010, 19:09
سلام من برنامه شما را روی برد خودم امتحان کردم حق با شما است و سرعت کلاک بسیار پایین است. پس از چندین بار پروگرم کردن و مقایسه با فایل خودم که در پست قبلی پیوست شده، فهمیدم که فایل استارت آپ شما به درستی به برنامه main الحاق نشده است و لذا تغییرات و تنظیمات pll در فایل استارت آپ در پروگرم کردن بی تاثیر است. لطفا فایل پیوست شده در پست قبلی را امتحان کنید حتما مشکل شما برطرف خواهد شد. البته من در برنامه پیوست شده، برای سادگی led را به PORTB.19 اختصاص داده ام. :wink:

agape
05-04-2010, 01:59
فایل بین شما رو پروگرام کردم به درستی کار میکرد و جواب میداد
یعنی ال ای دی آنبورد چمک میزد
حدود 5 دقیقه کار کرد و چشمک زد بعد خود به خود از کار افتاد و دیگه چشمک نزد
چند بار دیگه هم پروگرام کردم ولی هیچی به هیچی - نمیدونم مشکل از بورده یه پروگرام کردن من8o

vasa
19-04-2010, 02:22
دوستان سلام مخلص همگی
کلید حل مشکلتون دست منه آخه من خودم دقیقا همین مشکلو داشتم و اتفاقا مطرحشم کردم ولی کسی جواب نداد
مشکل سره اینه که این آقا wizard کارشو درست انجام نمیده و در نتیجه راه حل اینه که به صورت دستی تنظیماتو انجام بدیم که تو datasheet کامل مراحل کار رو توضیح داده که من برای آسایش شما دوستان کدشو اینجا میذارم

*AT91C_CKGR_MOR=0x00000701; //enable processor & programmable clocks
while(AT91C_PMC_MOSCS==0);

*AT91C_CKGR_PLLR=0x00040801; // Mul=4+1 Div=1
while(AT91C_PMC_LOCK==0);

*AT91C_PMC_MCKR=0x00000004;
while(AT91C_PMC_MCKRDY==0);
*AT91C_PMC_MCKR=0x00000007; // select (PLL clk)/2
while(AT91C_PMC_MCKRDY==0);

تو این رجیستر همAT91C_CKGR_PLLR ضرب و تقسیم PLL رو میتونید مشخص کنید.
موفق باشید:D