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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-04-2015, 10:21 PM المشاركة 9   
افتراضي أنواع البيانات والمتغيرات



أنواع البيانات والمتغيرات : Data Types and Variables

تستخدم لغة السى أنوع عديدة من البيانات تشمل الأحرف characters و الأعداد الصحيحة
integer numbers والأعداد الحقيقية ( الغير صحيحة) float numbers . فى لغة السى ، يجب الأعلان (تعريف) declare عن المتغير قبل أن تستخدمه . عند الإعلان عن المتغير يتم حجز مساحة فى الذاكرة مناسبة لنوعه .

المتغيرات فى لغة السى

المتغيرات هى مجموعة من البايتات Bytes يتم حجزها فى الذاكرة العشوائية RAM , حيث يتم وضع قيم متغيرة فى تلك البايتات المحجوزة ويمكن استرجاعها فى أى وقت . كل بايت يتم الوصول اليه من خلال عنوان address . تفقد ذاكرة RAM جميع بياناتها عند قطع التيار .
ذاكرة RAM عبارة عن رقاقة Chip تحتوى على عدد من الترانزستورات والمكثفات تقدر بالملايين , حيث كل ترانزستور ومكثف يشكلان وحدة ذاكرة تسمى بت(خانة) Bit , يحمل هذا البت إما القيمة صفر "0" أو القيمة واحد "1" . كل 8 بتات تشكل واحد بايت Byte وكل بايت له عنوان يمكن الوصول إليه والتغيير فى محتوياته ، أى أن الذاكرة عبارة عن عناوين متسلسلة لكل عنوان قيمة متغيرة كما فى الشكل التالى .



فى لغة السى ، يوجد عدة أنواع من المتغيرات والثوابت , منها متغيرات خاصة بالأعداد الصحيحة integer وأخرى خاصة بالأعداد الحقيقية float وثالثة خاصة بالأحرف characters و.... , ويجب الإعلان عن المتغيرات والثوابت قبل استعمالها (كأنك تحجز مكانا مسبقا " لوضع قيمة فيما بعد" ) .

طريقة الإعلان عن متغير :

للإعلان عن المتغير يتم كتابة نوع المتغير ثم اسم المتغير ثم القيمة التى سيحتويها المتغير (فى حالة إعطاءه قيمة مباشرة فى البداية ) كما فى الشكل التالى .



نوع المتغير Variable Type :

توجد عدة أنواع من المتغيرات لا تختلف عن بعضها إلا فى الحجم وهذا يعنى أنه عند الإعلان عن المتغير يمكننا أن نعطيه حرفا بدلا من القيمة .
تعريف المتغيرات والثوابت والمعرفات :
ينبعى التعريف الصحيح (الاسم والنوع المناسب) لجميع المتغيرات والثوابت المستخدمة فى البرنامج . نفس الشىء ينطبق على الدوال والمعرفات .
البيانات الأساسية يمكن أن تكون بطول 8 أو 16 أو 32 بت ، ونظراللخصائص الخاصة للميكروكونترولر ، يمكن أيضا تعريف متغيرات بطول بت واحدة .

مدى المتغيرات الأساسية :

• متغير 8 بت : مثل متغير الأحرف ويسمى char ( أو int8) يكون مداه من 0 إلى 255 .
• متغير 16 بت : مثل متغير الأعداد الصحيحة الطويلة ويسمى long int (أو 1nt16) يكون مداه من 0 إلى 65535 .
• متغير 32 بت : مثل متغير الأعداد الحقيقية (التى تحتوى على كسر عشرى) ويسمى float (أو int32) يكون مداها +/- 65535 .
• متغير بت واحد : وهو يأخذ إما القيمة صفر "0" او القيمة واحد "1" ويسمى short (أو int1) .
فيما يلى جدول يبين أنواع المتغيرات بلغة السى القياسية ، ولغة السى مع المترجم CCS C :



المتغيرات ذات القيم السالبة :

المتغيرات من نوع long int قد تحتوى أو قد لا تحتوى على علامة (إشارة) السالب . للتأكد من أن المتغير يكون موجب دائما ، نستخدم كلمة "بدون إشارة" unsigned قبل تعريفه ، أما إذا كان من الضرورى معالجة أعداد سالبة فأننا نستخدم كلمة "بإشارة" signed قبل تعريفة .
مثال :

كود:
unsigned long int time; // Time will from 0 to 65535
signed long int space; // Space will from -32768 to 32767
لاحظ أن :
• استخدام signed تخفض مجال المتغير إلى النصف .
• إذا لم يتم استخدام نوع محدد فإن المتغير يكون من النوع الافتراضى وهو unsigned .
• نوع char دائما يكون unsigned .
• النوع float يمكن أن يكون سالب أو موجب (ينصع بعدم استخدامه إلا عند الضرورة) .

مثال لإعلان (تعريف) المتغيرات والثوابت :

لإعلان متغير ينبغى أن نتبع الترتيب التالى : من اليسار إلى اليمين : النوع ثم الاسم "Type Name"
مثال :

كود:
Type Name
char  time; 		// The variable 'time' is from 0 to 255
يمكن إعلان مجموعة متغيرات من نفس النوع فى سطر واحد كما يلى :

كود:
char i, j, k; // Declares that i, j and k are of type char.
طريقة كتابة أسماء المتغيرات والثوابت والدوال :

جميع مسميات المتغيرات والثوابت والدوال ينبغى أن تبدأ بحرف أبجدى letter ، وأن يكون له 32 حرف كحد أقصى ولا يستخدم الأحرف الخاصة او أحرف التحكم ( مثل ! , \ , ? , % , ….) .
تحدثنا سابقا عن عناوين المتغيرات , توجد ملاحظة قوية هنا يجب التنبيه بها وهى أننا نرى المتغيرات أسماء أما الجهاز فيراه عناوين , الإسم مجرد أداة استعملت لتسهيل عملية الوصول إلى تلك العناوين بدون اللجوء إلى عناوين إنما أسماء واضحة توضح سبب الإعلان عنها .
لإسم المتغير حدود لا يجب تجاوزها وهى :
• أن لا يتجاوز اسم المتغير رأكثر من 31 حرف .
• أن لا يبدأ اسم المتغير بأرقام .
• أن لا يكون اسم المتغير يحتوى على مؤثرات مثل الجمع والطرح و...
• أن لا يكون اسم المتغير يحتوى على رموز مثل % و # و... باستثناء رمز الشرطة التحتية (-) .
• أن لا يكون اسم المتغير مستعمل سابقا فى دالة أو متغير آخر .
• أن لا يكون اسم المتغير من أسماء الكلمات المحجوزة .
ملحوظة هامة :
المترجم حساس لشكل الحرف ، فالكلمات TEST و Test و test ، بالنسبة للمترجم تكون لثلاثة متغيرات مختلفة .
من المفضل ، كممارسة عملية ، استخدام اسماء بأحرف مختلفة للتفرقة بين مسميات المتغيرات والثوابت والدوال ، كما فى الأمثلة التالية :

كود:
PORTB  for registers
TimeMs for functions
value for RAM variables
قيمة المتغير Variable Value :

يجب مراعاة قيمة المتغير حسب نوعه , فمثلا لا يمكن أن نعطى للمتغير int قيمة عدد حقيقى float . قيمة المتغير يمكن أن نعطيها له مباشرة بعد الإعلان عنه أو نقوم بالإعلان عنه ونضع به قيمة فيما بعد .
جميع المتغيرات يمكن استخدامها بعد الإعلان عنها . المثال التالى يبين متغيران من نوع الحرف char اسمهما w و x ، ولقد تم الإعلان عنهما وتعيين القيم 5 و 9 لهما على الترتيب :

كود:
char	w = 5, x = 9;

تخصيص (تعيين) القيم للمتغيرات :
يتم تخصيص قيمة للمتغير كما فى المثال التالى :

كود:
time = 123;
فى هذا المثال ، المتغير المسمى time يتم استبداله بالقيمة العشرية "123" .

ملحوظة هامة :
القيم الابتدائية للمتغيرات :


ينبغى دائما أن نحدد القيم الابتدائية لكل متغير فى البرنامج قبل استخدامه ، لأنه لا شىء يضمن أنه يكون بصفر عند إعادة التشغيل reset .

المتغيرات الشاملة (العمومية) global والمتغيرات المحلية local :

يوجد طريقتان أساسيتان لحجز ذاكرة للمتغيرات :

• طريقة المتغيرات الشاملة Global :
المتغيرات الشاملة يمكن الوصول إليها من خلال جميع الدوال الموجودة فى البرنامج . هذا يعنى أن أى دالة فى البرنامج يمكن أن تستخدم هذه المتغيرات الشاملة (العمومية) .

• المتغيرات المحلية Local :
المتغيرات المحلية يمكن أن نصل إليها فقط من داخل الدالة التى قمنا بإنشائها بها . وهذا يعنى ان الدالة التى أنشأنا فيها المتغير المحلى هى الوحيدة التى يمكن أن تستخدمها .

مثال :

كود:
char A, B, C; // A, B and C are global variables, since they are outside
                       // Any function 

main ()
{
  A = 0;                             // Make A = 0
  Time ();                         // Call  Time function
   Wait ();                        // Call Wait function 
}

 Time ()
     {
     char J;                 // Create a variable called J.
                                 // Only Time () function can use it
     J = A;
     }

Wait ()
{
    char X;               // Create a variable called X.
                                // Only function  Wait () can use it
    X = A;
   X = J; // Error: The variable J does not exist for this function 
 }
الميزة الرئيسية فى استخدام المتغيرات المحلية هى أن نفس ذاكرة RAM المحتلة بمتغيرات سوف تتقاسم مع المتغيرات المحلية الأخرى ، مما يتيح زيادة مساحة الذاكرة .

الثوابت Constants :
يتم إعلان القيم التى سوف لا تتغير بواسطة البرنامج باستخدام كلمة const كما فى المثال التالى :

كود:
float const pi = 3.14 ;
الدوال Functions :



اعلانات

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


استاذ فتح الله هل هذا الكومبايلر فيه مشاكل ام لا ؟؟؟ انا اقصد مشاكل الشاشة في مكتبة المايكروسي

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-04-2015, 10:55 PM المشاركة 11   
افتراضي


استاذ فتح الله هل هذا الكومبايلر فيه مشاكل ام لا ؟؟؟ انا اقصد مشاكل الشاشة في مكتبة المايكروسي
أخى الكريم
شكرا جزيلا لك
إذا كنت تقصد ساشة LCD :

اعتقد أن الميكروسى برو لا توجد به مشاكل مع مكتبة LCD .
وهذا البرنامج أيضا ليس به مشاكل مع مكتبة LCD .
عموما نابع الدروس وسوف يتم تغطية مواضيع كثيرة متعلقة بشاشة LCD
مع تمنياتى بدوام التوفيق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 04:13 PM المشاركة 12   
افتراضي


البداية وبرمجة السلسلة PIC16 بلغة السى :

سوف نتناول برمجة الميكروكونترولر PIC بلغة السى باستخدام أبسط برامج ممكنة ، على افتراض أن القارىء ليس لديه خبرة سابقة فى اللغة . المترجم CCS يستخدم بناء الجملة والهياكل التى تستخدمها لغة السى القياسية ANSI C . مع ذلك ، فإن مترجم أى ميكروكونترولر معين يستخدم الاختلافات الخاصة به من أجل عمليات محددة للمعالج ، ولا سيما عمليات الإدخال والإخراج .

برنامج بسيط :

البرنامج الأول ، هو برنامج الحد الأدنى والذى ببساطة يعين sets بتات منفذ 8 بت فى الميكروكونترولر PIC16F877A لأى مجموعة (توليفة) مطلوبة .

كود:
// Outputs an 8-bit code at Port D in the 16F877 MCU
#include <16F877A.h> 		// MCU header file

void main() 				// Main block start
{
output_D(255); 		// Switch on outputs
}
التعرف على مكونات كود المصدر :
• توجيه التضمين #include تخبر المترجم لدمج ملف يسمى ملف الرأس header file لميكروكونترولر معين . هذا الملف يقدم معلومات عن سمات الهاردوير التى يحتاجها المترجم لتكييف البرنامج .
• الكلمات الخاصة void main تشير إلى بداية كتلة دالة البرنامج الرئيسى ، والأقواس الملحقة بها (الأقواس المعرجة {} ) تطوق (تحصر) عبارات البرنامج .
• هذا البرنامج يحتوى على عبارة واحدة ، وهى دالة الخرج output_D(nnn) والتى ترسل (تمرر) بيانات بايت الوسيط nnn=255 إلى المنفذ Port D . النتيجة تعيين جميع أطراف المنفذ بالحالة المرتفعة .

تحليل البرنامج :
تتضمن دالة البرنامج الرئيسى main عبارة واحدة فقط وهى output_D(255) . هذه العبارة تعنى إخراج (إرسال) العدد 255 (عشرى) كشفرة ثنائية إلى المنفذ Port D للميكروكونترولر ، لتعيين جميع الأطراف للحالة المرتفعة (من الواضح أن أى عدد بين 0 و 255 ينتج خرج مناظر لمجموعة بتات ) .
جميع العبارات يجب أن تنتهى بالفاصلة المنقوطة ( . هذه العبارة هى استدعاء دالة ، وهو ما يعنى أن المترجم يحصل على شفرة الآلة لهذه العملية من المجموعة القياسية للدوال المدمجة المتوفرة بالمترجم . هذه الدالة بشكل خاص هى واحدة من مجموعة دوال المكتبة بالشكل output_x(n) ، حيث x هى رقم المنفذ
(A-E) ، و n هى قيمة المخرجات (0-255) .
الشكل العام لدالة لغة السى يكون function_name() . أى معلومات تحتاجها الدالة (تسمى بارامترات الدالة) , يتم إدراجها بين الأقواس ( ) .
يبدأ البرنامج الرئيسى بالكلمات الخاصة main() ويتم حصره بين أقواس مجعدة . يتم حصر جميع كتل البرنامج بواسطة الأقواس ، مما يسمح بالبناء الهرمى متعدد المستويات .
الدالة main() هى دالة خاصة والتى تحتوى على كتلة البرنامج الرئيسى ، والتى من خلالها يتم احتواء جميع دوال المستوى الأدنى ، وهذه الدوال يمكنها العودة بنتيجة للدالة التى تقوم بعملية الدعوة ، ولكن الكلمة الخاصة void التى تسبق اسم الدالة main تعنى أن هذه الدالة لا تعود بأى نتيجة ، حيث أنها دالة المستوى الأعلى (القمة) .
العبارة (#include <16F877A>.h") تسمى توجيه المعالج preprocessor directive وهى ترشد المترجم لضم (إدراج) هذا الملف ( وهو ملف الرأس 16F877A.h) لمعالج محدد (وهو الميكروكونترولر PIC16F877A) فى الجزء العلوى من البرنامج . هذا الملف يحتوى على تسميات وعناوين السجلات للميكروكونترولر المختار ، بحيث يعرف المترجم مكان تخزين متغيرات تحكم الميكروكونترولر .
التعليقات Comments يمكن حصرها بين حروف التحكم وهى الشرطة المائلة والنجمة (/*….*/) أو يمكن أن تأتى بعد الشرطة المائلة المزدوجة (//) ، وفى هذه الحالة يتم إنهاء التعليق مع عودة السطر (نهاية السطر). يجب أن يحتوى رأس (مقدمة) البرنامج على أكبر قدر ممكن من المعلومات (فى شكل تعليقات) لمساعدة المستخدم وتسهيل التعديلات فى المستقبل . من الناحية المثالية ، سطر التعليقات ينبغى أن يصف تأثير العبارة فى النظام المستهدف .
معنى برنامج لغة السى لا يعتمد على تخطيط الصفحة ، فقط تتابع (تسلسل) الأحرف هو المهم للمترجم . ومع ذلك ، من الناحية العملية ، ينبغى ترتيب شفرة (كود) المصدر للبرنامج لجعله أسهل فى الفهم قدر الممكن . المسافات الفارغة spaces أو علامات التبويب (الجدولة) tabs يمكن أن تستخدم لمحاذاة أطراف كل كتلة (تبعا لمستوى البرنامج ) ، وينبغى محاذاة أقواس الفتح وأقواس الغلق فى نفس العامود (الوضع الراسى) بحيث يمكن تطابق أزواج الأقواس عند اختبار البرنامج . هذا يجعل تصحيح وتعديل كود المصدر أسهل . فوائد التخطيط الجيد تصبح أكثر وضوحا لاحقا ، عندما يتم تطوير برامج اكثر تعقيدا .
تقليديا ، يتم كتابة كود مصدر لغة السى بالحروف السفلية ، وتستخدم الحروف العلوية من أجل بعض الكلمات الخاصة .

ملاحظة :
حتى نتمكن من رؤية النتيجة ، ينبغى وضع كتلة الدالة الرئيسية داخل حلقة تكرار لانهائى ، لأن تنفيذ هذه الدالة لن يستغرق إلا بضعة ميكرو ثانية ويتم إنهاء البرنامج ، ومن ثم لن تتمكن من رؤيته .


كود:
//Lesson1-EX1
// Outputs an 8-bit code at Port D in the 16F877 MCU
#include <16F877A.h>       // MCU header file

void main()             // Main block start
{
   While(true)
   {
      output_D(255);       // Switch on outputs
   }
}
رابط الملف :
http://www.mediafire.com/download/gk...esson1-EX1.zip

http://fathallaabdelaziz.forumarabia.com/t125-topic#328




الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 04:49 PM المشاركة 13   
افتراضي


أساسيات برمجة السلسلة PIC16 بلغة السى مع المترجم CCS C  :
• المتغيرات Variables .
• الحلقة Looping .
• القرارات Decisions .
الغرض من البرنامج هو قراءة البيانات من مداخل التحكم ، وعلاجها ، وتشغيل المخارج كما هو مطلوب . المدخلات من المنافذ المتوازية والتسلسلية والتماثلية يتم الاحتفاظ بها فى سجلات للتخزين المؤقت والمعالجة ، ويتم إخراج النتائج فى وقت لاحق ، كبيانات أو إشارات . برنامج معالجة البيانات عادة ما يحتوى على حلقات تكرار وتفرع مشروط ، والذى يعتمد على المدخلات أو القيم المحسوبة .

المتغيرات Variables :
تحتاج معظم البرامج إلى معالجة البيانات بطريقة ما ، وهناك حاجة لما يسمى المتغيرات لحفظ قيم البيانات . اسم المتغير هو لافتة (تسمية) label تعلق على موقع ذاكرة حيث يتم تخزين قيمة المتغير . عند العمل فى لغة التجميع (الأسمبلى) ، تعمل تسمية السجل كاسم للمتغير ويجب تعيينه (تخصيصه) صراحة . فى لغة السى ، يتم تعيين (تخصيص) تسمية المتغير تلقائيا إلى الموقع أو المواقع التالية المتاحة ( العديد من أنواع المتغير تحتاج إلى أكثر من بايت واحد من الذاكرة) . يجب أن يعلن اسم ونوع المتغير فى بداية كتلة البرنامج ، حتى يمكن للمترجم تخصيص مجموعة مماثلة من المواقع . يفترض أن قيم المتغيرات تكون بالنظام العشرى بشكل افتراضى ، ولذلك إذا تم إعطاء قيمة بالنظام الستة عشر فى كود المصدر ، يجب أن تكون مكتوبة بالبادئة (0x) ، لذلك فإن 0xFF يمثل 255 عشرى ، على سبيل المثال .  
فى البرنامج أدناه ، يتم استخدام متغير يسمى (x) . التسميات الأطول هى الأفضل فى بعض الأحيان ، مثل "output_value" ولكن لايسمح بالمسافات الفارغة . يمكن فقط استخدام الأحرف الأبجدية
(a–z, A–Z, 0–9) والشرطة السفلية ، بدلا من المسافة الفارغة .
فى الوضع الافتراضى يكون المترجم CCS غير حساس لحالة الحرف ، لذلك فإن الحرف 'a' هو نفسه الحرف 'A' ( على الرغم من أن كود أسكى يكون مختلف) . يجب عدم استخدام عدد محدود من الكلمات الخاصة بلغة السى , مثل main و include ، كاسماء للمتغيرات .        


كود:
/*Lesson1-EX2
Program function: Outputs an 8-bit variable
*************************************************/
#include <16F877A.h>

void main()
{
Int8 x; 			// Declare variable and type
x = 99; 		// Assign variable value
While(true)
{
output_D(x) ; // Display the value in binary
}
}


المتغير (x) هو عدد صحيح integer 8-bit ، يقع بين قيم الأعداد العشرية 0-255 . يمكن رؤية القيمة بالنظام الثنائى عندما يتم إخراجها على منفذ 8 بت .
عموما ، يتم تخزين الأعداد الصحيحة (int) فى لغة السى كقيم 16 بت ، ولكن لغة السى للميكروكونترولر 8 بت تستخدم فى الوضع الافتراضى شكل عدد صحيح 8 بت . فى البرنامج أعلاه ، يتم تخصيص (تعيين) قيمة ابتدائية للمتغير (القيمة 99) ، والذى بعد ذلك فى دالة الإخراج . النقطة هنا هى أن قيمة المتغير يمكن الآن تعديلها دون الحاجة إلى تغيير استدعاء دالة الخرج نفسها .
فى البرنامج ، تم إعلان المتغير (x) 8 بت ، وتخصيص القيمة (99) له باستخدام عامل التساوى. ومن ثم تم إخراجه إلى المنفذ Port D باستخدام دالة الإخراج القياسية .    

رابط الملف :
http://www.mediafire.com/download/98...esson1-EX2.zip
   



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 05:20 PM المشاركة 14   
افتراضي


الحلقات Looping
تحتاج معظم تطبيقات الوقت الحقيقى إلى التنفيذ المستمر حتى يتم إيقاف المعالج أو إعادة تشغيله reset . لذلك ، فإن البرنامج بشكل عام يقفز إلى الوراء عند النهاية لتكرار حلقة التحكم الرئيسية . فى لغة السى يمكن تنفيذ باستخدام حلقة "while" كما هو مبين أعلاه .
شرط استمرار تكرار كتلة الكود بين أقواس while المجعدة "{}" يتم حصرها بين الأقواس "( )" التى تأتى بعد الكلمة الخاصة while"" . يتم تنفيذ هذه الكتلة إذا كانت قيمة ، أو نتيجة التعبير ، فى الأقواس "( )" ليست صفرا . فى هذه الحالة ، تكون بواحد , مما يعنى أن الشرط صحيح true دائما ، وتتكرر الحلقة إلى ما لا نهاية .
البرنامج التالى يمثل بشكل مبسط الهيكل العام للتطبيقات المدمجة ، حيث مرحلة التهيئة initialization تكون متبوعة بحلقة تحكم لتكرار لا نهاية له . داخل الحلقة ، يتم تزايد قيمة المتغير "x" ( باستخدام عامل التزايد x++) . . وبالتالى ، عند تنفيذ البرنامج ، يظهر الخرج لعد تصاعدى فى النظام الثنائى . عندما يصل العد للحد الأقصى لقيمة 8 بت (11111111 = 255) ، فإن العد يدور وينتقل إلى الصفر ليبدأ من جديد .


كود:
//Lesson1-EX3 Endless Loop
// Program function: Outputs variable count
#include <16F877A.h>

void main()
{
    int x; // Declare variable
   while(TRUE) // Loop endlessly
              { 
       output_D(x); // Display value
                   x ++ ; // Increment value
             }
}
ملحوظة :
عند تجربة البرنامج سوف تلاحظ أنه يعمل بسرعة ولن تلاحظه ، لكى تستطيع ملاحظته يجب أن نستخدم دالة تأخير زمنى وهو ما سوف نتعرض له لاحقا .

رابط الملف :
http://www.mediafire.com/download/x3...esson1-EX3.zip



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 09:03 PM المشاركة 15   
افتراضي



اتخاذ القرار Decision Making

أبسط طريقة لتوضيح مبدأ اتخاذ القرار هى تغيير الخرج اعتمادا على حالة الدخل ، الدائرة الكهربية أدناه تبين ذلك ، حيث يولد المفتاح دخل على الطرف RC0 ، بينما الطرف RD0 يوفر الخرج .
الكلمة الخاصة الشائعة للاختيار فى الكثير من لغات المستوى المرتفع هى "IF" .
البرنامج أدناه به حلقة while اللا نهائية المعتادة ، لكن البرنامج يحتوى قبلها على عبارة لفصل المنفذ Port D فى الحالة الابتدائية باستخدام دالة الإخراج output_D(0); .
داخل الحلقة ، يتم قراءة حالة الدخل باستخدام دالة قراءة حالة طرف محدد input(PIN_C0) . وهذه الدالة تعين قيمة الدخل ، إما بواحد أو بصفر ، إلى المتغير "x" . ثم يتم اختبار هذه القيمة فى عبارة "if" ويتم تحديد الخرج وفقا لذلك .
لاحظ أن الاختبار يستخدم عامل تساوى مزدوج (==) لتمييزه عن عامل التخصيص (=) المستخدم فى عبارة التخصيص السابقة .
تأثير هذا البرنامج هو توصيل (تشغيل) on الخرج إذا كان الدخل فى الحالة المرتفعة high . يحتاج المفتاح أن يكون مغلقا قبل التشغيل لرؤية هذا التأثير . لا يمكن لليد أن يتم فصلها مرة أخرى حتى يتم إعادة بدء البرنامج.





كود:
//Lesson1-EX4 Tests an input
#include <16F877A.h>
void main()
{
   int x; 					// Declare variable
   output_D(0); 				// Clear all outputs

  while(1) 					// Loop always
    {
         x = input(PIN_C0); 			// Get input state
        if(x == 1)output_high(PIN_D0); 	// Change output
   }
}


هذا البرنامج يمكن تبسيطه عن طريق تجميع دالة الدخل مع عبارة الشرط كما يلى :

if(input(PIN_C0))output_high(PIN_D0);


يمكن أيضا اختيار التسلسل المشروط بواسطة عبارة شرط while . فى البرنامج أدناه ، يتم اختبار الدخل فى حلقة عبارة شرط والخرج يومض ، توصيل وفصل ، طالما أن المفتاح يكون مفتوحا ( الدخل مرتفعا) . إذا تم غلق المفتاح ، لا يتم تنفيذ الحلقة ويتوقف وميض الليد .

كود:
// Lesson1-5 Input switch controls output flashing
#include <16F877A.h>
#use delay (clock = 4000000) 		// MCU clock = 4 MHz

void main()
{
   while(true)
     {
        while(input(PIN_C0)) 			// Repeat while switch open
         {
             output_high(PIN_D0);
            delay_ms(500); 			// Delay 0.5s
            output_low(PIN_D0);
           delay_ms(500); 			// Delay 0.5s
        }

      output_low(PIN_D0); 			// Switch off LED
    }
}
يوضح البرنامج أيضا دالة التأخير delay_ms(500); . إذا غابت هذه الدالة ، فإن الحلقة يتم تنفيذها فى بضعة ميكروثوانى فقط ، لأن كل تعليمة كود الآلة يأخذ واحد ميكروثانية عند معدل ساعة أربعة ميجا هرتز . وبالتالى فإن وميض الخرج سيكون غير مرئى . التأخير المطلوب (بالملى ثانية) يعطى كبارامتر للدالة ، يتم توفير مرجع لمكتبة الدالة عند بداية البرنامج بالتوجيه (#use) . وهذا يسمح للمترجم لإيجاد الروتين delay_ms() . يجب أن تعطى سرعة الساعة للمعالج المستهدف فى التوجيه #use ، بحيث يتم حساب التأخير الصحيح داخل الدالة .

مقارنة بناء الجملة لعبارات الدخل/الخرج :
الدالة output_high(PIN_nn) هى عملية أخراج لتحديد طرف منفذ بالحالة المرتفعة . الدالة input(PIN_nn) هى دالة إدخال والتى تعيد واحد أو صفر من طرف دخل ، والتى يمكن اختبارها بواسطة عبارة IF أو WHILE . يتم تهيئة المنافذ تلقائيا ضمن هذه الدوال

رابط الملفات :
http://www.mediafire.com/download/gv...n1-EX4-EX5.zip

.


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 22-04-2015 الساعة 09:13 PM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 22-04-2015, 10:06 PM المشاركة 16   
افتراضي


حلقة FOR :
تتكرر حلقة WHILE حتى يتسبب حدث خارجى أو داخلى بتعديل القيمة التى تحقق شرط الاختبار .
فى حالات أخرى ، نحتاج تكرار حلقة لعدد محدد من المرات . تستخدم حلقة FOR متغير تحكم الحلقة ، والذى يتم تحديده بقيمة ابتدائية وتعديله لكل تكرار عندما يكون الشرط المحدد صواب true .
فى البرنامج أدناه ، بارامترات حلقة التحكم تعطى ضمن الأقواس التى تلى الكلمة الخاصة for .
   

كود:
// Lesson1-EX6 Repeat loop a set number of times
#include <16F877A.h>
#use delay (clock = 4000000)

void main()
{
   int x;
   while(input(PIN_C0)) { } ; // Wait until switch closed

   for (x = 0; x < 5; x ++) 		// For loop conditions
      {
         output_high(PIN_D0); // Flash sequence
        delay_ms(500);
       output_low(PIN_D0);
      delay_ms(500);
     }

     while(TRUE); // Wait for reset
}


يتم تعيين متغير تحكم الحلقة (x) فى البداية بالقيمة صفر ، وتستمر الحلقة طالما أن while هذه القيمة تكون أقل من 5 . يتم تزايد قيمة (x) فى كل مرة تتكرر تدور فيها الحلقة .
التأثير هو وميض الخرج خمس مرات ويتوقف البرنامج عند نهايته ولا يتكرر .
يتضمن البرنامج أيضا استخدام حلقة while للانتظار (طالما أن المفتاح مفتوح)، من أجل غلق المفتاح قبل أن يبدأ تسلسل الوميض . بالإضافة إلى ذلك ، فإن حلقة while(TRUE) الغير مشروطة تنهى البرنامج ، وتمنع تنفيذ البرنامج من التشغيل فى مواقع غير محددة بعد نهاية التسلسل . لهذا ينصح بذلك كلما لا يتم تشغيل البرنامج حلقة مستمرة .
لاحظ أن استخدام الأقواس الفارغة التى لا تحتوى على كود ، تكون اختيارية .

رابط الملفات :
http://www.mediafire.com/download/92...esson1-EX6.zip


http://fathallaabdelaziz.forumarabia.com/t128-topic#332





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