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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 02:30 PM المشاركة 1   
افتراضي المدخل المختصر للبرمجة بلغة السى Introduction to C Programming Language Twitter FaceBook Google+



المدخل المختصر للبرمجة بلغة السى Introduction to C Programming Language
من المفترض معرفة :
· نبذة تاريخية عن الميكروكونترولر .
· دراسة خصائص وبناء أجهزة hardware الميكروكونترولر المستهدف (على سبيل المثال PIC18F452 ) .
· معرفة طريقة تحرير وترجمة البرنامج بالمترجم mikroC compiler .

الآن حان وقت تعلم برمجة الميكروكونترولر PIC بلغة السى .
سوف نسعى لمعالجة محتوى وبنية اللغة إستنادا إلى أمثلة لبرامج , لأن هذه الطريقة سوف تكون أكثر وضوحا لفهم اللغة .
تتبع البرنامج التالى :


كود:
 
// البرنامج الأول /* برنامج وميض ليد كل واحد ثانية هذا البرنامج يهدف إلى إضاءة وإطفاء ليد متصل بطرف لمنفذ الميكروكونترولر إعداد : Eng.F.Abdelaziz http://www.eeecb.com/vb/index.php Online Course: PIC Microcontrollers - Programming in C */ void main () { TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية while (1) { PORTB.F0 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية PORTB.F0 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد Delay_ms (1000); // تكرار التأخير } }












النظر فى كل سطر من البرنامج :
السطر الأول :

// البرنامج الأول






هذا السطر يسمى "تعليق" comment . التعليقات مهمة لتوثيق البرنامج . يمكننا إضافة التعليقات إلى البرنامج بطريقتين :
· التعليقات "البسيطة" (سطر واحد) : عندما نرغب فى التعليق فى مجرد سطر واحد من البرنامج . نبدأ التعليق بالحروف "//".
· التعليقات "المركبة" أو المتعددة , يمكننا كتابة تعليقات فى أكثر من سطر من البرنامج باستخدام الحروف "/*" كبداية للتعليق و الحروف "*/" كنهاية له .







السطر التالى :
void main ()





العبارة main () تحدد اسم دالة . الدالة main () فى لغة السى , هى دائما أو ما يتم تنفيذه ويجب أن تكوم وحيدة (فريدة) unique فى البرنامج . ينتهى البرنامج عندما يتم انتهاء تنفيذ الدالة main () .
الدالة فى لغة السى ليست أكثر من مجرد مجموعة من التعليمات التى يمكن تنفيذها من أى نقطة فى البرنامج . نستخد إشارة لبدء الدالة "{" (قوس الفتح) وإشارة لإنهاء الدالة "}" (قوس الغلق) لكى تكتمل الدالة .جميع التعليمات يجب أن تكون بين القوسين ويتم تنفيذها حسب الترتيب الذى نكتبها به . فى هذا البرنامج البسيط لا تستقبل الدالة أى بارامترات ولا تعود بأى بارامتر . وهذا هو ما تم التصريح به من خلال الكلمة void(فارغ) فى مقدمة البرنامج (سوف يتم تناول الدوال بالتفصيل لاحقا) .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 02:33 PM المشاركة 2   
افتراضي


السطر التالى :


TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية






كما نعرف , الأمر TRISB يعرف اتجاه قيادة المنفذ PORTB للميكروكونترولر . فى هذا المثال
TRISB = 0 , يؤدى ذلك إلى إعداد جميع أطراف من المنفذ PORTB كمخارج .
الأمر PORTB = 0 يؤدى إلى جعل حالة الأطراف RB0 إلى RB7 فى الحالة المنطقية المخفضة (low=0).
التعليمات يجب أن تنتهى دائما بالفاصلة المنقوطة ";" . الفاصلة المنقوطة هى جزء من التعليمة وليست تبويب منفرد لذلك يجب ألا ننسى إضافة الفاصلة المنقوطة بعد نهاية كل تعليمة .

السطر التالى :
while (1)






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


كود:
 
{ PORTB.F0 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية PORTB.F0 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد Delay_ms (1000); // تكرار التأخير }









ونظرا لعدم وجود أمر يوقف حلقة while , يتم تنفيذ مجموعة الأوامر إلى أجل غير مسمى حتى يتم إيقاف العملية shut down أو إعادتها restarted .
العملية PORTB.F0 = 1 تؤدى إلى جعل الطرف RB0 للمنفذ PORTB فى الحالة المنطقية المرتفعة (high=1) . للإشارة لطرف بمنافذ الميكروكونترولر PORTA, PORTB, PORTC, PORTD, PORTE يجب أن نكتب اسم المنفذ ثم نقطة ثم الحرف f ثم رقم الطرف المطلوب .
مثال :
PORTB.F0 = 0 يشير للطرف RB0 بالمنفذ PORTB .
PORTD.F5 = 1 يشير للطرف RD5بالمنفذ PORTD .
PORTE.F1 = 1 يشير للطرف RE1 بالمنفذ PORTE .

سطر البرنامج delay_ms (1000) هو دالة داخلية للمترجم mikroC تستخدم فى توليد تأخير زمن بالملى ثانية . فى هذا المثال , يؤدى هذا الأمر إلى التأخير بقيمة 1000 ملى ثانية أو 1 ثانية .
العملية PORTB.F0 = 0 لوضع الطرف RB0 بالمنفذ PORTB فى الحالة المنخفضة low=0 . وبالتالى عند برمجة الميكروكونترولر PIC بعينة هذا البرنامج فإن الطرف RB0 سوف يتحول بين الحالة المنطقية المنخفضة والحالة المنطقية المرتفعة كل 1ثانية .

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 08:47 PM المشاركة 3   
افتراضي


البرنامج الثانى :
لنتناول برنامج آخر .


كود:
 
// البرنامج االثانى 
/* برنامج وميض ليد كل واحد ثانية 
هذا البرنامج يهدف إلى إضاءة وإطفاء ليد متصل بطرف لمنفذ الميكروكونترولر
إعداد :
Eng.F.Abdelaziz
http://www.eeecb.com/vb/index.php
Online Course: PIC Microcontrollers - Programming in C */ 
void main ()
     {
     TRISB = 0;   // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
     PORTB = 0;   // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية 
     TRISD = 0;   // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
     PORTD = 0;   //كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية 
 while (1)
      {
      PORTB = 255;  // جميع أطراف المنفذ فى الحالة المرتفعة 
      PORTD = 255;  // جميع أطراف المنفذ فى الحالة المرتفعة 
      Delay_ms (100);  // الانتظار 100 ملى ثانية 
      PORTB = 0;  //جميع أطراف المنفذ فى الحالة المنخفضة 
      PORTD = 0; // جميع أطراف المنفذ فى الحالة المنخفضة 
      Delay_ms (100);  // الانتظار 100 ملى ثانية
      }
    }






الغرض من البرنامج وميض ليدات متصلة بأطراف المنفذ PORTB والمنفذ PORTD للميكروكونترولر بصفى مستمرة على فترات 100 ملى ثانية . خصائص هذا البرنامج تماثل البرنامج الأول فيما عدا أن التعامل هنا يتم مع المنفذ بالكامل كوحدة واحدة
PORTB = 255; // جميع أطراف المنفذ فى الحالة المرتفعة
PORTD = 255; // جميع أطراف المنفذ فى الحالة المرتفعة



أشكال وطريقة التمثيل الأعداد


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 08:56 PM المشاركة 4   
افتراضي


أشكال وطريقة التمثيل الأعداد
المترجم الميكروسى يمكنه التعامل مع البيانات من النوع : العشرى و الثنائى و السداسى عشرى والثمانى . يمكننا تمثيل القيمة العددية بعدة طرق . للتوضيح , نفترض أننا نريد تحميل القيمة 187 بالسجل PORTB باستخدام الميكروسى :
· التمثيل العشرى Decimal:
لتمثيل عدد عشرى فقط ضع قيمته بدون أى اختصار كما فى السطر التالى :

PORTB = 187;//التمثيل العشرى



ملحوظة هامة :
يجب ألا يبدأ العدد العشرى بالصفر على الأطلاق , لأن الميكروسى سوف يفسره على أنه عدد ثمانى .
مثال :
PORTB = 25 تمثل 25 عشرى .
PORTB = 025 تمثل ثمانى .

· التمثيل السداسى عشرى Hexadecimal :
لتمثيل العدد السداسى عشرى يجب أن يبدأ "بالبادئةprefix" 0x (أو 0X ) قبل العدد السداسى عشرى ( من 0 إلى F) .
مثال :


PORTB = 0Xbb; // تمثيل سداسى عشرى للعدد العشرى 187
Or
PORTB = 0XBB; // تمثيل سداسى عشرى للعدد العشرى 187







· التمثيل الثنائى Binary :
لتمثيل العدد الثنائى يجب أن يبدأ "بالبادئةprefix" 0b (أو 0B ) قبل العدد الثنائى .
مثال :



PORTB; = 0b10111011; // التمثيل الثنائى للعدد العشرى 187
Or
PORTB; = 0B10111011; // التمثيل الثنائى للعدد العشرى 187









التمثيل الثنائى لهذا العدد كما يلى :






ملحوظة : الخانة ذات الأهمية القصوى MSB هى أقصى خانة جهة اليسار . أى خطأ فى تمثيل العدد الثنائى يسبب عدم عمل البرنامج بالطريقة الصحيحة .

· التمثيل الثمانى Octal :
النظام الثمانى ليس واسع النطاق اليوم . على الرغم من ذلك فأن الميكروسى يدعم تمثيل هذا النوع من الأعداد , يجب علينا استخدامها فقط عند الحاجة .
لتمثيل العدد الثمانى يجب أن يبدأ "بالبادئةprefix"0 (zero) قبل العدد الثمانى .
مثال :



PORTD = 0273; // التمثيل الثمانى للعدد العشرى 187





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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 08:59 PM المشاركة 5   
افتراضي


مثال 1 :
نريد إرسال الحالات التالية لأطراف المنفذ PORTB :


RB0 = 0
RB1 = 1
BR2 = 1
RB3 = 0
RB4 = 0
RB5 = 1
RB6 = 0
RB7 = 0






ما هى القيمة العددية التى نضعها فى التعليمة لتمثيل حالات أطراف المنفذ PORTB .

الحل :

التمثيل العشرى :
PORTB=38;





التمثيل الثنائى :

PORTB = 0b00100110;





التمثيل السداسى عشرى :


PORTB = 0x26;






النظام الثمانى :


PORTB = 046;




الحساسية لنوع الحرف فى الميكروسى :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 07-10-2011, 09:00 PM المشاركة 6   
افتراضي


الحساسية لنوع الحرف فى الميكروسى :
فى الميكروسى (على خلاف لغة السى القياسية) يمكننا استخدام الحروف الصغيرة (السفلية) lowercase والكبيرة (العلوية) فى البرنامج uppercase أى لا توجد حساسية لنوع الحرف .
التعامل مع بتات السجل فى الميكروسى :Handling bit registers in mikroC
يمكننا التعامل مع بتات سجلات الميكروكونترولر PIC بطرق مختلفة كما يلى :



PORTA.F5 = 0; // refers to the PIC pin RA5.
PORTD.F7 = 1; // refers to the PIC pin RD7.

TRISB.RB0 = 1; // makes reference to the bit 0 of register TRISB
T0CON.PSA = 0; // refers to bit 3







ويمكن الوصول إلى البت بالطريقة التالية :
RB0 = 0; // refers to pin 0 of PORTB
RA2 = 1;
// refers to the pin of PORTA




ملحوظة ليست كل السجلات تسمح بالوصول المباشر لبتاتها .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 08-10-2011, 12:59 AM المشاركة 7   
افتراضي


هياكل التحكم وحلقات التكرار Control structures and loops repeat

أبنية (هياكل) التحكم Control Structures
تستخدم هياكل التحكم فى البرامج فى الأماكن التى تحتاج ألية للعمليات المتكررة أو صنع(اتخاذ) قرار .

الأمر IF
هو بناء " اتخاذ قرار" decision استنادا على النتيجة المنطقية لاختبار . الشكل العام له كما يلى :


if (condition) statement;
or
if (condition) {commands} blocks;








فى لغة السى , أى عدد خلاف الصفر يعتبر "حقيقى" أو صواب true . هذا يعنى أن الشرط فى لغة السى يعتبر "غير حقيقى " أو خطأ false فقط عندما تكون نتيجة تطبيق العوامل بصفر (0). أى قيمة أخرى , حتى لو كانت سالبة تعتبر "حقيقى" true أو غير صفرية .
فى أمر IF , إذا كان الشرط حقيقى (غير صفرى) true (nonzero)فسوف يتم تنفيذ الأمر أو بلوكات الأوامر , وأن لم يكن , إى عندما يكون الشرط صفرى false (0 zero) فسوف يتم تجاهل الأمر .

مثال :



void main ()

{
char a = 10;
char b = 0;
if (a) b --;
}







يتم تعيين المتغير "a" بالقيمة 10 , والتى تختلف عن الصفر إى a=true . بالتالى إذا تم تنفيذ الأمر

if (a) b --;


فسوف يتم تنفيذ تناقص المتغير b .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 08-10-2011, 01:04 AM المشاركة 8   
افتراضي


يمكنك أيضا تشغيل أمر آخر أو بلوك من الأوامر إذا كان تقييم الشرط بصفر false باستخدام الأمر if – else. الشكل العام كما يلى :






if (expression)
command 1
else
Command 2









مثال :

if (x> 5)
z = 10;
else
z = 20;









سطر الأمر if (x> 5) له مهمة اختبار "هل x أكبر من 5صواب ؟ " if x> 5 is true , إذا كان الجواب (النتيجة) صواب true عندئذ يتم تنفيذ السطر z = 10 . وإذا كان الجواب (النتيجة) غير صواب false ,أى "x" أقل من 5 ,عندئذ يتم تنفيذ السطر z = 20 .

إضافة رد

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

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

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


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

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