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

   

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 21-01-2019, 09:42 AM المشاركة 9   
افتراضي



السلام عليكم ورحمه الله

اشكرك استاذي الفاضل علي اهتمامك ...

أخي كيف يمكنني تخزين رقم في ذاكره ابروم اكبر من 256 اقصد رقم وليث بايت

بأختصار عند الكتابه علي ذاكرة الأبرم هذا الرقم 256 وعند القرأه منها بتطلع الناتج مظبوط ولكن لو تجاوز هذا الرقم ثلا واصبح 300 عند القرائه بتطلع النتائج غير صحيحه

ايذا كيف يمكنني تخزين رقم قيمته الرقميه اكبر من 256

وبالمناسبه ما هي الطريقه اللتي اتعامل معها مع هذه النقطه ""ففى المساعدة وظائف Low,High,Higher,Highest""
الرقم الأصلى فى متغير من 4 بايت
هذه الوظائف لتفصل المنتغير كل بايت على حدة و مشروح فى ملف المساعدة help File اضغط على F1 تحصل على الملف
قد يتغير النص حسب ما إن كان للبك أم لغيره من المتحكمات لكن الأربع وظائف موجودة للأنواع الثلاث

اعلانات

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 322
نشاط [ احمد شهيد جواد ]
قوة السمعة:
قديم 22-01-2019, 10:23 PM المشاركة 10   
افتراضي


اخي الكريم بأختصار انت تقسم المتغير الى 2 بايت ثم تحفظ كل بايت في عنوان من ذاكرة الايبروم , قسم على 100 لتحصل على جزء الـ HIGH ثن اخزنه وبعدها خذ المتبقي وهو جزء الـ LOW واخزنه في عنوان ثاني , وعند القراءة قم بجمعهم ,

اما عن سؤال الاستاذ عن سبب الضرب في 256 هو لكون المتغير 16 بت فيجب ضرب البت العالي في 256 , وهذا ما تعلمته من المهندس حسن هادي محمود واعمل عليه

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

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 23-01-2019, 10:36 AM المشاركة 11   
افتراضي


اخي الكريم بأختصار انت تقسم المتغير الى 2 بايت ثم تحفظ كل بايت في عنوان من ذاكرة الايبروم , قسم على 100 لتحصل على جزء الـ HIGH ثن اخزنه وبعدها خذ المتبقي وهو جزء الـ LOW واخزنه في عنوان ثاني , وعند القراءة قم بجمعهم ,

اما عن سؤال الاستاذ عن سبب الضرب في 256 هو لكون المتغير 16 بت فيجب ضرب البت العالي في 256 , وهذا ما تعلمته من المهندس حسن هادي محمود واعمل عليه
أخى الكريم ما يمكن فعله بالورقة و القلم و الحاسبة يمكن عملة بالبرمجة و المتحكم و العكس بالعكس
للتقسيم يمكنك القسمة على ما تشاء لكن لإعادة الرقم يجب أن تضرب فى ذات الرقم الذى قسمت عليه

لو الرقم 321 مثلا
سنقسم على 100 سيعطى 3 و الباقى 21 ونخزن كل منها فى خانة
للإعادة سنضرب 3 * 100 = 300 ثم نجمع عليها الخانة الثانية 21 = 321 ذات الرقم الأصلى

لو سنقسم على 256 سيعطى 1 و الباقى 65
للإعادة 1*256 = 256 ثم نجمع عليها الخانة الثانية 65 = 321 ذات الرقم الأصلى

أما لو قسمت على 100 فستحصل على 3 و الباقى 21
و للإعادة ضربت 3*256 = 768 ثم نجمع عليها الخانة الثانية 21 = 789 رقم مخالف

و يمكنك التجربة على أى رقم شئت


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 05-02-2019, 06:46 AM المشاركة 12   
افتراضي


السلام عليكم ورحمه الله

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

اولا هذه داله تم اقتباسها من كود قد كتبته ..

كود:
   void EEPROM() {
 
     Lcd_Out(1, 1, " Program settings");  
     Lcd_Out(2, 1, "Temp:   . C"); delay_ms(1000);

       while(1)
    {
      LCD_Chr(2, 7, 48 + ((      Temp1 / 100) % 10));
      LCD_Chr(2, 8, 48 + ((      Temp1 / 10 ) % 10));
      LCD_Chr(2, 10, 48 + (      Temp1 % 10 ));
      if(Button(&PORTC,4,10,1)){ Temp1++;  delay_ms(100); }
      if(Button(&PORTC,5,10,1)){ Temp1--;  delay_ms(100); }

    }  
    
 }

أخي لقد حاولت بطرق عديده لكي اقسم قيمة المتغير " Temp1 " علي ثلاث مراحل كما موضح في الكود اعلاه

أخي الكريم أجد حيره ونتائج غريبه غير متوقعه في علي سبيل المثال كما في المعادله هذه
لو وضعت قيمه للمتغير " Temp1 " مثلا Temp1=321 وتم استخدام هذه المعادله
كود:
  LCD_Chr(2, 7, 48 + ((      Temp1 / 100) % 10));
      LCD_Chr(2, 8, 48 + ((      Temp1 / 10 ) % 10));
      LCD_Chr(2, 10, 48 + (      Temp1 % 10 ));
من التوقع وحسب ما فهمت أن ناتج القسمه هنا
كود:
  LCD_Chr(2, 7, 48 + ((      Temp1 / 100) % 10));
هيكون " 3 "
وهنا ناتج القسمه
كود:
   LCD_Chr(2, 8, 48 + ((      Temp1 / 10 ) % 10));
هيكون " 2 "
وهنا ناتج القسمه
كود:
  LCD_Chr(2, 10, 48 + (      Temp1 % 10 ));
هيكون " 1 "

وهنا ممكن احفظ ناتج كل عمليه قسمه من الثلاث عمليات اعلاه في ثلاث متغيرات ك التالي ناتج المعادله الأولي اضعهه في متغير مستقل وليكن مثلا " X1 " وهيساوي " 3 "
وايضا المعادله الثانيه اخذ ناتجها وهو " 2 " واحفظه مثلا في متغير " X2 "
وايضا ناتج المعادله الثالثه اخذ ناتجها واضعهه في متغير " X3 "

السؤال هنا كيف يتم اسناد ناتج كل معادله الي متغيير أخر هل بهذه الطريقه
كود:
  LCD_Chr(2, 7, 48 + ((      Temp1 / 100) % 10)); Temp1 = X1;
      LCD_Chr(2, 8, 48 + ((      Temp1 / 10 ) % 10)); Temp1 = X2;
      LCD_Chr(2, 10, 48 + (      Temp1 % 10 ));       Temp1 = X3;
وايضااا السؤال الثاني كيف اقوم بسترجاع قيمة المتغير " Temp1 " اقصد هنا القيمه المكانيه

هل بنفس الطريقه يعني اضرب قيمه المتغير " X1 " هكذا
كود:
    Temp1 = X1 * 100 + X2 + X3;
هل هذه المعادله بهذة الطريقه صحيحه ..

واخيراا اريد مثال او طريقه لتوضيح ما تم طلبه

وللعلم أخي المتغير " Temp1 " اقصي قيمه او رقم قد يصل اليها هو " 1000 " واستغربت أن هذة القيمه لم اوفق في تخزينها في ذاكره ابروم


واشكرك شكرااا جزيلا أخي ""ماجد ..""


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 05-02-2019, 08:43 AM المشاركة 13   
افتراضي


معذرة قبل ما أستطيع الرد عليك يجب أن تكون الأمور واضحة
الكتابة على الشاشة شيء و الحفظ فى EEPROM شيء آخر
ماذا تريد بالضبط؟؟


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 06-02-2019, 02:53 AM المشاركة 14   
افتراضي


معذرة قبل ما أستطيع الرد عليك يجب أن تكون الأمور واضحة
الكتابة على الشاشة شيء و الحفظ فى EEPROM شيء آخر
ماذا تريد بالضبط؟؟
السلام عليكم ورحمه الله

اقصد الكتابة والقرأة من ذاكرة "" EEPROM ""

مثل هذا الكود
كود:
  Lcd_Out(1, 1, "Temp:   . C"); delay_ms(1000);
      
      Temp1=321;
       
               //   EEPROM_Write    //
       Temp1 / 100 % 10;  X1 = Temp1;  EEPROM_Write(0, X1); //  X1 = 3  //
       Temp1 / 10 % 10;   X2 = Temp1;  EEPROM_Write(1, X2); //  X2 = 2  //
       Temp1 % 10 ;       X3 = Temp1;  EEPROM_Write(2, X3); //  X3 = 1  //

               //  EEPROM_Read  //
       X1 = EEPROM_Read(0); delay_ms(20);
       X2 = EEPROM_Read(1); delay_ms(20);
       X3 = EEPROM_Read(2); delay_ms(20);
      
       Temp1 =   X1 * 100 +  X2 + X3 ;
         
               //   Display data    //
       LCD_Chr(1, 7, 48 + (( Temp1 / 100) % 10));
       LCD_Chr(1, 8, 48 + (( Temp1 / 10 ) % 10));
       LCD_Chr(1, 10, 48 + ( Temp1 % 10 ));
في هذا البرنامج اريد تخزين هذا المتغيير " Temp1 " وقيمته = 321 وحفظه علي ذاكرة " EEPROM " وبعد ذالك القرأة من ذاكره EEPROM وعرض قيمة المتغير " Temp1 " علي شاشه LCD


وشكراا علي اهتمامك اخي


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 06-02-2019 الساعة 02:59 AM

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 06-02-2019, 10:22 AM المشاركة 15   
افتراضي


لو تقصد أنك تريد حفظ متغير من 4 بايت فى EEPROM ففى المساعدة وظائف Low,High,Higher,Highest للتعامل مع هذه الأجزاء الأربعة
الرقم الأصلى فى متغير من 4 بايت
هذه الوظائف لتفصل المنتغير كل بايت على حدة و مشروح فى ملف المساعدة help File اضغط على F1 تحصل على الملف
قد يتغير النص حسب ما إن كان للبك أم لغيره من المتحكمات لكن الأربع وظائف موجودة للأنواع الثلاث
أخى
أجبتك على هذا فى الردين السابقين ولو فتحت ملف المساعدة ستجد امثلة
كود:
include  built_in.h 
.
.
.
Temp = 1000 ; // 03E8 in hex
X1 = Lo (Temp); // x=E8
X2 = Hi (Temp); // X2=03
احفظهما فى الذاكرة و عندما تريد استعادتهما إقرأ اولا 
X1,X2 
من الذاكرة ثم
Lo (Temp) = X1 ;
Hi (Temp)=X2;
الآن 
 Temp 
  يحتوى القيمة الأصلية


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 11-02-2019, 06:05 AM المشاركة 16   
افتراضي


أخى
أجبتك على هذا فى الردين السابقين ولو فتحت ملف المساعدة ستجد امثلة
كود:
include  built_in.h 
.
.
.
Temp = 1000 ; // 03E8 in hex
X1 = Lo (Temp); // x=E8
X2 = Hi (Temp); // X2=03
احفظهما فى الذاكرة و عندما تريد استعادتهما إقرأ اولا 
X1,X2 
من الذاكرة ثم
Lo (Temp) = X1 ;
Hi (Temp)=X2;
الآن 
 Temp 
  يحتوى القيمة الأصلية

السلام عليكم ورحمه الله

أخي الكريم د/ ماجد "

اشكرك علي اهتمامك لقد فعلت ما فهمته من شرحك وتوصلت لهذه الطريقه والحمد لله النتائج مظبوطه .. اشكرك اخي علي تعاونك







لقد استخدمت 3 عناوين من ذاكره EEPROM هل توجد طريقة ما لأختصار الكود حتلي لو استخدم 2 عناوين بدلا من ثلاثه

كود:
void main() {
    TRISD = 254; PORTD =0;
 
   // OSCCON =  0X70;       // Set internal oscillator at 8MHz
    ADCON1 = 0x0F;        // Configure AN pins as digital
    Lcd_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);        // cursor off
    Lcd_Cmd(_LCD_CLEAR);             // clear LCD
    Lcd_Out(1, 6, "Temp:   . C");
    Lcd_Out(2, 2, "Humidity:   . %");

     while(1){

      X=377;
        
      X1= X / 100 % 10;
      X2=  X / 10 % 10;
      X3= X % 10;

     EEPROM_Write(0,X1); delay_ms(50);
     EEPROM_Write(1,X2); delay_ms(50);
     EEPROM_Write(2,X3); delay_ms(50);

     X1=  EEPROM_Read(0); delay_ms(50);
     X2=  EEPROM_Read(1); delay_ms(50);
     X3=  EEPROM_Read(2); delay_ms(50);
        
      Temp= X1*100+ X2*10+  X3 ;
       
      LCD_Chr(1, 12, 48 + ((Temp / 100) % 10));
      LCD_Chr(1, 13, 48 + ((Temp / 10) % 10));
      LCD_Chr(1, 15, 48 + (Temp % 10));
       
   }
   }


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 11-02-2019 الساعة 06:14 AM


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