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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-03-2012, 01:53 AM المشاركة 17   
افتراضي



الدرس السابع :

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


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


كود:
PORTB = 187;//التمثيل العشرى


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

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


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


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


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



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

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



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

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




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

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

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


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


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

الحل :

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

كود:
PORTB=38;


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

PORTB = 0b00100110;
كود:
PORTB = 0b00100110;

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


PORTB = 0x26;


كود:
PORTB = 0x26;



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


PORTB = 046;



كود:
PORTB = 046;


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-03-2012, 02:05 AM المشاركة 18   
افتراضي


ثانيا : الحساسية لنوع الحرف فى الميكروسى :
فى الميكروسى (على خلاف لغة السى القياسية) يمكننا استخدام الحروف الصغيرة (السفلية) lowercase والكبيرة (العلوية) uppercaseفى البرنامج أى لا توجد حساسية لنوع الحرف فى الحالة الافتراضية .


ثالثا : الوصول إلى البتات المفردة للمتغيرات والسجلات 8-bit فى المترجم mikroC PRO
يسمح لك المترجم mikroC PRO بالوصول إلى البتات الفردية للمتغيرات ذات الثمانى خانات . كما أنه يعتمد البيانات من النوع sbit و bit .
الوصول إلى بت فردية فى المتغير :
  • إذا كنت معتاد على الميكروكونترولر فيمكنك الوصول إلى الخانات بإسمها مباشرة كما يلى :

GIE_bit = 0 ; //Clear Global Interupt Bit (GIE)

كود:
GIE_bit = 0 ; //Clear Global Interupt Bit (GIE)

  • كما يمكنك ببساطة استخدام رمز إنتقاء (اختيار) الرقم وهو النقطة (.) مع المتغير متبوعا بواحد من المعرفات : B0 , B1 , ……, B7 أو F1 , F2 , ……F7
حيث F7 هى البت ذات القيمة القصوى MSB :
أمثلة :
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
INTCON . B0 = 0 ; // Clear bit 0 in INTCON register

كود:
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 INTCON . B0 = 0 ; // Clear bit 0 in INTCON register
  • لا توجد حاجة لإى إعلانات خاصة .هذا النوع من الوصول الانتقائى هو خاصية جوهرية فى المترجم mikroC PRO ويمكن استخدامه فى أى مكان فى الكود .
  • المعرفات B0-B7 ليست حساسة لنوع الحرف كبير أم صغير .

الخانات نوع sbit :

يمتلك المترجم mikroC PRO نوع من بيانات الخانات يسمى sbit والذى يوفر الوصول لخانة بسجلات الوظائف الخاصة SFR .
يمكن تعريفها والوصول اليها بالطريقة التالية :
sbit LEDA at PORTA.B0 ;
sbit bit_name at sfr-name.B <bit-position> ;

sbit LEDB at PORTB.F0 ;
sbit bit_name at sfr-name.F <bit-position> ;

كود:
sbit LEDA at PORTA.B0 ; sbit bit_name at sfr-name.B <bit-position> ; sbit LEDB at PORTB.F0 ; sbit bit_name at sfr-name.F <bit-position> ;


بيانات البتات من النوع bit :
يوفر المترجم mikroC PRO بيانات بتات من نوع bit والتى يمكن استخدامها فى الإعلان عن المتغير.
bit bf ; // bit variable

كود:
bit bf ; // bit variable


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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-03-2012, 02:20 AM المشاركة 19   
افتراضي


الدرس الثامن :
أنواع المتغيرات Variables والبيانات Data :
المحتويات :
1- المعرفات Identifiers
2- أنواع البيانات .
3- معدلات نوع البيانات modifiers
4- إعلان (تعريف) المتغيرات Declaration.
5- المتغيرات الشاملة (العامة) Global variables .
6- المتغيرات المحلية Local variables .

1- المعرفات
المعرفات هى أسماء محددة بأى طول تعطى للدوال والمتغيرات والثوابت الرمزية والعلامات labels . يشار إلى كل عناصر البرنامج هذه ككائنات .
يمكن أن تحتوى المعرفات على حروف " a to z " و A to Z "" والشرطة السفلية “_” والأرقام
" 0 to 9" . القيد الوحيد هو أن الحرف الأول يجب أن يكون حرف هجائى أو الشرطة السفلية .
الحساسية لنوع الحرف :
المترجم ميكروسى برو , فى وضعه الافتراضى, ليس حساس لنوع الحرف أى أن Sum, sum, suM تمثل نفس المعرف .
أمثلة للمعرفات :
فيما يلى بعض معرفات الصحيحة (الصالحة) :


كود:
temperature_V1 Pressure no_hit dat2string SUM3 _vtext



وفيما يلى بعض المعرفات الغير صحيحة :


كود:
7temp // NO -- cannot begin with a numeral %higher // NO -- cannot contain special characters int // NO -- cannot match reserved word j23.07.04 // NO -- cannot contain special characters (dot)



1- أنواع البيانات Data Type :
يوجد خمسة أنواع أساسية للبيانات والمعتمدة بالمترجم ميكروسى برو وهى : الأحرف (الرموز) character و الأعداد الصحيحة integer والأعداد الحقيقية (العشرية)( float/double) floating point وعديمة القيمة worthless .
الكلمات المحجوزة التى تستخدم فى إعلان (تعريف) المتغيرات من تلك الأنواع هى :
char, int, float/double , voidعلى الترتيب .
الجدول التالى يوضح قيمة ومدى كل نوع من البيانات :






البيانات من نوع char تستخدم لتمثيل أحرف كود أسكى ASCII characters . كل متغير من نوع char يمكن إن يمثل حرف من أحرف كود أسكى .
البيانات من نوع int تستخدم فى تمثيل الأعداد الصحيحة بسعة 8 bits (0-255) . هذه الأنواع من البيانات تستخدم على نطاق واسع فى البرمجة بلغة السى .
البيانات من النوع char و النوع int تمثل أعداد صحيحة ولا يمكن أن تستخدم فى تمثيل الأعداد الكسرية . لهذا الغرض يجب أن تستخدم بيلنات من النوع float , يسمى أيضا floating-point .
هذا النوع من البيانات يجب تجنبه إلى أقصى حد ويستخدم فقط عند الحاجة الفعلية لمثل هذه البيانات .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-03-2012, 02:24 AM المشاركة 20   
افتراضي


3- معدلات نوع البيانات modifiers .
يمكننا استخدام أوامر خاصة بلغة السى للحصول على أنوع أخرى من البيانات . هذه الأوامر تسمى "معدلات" modifiers الأنواع الخاصة وهى :signed, unsigned, short, long.
معدل نوع "بإشارة" signed
يمكن أن يستخدم فى تعديل النوع الأساسى من البيانات بحيث يمكن أن يمثل الأعداد الموجبى والسالبة .
معدل نوع "القصير" short يستخدم فى تعريف متغير صغير الحجم أصغر من النوع الأساسى أى أنه شكل مخفض من النوع المحدد .
معدل نوع "الطويل" long يستخدم فى توسعة مقياس تمثيل النوع المحدد .







ملاحظة :
الأنواع float, double
, long double تعتبر من نفس النوع فى المترجم ميكروسى .

1- إعلان (تعريف) المتغيرات Declaration

تعريف المتغير يتم إنشاءه بموقع بالذاكرة , حيث يتم إعطاءه "إسم" و "نوع" محدد من البيانات التى سوف يتم حفظها .
المتغير , من وجهة نظر البرمجة, هو منطقة بالذاكرة والتى يتم حجزها بغرض حفظ البيانات أو المعلومات عن البرنامج لفترة زمنية محددة . أى أن المتغير يحفظ قيمة واحدة فقط فى أى لحظة .
صيغة إنشاء المتغير فى لغة السى :

كود:
<type> name_of_variable;


النوع type يجب أن يكون نوع صالح (متاح) من أنواع البيانات مثل char, int, floatسواء بدون معدلات أو بالمعدلات unsigned, signed, short , long.
فى لغة السى يمكننا إعلان عدة متغيرات فى نفس السطر بوضع فاصلة "," بين كل متغير وآخر .
أمثلة :


كود:
int sum; unsigned char i, j, k; float salary; unsigned int age; short int y; long way, state; unsigned value;

جانب هام آخر فى إعلان المتغيرات وهو "المكان" الذى يتم الإعلان عنده .
يمكن إعلان المتغير أساسا عند نقطنين متميزتين فى البرنامج :





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 16-03-2012, 02:27 AM المشاركة 21   
افتراضي


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

هذه البمتغيرات تكون "خارج أى دالة" من دوال البرنامج بما فى ذلك الدالة الرئيسية main () .
مثال :
كود:
int count; // sets the global variable "count" as integer char a; // sets the global variable "a" as char
void main () // main function of the program { counter = counter + 10; }

لاحظ أن المتغير "counter" والمتغير a"" تم تعريفهما خارج أى دالة من دوال البرنامج , هذه المتغيرات تعالج كمتغيرات عمومية ويمكن تناول ومعالجة بياناتهما عن طريق أى دالة فى البرنامج .

مثال آخر للمتغيرات العمومية :

كود:
int count; // sets the global variable "count" as integer char a; // sets the global variable "a" as char
void subroutine () // function subroutine any program { count = count - 20; a = 100; }
void main () // main function of the program { count = count + 10; a = 55; }



لاحظ أنه فى هذا المثال أن المتغير "count" والمتغير "a" تم تناولهما فى جسم الدالة الرئيسية
main () وفى جسم الدالة subroutine () .


  • المتغيرات المحلية Local variables :
على خلاف المتغيرات العمومية , فإن المتغيرات المحلية "تتواجد فقط داخل الدالة التى تم إعلانها فيها" . هذا يعنى أن المتغير المحلى يتواجد فقط "أثناء تنفيذ الدالة" , و فى لحظة إنتهاء الدالة والحصول على عائدها يتم التخلص من المتغير .

مثال :
كود:
void main () // main function of the program { int count; // define the local variable "count" as int count = count + 10; }

لاحظ أن المتغير "count" تم إعلانه بداخل الدالة الرئيسية main (), هذا المتغير المحلى سوف يكون متاحا فقط بداخل الدالة التى أعلن فيها , فى هذه الحالة المتغير "count" يمكن فقط تناوله فى البرنامج داخل الدالة الرئيسية main () .
مثال آخر لتوضيح المتغير المحلى :



كود:
void subroutine () // any sub-program function { int time; time = time * 2; }
void main () // main function of the program { int time; time = time / 2; }



لاحظ أنه فى هذا المثال لدينا دالتان : الدالة الرئيسية main () ودالة فرعية subroutine () . بداخل كا دالة تم إنشاء متغير يسمى "time" من نوع int , ولأن المتغير المحلى قابل للاستخدام فقط داخل الدالة التى يتم إعلانه فيها فإن " المتغير "time" الموجود بالدالة الفرعية subroutine () ليس له أى إرتباط بالمتغير "time" الموجود بالدالة الرئيسية main () " لأنهما متغيرين محليين .
إذا وحدث أن ارتكبنا الخطأ التالى :

كود:
void subroutine () // any sub-program function { time = time * 2; }
void main () / / main function of the program { int time; }

لاحظ ن المتغير "time" تم إعلانه فقط داخل الدالة الرئيسية main () بينما تم تناول بياناتك داخل دالة أخرى تسمى subroutine () . عندما تترجم هذا البرنامج فسوف يظهر المترجم بالقطع رسالة خطأ مفادها "أن المتغير "time" غير معرف" . وهذا خطأ شائع نقع فيه فى بداية تعلم البرمجة لأننا ننسى أن المتغير المحلى متاح فقط داخل الدالة التى أعلن فيها .


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


الدرس التاسع :
هيكل (بناء) برنامج لغة السى Structure of a C program
وضع البرنامج فى صورة هيكل محدد المعالم يسهل عملية البرمجة وتتبع أخطاء البرنامج وتصحيحها بسهولة.
كل برنامج مكتوب بلغة السى يتكون من دالة أو أكثر , فكرة الدالة تجعل من الممكن إنشاء برامج مكونة من وحدات (موديولات) modulesوهياكل structures .
البرنامج الرئيسى main program المكتوب بلغة السى هو "دالة" function . لغة السى هى لغة بناء بحت وتتطلب من المبرمج الإلمام الكافى بهذا المفهوم . فيما يلى أصغر برنامج يمكن كتابه بلغة السى :

main ()
{

}


كود:
main ()
{

}


حيث :
main (): هى الدالة الأولى والرئيسية التى يتم تنفيذها .
{ : بدأ أو فتح جسم الدالة .
} : نهاية أو غلق جسم الدالة .

الدالة الرئيسية هى التعليمة الرئيسية (الأساسية) التى ينبغى أخذها بعين الاعتبار فى البرنامج المكتوب بلغة السى ويجب أن تكون موجودة فى مكان ما فى البرنامج لأنها تمثل نقطة بداية عملية تنفيذ البرنامج .


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


سنلقى نظرة على نموذج لبرنامج مكتوب بلغة السى مع جميع التعريفات والتعليقات , فلنتتبعه :


كود:
[Comment blocks of great importance in the program documentation]
[<declaration of global variables-headers>]
[<type>] function_name ([<parameters>])
[<declaration of parameter settings>]
{ / * This section is reserved for the body of function_name, with the declaration of its local variables, commands and functions work. This function can be called a subroutine of the program. * /
[return or return () or return (value)]
}
void main ([<parameters>]) { / * This section is reserved for the function body with the declaration of its local variables, commands and functions work. Here are the first commands that will execute the program. * / }


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


ملحوظة :
جميع المعلومات الموجودة بين القوسين "[" و "]" هى معلومات اختيارية قد تكون موجودة أو قد لا تكون موجودة فى البرنامج .
سوف نتناول كل قسم (بلوك) من البرنامج :
القسم (البلوك) الأول : هو "تعليقات عامة"
التعليقات العامة شديدة الأهمية فى توثيق البرنامج . يمكن للمبرمج إدراج أو عدم إدراج تعليقات فى البرنامج . من المتفق عليه , أنه من المهم أن تضع دائما بعض التعليقات كمقدمة للبرنامج .

القسم الثانى "رأس البرنامج" Header :
فى هذا القسم من البرنامج يمكنك إعلان جميع رؤوس البرنامج علاوة على تعيين المتغيرات العمومية
global variables والتى يمكن استخدامها فى جميع دوال البرنامج .

مثال لقسم الرأس :



كود:
# Include "file_name.h" // included file file_name.h  
int a; // define the variable a as  global
int b; // define the variable b as global
القسم الثالث : دوال البرامج الفرعية subroutines
الصيغة :



كود:
[<type>] function_name ([<parameters>])
[<declaration of parameters >]
 {
/*
This section is reserved for the body of function_name with the declaration of its local variables, commands and their job functions. This function can be called a subroutine of the program.
* /
 [Return or return () or return (value)]
}

هذا القسم يمثل دالة تحمل الاسم function_name . قد تحدد نوع typeعائد (نتيجة) الدالة قبل اسمها أو قد لا تحدد . إذا لم تحدد النوع فإن الدالة سوف تكون من نوع int كوضع إفتراضى .
هذه الدالة ليست جزء من الدالة الرئيسية main () ويجب أن تستدعى فى أى وقت عن طريق الدالة الرئيسية main () أو عن طريق أى دالة أخرى تتطلب تنفيذ أوامرها . عند استدعاء الدالة يجب تحديد بارامتراتها (أدلتها) .
فى نهاية الدالة نجد عبارة العودة والغرض منها عودة الدالة بقيمة (نتيجة) الدالة .
ليس من الضرورى استخدام عبارة العودة إذا لم نحتاج للعودة بإى قيمة للدالة .

مثال على دالة فرعية :



كود:
void function (void) {
PORTB = ~ PORTB;
return;
}

القسم الرابع : الدالة الرئيسية main () :
الصيغة :


كود:
void main ([<parameters>])
{
/*
This section is reserved for the function body with the declaration of its local variables, commands and their job functions. Here are the first commands that will execute the program.
*/
}

الدالة الرئيسية main () سوف تكون أول ما ينفذ بواسطة المعالج processor . بالدالة الرئيسية main () لدينا معدل بيانات من النوع "فارغ" void بغرض أعلان الدالة الرئيسية main () على أنها يجب ألا تعود بأى قيمة . يجب دائما أن نبدأ الدالة الرئيسية main () بمعدل البيانات من النوع void .
مثال على الدالة الرئيسية :




كود:
void main () {
PORTB = 0;
TRISB = 0;
PORTB = ~ PORTB;
Delay_ms (1000);
}


ملحوظة هامة جدا :

"الدوال الفرعية function (void) يجب أن توضع قبل الدالة الرئيسية main () " وإلا حدث خطأ عند ترجمة البرنامج . وذلك بسبب أننا لا نستطيع أن نستخدم دالة قبل إعلانها مسبقا .



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