قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 23-08-2013, 03:11 AM المشاركة 1   
افتراضي التحكم بابعاد المصفوفه Twitter FaceBook Google+



سلام عليكم
في اي مشروع يتم خزن رسائل في روم لكون مساحته روم كبيره مقارنه مع رام
مشكله هي انه لو افترضت شاشه (2x40) ورساله لديه طولها 40 واخرى طولها 20 واخرى طوله 10
لكي اعرضها على شاشه لابد من تحويل رسائل التي تم خزنها في روم الى رام
انظر كود تالي
كود:
void message(const char *message)
{
 for(x=0;x<40;x++) my_txt[x]=message[x];
 lcd_out(1,1,my_txt);
}
تلاحظون انه انا ملزم بتحويل رساله (من روم الى رام ) بتكوين مصفوفه ابعادها =طول الشاشه للضمان عرض اطول رساله وتعلمون ان لابد من تعريف مصفوفه في بدايه البرنامج مع اعطاءها ابعادها اي طول مصفوفه من نوع ثابت وليس متغير
ماهي مشكله
مشكله هي انه استهلك من روم في كل رساله 40 بايت سواء كانت رساله صغيره ام كبيره هل هناك وسيله لاجعل ابعاد مصفوفه قابله للتغير يعني قبل اعرض رساله اخبره اجعل ابعاده مصفوفه 10 واذا كانت رساله 20 حرف اخبره اجعل ابعاد مصفوفه 20 اي استهلك من روم على حسب طول رساله
طبعا اكيد انا لااستطيع طباعه رساله مخزونه في روم على شاشه لانه اوامر طباعه تريد متغير ليس من نوع الثابت

http://upload.qariya.info/images/qar...270664ea91.png
مع الشكر والتقدير

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 24-08-2013, 10:50 AM المشاركة 2   
افتراضي


سلام عليكم
الا توجد طريقه للتحكم بأبعاد مصفوفه ام لايمكن تحكم بابعادها
يعني اقصد مصفوفه متكونه من 16 حرف يمكني جعل ابعادها 6 ومره اجعل ابعادها 10

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 26-08-2013, 03:03 AM المشاركة 3   
افتراضي


طبعا اظن انه لايمكن يتحكم بابعاد مصفوفه لكون عدد عناصرها من نوع ثابت
هنا يأتي سؤال مره اخرى هل باميكروسي يوجد امر يحول ثابت الى متغير ام لا
==================================
طبعا وردت لي فكره اذا كانت عرض شاشه 40 او حتى 16 وكان عدد رسائل يصل الى عدد كبير بدلا من كل رساله اكتبها بطول الشاشه يعني طولها 16 او 40
اكتب اي رساله فقط مااريده اي طول رساله يعتمد على عدد احرف
وهنا كيف يتم عرض رساله لانه لايمكن وضع مصفوفه اقوم بتحويل كل حرف ثابت واخزنها في مصفوفه من نوع متغير وبعدها اعرضها على شاشه
هنا اقوم باستخدام ذاكره ايبروم كوسيط لخزن رساله واظهاره على شاشه
لقد قمت بتجربه هذه خطوه وعملت معاي على بروتيس
وبالتالي وفرت في روم لانك احيانا تكتب فقط كلمه ok وانت لاتريد استخدام رام
بالتاكيد اذا خزنتها في روم لابد من كتابه طول هذه رساله=طول شاشه يعني
كود:
const ok[]="ok              "
وهذه رساله طولها =16 اذن راح مني 14 بايت دون فائده
ولكنني اريد استهلك من روم سوى 2 يعني فقط كلمه ok
ماعليه سوى
كود:
 استدعي داله عرض رساله واعطيها طول رساله
;(message(ok,2
وبداله messge
كود:
void message(const char *message,char zz)
{
 for(x=0;x<zz;x++) 
     {
     eeprom_write(100+x,message[x]);
     lcd_chr(1,x+1,eeprom_read(100+x));
    }
}
واتمنى من لديه فكره ان يتفضل علينا بفكرته وله جزيل الشكر


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 26-08-2013 الساعة 03:06 AM

the lion
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
الدولة: egypt
المشاركات: 117
نشاط [ the lion ]
قوة السمعة:0
قديم 26-08-2013, 06:57 AM المشاركة 4   
افتراضي


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


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 26-08-2013, 01:09 PM المشاركة 5   
افتراضي


لحد دلوقتي مش فاهم المشكله فين .. هو ليه لازم اكتب الرساله بحجم معين ثابت ؟
لانك لو قمت بخزن رسائل كثيره في رام ستواجه مشكله في عمل مايكروكترولر اي ستبدء هناك مشاكل في عرض الرسائل لماذا يحدث ذلك انظر الى الصوره
http://upload.qariya.info/images/qar...7211427a00.png
تلاحظ في bank0 يحتوي على 96 بايت هنا لو لوكانت لديك 10 رساله طولها 10 احرف
اذا عدد بايت مطلوب =100 هنا ستبدء مشكله في عرض معلومات على شاشه
لانه حسب ماتلاحظه مواقع رام غير مرتبه بشكل تسلسلي
كما انه اذا استخدمت خزن رسائل كلها في رام فانها سوف تنفذ منك لان مساحتها صغيره مقارنه مع روم لذا قمت بخزن كل رسائل في روم كيف يتم خزن في روم
بمجرد كتابه امام اسم متغير او مصفوفه كلمه const وهذه طريقه مفضله
ولكني اواجه مشكله لما اريد عرض رساله لابد ان تكون رساله من نوع متغير وليس
من نوع ثابت
http://flash01.arabsh.com/uploads/im...4d4b61f502.png

كيف احول ثابت الى متغير اعمل مصفوفه ولكن كم هي ابعادها
جواب = اقصى طول رساله لديك في مشروع وبالتالي انا فقط استهلكت من رام سوى حجم هذه مصفوفه
هنا اخي كان سؤالي هو انني سوف استهلك بايتات من روم على فاضي يعني اقصد لو كان اقصى طول رساله لديه =16 حرف ولديه رساله طولها 4 احرف هنا انا مجبور ان اكون مصفوفه ابعادها 16
اريد تنظر الى هذا مثال
كود:
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[]                 ="                ";
كيف ياخي خزن هذه رسائل في رام !!
اذن لابد من تحويلها الى روم
ولكن كيف اعرضها انظر الى داله عرض رسائل
كود:
void message(const char *message,char zz)
{
 for(x=0;x<16;x++) my_txt[x]=message[x];
 lcd_out(zz,1,my_txt);
}
تلاحظ بداله اني كلما اريد ان عرض رساله لابد من تحويلها الى رام ومن ثم اقوم بعرضها
اكرر لك اخي كريم مشكلههي ان كل رساله لها ابعاد مختلفه ولكني مجبور اخذ اقصى طول رساله لكي تكون هذه هي ابعاد مصفوفه لضمان عرض كل معلومات بدون نقص هنا الرسائل الاقل من اقصى طول لابد ان اقوم بمساواه ابعاد بترك فراغ وتلاحظ برسائل وجود فراغ وكل ابعاد متساويه انا اريد اسأل هل توجد امكانيه اتحكم بطول مصفوفه يعني رساله طولها 10 اخلي ابعادها 10 ورساله طولها 16 خلي ابعادها 16 ورساله طولها 2 اخلي ابعادها 2 وهكذا ........ انا بعتقادي لايمكن ذلك انا ليس متأكد
ولكني كحل لهذه مشكله هو استخدام ايبروم كما ذكرت في رد سابق والغايه منها تقليل حجم كود لاني الم افعل ذلك فان في كل رساله لو افترضت اقصى طول رساله=16 فاني سحتاج الى 16 بايت لوكانت عندي 10 سحتاج الى 160 بايت لكن لو استخدمت طريقه اتحكم بابعاد مصفوفه او ايبروم لربما احتاج فقط 90 بايت هذا مااريده


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 26-08-2013 الساعة 01:25 PM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً المخترع01 ( شكر العضو على هذه المشاركة )
اعجاب المخترع01 ( أعجبته المشاركة )

abdo1992
:: مهندس جيد ::
تاريخ التسجيل: Aug 2010
الدولة: مصر
المشاركات: 225
نشاط [ abdo1992 ]
قوة السمعة:0
قديم 27-07-2014, 07:27 PM المشاركة 6   
افتراضي مشكلة


السلام عليكم انا كنت بستخدم الطريقة دة لمدة طويلة اختها من حضرتك والصراحة عجبتني اوي .بس دلوقتي في مشكلة وهيا اني بستخدم شاشة 16*4 الغريب بقا في الامر اني في السطر 3 والسطر 4 بجد الجملة كلها متشفتة نحوا اليمين 3 خانات ويبقا واجب عليا اني احط LCD_OUT (1,-3,"gf")g وهاكذا لا اعرف ما هوا السبب . دة المشكلة الاولي المشكلة الثانية .

اني لو بعرض اي كلام علي السطر الاول او الثاني بيظهر كلام في السطر الثالث والرابع كلام عشوائي مش عارف اية سببها .

دة كود انا شغال علية بستخدم اتنين PIC بستخدم واحدة منهم للعرض علي الشاشة والاخري هتكون ليها مهام خري .
كود:
//sbit lcd
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

////////////////////////////////////////////////////////////////////////////////
const char b[]                    =".....Welcome...." ;
const char e []                   ="Running........." ;
const char l[]                    ="Error..........." ;
const char x13[]                  ="Finish.........." ;
const char x14[]                  ="Emergency......." ;
const char x15[]                  ="1-USB.......2-SD" ;
const char x16[]                  ="1RUN 2back 3main" ;
const char x17[]                  =".....waiting...." ;
const char x18[]                  ="....loading....." ;
const char x19[]                  ="enter_to_Back..." ;
////////////////////////////////////////////////////////////////////////////////
char mas,zz=1,yy=1,ii=1;int x;
char iitxt[7];
////////////////////////////////////////////////////////////////////////////////
void message(const char *pci,char zzz,char yyy)
{int x; char my_txt[16];
 for(x=0;x<16;x++) my_txt[x]=pci[x];
  lcd_out(zzz,yyy,my_txt);
   }
////////////////////////////////////////////////////////////////////////////////
void show(char i){
if(zz==3||zz==4){yy=-3;} 
else yy=1;
switch(i){
case 1 :message(b,zz,yy);break;
case 2 :message(e,zz,yy);break;
case 3 :message(l,zz,yy);break;
case 4 :message(x13,zz,yy);break;
case 5 :message(x14,zz,yy);break;
case 6 :message(x15,zz,yy);break;
case 7 :message(x16,zz,yy);break;
case 8 :message(x17,zz,yy);break;
case 9 :message(x18,zz,yy);break;
case 10:message(x19,zz,yy);break;
}
}
////////////////////////////////////////////////////////////////////////////////
void main() {
trisa=0; porta=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
uart1_init(9600);
while(1){
while(!UART1_Data_Ready()){}
 ii = UART1_Read();
while(!UART1_Data_Ready()){}
 zz = UART1_Read();
show(ii);
if(zz==4){delay_ms(20);Lcd_Cmd(_LCD_CLEAR);}
}}


[IMG][/IMG]


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 27-07-2014, 07:38 PM المشاركة 7   
افتراضي


السلام عليكم انا كنت بستخدم الطريقة دة لمدة طويلة اختها من حضرتك والصراحة عجبتني اوي .بس دلوقتي في مشكلة وهيا اني بستخدم شاشة 16*4 الغريب بقا في الامر اني في السطر 3 والسطر 4 بجد الجملة كلها متشفتة نحوا اليمين 3 خانات ويبقا واجب عليا اني احط LCD_OUT (1,-3,"gf")g وهاكذا لا اعرف ما هوا السبب . دة المشكلة الاولي المشكلة الثانية .

اني لو بعرض اي كلام علي السطر الاول او الثاني بيظهر كلام في السطر الثالث والرابع كلام عشوائي مش عارف اية سببها .

دة كود انا شغال علية بستخدم اتنين PIC بستخدم واحدة منهم للعرض علي الشاشة والاخري هتكون ليها مهام خري .
كود:
//sbit lcd
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

////////////////////////////////////////////////////////////////////////////////
const char b[]                    =".....Welcome...." ;
const char e []                   ="Running........." ;
const char l[]                    ="Error..........." ;
const char x13[]                  ="Finish.........." ;
const char x14[]                  ="Emergency......." ;
const char x15[]                  ="1-USB.......2-SD" ;
const char x16[]                  ="1RUN 2back 3main" ;
const char x17[]                  =".....waiting...." ;
const char x18[]                  ="....loading....." ;
const char x19[]                  ="enter_to_Back..." ;
////////////////////////////////////////////////////////////////////////////////
char mas,zz=1,yy=1,ii=1;int x;
char iitxt[7];
////////////////////////////////////////////////////////////////////////////////
void message(const char *pci,char zzz,char yyy)
{int x; char my_txt[16];
 for(x=0;x<16;x++) my_txt[x]=pci[x];
  lcd_out(zzz,yyy,my_txt);
   }
////////////////////////////////////////////////////////////////////////////////
void show(char i){
if(zz==3||zz==4){yy=-3;} 
else yy=1;
switch(i){
case 1 :message(b,zz,yy);break;
case 2 :message(e,zz,yy);break;
case 3 :message(l,zz,yy);break;
case 4 :message(x13,zz,yy);break;
case 5 :message(x14,zz,yy);break;
case 6 :message(x15,zz,yy);break;
case 7 :message(x16,zz,yy);break;
case 8 :message(x17,zz,yy);break;
case 9 :message(x18,zz,yy);break;
case 10:message(x19,zz,yy);break;
}
}
////////////////////////////////////////////////////////////////////////////////
void main() {
trisa=0; porta=0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
uart1_init(9600);
while(1){
while(!UART1_Data_Ready()){}
 ii = UART1_Read();
while(!UART1_Data_Ready()){}
 zz = UART1_Read();
show(ii);
if(zz==4){delay_ms(20);Lcd_Cmd(_LCD_CLEAR);}
}}


[IMG][/IMG]
السلام عليكم
زودني بملفات مشروع الكامله لنرى اين مشكله
تحياتي


abdo1992
:: مهندس جيد ::
تاريخ التسجيل: Aug 2010
الدولة: مصر
المشاركات: 225
نشاط [ abdo1992 ]
قوة السمعة:0
قديم 28-07-2014, 03:25 AM المشاركة 8   
افتراضي


http://www.mediafire.com/download/fn...p7nz/final.rar

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 02:27 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025