 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:332
|
|
18-05-2017, 12:20 PM
المشاركة 7
|
|
قبل كتابة برنامجك الأول يجب أن تكون ملما بما يلى :
• أطراف الميكروكونترولر PIC تكون مقسمة إلى "منافذ" PORTS تحتوى على مجموعة من "أطراف الدخل/الخرج .
• فى الميكروكونترولر PIC16F ، يوجد 2 سجل register ، كل سجل مكون من بايت أى 8 بت ، مرتبطة بكل منفذ ، السجل TRIS والسجل PORT ، على سبيل المثال : TRISB, PORTB و TRISC, PORTC وهكذا .
• الكلمة TRIS تعنى "حالات ثلاثة" Tri-State، والسجل TRIS هو المعنى بتحديد اتجاه كل طرف من أطراف الدخل/الخرج . وجود المنطق “1” فى بت محددة من بتات السجل TRIS يجعل الطرف المناظر "مدخل" Input ، ووجود المنطق “0” فى بت محددة من بتات السجل TRIS يجعل الطرف المناظر "مخرج" Output .
• السجلات PORT تستخدم لقراءة البيانات من أو كتابة البيانات إلى أطراف الدخل /الخرج . كتابة المنطق “1” فى بت معينة من بتات السجل PORT تجعل الطرف المناظر عند "المنطق المرتفع" (VDD) ، وكتابة المنطق “0” فى بت من بتات السجل PORT تجعل الطرف المناظر عند "المنطق المنخفض" (VSS) ، وذلك إذا كان هذا الطرف "مخرج" Output ( البت المناظرة من السجل TRIS بصفر “0” ) .
• السجل PORT يمكن أن يستخدم لقراءة البيانات الرقمية من طرف "مدخل". المنطق “1” عند طرف المدخل يشير إلى أن هذا الطرف عند الحالة المنطقية المرتفعة (VDD) Logic High ، والمنطق “0” عند طرف المدخل يشير إلى أن هذا الطرف عند الحالة المنطقية المنخفضة (VSS) Logic Low .

• يمكنك الكتابة إلى السجل PORT والسجل TRIS ككل (كبايت 8-bit ) أو ألى كل بت بشكل منفصل (بت ببت bit by bit ) :
مثال على طريقة الكتابة إلى البتات (بت ببت) :
كود:
TRISC.F0 = 1; //Makes 0th bit of PORTC Input
TRISC.F5 = 0; //Makes 5th bit of PORTC Output
PORTB.F3 = 1; //Makes 3ed bit of PORTB at Logic High
PORTB.F7 = 0; //Makes 7th bit of PORTB at Logic Low
ملاحظات :
• لعلك لاحظت وجود "فاصلة منقوطة" ( عند نهاية كل تعليمة (أمر) . هذه الفاصلة المنقوطة مهمة فى لغة السى حيث يتعرف عليها المترجم فيعلم مكان انتهاء التعليمة ويبدأ فى ترجمتها وينتقل إلى [/code] التعليمة التالية وهكذا .
• للإشارة إلى البت المحددة بالسجل يمكن استخدام الصيغة TRISC.F0 أو الصيغة TRISC.B0 .
• علامة التساوى (=) هنا تسمى علامة "تخصيص" ، بمعنى كتابة أو إرسال “1” إلى البت TRISC.F0 ، على سبيل المثال .
وللكتابة إلى السجل ككل (بايت) :
يجب أن تكون ملما بالمفاهيم التالية عند البرمجة بلغة السى :
• العدد الثنائى binary يشار إليه بالبادئة “0b” .
• العدد الثمانى octal يشار إليه بالبادئة “0” .
• العدد السداسى عشر hexadecimal يشار إليه بالبادئة “0x”.
• العدد العشرى decimal يكون بدون بادئة .
إليك بعض الأمثلة :
كود:
PORTB = 0xFF; //Makes all pins of PORTB Logic High
TRISC = 0x00; //Makes all pins of TRISC Output
PORTD = 128; //Makes 7th bit of PORTD Logic High
برنامجك الأول :
البرنامج التالى يقوم بعمل وميض ليد Led Blink بتأخير زمنى قيمته واحد ثانية :
كود:
void main()
{
TRISB.F0 = 0; //Makes PORTB0 or RB0 Output Pin
PORTB=0; //LED OFF
while(1) //Infinite Loop
{
PORTB.F0 = 1; //LED ON
Delay_ms(1000); //1 Second Delay
PORTB.F0 = 0; //LED OFF
Delay_ms(1000); //1 Second Delay
}
}
ملحوظة : الدالة Delay_ms هى دالة ضمن مكتبة المترجم ميكروسى برو والتى توفر تأخير بالملى ثانية .
• أدخل البرنامج السابق بنافذة المحرر للمترجم ميكروسى برو .
• احفظ المشروع .
• قم بترجمة المشروع من خلال النقر على Build >> Build (or Ctrl+F9) .
• سوف يتم توليد الملف التنفيذى بالامتداد hex فى مجلد المشروع . أنت بحاجة إلى تحميل (كتابة) هذا الملف إلى الميكروكونترولر باستخدام جهاز برمجة أو تحميله فى برنامج ISIS بغرض المحاكاة .
الدائرة الكهربية :

الطرف VDD والطرف VSS للميكروكونترولر PIC تكون متصلة بكل من +5V و GND على الترتيب لتوفير القدرة اللازمة لعمل الميكروكونترولر . الكريستال 4MHz تستخدم لتوفير الساعة اللازمة للميكروكونترولر . المكثفات 22Pf تقوم بعمل تنظيم (تثبيت) لذبذبات الكريستال . يتم توصيل الليد LED بالبت bit0 للمنفذ PORTB (تسمى RB0) ويتم توصيل مقاومة 330 أوم على التوالى مع الليد للحد من التيار المار خلال الليد .
يمكنك محاكاة العمل باستخدام برنامج Proteus . لا تنسى إعداد تردد الساعة وأن تضيف ملف hex الموجود فى مجلد المشروع وذلك عن طريق تحرير خصائص الميكروكونترولر وذلك بالنقر المزدوج على الميكروكونترولر فتظهر لك نافذة كما هو مبين بالشكل التالى :

هذا البرنامج يقوم بتوصيل on لليد المتصل بالطرف RB0 من المنفذ PORTB للميكروكونترولر PIC16F877A . وبعد تأخير 1000 ملى ثانية (واحد ثانية) يتم فصل off الليد ، ثم التأخير واحد ثانية مرة أخرى ويتكرر العمل السابق بشكل غير منتهى بفعل الدالة while(1) .
لا تقلق إذا كنت لا تفهم عمل هذا البرنامج فى هذه المرحلة ، حيث أن كل شىء سوف يكون واضحا كلما تقدمنا.
|