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

   

الصورة الرمزية اسامة صقر
اسامة صقر
:: عضو ماسي ::
تاريخ التسجيل: Sep 2007
الدولة: مصر - الاسكندرية
المشاركات: 1,335
نشاط [ اسامة صقر ]
قوة السمعة:
قديم 17-02-2013, 06:02 AM المشاركة 9   
افتراضي



م/ عبدالعزيز لا اجد كلمات اعبر بها لك جزاك الله خير الجزاء لم تقدمة

اعلانات

Tico
:: عضو ذهبي ::
تاريخ التسجيل: May 2012
المشاركات: 1,423
نشاط [ Tico ]
قوة السمعة:
قديم 17-02-2013, 01:27 PM المشاركة 10   
افتراضي


كتاب ودورة جديدة Embedded C Programming PIC والمترجم CCS PIC C





عام :
الميكروكونترولر المدمج هو كومبيوتر دقيق والذى يحتوى على معظم أجهزته المحيطة والذاكرة المطلوبة بداخل دائرة متكاملة واحدة مع وحدة المعالجة المركزية CPU . فهو بالفعل "كومبيوتر دقيق فى شريحة" .
رائع أخي العزيز جزاك الله أحسن الجزاء

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 17-02-2013, 05:21 PM المشاركة 11   
افتراضي


السلام عليكم

شكرا جزيلا لجميع الأخوة المشاركين

مع تمنياتى بدوام التوفيق


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


1-4-3 الثوابت Constants :
الثوابت هى "قيم ثابتة" والتى قد لا يتم تعديلها أثناء تنفيذ البرنامج . فى كثير من الحالات تكون الثوابت جزء من البرنامج المترجم نفسه , موضوعة فى ذاكرة القراءة فقط ROM , بدلا من ذاكرة الوصول العشوائى RAM القابلة للتغيير .
فى التخصيص التالى :
x = 3 + y ;
العدد "3" هو "ثابت" وسوف يتم تشفيره مباشرة فى عملية "جمع" عن طريق المترجم .
يمكن أيضا أن تكون الثوابت فى شكل حروف أو سلسلة نصية كما يلى :


كود:
printf("hello world"); //The text hello world is placed in program memory and never changes. x = 'B' ; //The letter 'B' is permanently set in program memory.
يمكنك أيضا إعلان الثابت عن طريق "الكلمة المحجوزة"const ثم الإشارة إلى نوعه وحجمه . لكى يكون الإعلان تام مطلوب "معرف الهوية" أو الاسم و "القيمة" كما يلى :

كود:
cons char c = 57 ;
تعريف متغير كثابت سوف يؤدى إلى أن هذا المتغير يخزن فى حيز ذاكرة البرنامج بدلا من حيز ذاكرة المعطيات RAM المتغيرة المحدودة . هذا يساعد على الحفاظ على حيز ذاكرة RAM المحدود .
الثوابت العددية Numeric Constants :
يمكن إعلان الثوابت العددية بعدة طرق عن طريق الإشارة إلى "الأساس العددى" وجعل البرنامج أكثر قدرة للقراءة .
يمكن كتابة ثوابت "الأعداد الصحيحة" integer و "الأعداد الصحيحة الطويلة" long integer بالأشكال التالية :
· الشكل "العشرى" decimal بدون "سابقة" (مثل (1234 .
· الشكل "الثنائى" binary مع السابقة "0b" (مثل 0b101001 ) .
· الشكل "السداسى عشر" hexadecimal مع السابقة "0x" (مثل 0xff ).
· الشكل "الثمانى" octal مع السابقة "0" ( مثل 0777 ) .
يوجد أيضا "معدلات" modifiers للتعريف بشكل أفضل للحجم المراد وتستخدم مع الثوابت كما يلى :
· ثوابت "الأعداد الصحيحة بدون إشارة" Unsigned integer يمكن أن تمتلك "اللاحقة" U ( مثل 10000U ) .
· ثوابت "الأعداد الصحيحة الطويلة" Long integer يمكن أن تمتلك اللاحقة L (مثل 99L ).
· ثوابت "الأعداد الصحيحة الطويلة بدون إشارة" Unsigned long integer يمكن أن تمتلك اللاحقة UL ( مثل 99UL ) .
· ثوابت "الأعداد الحقيقية" Floating point يمكن أن تمتلك اللاحقة F (مثل 1.234F ) .
· ثوابت "الحروف" Character يجب أن تحاط بعلامات "اقتباس مفردة" ( مثل 'a' و 'A' ).

ثوابت الحرف Character constants :


ثوابت الحرف يمكن أن تكون "قابلة للطباعة" ( مثل 0 – 9 و A – Z ) أو حروف "غير قابلة للطباعة" ( مثل "سطر جديد" new line أو "عودة العربة" carriage return أو "التبويب" tab ) . ثوابت الحرف القابلة للطباعة قد يتم إحاطتها بعلامتى اقتباس مفردة ( مثل 'a' ) . علامتى الاقتباس المفرد التى تحيط "الشرطة المائلة" backslash المتبوعة بقيمة ثمانية أو سداسية عشر يمكن أيضا أن تمثل ثوابت الحرف كما يلى :
  • 't' يمكن تمثيلها عن طريق '\164' (ثمانى) .
  • 't' يمكن تمثيلها عن طريق 'x74' (سداسى عشر) .
الجدول التالى يبين الحروف الغير قابلة للطباعة والتى يمكن التعرف عليها من خلال لغة السى :




قوائم السرد Enumerations والتعريفات Definitions :
القدرة على قراءة برامج لغة السى هام للغاية . قوائم السرد والتعريفات تمكن المبرمج من استبدال الأعداد بأسماء أو عبارات أخرى تكون أكثر معنى .
"قوائم السرد" هى قائمة من الثوابت . تستخدم "الكلمة المحجوزة" enum لتخصيص قيم أعداد صحيحة ثابتة متتابعة لقائمة من المعرفات "المسميات" كما يلى :

كود:
int num_val ; //declare an integer variable //declare an enumeration enum { zero_val , one_val , two_val , three_val ) ; num_val = two_val ; // the same as : num_val = 2 ;
الاسم zero_val مخصص له القيمة "0" والاسم one_val مخصص له القيمة "1" والاسم two_val مخصص له القيمة "2" وهكذا .
القيمة الابتدائية قد تجبر على التحديد كما فى :

كود:
enum { start=10 , next1 , next2 , end_val } ;
والتى تؤدى إلى أن تكون القيمة الابتدائية بالقيمة "10" وبعد ذلك بالتتابع سوف يتزايد الاسم بواحد . قيمة next1 تكون "11" وقيمة next2 تكون "12" والقيمة النهائية end_val تكون "13" .
تستخدم قوائم السرد لاستبدال الأعداد الصرفة , والتى سوف يبحث فيها المبرمج , بكلمات أو عبارات تساعد فى وصف استخدام الأعداد .
تستخدم التعريفات definitions بطريقة مشابه إلى حد ما بقوائم السرد , فى أنها سوف تسمح "باستبدال سلسلة نصية بأخرى" . لاحظ المثال التالى :
كود:
… … enum { red_led_on = 1 , green_led_on, both_leds_on } ; #define leds PORTB … … PORTB = 0x1 ; // means turn the red LED on leds = red_led_on ; // means the same thing

السطر #define leds PORTB يتسبب فى قيام المترجم باستبدال (التعويض عن) المسمى PORTB أينما وجد بالكلمة led . لاحظ أن سطر #define لا ينتهى بالفاصلة المنقوطة وفقط قد يكون به تعليق محاط بالرموز /*….*/ .
قائمة السرد تحدد red_led_on بالقيمة "1" وتحدد green_led_on بالقيمة "2" وتحدد كلاهما both_leds_on بالقيمة "3" . هذه القيم قد تستخدم فى برنامج للتحكم فى ليد أحمر وليد أخضر , حيث إخراج القيمة "1" تضىء الليد الأحمر والقيمة "2" تضىء الليد الأخضر وهكذا . التقطة هى أن
" leds = red_led_on" أسهل بكثير فى فهم سياق البرنامج عن "PORTB=0x1" .
الموجة #define ليس جزء فعلى من بناء جمل لغة السى . التوجيه منفصل عن عملية ترجمة البرنامج حيث يحدث قبل بداية الترجمة الفعلية .

1-5 عمليات الدخل / الخرج I /O Operations :


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


1-5 عمليات الدخل / الخرج I /O Operations :
المتحكمات الدقيقة المدمجة يجب أن تتفاعل مباشرة مع الأجهزة hardware الأخرى . لذلك , فإن الكثير من عمليات الدخل والخرج تتم عن طريق استخدام "المنافذ المتوازية" المدمجة بها .
معظم مترجمات لغة السى توفر طريقة مناسبة للتفاعل مع المنافذ المتوازية من خلال "مكتبة" library أو "ملف رأس" header file . المترجم CCS-PICC يستخدم الأمر #byte لتخصيص مسميات labels لكل منفذ متوازى بالإضافة إلى أجهزة الدخل / الخرج الأخرى . هذا الأمر سوف يتم مناقشته فيما بعد , لكن المثال التالى سوف يساعد على استعراض استخدام المنافذ المتوازية :

كود:
#include <16F877.h> //register definition header file for #fuses HS,NOWDT //a Microchip PIC16F877 and fuses unsigned char z ; // declare z void main (void) { set_tris_d(0x00); //set all bits of port D for output set_tris_b(0Xff); //set port B for all input while(1) { z = input_b( ) ; // read the binary value on the //port B pins ( i.e., input from port B) output_d(z+1) ; // write the binary value read from B // plus 1 to port D } }

هذا المثال يبين كل من طرق القراءة والكتابة لمنفذ المتوازى .
  • الحرف "z" تم إعلانه كمتغير نوع "بدون إشارة" unsigned وحجم "حرف" char لأن المنفذ هو منفذ 8 بتات 8-bit port . والمتغير من هذا النوع سوف يخزن بيانات بطول 8-bit .
  • تستخدم السجلات TRISx لمعالج الميكروكونترولر PIC لتحديد أى بتات المنفذ ( A,B,… تبعا للمعالج) يتم استخدامها كمخارج . عند الإعادة reset , جميع منافذ الدخل / الخرج تكون فى الحالة الافتراضية كمداخل عن طريق كتابة الميكروكونترولر القيمة "1" على جميع بتات السجلات TRISx . لذلك على المبرمج تحديد بتات TRISx تبعا لأى من البتات تستخدم كمخارج . على سبيل المثال :
كود:
set_tris_b(0xc3); //set the upper 2 and lower 2 bits of //port B for input , the rest for output //0xc3=0b11000011
هذا المثال يهىء البتين العلويين والبتين السفليين للاستخدام كبتات دخل والبقية كمخارج .


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


1-6 العوامل Operators والتعبيرات Expressions :
"التعبير" expression : هو عبارة والتى فيها يرتبط عامل operator بمعرفات بحيث يتم تقيمها ,والنتيجة قد تكون "صواب" true أو "غير صواب" false , أو قيمة عددية .
"العوامل" operators : هى رموز تبين للمترجم نوع العملية التى يقوم بتنفيذها باستخدام المعرفات المحيطة . توجد قواعد تطبق على الترتيب والأولوية التى يتم بها تنفيذ العمليات . عندما يتم تجميع عوامل فى تعبير واحد , يجب تطبيق هذه القواعد للحصول على النتيجة المطلوبة .

1-6-1 عوامل التخصيص Assignment والعوامل الحسابية Arithmetic :
بمجرد إعلان المتغيرات , يمكن تنفيذ العمليات عليها باستخدام عامل التخصيص , وهو علامة التساوى (=). القيمة التى تخصص للمتغير قد تكون "ثابت" أو "متغير" أو "تعبير" . التعبير فى لغة السى هو تركيبة من "المعاملات" operands ( المعرفات) و "العوامل" operators . شكل التخصيص يكون كما يلى :

كود:
dog = 35 ; val = dog ; dog = dog + 0x35 ; val = (2 * ( dog + 0172 ) ) + 6 ; y = ( m * x ) + b ;

البرنامج المترجم يعالج التعبيرات رياضيا تماما كما كنت ترغب فى أن تعالجها يدويا . يبدأ من داخل الأقواس ويعمل للخارج من اليسار إلى اليمين : فى التعبير السابق y=(m*x)+b يتم أولا ضرب m و x معا ثم إضافة b وفى النهاية يتم تخصيص قيمة النتيجة للمتغير y . بالإضافة إلى الأقواس , يوجد أولوية للعوامل نفسها . يتم تنفيذ الضرب والقسمة أولا , يليها الجمع والطرح . لذلك فإن العبارة التالية :

كود:
y= m * x + b ;
يتم تقييمها مثل العبارة :

كود:
y = ( m * x ) + b ;
يجب ملاحظة أن استخدام الأقواس يحسن من القدرة على قراءة الكود .
الجدول التالى يبين العوامل الرياضية بترتيب الأولوية (الأسبقية) :


يوجد أنوع أخرى من العومل بجانب العوامل الحسابية وعوامل التخصيص . هذه العوامل تشمل العوامل المتعلقة بالبت المفردة bitwise , والعوامل المنطقية logical , وعوامل العلاقات النسبية أو المقارنات relational , وعوامل التزايد increment والتناقص decrement , والتخصيص المركب compound assignment والشرط conditional .



العوامل المتعلقة بالتعامل مع البت المفردة Bitwise Operation :


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


العوامل المتعلقة بالتعامل مع البت المفردة Bitwise Operation :
هذه العوامل تنفذ الدوال التى سوف تؤثر بالمعاملات على مستوى البت bit . هذه العوامل تعمل على المعاملات operands الغير حقيقية وهى : char , int , long . الجدول التالى يبين قائمة بالعوامل التى تتعامل على مستوى البت تبعا لأسبقيتها :




فيما يلى وصف لكل عامل منها :
  • عامل "متمم الآحاد" ones complement"~": يحول البتات داخل المعامل إلى "1" إذا كانت "0" وإلى "0" إذا كانت "1" .
  • عامل"الإزاحة جهة اليسار" left shift"<<" : يقوم بإزاحة shift المعامل الذى على يساره إلى جهة اليسار , فى النموذج الثنائى , عدد من المرات يحدد بالمعامل الذى على يمينه . فى عملية الإزاحة جهة اليسار , يتم دائما إزاحة الصفر ليحل محل أماكن البتات المنخفضة التى أصبحت فارغة . كل إزاحة جهى اليسار يكون تأثيرها الفعلى تنفيذ ضرب المعامل فى "2" .
  • عامل "الإزاحة جهة اليمين" right left">>" : يقوم بإزاحة المعامل الذى على يساره إلى جهة اليمين , فى النموذج الثنائى, عدد من المرات يحدد بالمعامل الذى على يمينه . كل إزاحة جهة اليمين يكون تأثيرها الفعلى تنفيذ قسمة المعامل على "2" .
  • العامل AND"&" : ينتج "1" عند موقع كل بت عندما يكون كلا المعاملين بالقيمة "1" .
  • العامل "أو الحصرى" exclusive OR"^": ينتج "1" عند موقع كل بت عندما يختلف المعاملين ( أحدهما "0" والآخر "1" ) .
  • العامل OR"|" : ينتج "1" عند موقع كل بت عندما يكون أى من المعاملين "1" .
الجدول التالى يبين بعض الأمثلة :





العوامل AND(&) و OR(|) الخاصة بالتعامل مع البتات المفردة مفيدة عند التعامل المنافذ المتوازية . لاحظ المثال التالى :
كود:
#include <16F877.h> //register definition header file for #fuses HS,NOWDT //a Microchip PIC16F877 and fuses unsigned char z ; //declare z void main(void) { port_b_pullups(TRUE); set_tris_d(0x00); //set all bits of port D for all output set_tris_b(0xFF); //set port B for all input while(TRUE) { z = input_b( ) & 0x6 ; //read the binary value on //the port B pins ANDed with 00000110 output_d(input_d( ) | 0x60 ); // write the binary value from (port D //ORed with 01100000) back to port D output_d(input_d( ) & 0xFE) ; //write the binary value from( port D //ANDed with 0xFE) to port D . } }
هذا المثال يستعرض عملية "الإخفاء" masking وعملية التحكم فى بتات المنفذ المفردة .
تقنية "الإخفاء" masking : تستخدم فى "تحديد قيمة بتات معينة لقيمة ثنائية" . فى هذه الحالة يتم إنجاز "الإخفاء" عن طريق عملية AND(&) بين البتات الغير مرغوب فيها مع الصفر "0" ( لأن
"x" AND" 0 تنتج دائما الصفر "0" ) والبتات التى نرغب فيها (نهتم بها) مع الواحد "1" ( لأن "x" AND "1" تنتج دائما القيمة "x" ) . بهذه الطريقة جميع البتات ماعدا البتين الأوسطين للنبل السفلى (البت الثانى والبت الثالث ) يتم التخلص منها ( جعلها أصفار) .

كود:
input_b( ) & 0x6 same as PORTB & 0x06 same as PORTB & 0b00000110 // RB0,RB3,RB4,RB5,RB6,RB7 always zeros (mask)


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


كود:
output_d(input_d( ) | 0x60 );//0bxxxxxxxx | 0b01100000 = 0b0xx00000
سطر الإخراج الثانى يبين طريقة إجبار بت من المنفذ للحالة المنخفضة عن طريق عملية AND(&) للبت مع الصفر .
output_d(input_d( ) & 0xFE) ;//0bxxxxxxxx & 0b11111110 =0bxxxxxxx0

1-6-2 العوامل المنطقية Logical وعوامل العلاقات النسبية (المقارنات) Relational :


touiri2
:: مهندس ::
تاريخ التسجيل: Dec 2008
المشاركات: 1
نشاط [ touiri2 ]
قوة السمعة:
قديم 18-02-2013, 04:47 PM المشاركة 16   
افتراضي


شكرا جزيلا على هذا الشرح الجيد جدا



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