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

   

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,679
نشاط [ مسلم11 ]
قوة السمعة:
قديم 04-01-2020, 08:37 PM المشاركة 97   
افتراضي



👍👍👍👍👍👍👍👍👍👍👍👍👍 مليون like قليل .
شكرا لك .
الكلمة unsigned هي للاعداد الصحيحة الطويلة اليس كذلك اتمنى لو كلمتين عنها بطريقتك و اول سطرين من الاعلى .
والله شرحك اكثر من رائع سلس يفهم جيدا .
بارك الله بك


التعديل الأخير تم بواسطة : مسلم11 بتاريخ 04-01-2020 الساعة 08:44 PM
اعلانات

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


👍👍👍👍👍👍👍👍👍👍👍👍👍 مليون like قليل .
شكرا لك .
الكلمة unsigned هي للاعداد الصحيحة الطويلة اليس كذلك اتمنى لو كلمتين عنها بطريقتك و اول سطرين من الاعلى .
والله شرحك اكثر من رائع سلس يفهم جيدا .
بارك الله بك
شكراا اخي
نعم كلمة unsigned هي للاعداد الصحيحة الطويلة

بالنسبة لهذا السطر
كود:
 unsigned short mask(unsigned short num);
يوجد متغير num يستقبل حالة التحويل القادمة من هذا الكود
كود:
unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;
وبعد ذالك ينسب ناتج التحويل الي mask .. الي هنا خلينا نشوف هنعمل اية في هذة القيمه


الأن عرفنا ان فائدة هذا الكود هوا استلام قيمة معينة ةتسليمها بقيمة أخري وفي الحالتين نحن من نكتب لهة القيمتين
مثال case 9 : return 144 هنا قولنا للبرنامج لو جالك رقم 9 حولة الي رقم 144 واحفظة في هذا المتغير
كود:
unsigned short mask(unsigned short num);
وسوف نتعرف ماذا نفعل مع هذة القيمة

للموضوع بقية

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

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


نكمل

الأن تعرفنا الي أين تستقر القيمة المحولة واريد التحدث قليلا عن هذا الكود
كود:
 unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;
كما هوا واضح هذا الكود يستقبل قيم معينة وتبدأ من 0 الي 9 ويحويلها الي قيمة أخري قد كتبناها
وللتوضيح اكثر خلينا نشوف ازاي نشكل حرف p علي شاشة 7 سيجمينت

خلينا نقول ان الشاشة موصلة بالترتيب التالي
حرف A في الشاشة موصل بطرف 1 للمنفذ B في المتحكم
حرف B في الشاشة موصل بطرف 2 للمنفذ B في المتحكم
حرف C في الشاشة موصل بطرف 3 للمنفذ B في المتحكم
حرف D في الشاشة موصل بطرف 4 للمنفذ B في المتحكم
حرف E في الشاشة موصل بطرف 5 للمنفذ B في المتحكم
حرف F في الشاشة موصل بطرف 6 للمنفذ B في المتحكم
حرف G في الشاشة موصل بطرف 7 للمنفذ B في المتحكم
حرف DP في الشاشة موصل بطرف 8 للمنفذ B في المتحكم

وهنا لإظهار حرف P علي الشاشة سوف نخرج صفر فولت أو جهد سالب علي كل من A, B, E, F, G وباقي الأطراف نخرج 5 فوالت وهم C, D, DP
http://upload.qariya.info/up2019/165...0999B7EF9F.gif
ولاحظ عند اشعال هذة الليدات سوف يتشكل لنا حرف P وهنا سيكون الأمر متعب حيث كل مرة تريد اظهار رقم فيها علي الشاشة تحتاج الي ان تري ما هي الأطراف اللتي تخرج عليها صفر فولت أو 5 فولت
وهنا ميزة استخدام المحاكي لشاشة 7 سجمينت لتكوين قيمة رقمية مطابقة لتفعيل الجهود اللازمة لإضاءة الليدات في الشاشة
وهنا جاء اهمية كود التحويل لكي يسهل الأمور علينا حيث يستقبل قيمة رقمية عشرية ويحولها لقيمة ثنائية او كما نسميها لغة الأله


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


نكمل

نبدأ من هذا السطر
هنا قد تم اسناد قيمة المتغير SEGMENT1 الي mask وبالطبع mask أخذ هذة القيمة وذهب بها الي كود التحويل
كود:
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;
ليتم عملية التحويل لو كانت قيمة المتغير SEGMENT1 = 0 اجعلها = 192 القيمة بالثنائي هي 11000000
ولو كانت قيمة المتغير SEGMENT1 = 1 اجعلها = 249 القيمة بالثنائي هي 11111001
ولو كانت قيمة المتغير SEGMENT1 = 2 اجعلها = 164 القيمة بالثنائي هي 10100100
ولو كانت قيمة المتغير SEGMENT1 = 3 اجعلها = 176 القيمة بالثنائي هي 10110000
ولو كانت قيمة المتغير SEGMENT1 = 4 اجعلها = 153 القيمة بالثنائي هي 10011001
ولو كانت قيمة المتغير SEGMENT1 = 5 اجعلها = 146 القيمة بالثنائي هي 10010010
ولو كانت قيمة المتغير SEGMENT1 = 6 اجعلها = 130 القيمة بالثنائي هي 10000010
ولو كانت قيمة المتغير SEGMENT1 = 7 اجعلها = 248 القيمة بالثنائي هي 11111000
ولو كانت قيمة المتغير SEGMENT1 = 8 اجعلها = 128 القيمة بالثنائي هي 10000000
ولو كانت قيمة المتغير SEGMENT1 = 9 اجعلها = 144 القيمة بالثنائي هي 10010000

الأن اصبح قيمة mask هي ناتج عملية التحويل حسنا
كود:
    PORTB = mask ( SEGMENT1 ); delay_ms(1);
هذا الكود يجعل البورت ب باكامل 8 منافذ = قيمة mask وعندها تظهر لنا القيمة علي الشاشة

كود:
           
      if( PORTD.F0==1 ) { SEGMENT2++; delay_ms(250);}
      if( PORTD.F1==1 ) { SEGMENT1--; delay_ms(250);}
الأن هذة الأوامر الشرطية كما هوا واضح PORTD.F0==1 لو البن رقم 1 في البورت D هل = 1 تذيد قيمة المتغير SEGMENT1 بواحد كل مرة يتحقق فيها الشرت يذداد المتغير SEGMENT1 بواحد وينتظر delay_ms(250) ; OK ليعطي وقت كافي لرفع يدك من علي المفتاح ..
ونفس الأمر في الشرط الثاني ولكن الشرط الثاني هوا لأنقاص قيمة SEGMENT1 بواحد عند كل مرة يتحقق فيها الشرط ..

بعد ذالك يجب علينا تقيد قيمة المتغير SEGMENT1 حتي لا يتخطي القيمة ما بين 0 و 9
كود:
 if( SEGMENT1 >9  ) { SEGMENT1=0;   }
      if( SEGMENT1 <0  ) { SEGMENT1=0; ; }
هنا الشرط الأول يقول لو SEGMENT1 اصبح اكبر من 9 اجعله = 0
والشرط الثاني يقول لو SEGMENT1 اصبح اصغر من 0 اجعلة = 0

الي هنا الباقي معروف
نكمل في شرح برنامج الشاشتين


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 05-01-2020 الساعة 03:30 AM

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


نكمل

كود:



     unsigned short mask(unsigned short num);
      unsigned int SEGMENT1=0,SEGMENT2=0;

            void main() {
          TRISB=0; PORTB=0;
          TRISD=7; PORTD=0;
          TRISC=0; PORTC=0;
             while(1){
             
          PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
              
          PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(1);
              
      if( PORTD.F0==1 ) { SEGMENT2++; delay_ms(250);}
      if( PORTD.F1==1 ) { SEGMENT1--; delay_ms(250);}

      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1++;  }
      if( SEGMENT1 >9  ) { SEGMENT2=9;  SEGMENT1=9; }


        
  }
    }
    

  unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;

 
}
}
البرنامج الثاني

هوا هوا نفس البرنامج مع اضاة امر لتغذية انود المشترك للشاشتين وهنا نعتمد علي الخداع البصري

كما نعلم أن مقطع الفيديو هوا عبارة عن عدد كبير من الصور يتم عرضها بسرعه 23 صورة في السانية لنتوهم أنه الأشياء تتحرك ولكن في الحقيقه هي صور سابتة ولكن سرعة العرض هي من تخدع العقل ويتوهم انها تتحرك ..

وهنا نشرح الكود المضاف وتم تحديدة بالون الأزرق
كود:
  PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
نشرح هذة التعليمة
هنا تم اخراج 5 فولت للطرف المشترك انود الشاشة وفي نفس الوقت تم اخراج الداتا أو الجهود علي المنفذ B وهنا تم وصول 5 فولت للطرف المشترك في الشاشة وايضا في نفس الوقت تم اخراج اصفار ووحايد علي منفذ B ليتم اظهار القيمة علي الشاشة وبعد ذالك أمر انتظار 1 /1000 من السانية وبعد ذالك تم اطفاء الشاشة الأولي وتشغيل الشاشة الثانية
كود:
  PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(1);
ولاحظ أن حالة PORTC=2 تغيرت من واحد الي اثنان وهنا لكي تنقل ال 5 فولت من علي الشاشة الأولي الي الثانية واظهار المعلومات عبر اسناد قيمة mask للبورت B وتتكرر هذة التعملية بسرعه 1 /1000 وهنا يتم خداع العين لأن في الحقيقة يتم تشغيل شاشة واحدة ويتم التبديل بينهم ولكن ما يظهر لنا هوا ان الشاشتين مشتعلان ..

البرنامج القادم هوا استخدام 4 شاشات وسوف تواجهنا مشكلة لنري كيف نتخطاها

ويوجد سؤال ماذ يحدث لو تم وضع أمر انتظار في منتصف البرنامج بالطبع هنا لن نري الشاشتين يعملان في نفس الوقت ونلاحظ ان تشتغل واحدة وطنطفئ الأخري ويتم التبديل ما كانت منطفئة تشتعل ومن كانت مشتعلة تنطفئ وهذا ناتج عن أن الميكرو في هذا البرنامج لا يستطيع تنفيذ امرين في تفس الوقت
وهذا ما سوف نعرفة في الدرس القادم
وهوا كيف يقوم الميكرو بمراقبةوتنفيذ اكثر من أمر في نفس الوقت


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 05-01-2020 الساعة 03:23 AM

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


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

الأن نكمل مع سلسة انشاء عداد بستخدام ال 7 سيجمنت

تم تطوير العداد واصبح 4 شاشات




كود

كود:
     unsigned short mask(unsigned short num);
     unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0;

            void main() {
          TRISB=0; PORTB=0;
          TRISD=7; PORTD=0;
          TRISC=0; PORTC=0;
          
          while(1){

          PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
              
          PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(1);
          
          PORTC=4; PORTB = mask ( SEGMENT3 ); delay_ms(1);
          
          PORTC=8; PORTB = mask ( SEGMENT4 ); delay_ms(1);
          
          if( PORTD.F0==1 ) { SEGMENT4++; delay_ms(250);}

      if( SEGMENT4 >9  ) { SEGMENT4=0;  SEGMENT3 ++;  }
      if( SEGMENT3 >9  ) { SEGMENT3=0;  SEGMENT2 ++; }
      if( SEGMENT2 >9  ) { SEGMENT2=0;  SEGMENT1 ++; }
      if( SEGMENT1 >9  ) 
      { SEGMENT1=0;  SEGMENT2=0; SEGMENT3=0; SEGMENT4=0; }

  }
    }
    
  unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;

 
}
}
هنا تم اضافة متغيران للشاشات المضافة
كود:
 unsigned int SEGMENT1=3,SEGMENT2=2,SEGMENT3=0,SEGMENT4=0;
المتغيرات المضافة باللون الأزرق

وايضا هذا الكود هوي لإظهار البينات علي الشاشات الأربعة
كود:
PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
              
          PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(1);
          
          PORTC=4; PORTB = mask ( SEGMENT3 ); delay_ms(1);
          
          PORTC=8; PORTB = mask ( SEGMENT4 ); delay_ms(1);
نعيد شرح وتفصيل هذا الكود ونلاحظ هنا من بداية العرض ونذكر أن الشاشات المستخدمة من نوع الموجب المشترك ..

كود:
PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
من بداية الكود PORTC=1 هنا تم اخراج 5 فولت لمشترك الشاشة الأولي وفي نفس الوقت أخراج الداتا من منفذ B وايضا اسناد الداتا أو الرقم أو خلينا نقول ناتج التحويل الي المنفذ B من خلال هذة التعليمة( PORTB = mask ( SEGMENT1 نتكلم قليلا عن هذة التعليمة وهي مثلا قيمة المتغير SEGMENT1 = 3 هنا يذهب البرنامج الي كود التحويل هذا
كود:
unsigned short mask(unsigned short num){
  switch (num){
 case 0 : return 192;
 case 1 : return 249;
 case 2 : return 164;
 case 3 : return 176;
 case 4 : return 153;
 case 5 : return 146;
 case 6 : return 130;
 case 7 : return 248;
 case 8 : return 128;
 case 9 : return 144;
ونلاحظ هنا ما هي قيمة SEGMENT1 قيمتها = 3. حسنا البرنامج يعمل عملية فحص في كود التحويل هل يوجد رقم 3 في هذة التعليمات نعم يوجد رقم 3 وتم تحديدة بالأزرق لكي نلاحظة وهذا هوا case 3 : return 176 وهنا هذة التعليمة تقول لو جاء لك 3 حولها الي return 176 وارجعها لل mask وهنا اصبحت قيمة mask هي 176 وبالثنائي هكذا 10110000 وهذا بالظبط ما سوف يخرجة المتحكم علي اطراف المنفذ B عبر هذا الأمر
كود:
PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1);
وهنا نلاحظ أن خرج المنفذ PORTB سيكون هكذا ( سالب / سالب / سالب / سالب / موجب / موجب / سالب / موجب ولو طبقنا هذة الجهود علي الشاشة سوف تشكل لنا رقم ( 3 )

وهكذا مع باقي الشاشات البرنامج يختبر قيمة المتغيرات SEGMENT1 , SEGMENT4 , SEGMENT3 , SEGMENT2 ويذهب الي كود التحويل لكي يحول قيمة كل متغير ويحفظ الرقم المحول في mask ولكن هنا سؤال كيف تكون كل متغيرا الأربع لل SEGMENT تنسب قيمتها المحولة لل mask اليس هذا يعني أن جميع الشاشات سوف تظهر لنا قيمة mask وستكون هذة القيمة متكررة للأربع شاشات ..

هنا نقول أن اللغز هذا يعتمد علي الخداع البصري لأن في الواقع هي شاشة واحدة من تعمل

خلينا نشوف اية اللي بيحصل عشان تظهر لنا قيمة كل شاشة مستقلة عن الأخري

نكمل


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 06-01-2020 الساعة 03:57 AM

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


نكمل

خلينا نعلن عن الأربع متغيرات للأربع شاشات ونسند اليهم قيم مباشرة هكذا
كود:
unsigned int SEGMENT1=3,SEGMENT2=2,SEGMENT3=1,SEGMENT4=6;
هنا تم اسناد القيمة 3 للشاشة SEGMENT1 الأولي
والقيمة 2 للشاشة SEGMENT2 الثانية
والقيمة 1 للشاشة SEGMENT3 الثالثة
والقيمة 6 للشاشة SEGMENT4 الرابعة

تمام ما هي الخطوات اللذي يجريها البرنامج لإظهار قيمة كل شاشة مستقلة عن الأخري

بعد قرأة المتغيرات ومعرفة حالة المنافذ وجمع المعلومات من قبل البرنامج يستعد ويذهب الي تنفيذ الأوامر الموجودة في دالة البداية

وهنا نبدأ من هذا السطر PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(1); كما شرحنا هذا الكود ونعيد ونكرر شرحة مرة ثالثة لنتعمق اكثر في فهم مسار البرنامج وكيف تجري الأمور ..
هنا PORTC=1; PORTB = mask البرنامج يخرج 5 فولت علي البن 1 للمنفذ C وايضا يأخذ المنفذ B قيمة mask طبعا بعد عملية التحويل لأن mask واخد ناتج قيمة تحويل قيمة SEGMENT1 وهنا بعد تحويل قيمة SEGMENT1 تم هفظها في mask وهنا من خلال هذة التعليمة( PORTB = mask ( SEGMENT1 اصبحت قيمة PORTB = قيمة mask وهنا تم تفعيل 5 فولت علي البن رقم 1 للمنفذ C وفي نفس للوقت تم اخراج الداتا علي المنفذ PORTB ..
وهنا تلاحظ أن باقي الشاشات متصلة معا بالتوازي من اطراف سالب الليدات أو خلينا نقول من اطراف الداتا ولأن مشترك موجب الشاشات متصل مع المنفذ C فهنا لن تضيئ الا الشاشة الأولي فقط وهنا لأن تم اخراج 5 لمجمع الشاشة الأولي وباقي مجمع الشاشات يصل الية صفر فولت ولأن تحقق 5 فولت وايضا تحقق سالب فولت من منفذ PORTB فهنا بالطبع سوف تضوي الشاشة الأولي وباقي الشاشات ستكون متوقفة لأن مجمع موجب هذة الشاشات لم يطبق علية 5 فولت
وبعد اشعال الشاشة الأولي واخراج الداتا لها ينتظر البرنامج 1 / 1000 من السانية ليعطي لعين الأنسان فرصة لطبع صورة الشاشة الأولي في ذاكرتة ..
وبعد ذالك يذهب للبرنامج للسطر التالي

كود:
PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(1);
هنا في هذا الكود تختفي 5 فولت من علي البن رقم 1 للمنفذ PORTC وفي نفس الوقت يخرج 5 فولت للبن رقم 2 للمنفذ PORTC وهنا نلاحظ أن ال 5 فولت قد انتقلت من الشاشة الأولي الي الشاشة الثانية وباقي مجمع الشاشات صفر فولت وبعد ذالك تتم نفس الخطوات PORTB = mask وهي اسناد قيمة mask الي
PORTB ولكن mask نتذكر انة = 3 وهتا قبل اسناد قيمة mask الي منفذ PORTB يذهب البرنامج الي المتغير SEGMENT2 ليجد ان قيمتها = 2 ايذا يذهب لكود التحويل
كود:
case 2 : return 164;
ليحول رقم 2 الي القيمة الموجودة في جدول التحويل وهي return 164 وهنا ترجع هذة القيمة الي mask وهنا يسند mask قيمته الي PORTB هكذا PORTB = mask وهنا سيكون خرج منفذ PORTB هكذا 10100100 بالثنائي وطبعا الصفر = سالب و الواحد = 5 فولت وهنا يتم اخراج هذة الجهود لكل الشاشات لأن اطراف الداتا لكل الشاشات متصلة مع بعض ولنتذكر لأن الميكرو يخرج 5 فولت فقط لمجمع الشاشة الثانية في اللتي تضوي وبعد ذالك ينتظر 1 / 1000 من السانية ليعطي اثر في العين وتتكرر نفس الطريقة مع باقي الشاشات ونلاحظ أن كل هذة الأوامر والحسابات وعمليات التحويل واظهار النتائج او اظهار المعلومات تحدث فقط في 4 / 1000 من الثانية وهنا لم نلاحظ ان. الشاشات تضوي وتنطفئ بالتسلسل هذا لأن عملية التبديل سريعه جدا وتسبق سرعة العين البشرية وهنا تتم عملية الخداع البصري ..

وهنا لو نؤيد ابطاء سرعة المشهد لكي نلاحظ ماذا يحدث يمكننا ذيادة وقت التبديل بين الشاشات مثل هكذا


كود:
 PORTC=1; PORTB = mask ( SEGMENT1 ); delay_ms(100);
              
          PORTC=2; PORTB = mask ( SEGMENT2 ); delay_ms(100);
          
          PORTC=4; PORTB = mask ( SEGMENT3 ); delay_ms(100);
          
          PORTC=8; PORTB = mask ( SEGMENT4 ); delay_ms(100);
نلاحظ هنا تم ذيادة وقت الإنتظار أو كما نسمية وقت التبديل ليكون زمن الإنتظار 100 ميكرو سانية بدلا من واحد ميكرو سانية ولو قمنا بهذة التجربة علي المحاكي سوف نلاحظ أن شاشة واحدة فقط هي من تعمل بالتتالي ..

يوجد عيب وحيد في هذا الكود
وهوا عند الضغط علي مفتاح ذيادة العداد سوف ينتظر البرنامج 250 ميكرو سانية في كل مرة نضغط فيها علي مفتاح الذيادة وهنا سوف نلاحظ أنة يحدث خلل في عرض الشاشات حيث سوف تتوقف 3 شاشات عند الضغط علي المفتاح وهذا لأن البرنامج يكون مشغول في اشعال واطفاء الأربع شاشات بالتوالي بسرعة كبيرة تخدع العين البشرية ولكن لو كانت الشاشة الأخير قبل أمر شرط المفتاح مشتعلة وعند الضغط علي المفتاح سوف يتوقف البرنامج عن اشعال باقي الشاشات وهنا سوف تلاحظ العين البشرية أن شاشة واحده فقط هي اللتي تعمل
هل يوجد حل لهذة المشكلة
بالطبع نعم بعض المتحكمات تستطيع تنفيذ أو متابعة تنفيذ أمرين في وقت واحد وهذا بستخدام التايمر الداخلي للمتحكم

وهذا هو الدرس القادم استخدام التايمر الداخلي لإظهار وتشغيل 8 شاشات 7 سيجمنت

نتابع


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 06-01-2020 الساعة 05:09 AM

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


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


نتكلم اليوم عن المقاطعات Interrupts .. كما هوا واضح من اسمها فهيا وظيفتها مقاطعة البرنامج للذهاب الي تنفيذ برنامج أخر ..

وهنا لكي نستطيع التعامل مع التايمر الداخلي قد انتجة شركة ميكرو الكترونكا اداة مهمه جداا لحساب زمن التايمر
ولتحميل هذة الأداة من هذا الرابط
https://libstock.mikroe.com/projects...mer-calculator

صورة لأداة حساب التايمر


كما هوا واضح في الصورة نختار عائلة ال pic ونختار رقم التايمر 0 أو 1 او 2 الخ
حيث لبعض المتحكمات تحتوي بداخلها علي عدد من التايمر
بعد اختيار رقم التايمر ايضا بنختار زمن دورة التايمر وفي هذة الصورة تم اختيار 1 ميكرو سانية

بعد ذالك الأداة تولد لنا اعدادات وكود لإستخدام وتهيئة التايمر
مثل هذا الكود
[code]//Timer0
//Prescaler 1:8; TMR0 Preload = 6; Actual Interrupt Time : 1 ms

//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x82;
TMR0 = 6;
INTCON = 0xA0;
}


كود:
void Interrupt(){
  if (TMR0IF_bit){ 
    TMR0IF_bit	 = 0;
    TMR0		 = 6;
    //Enter your code here
  }
}
يوجد في هذا الكود جزئين الأول هوا كود لتهيئة وتعريف التايمر وتهيئة زمن الدورة

وهذا كود التهيئة أو التعريف
كود:
void InitTimer0(){
  OPTION_REG	 = 0x82;
  TMR0		 = 6;
  INTCON	 = 0xA0;
}
وهذا كود لبرنامج التايمر اللذي نكتب داخل القوسين الأكواد اللتي نريدها

void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 6;

//Enter your code here



}
}


نكتب الكود من بداية هذة الكلمة //Enter your code here

نكمل


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 08-01-2020 الساعة 05:55 AM


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