|
بارك الله فيك أخى الفاضل زكى شاكر شرح مبسط ورائع جزاك الله خيرا
لك منى أجمل تحية
|
شكرا لك اخي ايضا لانك وفرت لي الفرصة للحديث حول هذا الموضوع
كما وعدت سابقا هاهي تكملة شرح البرنامج التجريبي البسيط on/off:
http://www.*********.com/files/166753273/on-off-pic.GIF
كود:
;#######################################
;# on off par bp / Pic 16F84 #
;#######################################
LIST p=16f84
#include "p16f84.inc"
__config 0x3FF2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CBLOCK 0x00C
mediat : 1
ENDC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reset :
org 0x00
goto init ; (initialisation)
org 0x004
goto inter ; (interruption)
; S/Prog initialisation:
init clrf PORTB
clrf mediat
bsf STATUS,RP0
movlw 0x7F
movwf TRISB
clrf OPTION_REG
bcf STATUS,RP0
movlw 0x90
movwf INTCON
;**** Progr. Principal **** :
start btfss mediat,0
goto start
bsf PORTB,7
goto start
; S/Prog interruption :
inter clrf PORTB
comf mediat,1
movlw 0x90
movwf INTCON
retfie
end
س1
يوضح من أين سيبدأ المتحكم تنفيذ الاوامر.
س2
إحالة الى برنامج مصغر init للإعداد:
س 5: مسح المخارج B
س 6 : جعل محتوى السجل mediat الذي أنشأه المبرمج فارغا ، أي ان مجموع 8 bit التيله = 0. (الحقيقة لا يهمنا إلا bit 0 نريده ان يكون صفرا في البداية، لغرض في نفس يعقوب.)
س7: امر الانتقال الى الشق الثاني من منطقة الذاكرة وذلك:
1- للتمكن (في س8 و س9 ) من كتابة الرقم 7F ( او 01111111 ، أفضل) في السجل TRISB. الذي يحدد لكل طرف من الأطراف الثمانية للمخارج PortB هل سيكون مدخل ام مخرج.
وهكذا يصبح: RB0 = in وRB7 = out
(يهمنا فقط ان يكون RB0 كمدخل و RB7 كمخرج )
2- تصفير السجل option_reg يهمنا فيه:
b7 : RBPU =0مما يسمح بتوصيل مقاومة Pull-up داخل المتحكم، بالطرف RB7 الموصول بالمفتاح اللحظي في الدارة.
( لا علاقة بين الbit7 للسجل option_reg وبين RB7 أحد أطراف PortB
رقم 7 مجردصدفة ..).
b6 : INTEDG =0 . المبرمج أراد أن يتحسس المتحكم التغير على المدخل RB0 عندما يجعله المفتاح مرتبطا ب0 فولت اي = 0.
س11: عودة للشق الاول من الذاكرة لتنفيذ
السطر 12 و 13 ، وشرحهما واضح في المشاركة السابقة.
وبه انتهى برنامج الإعداد .
هنا يصبح المتحكم أمام خيارين لا اختيار له فيهما :
1- المستعمل لم يضغط على المفتاح ولو للحظة واحدة:
في هذه الحال ، يتابع المتحكم تنفيذ التعليمات بطريقة تسلسلية كالعادة: بعد تنفيذ التعليمة 13 ينتقل الى التعليمة 14
س14
هنا بواسطة التعليمة btfss ، يفحص ال bit 0 ( يعني الأول ابتداء من اليمين ) في السجل mediat هل = 1 او = 0. :
الواقع انه في غياب الضغط على المفتاح سيجده = 0. clrf لان التعليمة قامت بالواجب نحو mediat في السطر 5 .
لذلك سيتابع المتحكم طريقه منفذا الامر 15 الذي سيعيده الى الامر 14 بشكل مستمر دون كلل ولا ملل ..
إلا إذا .. حدث تغير من +5 فولت الى 0 فولت على مدخل المقاطعة RB0 .
أي إذا حدثت مقاطعة على الطرف RB0 .
2- المستعمل يضغط ولو للحظة على المفتاح :
في هذه الحال سيشعر المتحكم بالتغير على مدخل المقاطعة ( تم اعداد بالسجل الخاص INTCON ) فينفذ تعليمة السطر 3 التي تحيله الى السطر 18 بداية تعليمات تنفيذ برنامج المقاطعة inter
س18
يبدأ بمسح كل أطراف PortB
س19
يتابع السير بتنفيذ التعليمة comf التي ستقلب كل من bit مجموع الثمانية bit التي للسجل mediat ، الى عكسه:
اذا كان 1 يصبح 0 وادا كان 0 يصبح 1 ( بمعنى =5 فولت)..
لا يهمنا كما سبقت الاشارة الى ذلك الا ال bit الاول منه (bit0).
سيجده = 0 ( سطر 5) فيقلبه الى 1 ( بمعنى =5 فولت) .
ويكمل المتحكم تنفيذ التعليمات 20 و 21 أي يعيد ضبط INTCON كما فعل في السطر 12 و13 وهذا إجراء لابد منه لان الانتهاء من برنامج المقاطعة يبطل الإعدادات السابقة لذلك وجب التذكير.
لكن ماذا استفاد المبرمج من كل هذا؟
ببساطة عندما انقلب bit 0 للسجل mediat شعر المتحكم بذلك بواسطة الامر btfss (السطر 15 ) فقفز ينفذ الامر المهم الذي يعنينا بالسطر 16 وهو:
Bsf Port B, 7
أي جعل الليد على الطرف RB7 مشتعلة بعدما كانت منطفئة .
الى هنا اكون قد حاولت تقريب مفهوم احدى المقاطعات
اترك لك اخي التفكير في كيفية حدوث الحالة المقابلة .. أي كيف تجعل الضغطة الموالية على المفتاح اللحظي ، الليد تنطفئ واتمنى لك التوفيق
تحياتي .