|
:: نائب المشرف العام ::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
|
|
نشاط [ ماجد عباس محمد ]
قوة السمعة:
|
|
15-06-2018, 10:56 AM
المشاركة 21
|
|
الدائرة باستخدام ميكروتشيب PIC16F877A
ميكروتشيب PIC16F877A
الآن سننفذ ذات الدائرة على بروتس باستخدام PIC16c877A متحكم و معه ذات المكونات و الدائرة كما بالرسم.
سنلاحظ اختلاف فى توصيل الليدات و السبب أن منافذ ألبيك قادرة على الإمداد بالتيار عكس أتميل التى تقبل فقط.

نلاحظ أيضا أننا لن نتعامل حاليا مع منفذي A,E لارتباطهما بالمحول تماثلى رقمى و يجب تهيئتهما للتعامل كمنفذ رقمى فقط.
يمكننا استخدام ألباقى وسنختار المنفذ D .
المنفذ B يحتوي مقاومات جذب للأعلى Pull-up وهى خاصية ضرورية لأن المنفذ عندما يهيأ كدخول ستكون له معاوقة دخول عالية و من ثم الجهد عليه غير محدد و عند قراءته كطرف رقمى قد يقرأ 1 ثم يقرأ صفر بلا انتظام ولكنها توضع للأطراف الثمانية معا أو تحذف معا ولا ينصح باستخدامها لو البعض دخول و الباقى خروج و هذا يعالج بوضع المقاومات هذه خارجيا وهى R4,R5,R6 و عادة ما تكون 10 ك أوم , ولذا لم يعد مهما استخدام المنفذ B كدخول أو خروج و سنختار كما هو بالرسم.
بمراجعة صفحة الكود سنجد كما سبق كثير من الأسطر لا حاجة لها الآن سوى سطر
كود:
#include p16f877a.inc ; Include register definition file
وهو لتعريف المترجم أسماء مكونات المتحكم ثم يلى ذلك تعريف بدء البرنامج بتحديد البدء RESET ثم الانتقال لأول البرنامج بالأمر GOTO START وأخيرا إلغاء طرف البرمجة فى البوردة PGM
RST code 0x0
goto Start
PGM code
بعد ذلك نبدأ بتهيئة المنفذ B كخروج و المنفذ D كدخول و هذا بتنفيذ الأمر TRISB=0 و يكتب هكذا
كود:
CLRF STATUS ; Bank0
CLRF PORTB ; Initialize PORTB by clearing output data latches
CLRF PORTD ; Initialize PORTD by clearing output data latches
BSF STATUS, RP0 ; Select Bank1
CLRF TRISB ; All OUTs
حيث CLRF تعنى Clear أو إلغاء محتوى المسجل المشار إليه بالحرف f وهو هنا STATUS وهذا لاختيار المجموعة صفر حيث لا يمكن للبيك أن يتعامل مع الذاكرة ككل و يقسمها لمجموعات كل منها تسمى بانك أو مجموعة أو BANK و نختار Bank0 لجعل المخارج أصفار بالأمرين CLRF PORTB ثم CLRF PORTD بعد ذلك نختار بانك رقم 1 بالأمر BSF STATUS, RP0 لتهيئة المنافذ بعد ذلك بالأمر CLRF TRISB لجعل المنفذ B مخارج.
لتهيئه المنفذ D كدخول نحتاج لأمر مشابه للسابق أى TRISD=255 و المشكلة أنك لا تملك أمر مماثل لأتميل حيث تكتب ما تشاء حيث تشاء كيف تشاء لكن يمكنك فقط كتابه ما تشاء فى المسجل W ثم تنسخه حيث تشاء بعد ذلك، ولهذا تحتاج لأمرين هما
MOVLW 255
MOVWF TRISD
حيث الأول Move Literal W أو اكتب حرفيا فى المسجل W و القيمة المطلوب كتابتها هى 255 أى 11111111 ثنائى ثم نسخها للمسجل TRISD بالأمر التالى MOVWF أو انقل محتوى W للمسجل F و المسمى هنا TRISD و أخيرا الأمر
CLRF STATUS ; Bank0
لنعود للبانك صفر مرة أخرى لنكتب فى المنافذ. نبدأ البرنامج بالعنوان
كود:
Loop:
BTFSC PORTD , 0
GOTO Sw1
MOVLW 1
MOVWF PORTB
GOTO Loop
هذا حيث سيتكرر البرنامج دوما و سنختبر المفاتيح بالأمر
BTFSS f, b Bit Test f, Skip if Set
و هى تعنى اختبر البت f و لو =1 لا تنفذ الأمر التالى مباشرة و عكسها
BTFSC f, b Bit Test f, Skip if Clear
و هى تعنى اختبر البت f و لو =0 لا تنفذ الأمر التالى مباشرة وهذا الأمر التالى طبعا يجب أن يكون أمر انتقال لمكان ما
GOTO xxx
وهكذا يصبح اختبر المنفذ PORTD الطرف صفر فإن كان =1 انتقل لعنوان Sw1 و إلا فالزر مضغوط ولذا نكتب 1 فى المسجل W ثم ننسخه للمنفذ B و نعود للعنوان Loop لنكرر الاختبار. أما لو انتقلنا إلى Sw1 سنجد
كود:
Sw1:
BTFSC PORTD , 1
GOTO Sw2
MOVLW 3
MOVWF PORTB
GOTO Loop
اختبار مماثل لكن للمنفذ PORTD الطرف 1 بدلا من صفر و الانتقال إلى Sw2 أو إنارة 2 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
Sw2:
BTFSC PORTD, 2
GOTO SW3
MOVLW 7
MOVWF PORTB
GOTO Loop
فى عنوان Sw2 سنجد اختبار مماثل لكن للمنفذ PORTD الطرف 2 بدلا من صفر أو 1 و الانتقال إلى Sw3 أو إنارة 3 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
SW3:
CLRF PORTB
GOTO Loop
;===========
END
و أخيرا فى عنوان SW3 سنطفئ الكل لنعود للأول Loop مرة أخرى و كما ذكرنا أن واقعيا هذه الدائرة لا تعمل و يجب أن تصبح هكذا

من الواضح أن كم التعليمات أكثر بكثير مما استخدم مع السابق C51 وهذا راجع لقله الأوامر المتاحة فضلا عن كثير من التعليمات لا تستنتجها وحدك لبدء التهيئة و التشغيل.
لذا فألبيك يفضل دوما برمجته باستخدام اللغات العالية مثل البيزك أو C. فهذا البرنامج البسيط تطلب العديد من التعليمات ولو كان البرنامج أكثر تطورا ربما أصبح من الصعب تنفيذه بالأسيمبلى بألبيك .
يجب أن نتذكر هنا أننا باستخدام لغة ما غير الأسيمبلى قد تضيف كثير من التعليمات التى كان من الممكن اختصارها بالأسيمبلى.، لكن هناك أمر لا يسهل التغاضي عنه وهو استخدام مكتبات الأرقام العشرية و أنا شخصيا لو احتاج لعدد ثابت من الأرقام العشرية استخدم الحساب بدلا من المكتبات الجاهزة لاستهلاكها لذاكرة البرنامج فمثلا لو احتاج لرقمين صحيحين و كسرين عشريين أعتبر الحسابات ستكون على رقم أعلاه 9999 صحيح و استخدم له 2 بايت (حتى 65000) أو بالإشارة +/-32000 ثم فى عرض الرقم أضيق علامة عشرية بين الثانى و الثالث.
من المثال السابق نستخلص منهجا لما سيلى وهو أننا يمكننا مناقشة الأسيمبلى لمنتجات أتميل C51 فقط بينما AVR , ميكروتشيب سنكتفي باللغات العالية وذلك لكون الأسماء قد تغيرت و أيضا ذاكرة البرنامج زادت حتى سهل استخدام الحساب بالأرقام العشرية و من ثم اقتصرت البرمجة بالأسيمبلى على السرعة أولا و تقليل الحجم إن اضطر الأمر .
المرة القادمة إن شاء الله سنحاول كتابة هذا البرنامج باللغات العالية
|