 |
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
|
|
نشاط [ حسن هادي محمود ]
قوة السمعة:135
|
|
23-08-2013, 03:34 PM
المشاركة 1
|
|
سلام عليكم
اتمنى من حضراتكم منافشه طرق الاحترافيه في تقليل حجم الكود لغرض توفير ذاكره
ا- لاحظت ان زمن ديلي ياخذ كود كبير يتراوح من 9 بايت الى 15 بايت طبعا اذا كنت تستعمل ديلي بكثره في مشروع اكيد راح ياخذ منك كود كبير
اليكم طريقه تقلل هذا كود مثلا لاحظت عندما اكتب (delay_ms(5000 يحتاج الى 15 بايت من روم بينما اذا استخدمت طريقه اخرى فانه يحتاج 6 بايت اي وفرت 9 بايت
طبعا طريقه هي استخدام تايمرزيرو واليكم الكود
الان كود زمن الانتظار
كود:
void timer( unsigned int t)
{
tmr0=0; cont=0;
while(t > cont);
}
وهذا ماكتبته في داله الانتربت
كود:
void interrupt()
{
if( T0IF_bit is 1) cont++;
T0IF_bit=0;
}
كانت تردد كرستاله =4 ميكاهيرتز اي زمن =1us
واستخدمت نسبه تقسيم للتايمرزيرو=256
هنا يعني انه بعد 256x256=65536us يحدث طفحان ويزداد cont بمقدار واحد
لاحظو في هذا مثال يتم انتظار لمده ثانيه واحده
كود:
void download()
{
message(Welcome,1);
message (loading ,2);
for(x=0;x<5;x++)
{
lcd_chr(2,x+8,'.');
timer(16); //1 second
}
}
لاحظو لكي اريد تشغيل سماعه الانذار لمده 1 دقيقه هنا اريد سماعه تعمل طوال الوقت لاحظو الكود نفس داله تايمر يتم تصفير تايمرزيرو وعداد ويتم الاختبار هل تم وصول الى زمن ام لا
كود:
void alarm(char mm)
{
lcd_out(2,6,"alarm");
if(mm is 1){
tmr0=cont=0;
while(cont<916) melody(); // alarm for 1 minute
}
if(mm is 2)
{
tmr0=cont=0;
while(cont<77)tone1();
}
error=0;
}
طبعا هذه طريقه تتيح لك استخدام ازمنه تصل الى ساعات وتوفر لك حجم الكود
بالنسبه كيف حسبت 1 دقيقه بشكل مبسط
انا اريد 1 دقيقه اذن = 60ثانيه او=60000000 بامايكروثانيه
نقسم 60000000 على 65536 نحصل على قيمه count وهي 916 وهكذا
=========================================
كما هناك طريقه اخرى رفقتها سابقا بمشروع باسورد وهي تقلل حجم كود وعلاوه على ذلك تعطيك مميزه حلوه في عرض رسائل
اليكم جزء بسيط من مشروع انظرو فقط الى طريقه عرض رسائل على شاشه
ومميزه فيها اذا كنت تريد اظهار مثلا 10 رسائل واحده تلو اخرى بفاصل زمني يمكنك عرضها بدون استخدام الامر مسح شاشه
كود:
const char welcome[] =" Welcome! ";
const char check_pass[] ="check password ";
const char correct_pass[] ="correct password" ;
const char input_pass[] ="input password ";
const char new_pass[] ="new password ";
const char uncorrect_pass[] ="vaild password ";
const char old_password[] ="old password ";
const char change_password[] ="password changed";
const char enter[] =" press enter ";
const char admin[] ="input admin old ";
const char vaild_admin[] ="vaild admin ";
const char new_admin[] ="new admin ";
const char admin_changed[] ="admin is changed";
const char securty_equation[] ="securty equation";
const char my_name[] ="my name is: ";
const char loading[] ="LOADING ";
const char master_password[] ="master code ";
const char press_enter[] =" PRESS ENTER ";
const char closed[] =" CLOSED ";
const char open[] =" OPEN ";
const char clear[] =" ";
كود:
///////////////////////// show message ////////////////////
void message(const char *message,char zz)
{
for(x=0;x<16;x++) my_txt[x]=message[x];
lcd_out(zz,1,my_txt);
}
اما كيف يتم عرض رساله اليكم مثال
كود:
if( list > 0)message(press_enter,2);
if( list is 1 )
{
message(input_pass,1);
}
else if( list is 2)
{
message(change_password,1); // change password message
}
===========================================
طبعا هناك طرق اتحرافيه افضل لذا من كان لديه طرق فدعونا للنقاش فيها
الغايه من ذلك هي كتابه برنامج باسلوب احترافي كما انها تقلل خطأ
ملاحظه لو كتبت كل تلك رسائل في رام سترى ان مايكرو يظهر اشياء قريبه على شاشه لان ذاكره رام غير مرتبه بشكل متسلسل وانما عباره عن بلوكات في كل بلوك يوجد ريجسترات واخرى لاستخدام عام
اضافه يبد المايكرو يعلق اي يتوقف ولايعمل بشكل صحيح
تحياتي للجميع
التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 23-08-2013 الساعة 04:09 PM
|