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

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 28-02-2015, 02:06 PM المشاركة 1   
x4 معلومه بسيطه ومهمه في البرمجه Twitter FaceBook Google+



السلام عليكم
اليكم معلومه مهمه في التعامل مع المصفوفات خصوصا عندها عرضها على شاشه
في هذا الكود البسيط يتم قراءه درجه حراره من حساس LM35
كود:
temp_res = ADC_Get_Sample(6);     // Get 10-bit results of AD conversion
    temp = (temp_res * VREF)/10.240;  // Calculate temperature in Celsuis
                                      //  change Vref constant according
                                      //  to the power supply voltage
    FloatToStr(temp, txt);            // Convert temperature to string
                                                                             txt[4] = 0;

    Lcd_Out(2,3,txt);                 // Write string in second row
    Delay_ms(300);
معلومه هي انك تستطيع قفل مصفوفه عند عنصر معين كيف ذلك
تلاحظ انه استخدمنا FloatToStr(temp, txt) هذه تحويله لو عرضت قيمه txt مباشره على شاشه راح تظهر قيم كثيره انظر الصوره



ولكني اريد فقط 4 ارقام كحد اقصى ماذا افعل
فقط اجعل عنصر الاخير =0 ومعناها null وهذه خطوه مهمه في مصفوفات لضمان

1- تحديد عناصر مصفوفه
2- عدم اخذ حيز كبير في ذاكره
3- ضمان عدم ظهور رساله خطا Memory Error - Stack Overflow

تلاحظون اذا كتبنا 0 =[txt[4



لذا ارجو انتباه لهذه نقطه مهمه
يعني حاول قفل مصفوفه اذا قمت بعمليه خزن او نقل يعني من محتمل ان تزيد عن عدد عناصرها ولتجنب Memory Error - Stack Overflow
تحياتي

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً قطر الندى 89, سعيد قادر ( شكر العضو على هذه المشاركة )
اعجاب قطر الندى 89, سعيد قادر ( أعجبته المشاركة )
اعلانات

الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,916
نشاط [ سعيد قادر ]
قوة السمعة:152
قديم 28-02-2015, 06:48 PM المشاركة 2   
افتراضي


شكرا لك مهندس حسن ممكن تكتبها فى الكود لو سمحت

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعجاب حسن هادي محمود ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

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


شكرا لك مهندس حسن ممكن تكتبها فى الكود لو سمحت
بالخدمه أخي سعيد
في رابط مرفق مشروعين تمت تنفيذهما عمليا

https://www.mediafire.com/?g76irhi6qpg979q

وهذا احدهما وهو كود لشركه مايكروشيب
كود:
// LCD module connections
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_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;
// End LCD module connections

unsigned int temp_res = 0;
float temp;
char txt[15];

void main() {
  ANSELB = 0;                        // Configure PORTB pins as digital
  ANSELE = 0x02;                     // Configure RE1 pin as analog
  TRISE1_bit = 1;                    // Configure RE1 pin as input

  ADC_Init();                        // Initialize ADC

  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off

  Lcd_Out(1, 1, "Temperature :");
  Lcd_Chr(2,8,223);                  // Different LCD displays have different
                                     //   char code for degree
  Lcd_Chr(2,9,'C');                  // Display "C" for Celsius

  temp_res = 0;
  do {
    temp_res = ADC_Get_Sample(6);     // Get 10-bit results of AD conversion
    temp = (temp_res * 5)/10.240;  // Calculate temperature in Celsuis
                                      //  change Vref constant according
                                      //  to the power supply voltage
    FloatToStr(temp, txt);            // Convert temperature to string
    txt[4] = 0;
    Lcd_Out(2,3,txt);                 // Write string in second row
    Delay_ms(300);
  } while(1);
}
طبعا تلاحظ هو قفل مصفوفه txt[4] = 0 هو شنو معناها بالضبط
احيانا يحدث خطأ وانت تخزن رساله من مصفوفه الى أخرى او مصفوفه عدد عناصرها 16 بس احتاج فقط 4 عناصر
وماذا تعني مشكله Stack Overflow يعني تحدث هذه في مصفوفات لان مؤشر اذا تجاوز عنصر الاخير في مصفوفه راح يصبح Stack Overflow فعال وكأنه يخبرك انت خزنت البيانات في أماكن غير محجوزه للمصفوفه وبتالي نتيجه ذلك تغير قيم بعض مواقع ذاكره قد تكون ريجيسترات مهمه
وعليه لازم نضع حد للبيانات مخرنه في مصفوفه
اذن لازم شنو سوي تعمل ريست للمؤشر خاص بالمصفوفه يعني لما تخبره
txt[4] = 0 معناعا مؤشر سيتوقف عند عنصر رابع ولن يكمل بعد وبتالي يصبح عدد بيانات في مصفوفه txt فقط 4 عناصر


طبعا يجب اضافه هذا الكود ان كنت تستخدم
1- 18f45k22
2- PLL وهو مضاعف تردد داخل مايكرو اي مثلا عندك كرستاله 8 ميكا وتريد تردد نظام 32 ميكا عندها سوف تفعل PLL
ولكن عمليا سوف تواجه مشكله عويصه خصوصا في LCD يعني مشروع لن يعمل معاك رغم انه سوف يعمل في البروتيس
لذا عليك اضافه هذا كود في داله الرئيسيه
كود:
SLRCON = 0; // Set output slew rate on all ports at standard rate

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً سعيد قادر ( شكر العضو على هذه المشاركة )
اعجاب سعيد قادر ( أعجبته المشاركة )

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


في هذا مشروع راح اوضح لكم مشكله stack over

هذا كود فيه خطأ رغم انه كود صحيح ولم يتم زياده في عدد عناصر مصفوفه اقصد عدد عناصرها 17 فلم اقم بخزن اكثر من 17 عنصر ولكن مشكله سوف تظهر
كود:
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

unsigned char x,y, kk , count;
char text_lcd[17];
const char txt[]="               Hello ....How is my friend .. my name is Hasan Iam from iraq                ";
void main()
{
 cmcon=7;
 Lcd_Init();
 lcd_cmd(_LCD_CURSOR_OFF);
 lcd_cmd(1);
 while(1)
        {
         kk=sizeof(txt);// calcaulate size of txt
         for(x=0;x<17;x++)
                         {
                          text_lcd[x]=txt[x+y]; // 15+42

                          }
         lcd_out(1,1,text_lcd);

                            //delay_ms(150);
        count++;
        delay_ms(10);
        //lcd_out(1,1,"                ");// clear LCD
        if(count==10)// to reducing time
                    {
                      y++;
                      if(y==kk-15)y=0;
                      count=0;
                     }


        }
}
وهذه هي صوره مشكله


ولكن لو عملنا رسيت للمؤشر اي وضعنا حدود للمصفوفه سوف تزول هذه مشكله

هذا نفس كود مع اضافه كود بسيط بلون احمر
كود:
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

unsigned char x,y, kk , count;
char text_lcd[17];
const char txt[]="               Hello ....How is my friend .. my name is Hasan Iam from iraq                ";
void main()
{
 cmcon=7;
 Lcd_Init();
 lcd_cmd(_LCD_CURSOR_OFF);
 lcd_cmd(1);
 while(1)
        {
         kk=sizeof(txt);// calcaulate size of txt
         for(x=0;x<17;x++)
                         {
                           if(x==16){text_lcd[x]=0;break;}// reset text_lcd[x] this verry nessary for avoid overwrited
                          text_lcd[x]=txt[x+y]; // 15+42

                          }
         lcd_out(1,1,text_lcd);

                            //delay_ms(150);
        count++;
        delay_ms(10);
        //lcd_out(1,1,"                ");// clear LCD
        if(count==10)// to reducing time
                    {
                      y++;
                      if(y==kk-15)y=0;
                      count=0;
                     }


        }
}


الصورة الرمزية قطر الندى 89
قطر الندى 89
:: مهندس متميز ::
تاريخ التسجيل: Aug 2013
الدولة: IRAQ
المشاركات: 335
نشاط [ قطر الندى 89 ]
قوة السمعة:0
قديم 02-03-2015, 06:56 PM المشاركة 5   
افتراضي


قد يكون السؤال في غير محله ولكن مادام انت تناقش هذا الموضوع فأسمحلي بالسؤال عن هذا الامر FloatToStr ماهو ولماذا يكتب ؟؟؟


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


قد يكون السؤال في غير محله ولكن مادام انت تناقش هذا الموضوع فأسمحلي بالسؤال عن هذا الامر FloatToStr ماهو ولماذا يكتب ؟؟؟
يستخدم لتحويل قيم مثلا 24.5 يعني الي بيها الارقام عشريه اlلى string لكي اكدر اعرضها على شاشه لان بيانات الي تظهر على شاشه lcd هي من نوع string

FloatToStr اذن تحول قيم float الى string

لمزيد من معلومات تجدها في help خاص بامايكروسي

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً قطر الندى 89 ( شكر العضو على هذه المشاركة )
اعجاب قطر الندى 89 ( أعجبته المشاركة )
إضافة رد

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

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

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


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

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