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

   

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



تنفيذ البرنامج بلغة السى والميكروكونترولر PIC16F628A وباستخدام المذبذب الداخلى 4MHz :

كود:
//PIC16F628A //Turns ON bottom left-hand LED (LED1) void main (){ //Start CMCON=0x7; // Turn comparators off andenable pins for I/O functions TRISA=0; // Make all RA lines output TRISB=0; //Make all RB lines output PORTA=0x02; // Reset the 4017 while(1){ //Endless loop PORTB=0x01; // turn on first LED } }






تعليق على البرمجة بلغة السى :
  • فى البداية نجد التعليقات وتبدأ بالرمز "//" .
  • ثم الدالة الرئيسية وتبدأ بالتعليمة "void main(){" وتنتهى بالقوس "}" .
يلى ذلك إعدادات المنافذ اللازمة لهذا المشروع : حيث يتم إعداد جميع أطراف المنفذ portA كخارج بالتعليمة "TRISA=0;" وكذلك جميع أطراف المنفذ portB بالتعليمة "TRISB=0;" , مع تحديد
حالة ابتدائية لأطراف المنفذ portA بالتعليمة "PORTA=0x02;" لعمل إعادة reset للعداد 4017 فيخرج خرج موجب على أول مخرج له Q0 لتفعيل العامود الأول بجهد سالب ( بعد الترانزستور العاكس ) فى انتظار أى جهد موجب على ليد فى صف لتوصيله .
  • ثم نقوم بإنشاء حلقة تكرار غير منتهية تبدأ بالتعليمة "while(1){" وتنتهى بالقوس "}" .
  • داخل هذه الحلقة يتم كتابة جزء البرنامج الفعلى والذى يتم تنفيذه بصفة مستمرة , وهو هنا عبارة عن تعليمة واحدة فقط هى "PORTB=0x01;" والتى تجعل أول ليد من أسفل فى العامود الأول (الذى تم تفعيله مسبقا) يضىء بصفة مستمرة .

اعلانات

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


إدخال مفهوم الدالة :
خلال البرنامج الواحد , وخلال البرامج المختلفة ربما توجد أجزاء من البرنامج , مكونة من عدد من التعليمات , تتكرر بصفة دائمة . لاختزال الكتابة فى كل مرة ولتسهيل عملية كتابة وقراءة وفهم البرنامج يمكن دمج هذه التعليمات المتكررة فى وحدة واحدة تسمى الدالة . على سبيل المثال :
  • تعليمات إعدادات المنافذ سوف تتكرر فى معظم البرامج القادة , فيمكن دمجها فى دالة بالصيغة التالية :
كود:
void Init(void){ CMCON=0x7; // Turn comparators off andenable pins for I/O functions TRISA=0; // Make all RA lines output TRISB=0; //Make all RB lines output }

يتم استدعاء هذه الدالة بالصغة التالية :

كود:
Init();
  • تعليمات عملية إعادة العداد 4017 يمكن وضعها فى دالة بالصيغة :
كود:
void Reset_4017(void){ PORTA.F1=1; // Reset the 4017, RA1 Reset pin PORTA.F1=0; }
ويتم استدعاء هذه الدالة بالصيغة التالية :


كود:
Reset_4017();

  • تعليمات عملية توقيت العداد 4017 يمكن وضعها فى دالة بالصيغة التالية :
كود:
void Clk_4017(void){ PORTA.F0=1; // Clock the 4017, RA0 Clock pin PORTA.F0=0; }
ويتم استدعاء هذه الدالة بالصيغة التالية :

كود:
Clk_4017();
ومن ثم يمكن وضع البرنامج السابق فى الشكل التالى :


كود:
//PIC16F628A //Turns ON bottom left-hand LED (LED1) void Init(void){ CMCON=0x7; // Turn comparators off andenable pins for I/O functions TRISA=0; // Make all RA lines output TRISB=0; //Make all RB lines output } void Reset_4017(void){ PORTA.F1=1; // Reset the 4017, RA1 Reset pin PORTA.F1=0; } void main (){ //Start Init(); Reset_4017(); while(1){ //Endless loop PORTB=0x01; // turn on first LED } }

كما يمكن كتابة النموذج الأولى للدالة فى البداية , لإعلام المترجم , ثم كتابة تفاصيلها فى النهاية كما يلى :


كود:
//PIC16F628A 
//Turns ON bottom left-hand LED (LED1)
void Init(void);
void Reset_4017(void);
void main (){                 //Start
Init();
Reset_4017();

while(1){                     //Endless loop
PORTB=0x01;           // turn on first LED
}
}

void Init(void){
CMCON=0x7;           // Turn comparators off andenable pins for I/O functions
TRISA=0;                   // Make all RA lines output
TRISB=0;                   //Make all RB lines output
}

void Reset_4017(void){
PORTA.F1=1;           // Reset the 4017, RA1 Reset pin
PORTA.F1=0;
}

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

fawzy73
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2008
المشاركات: 92
نشاط [ fawzy73 ]
قوة السمعة:
قديم 04-02-2013, 03:54 PM المشاركة 19   
افتراضي


بارك الله فيك
وجعله في ميزان حسناتك

ونحن نتظر المزيد


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


قبل أن نتقدم خطوة أخرى إلى الأمام لننظر خلفنا قليلا ونستدعى المساعدة الخاصة بمترجم الميكروسى برو لنعرف بعض مفردات البرمجة بلغة السى والتى يوصى بمعرفتها بشكل جيد :

التعليقات Comments :
التعليقات هى قطعة من النص تستخدم للتعليق التوضيحى للبرنامج وتقنيا هى شكل أخر من أشكال المسافات الفارغة (البيضاء) . التعليقات من أجل استخدام المبرمج فقط , ويتم تجريدها من النص المصدر قبل التحليل (الترجمة) . هناك طريقتان لتحديد التعليقات : طريقة لغة السى C وطريقة لغة السى بلس بلس C++ . كلاهما معتمد من قبل المترجم ميكروسى برو للميكروكونترولر PIC .

تعليقات لغة السى C :
تعليق لغة السى هو أى تسلسل من الحروف يوضع بعد الرمز المزدوج "/*" (رمز البداية) . يتم إنهاء التعليق عند أول ظهور للرمز المزدوج "*/" (رمز النهاية) الذى يلى الرمز المزدوج "/*" للبداية . يتم استبدال التسلسل بالكامل بمسافة واحدة .
فى مترجم الميكروسى برو العبارة التالية :

كود:
int /* type */i /* identifier */;
تفسر على أنها :

كود:
int i;

تعليقات لغة السى بلس بلس C++ :
يسمح مترجم الميكروسى برو باستخدام تعليقات "السطر – المفرد" عن طريق استخدام الرمز المزدوج "//" . يمكن "بدء" التعليق من أى مكان ويمتد حتى نهاية السطر أى حتى "السطر الجديد التالى " .
الكود التالى :


كود:
int i; // this is a comment int j;

يفسر على أنه :

كود:
int i; int j;

العلامات (الحروف الخاصة) Punctuators("[]","( )","{ }",",",";",":","*","=","#') :


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


العلامات (الحروف الخاصة) Punctuators("[]","( )","{ }",",",";",":","*","=","#') :
العلامات (الحروف الخاصة) لمترجم الميكروسى برو ( تسمى أيضا "الفواصل") هى :


كود:
("[]","( )","{ }",",",";",":","*","=","#'

معظم هذه العلامات تقوم أيضا بوظيفة العوامل operators .

الأقواس "[ ]" :
تشير الأقواس "[ ]" إلى المشاركة فى مصفوفة أحادية البعد أو متعددة الأبعاد :

كود:
char ch, str[] = "mikro";
int mat[3][4]; /* 3 x 4 matrix */ ch = str[3]; /* 4th element */
الأقواس "( )" :
تستخدم الأقواس "( )" فى تجميع عبارات , وفى عزل العبارات الشرطية وتشير إلى إستدعاءات الدالة وإلى بارامترات الدالة :


كود:
d = c * (a + b); /* override normal precedence */ if (d == z) ++x; /* essential with conditional statement */ func(); /* function call, no args */ void func2(int n); /* function declaration with parameters */
الأقواس "{ }" :
تشير الأقواس "{ }" إلى بداية ونهاية عبارة مركبة :

كود:
if (d == z) { ++x; func(); }
قوس الإغلاق "}" يقوم بإنهاء العبارة المركبة , لذلك فإن الفاصلة المنقوطة ";" لا حاجة لها بعد قوس الإلاق "}" , إلا عند إعلان الهياكل . فى بعض الأحيان تكون النقطة المنقوطة غير قانونية (جائزة) كما فى المثال التالى :

كود:
if (statement)
{ ... }; /* illegal semicolon! */ else { ... };
الفاصلة "," :
الفاصلة "," تفصل العناصر فى قائمة بارامترات (أدلة) الدالة :

كود:
void func(int n, float f, char ch);
تستخدم الفاصلة أيضا كمعامل فى "عبارات الفاصلة" . من الجائز الجمع بين الاستخدامين , لكن يجب عليك استخدام أقواس لتميزهما :


كود:
func(i, j); /* call func with two args */
func((exp1, exp2), (exp3, exp4, exp5)); /* also calls func with two args! */
الفاصلة المنقوطة ";" :
الفاصلة المنقوطة ";" هى علامة إنتهاء العبارة . يتم تفسير (نرجمة) أى عبارة قانونية بلغة السى ( بما فى ذلك العبارة الفارغة) متبوعة بفاصلة منقوطة كتعبير statement أو عبارة تعبير . يتم تقييم العبارة مع تجاهل قيمتها . إذا كان تعبير العبارة ليس له آثار جانبية , فإن مترجم الميكروسى برو قد يتجاهله .


كود:
a + b; /* Evaluate a + b, but discard value */
++a; /* Side effect on a, but discard value of ++a */ ; /* Empty expression, or a null statement */
أحيانا يتم استخدام الفاصلة المنقوطة لإنشاء عبارة فارغة :

كود:
for (i = 0; i < n; i++);
النقطتان ":" :
تستخدم النقطتان ":" للإشارة إلى عبارة عنوان labeled statement :

كود:
start: x = 0;
... goto start;
علامة النجمة "*" ( إعلان المؤشر) :
علامة النجمة "*" فى تعريف متغير يدل على إنشاء مؤشر pointer إلى لنوع :

كود:
char *char_ptr; /* a pointer to char is declared */
يمكنك أيضا استخدام علامة النجمة كعامل operator لأى من إلغاء مرجعية المؤشر أو كعامل ضرب :

كود:
i = *int_ptr;
a = b * 3.14;
علامة التساوى "=" :
علاومة التساوى "=" تفصل بين تعريفات المتغيرات وقوائم التهيئة :

كود:
int test[5] = { 1, 2, 3, 4, 5 };
int x = 5;
علامة التساوى تستخدم أيضا كعامل تخصيص (تعيين) assignment فى العبارات :

كود:
int a, b, c;
a = b + c;
رمز الجنيه "#" ( توجيه قبل المعالج) :
رمز الجنيه "#" يشير إلى التوجيه قبل المعالج عندما يوجد كأول حرف غير فارغ بالسطر . وهو يدل على عمل للمترجم , وليس بالضرورة يكون مرتبطا بتوليد الكود .


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 04-02-2013 الساعة 04:21 PM

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


ملف بصيغة word يتناول موضوع الدوال - والنماذج الأولية للدوال - وتمرير المصفوفات إلى الدوال


http://www.mediafire.com/view/?y93r4h2hgfq62w6


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


نتابع التجارب :

التجربة رقم 2 وميض (فلاش) ليد FLASH A LED :







الغرض :
وميض الليد الأسفل من العامود الأول بالجهة اليسرى وبيان مفهوم دالة التأخير delay .
الدائرة الكهربائية :



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


لغة الأسمبلى :

كود:
;PIC16F84 and only F84 chip ;Bottom left-hand LED flashes at 2Hz
Start ORG 0x00 BSF 03,5 ;Go to page1 for setting-up the ports MOVLW 00h ;Put 00 into W MOVWF 05h ;Make all RA lines output MOVWF 06h ;Make all RB lines output BCF 03,5 ;Go to Page0 for programming MOVLW 02h ;Put 02 into W to MOVWF 05h ; Reset the 4017
Flash MOVLW 01h ;Put 1 into W MOVWF 06h ; and output to turn on LED CALL Delay ;Call Delay MOVLW 00 ;Put 00 into W MOVWF 06h ;To turn off LED CALL Delay ;Call Delay GOTO Flash ;Repeat cycle
Delay MOVLW 03 MOVWF 1Ah Delay1 DECFSZ 1Bh,1 GOTO Delay1 DECFSZ 1Ch,1 GOTO Delay1 DECFSZ 1Ah,1 GOTO Delay1 RETURN
END
لغة السى والمترجم ميكروسى برو :



كود:
//PIC16F84 and only F84 chip // Bottom left-hand LED flashes at 2Hz
void main (){ //Start
TRISA=0; // Make all RA lines output TRISB=0; //Make all RB lines output PORTA=0x02; // Reset the 4017
while(1){ //Endless loop PORTB=0x01; // turn on first LED Delay_ms(250); // Call Delay 250 ms PORTB=0x0; // turn off first LED Delay_ms(250); // Call Delay250 ms } }


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 05-02-2013 الساعة 03:47 AM


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