دروس الموافقة المسبقة عن علم- من السجلات إلى المقاطعات

جرب أداة القضاء على المشاكل





قبل الدخول في التفاصيل الدقيقة لبرمجة الموافقة المسبقة عن علم ، سيكون من المهم أولاً تعلم بعض طرق البرمجة الجيدة.

فهم السجلات

بادئ ذي بدء ، لنفترض أنك كتبت (فاصلة منقوطة) في أي نقطة من البرنامج ، فكل ما يأتي بعد هذه الفاصلة المنقوطة سيتجاهلها المترجم ، حتى يعود حامل الخرطوش إلى الموضع بالطبع.



تتيح لنا الميزة أعلاه إضافة تعليقات أو ملاحظات بحيث لا تصبح جزءًا من البرنامج ولكنها تسهل علينا تحديد البرنامج بمساعدة التعليقات بجانبه. يُنصح بوضع التعليقات أثناء برمجة أي IC.

الشيء المهم التالي في الدورة هو تعيين أسماء للثوابت المختلفة (ستتعلمها لاحقًا بشكل مفصل). هذا aso يجعل من السهل فهم ما تتم كتابته ، أو فيما يتعلق بالقيم المعنية ، بدلاً من الخلط بينه وبين الأرقام المضمنة.



يجب أن يتم ما ورد أعلاه في شكل أسماء فعلية للتعرف الفوري ، على سبيل المثال COUNT ، سيكون من المهم ملاحظة أنه يتم استخدام جميع الأحرف الكبيرة هنا لجعلها مميزة وكذلك الإشارة إلى أنها قيمة ثابتة.


كما نرى ، تم إجراء ما سبق على شكل مربع مصنوع من الفاصلة المنقوطة ، مما يجعله يبدو أنظف. بالإضافة إلى ذلك ، حاول توثيق البرنامج على الورق أيضًا ، فهذه الممارسة ستساعد على فهم الأشياء بطريقة حكيمة.

2. السجلات.

السجل داخل الموافقة المسبقة عن علم هو منطقة تقبل التفاصيل المكتوبة كما تتيح القراءة منها. يمكنك مقارنتها بورقة حيث يمكنك تصور المحتويات وإضافة aso عن طريق الكتابة عليها.

يوضح الشكل أدناه خريطة ملف تسجيل نموذجية مضمنة في PIC16F84. التنسيق ليس شيئًا تم تعيينه بالفعل داخل الموافقة المسبقة عن علم ، إنه ببساطة للإشارة إلى كيفية ترتيب البتات داخل الشريحة وفهم عدد قليل من الأوامر المعنية.

يمكنك أن ترى أنه مقسم بشكل أساسي إلى Bank 0 و Bank 1. البنك 1 مسؤول عن التحكم في العمل الفعلي للموافقة المسبقة عن علم ، على سبيل المثال عن طريق الهاتف PIC الذي يتم تعيين البتات في المنفذ A كمدخلات والتي تكون بمثابة مخرجات.

البنك 2 هو فقط لمعالجة المعلومات.

دعنا نفهم هذا من خلال المثال التالي:

لنفترض أننا نرغب في تعيين بت واحد عند ارتفاع PortA. لهذا ، سنحتاج أولاً إلى الانتقال إلى البنك 1 لإعداد البت أو الدبوس المحدد في المنفذ A في شكل إخراج. بعد ذلك نعود إلى البنك 0 ونسلم المنطق 1 (بت 1) لهذا الدبوس المحدد.

أكثر السجلات شيوعًا التي نود استخدامها في البنك 1 هي STATUS و TRISA و TRISB.

تساعدنا STATUS على العودة إلى Bank 0 ، وتسمح لنا TRISA باختيار أي دبابيس في المنفذ A هي مخرجات وأيها قد تكون مدخلات ، بينما يسهل TRISB الاختيار بين المخرجات ودبوس الإدخال في المنفذ B. يسمح سجل SELECT في BANK 0 للمستخدم للقلب إلى البنك 1.

دعونا نلخص المفهوم بالكامل بالوصف التالي:

الحالة:

من أجل التبديل من البنك 0 إلى البنك 1 ، فإننا نصدر أمر تسجيل الحالة. يتم تنفيذ ذلك من خلال تعيين البت رقم 5 من سجل الحالة على 1. من أجل العودة مرة أخرى إلى البنك 0 ، نقوم بتعيين البت 5 من سجل الحالة إلى 0. يتم وضع سجل الحالة في العنوان 03h ، وهنا يشير h إلى الرقم قد يكون بالنظام الست عشري.

TRISA و TRISB:

تقع هذه في العنوان 85h و 86 h المقابل. لبرمجة دبوس كمخرج أو إدخال ، فإننا نقدم فقط صفرًا أو واحدًا إلى البت المعين في السجل. الآن يمكن القيام بذلك بطريقتين ، عبر ثنائي ، أو Hex. في حالة عدم قدرة المرء على تحويل المعلمة ، يمكنه البحث عن آلة حاسبة علمية لتنفيذ القيم.

الآن لدينا 5 دبابيس في المنفذ A ، والتي تتوافق مع 5 دبابيس. إذا كنا نعتزم إصلاح أحد المسامير كمدخلات ، فإننا نقدم '1' للبت المعين.

في حالة أردنا تعيين أحد المسامير كمخرجات ، فسنضبط الدبوس المحدد على '0'. البتات هي المساعدة لأسفل بشكل دقيق المقابلة للبتات ، أو أكثر دقة البتة 0 هي RA0 ، البتة 1 ستكون RA1 ، البتة 2 = RA2 وما إلى ذلك. دعونا نفهمها بهذه الطريقة:

لنفترض أنك ترغب في إصلاح RA0 و RA3 و RA4 كمخرجات ، بينما RA1 / RA2 كـ i / ps ، يمكنك القيام بذلك بإرسال 00110 (06h). تحقق من أن البتة 0 باتجاه اليمين كما هو موضح هنا:

المنفذ A Pin RA4 RA3 RA2 RA1 RA0

رقم البت 4 3 2 1 0

ثنائي 0 0 1 1 0

الشيء نفسه ينطبق على TRISB.

بورتا وبورتب

من أجل رفع أحد دبابيس الخرج ، نعرض فقط '1' للبتة المعنية في سجل PORTA أو PORTB. يمكن أيضًا اتباع إجراء مماثل لسجلات TRISA و TRISB. قبل أن نسرع ​​في مثالنا الأول للترميز ، دعنا نفهم فقط مجموعة من المزيد من السجلات ، بمعنى: w و f.

دبليو و

سجل W هو سجل عادي يمكّنك من تخصيص أي قيمة من اختيارك. بمجرد تعيين مقدار إلى W ، يمكنك المتابعة بإضافة هذا إلى قيمة أخرى أو نقله ببساطة. مع تعيين قيمة أخرى ، تتم الكتابة فوق التفاصيل ببساطة على W.

يقوم سجل F بإعادة توجيه المسألة المكتوبة إلى السجل. قد نطلب من سجل F هذا تعيين قيمة على أحد السجلات ، وقد تكون أكثر من الحالة أو سجلات TRISA ، لأن هذه لن تسمح لنا بوضع القيم عليها مباشرة. برنامج مثال

دعنا نفحص رمز المثال التالي الذي سيوضح لنا كيفية تنفيذ التعليمات المذكورة أعلاه وسيشهد أيضًا بعض الإرشادات في الدورة التدريبية.

لنبدأ بإصلاح المنفذ A كما هو موضح أعلاه.

لهذا نحتاج إلى الانتقال من البنك 0 إلى البنك 1 ، ويتم ذلك عن طريق إعداد سجل الحالة الموجود في العنوان 03h ، بت 5 إلى 1.

BSF 03h، 5

BSF يعني Bit Set F. نحن نستخدم رقمين بعد هذه التعليمات - 03h ، وهو عنوان سجل الحالة ، والرقم 5 الذي يتوافق مع رقم البت.

لذا ، ما نقوله هو 'تعيين البت 5 في العنوان 03h إلى 1'.

نحن الآن في البنك 1.

موفلو 00110 ب

نحن نضع القيمة الثنائية 00110 (الحرف b يعني أن الرقم ثنائي) في سجل الأغراض العامة الخاص بنا W. كان بإمكاني بالطبع القيام بذلك في شكل سداسي عشري ، وفي هذه الحالة ستكون تعليماتنا:

موفلو 06 ح

كلاهما يعمل. يعني MOVLW 'نقل القيمة الحرفية إلى W' ، وهو ما يعني في اللغة الإنجليزية وضع القيمة التي تلي مباشرة في سجل W.

نحتاج الآن إلى وضع هذه القيمة في سجل TRISA الخاص بنا لإعداد المنفذ:

موفوف 85 ساعة

تشير هذه التعليمات إلى 'نقل محتويات W إلى عنوان السجل التالي' ، في هذه الحالة يشير العنوان إلى TRISA.

سجل TRISA الخاص بنا في هذه المرحلة يحمل الرقم 00110 ، أو يعرض بيانياً:

المنفذ A Pin RA4 RA3 RA2 RA1 RA0

ثنائي 0 0 1 1 0

الإدخال / الإخراج O O I I O

الآن لدينا دبابيس المنفذ A ، يجب أن نعود إلى البنك 0 لضبط أحد المعلومات.

BCF 03h، 5

هذه التعليمات تنجز عكس BSF. إنه يعني 'Bit Clear F'. زوج الأرقام المتوافق هو عنوان السجل ، وهنا سجل الحالة ، وكذلك رقم البت ، في هذا المثال ، بت خمسة. ما أكملناه بالضبط في الوقت الحالي هو تحديد البتة الخامسة في

سجل الحالة إلى 0

لقد عادنا في هذه المرحلة في Bank 0.
ما يلي هو رمز الكل في كتلة واحدة:

BSF 03h، 5 اذهب إلى البنك 1
MOVLW 06h ضع 00110 في W
MOVWF 85h انقل 00110 إلى TRISA
BCF 03h، 5 ارجع إلى البنك 0

ضمن التعليمات الأخيرة ، أكدنا لك طريقة إنشاء دبابيس منفذ الإدخال والإخراج على الموافقة المسبقة عن علم ليكون إدخالًا أو إخراجًا.

من خلال هذه الدورة ، دعني أساعدك في إرسال البيانات إلى المنافذ.

إرسال البيانات إلى المنافذ

في البرنامج التعليمي التالي ، سنستكمل عن طريق وميض وإيقاف تشغيل LED الذي يتكون من برنامج كامل يوضح بالتفصيل ومخطط دائرة مباشر حتى تتمكن من رؤية الموافقة المسبقة عن علم تؤدي بالضبط ما نتوقعه.

لا تحاول تجميع وبرمجة الموافقة المسبقة عن علم مع النتائج أدناه ، حيث إنها مجرد رسوم توضيحية فقط. في البداية ، سنقوم بإنشاء Port A bit 2 كمخرج:

يمكن التعرف على هذا من التعليم السابق. يمكن أن يكون التمييز الوحيد هو أننا قمنا بإصلاح كل جزء من المسامير على A كمخرج ، من خلال تسليم 0h إلى سجل ثلاثي الحالة. إذن ما يجب عليه الآن فعله هو تشغيل مصباح LED.

نحقق ذلك من خلال جدولة أحد المسامير (التي بها مؤشر LED) مرتفعًا. لوضعها بشكل مختلف ، نطبق '1' على الدبوس. هذا هو بالضبط كيف يتم تنفيذها (لاحظ التعليقات للحصول على توضيح لكل سطر):

لذلك ، ما أنجزناه الآن هو تشغيل LED ثم إيقاف تشغيله مرة واحدة. ما نرغب فيه هو أن يتم تشغيل LED لاحقًا بشكل مستمر.

نحقق ذلك بالحصول على البرنامج للعودة إلى البداية. نحقق ذلك من خلال إنشاء علامة مبدئيًا في بداية برنامجنا ، وبعد ذلك نقوم بإبلاغ البرنامج للعودة إلى هناك. نحدد العلامة بوضوح تام.

أدخل مصطلحًا ، على سبيل المثال START ، اكتب الرمز التالي:

كما هو موضح ، ذكرنا في البداية عبارة 'ابدأ' على الفور في بداية البرنامج.

بعد ذلك ، في نهاية البرنامج ، ذكرنا بوضوح 'الانتقال إلى البداية'. تؤدي تعليمات 'goto' فقط ما تعلنه.

سيقوم هذا البرنامج بتشغيل وإيقاف مؤشر LED باستمرار كلما قمنا بتشغيل الدائرة ، ونميل إلى إيقاف التشغيل بمجرد إزالة الكهرباء. قد يتعين علينا التحقق من برنامجنا مرة أخرى:

بالتأكيد حذفنا التعليقات ، لكن لا يزال بإمكاننا مراعاة التعليمات والأرقام.

قد يكون هذا محيرًا بعض الشيء لاحقًا في حالة محاولة استكشاف أخطاء البرنامج وإصلاحها وأثناء كتابة الكود الذي قمت بحفظ جميع العناوين.

على الرغم من أنه قد يتم وضع التعليقات ، إلا أنها قد تصبح مزدحمة بعض الشيء. سيتطلب هذا تسمية الأرقام ويمكن تحقيقه من خلال تعليمات إضافية: 'equ' تشير تعليمات 'equ' إلى أن بعض الأشياء قد تكون مساوية لأشياء أخرى.

قد لا تكون تعليمات للموافقة المسبقة عن علم ، بل للمجمع. تسهل هذه التعليمات تعيين اسم لموقع عنوان السجل ، أو ثابت لمصطلح البرمجة.

سنضع بعض الثوابت لبرنامجنا ونشهد أيضًا مدى وضوح قراءة البرنامج.

منذ الآن ، قمنا بإصلاح القيم الثابتة التي يمكننا المضي قدمًا من خلال إعدادها في برنامجنا. يجب تحديد القيم الثابتة قبل استخدامها.

لذلك تأكد من وضعها دائمًا في بداية البرنامج. سنعيد كتابة البرنامج باستثناء التعليقات مرة أخرى ، لمقارنة التسمية السابقة بأحدثها.

قد تكون قادرًا على ملاحظة أن الثوابت تتيح فهمًا أسهل قليلاً للبرنامج ، ومع ذلك ما زلنا بدون التعليقات ، ولا داعي للقلق ، لأننا لم ننتهي بعد.

قد يكون هناك جانب سلبي بسيط لبرنامج LED الوامض الخاص بنا.
كل تعليمات تحتاج تسلسل ساعة واحد حتى تنتهي. في حال كنا نستخدم بلورة 4 ميجاهرتز ، فإن كل تعليمات تستدعي 1/4 ميجاهرتز أو 1uS للإنهاء.

نظرًا لأننا كنا نستخدم خمسة تعليمات فقط ، فسيتم تنشيط LED ثم إيقاف تشغيله في 5uS. قد يكون هذا سريعًا جدًا بحيث لا يلاحظه الأشخاص ، بالإضافة إلى أنه يبدو أن مؤشر LED قيد التشغيل بالكامل.

ما يجب علينا تحقيقه بدلاً من ذلك هو إنتاج منع بين تشغيل LED وإيقاف تشغيل LED. نظرية التثبيط هي أننا نعد تنازليًا من كمية سابقة ، لذلك عندما تصل إلى الصفر ، نتوقف عن العد.

تشير القيمة الصفرية إلى انتهاء التأخير ، ونواصل عملنا خلال البرنامج. لذلك ، أول ما يجب علينا فعله هو تحديد ثابت للاستفادة منه كمقابل.

دعونا نطلق على هذا العدد الثابت. بعد ذلك ، يجب أن نحدد مدى أهمية الرقم الذي نبدأ العد منه. بالتأكيد ، أكبر رقم يمكننا تضمينه هو 255 ، أو FFh في ست عشري. ، كما تحدثت في البرنامج التعليمي السابق ، تعين تعليمة equ تعبيرًا لموقف السجل.

هذا يعني أنه بغض النظر عن الكمية التي نخصصها COUNT ، فإنها ستطابق عناصر السجل. في حال حاولنا تعيين القيمة FFh ، سنرتكب خطأ بمجرد أن نصل إلى تجميع البرنامج.

السبب في كون الموقع FFh هو ، لذلك لا يمكننا الوصول إليه. لذلك ، كيف يجب أن نحدد رقمًا حقيقيًا؟ بالتأكيد ، سيتطلب ذلك قدرًا صغيرًا من التأمل الجانبي.

إذا ربما قمنا بتعيين COUNT الخاص بنا إلى العنوان 08h ، على سبيل المثال ، فهذا يشير إلى وجهة تسجيل الهدف الأساسية. بشكل افتراضي ، يتم تعيين المناطق التي لم يتم لمسها على FFh. وبالتالي ، إذا أدت COUNT إلى الساعة 08 ، فستواجه قيمة FFh أثناء تشغيلنا لأول مرة. ومع ذلك ، أنا أنت ، كيف يمكننا إصلاح COUNT لرقم آخر ؟، كل ما نطبقه هو 'نقل' التقييم إلى هذه الوجهة أولاً.

كتوضيح ، لنفترض أننا نرغب في أن تمتلك COUNT قيمة 85 ساعة ، ولا يمكننا ذكر COUNT تساوي 85 ساعة نظرًا لأن هذا هو الموقف من سجل Tri-State للمنفذ A. بالضبط ما نحققه هو ما يلي: movlw 85h الوضع الأول قيمة 85h في W سجل movwf 08h

الآن قم بنقله إلى سجل 08h الخاص بنا. بعد ذلك ، في حالة التعبير عن COUNT يساوي 08h ، فإن COUNT ستطابق القيمة 85h. حساسة ، أليس كذلك! لذلك ، نحدد ثابتنا في البداية: COUNT يساوي 08h بعد ذلك يجب علينا تقليل هذا العدد بمقدار واحد حتى يصبح صفرًا.

يحدث ببساطة أن هناك تعليمات واحدة مصممة لتحقيق ذلك لنا ، من خلال استخدام 'goto' والعلامة.

التعليمات التي سنقوم بتطبيقها هي: DECFSZ COUNT ، 1 تنص هذه التعليمات على 'إنقاص السجل (هنا العدد COUNT) بالرقم الذي يتتبع الفاصلة. إذا وصلنا إلى الصفر ، قفز إلى الأمام بنقطتين. 'لنجدها في العمل أولاً ، قبل أن نضعها في مسارنا.

ما قمنا به هو في البداية إنشاء COUNT إلى 255 الثابت الخاص بنا. ويضع المقطع التالي علامة تسمى LABEL بالقرب من تعليمات decfsz الخاصة بنا.

يقلل decfsz COUNT ، 1 من قيمة COUNT بمقدار واحد ، ويحتفظ بالنتيجة النهائية مباشرة إلى COUNT. علاوة على ذلك ، فإنه يتحقق للتحقق مما إذا كانت COUNT تمتلك قيمة 0.

إذا لم يحدث ذلك ، فإنه في هذه الحالة يقوم بتشغيل البرنامج للانتقال إلى السطر التالي. الآن لدينا إعلان 'goto' الذي يعيدنا إلى تعليمات decfsz الخاصة بنا.

في حالة أداء قيمة COUNT متساوية ، ينتج عن تعليمات decfsz في برنامجنا قفز نقطتين للأمام ، ويتم إرسالها إلى حيث قلنا 'استمر هنا'.

لذلك ، نظرًا لأنه يمكنك الملاحظة ، فقد وضعنا البرنامج للجلوس في مكان واحد لفترة زمنية محددة مسبقًا قبل المتابعة. يمكن تسمية هذا بحلقة تأخير.

فهم حلقات التأخير

في حال احتجنا إلى تأخير أكبر ، يمكننا متابعة حلقة واحدة تلو الأخرى. الحلقات الإضافية ، تمديد التأخير. دعونا على الأقل اثنين ، بافتراض أننا نريد مراقبة فلاش LED .. سنضع حلقات التأخير هذه في برنامجنا ، وننجزها من خلال جعله برنامجًا حقيقيًا من خلال تقديم التعليقات:

من الممكن تجميع هذا البرنامج وبعد ذلك يتم برمجة الموافقة المسبقة عن علم. من الواضح ، تأكد من محاولة الخروج من الدائرة للتحقق مما إذا كانت تعمل بالفعل. فيما يلي رسم تخطيطي للدائرة يجب أن تنشئه بمجرد برمجة الموافقة المسبقة عن علم.


أحسنت صنعًا ، كان من الممكن أن تكون قد قمت بالفعل بتكوين برنامج PIC الأول الخاص بك ، بالإضافة إلى إنشاء دائرة لإضاءة وإيقاف تشغيل LED. حتى الآن ، إذا كنت قد تابعت هذه الدورات التدريبية ، فربما تكون قد تعلمت ما مجموعه سبعة تعليمات من أصل 35 ، ولكن دون شك حتى الآن قد تتحكم في منافذ الإدخال / الإخراج!

هل تحاول تغيير حلقات التأخير لتقديم وميض LED بشكل أسرع - ما الذي يظهر أقل قيمة لـ COUNT لرؤية وميض LED بشكل أساسي؟ أو ربما تريد تضمين حلقة تأخير ثالثة أو تكميلية بعد الأولى لتثبيت مؤشر LED لأسفل. ثابت فريد لكل حلقة تأخير.

من المحتمل أن تتمكن في الواقع من العبث بحلقات التأخير لتقديم وميض LED بسرعة معينة ، على سبيل المثال بعد ثانية. في البرنامج التعليمي التالي ، دعونا نرى كيف يمكننا استخدام شيء يعرف باسم روتين فرعي للحفاظ على ضغط البرنامج والروتين الفرعي الأساسي هو جزء لا يتجزأ من الكود أو البرنامج ، والذي قد يشار إليه ومتى قد تحتاج إليه. يتم استخدام الروتين الفرعي في الحالات التي تقوم فيها بوظيفة مماثلة بشكل متكرر.

ما هي الإجراءات الفرعية

تتمثل فوائد استخدام روتين فرعي في أنه سيكون من الأسهل على الأرجح تعديل القيمة مرة واحدة داخل روتين فرعي بدلاً من ، على سبيل المثال ، عشرة أضعاف خلال برنامجك ، بالإضافة إلى أنه يساهم بشكل كبير في تقليل مستوى الذاكرة التي يستهلكها برنامجك داخل صورة. سوف نتحقق من روتين فرعي:

في البداية ، نحتاج إلى تقديم تسمية للروتين الفرعي ، وفي هذه الحالة ، اخترنا ROUTINE. نكتب بعد ذلك الكود الذي نرغب في إجرائه كالمعتاد. لهذا السبب ، اخترنا التأخير في برنامجنا الوامض. أخيرًا ، نختتم الإجراء الفرعي عن طريق إدخال تعليمة RETURN.

لبدء الروتين الفرعي من أي مكان في برنامجنا ، نكتب بسرعة التعليمات CALL ثم تعيين الروتين الفرعي.

سننظر في هذا بعمق أكثر. بمجرد وصولنا إلى قسم برنامجنا CALL xxx ، حيث xxx هو اسم الروتين الفرعي لدينا ، ينتقل البرنامج إلى أي مكان يتم فيه تثبيت الروتين الفرعي xxx. يتم تنفيذ التعليمات الموجودة داخل الروتين الفرعي.

عندما يتم الانتهاء من التعليمات RETURN ، يقفز البرنامج للعودة إلى برنامجنا الرئيسي إلى التعليمات اللاحقة لتعليمات CALL xxx.

من الممكن استدعاء الإجراء الفرعي المماثل عدة مرات كما تريد ، وهو ما يفسر سبب استخدام الإجراءات الفرعية لتقليل المدة العامة لبرنامجنا.

ومع ذلك ، هناك عاملين يجب أن تعرفهما. في البداية ، كما هو الحال مع برنامجنا الرئيسي ، يجب الاعتراف بأي ثوابت محددة قبل أن تتمكن من استخدامها.

قد يتم التعرف على هذه داخل الروتين الفرعي نفسه ، أو مباشرة في بداية البرنامج الرئيسي. أقترح عليك أن تقر بكل شيء في بداية برنامجك الرئيسي ، منذ ذلك الحين تدرك أن الأشياء في وضع مماثل. بعد ذلك ، يجب التأكد من أن البرنامج الرئيسي يتخطى الروتين الفرعي.

ما أعنيه بهذا هو أنه يجب عليك وضع الروتين الفرعي مباشرةً في ختام برنامجك الأساسي ، إلا إذا كنت تستخدم إعلان 'الانتقال' للقفز من مكان الروتين الفرعي ، فسيستمر البرنامج وينفذ الإجراء الفرعي بغض النظر عما إذا كنت تتطلب ذلك أو غير ذلك.

لن تميز الموافقة المسبقة عن علم بين روتين فرعي والبرنامج الرئيسي. سوف نتحقق من برنامجنا الوامض ، ولكن هذه المرة سنستخدم روتين فرعي لحلقة التأخير. من الناحية المثالية ، سوف تكتشف إلى أي مدى يبدو البرنامج أقل تعقيدًا ، وكذلك قد تجد كيفية تطبيق الروتين الفرعي عمليًا.

في النهاية ، يمكنك ملاحظة أنه من خلال استخدام روتين فرعي لحلقة التأخير ، ربما نكون قد قلصنا أبعاد البرنامج.

في كل مرة نرغب في التأخير ، ربما عندما يكون مؤشر LED قيد التشغيل أو الإيقاف ، فإننا نطلق على الإجراء الفرعي للتأخير بشكل أساسي. في ختام الروتين الفرعي ، يعود البرنامج إلى السطر الذي يتبع تعليمات 'الاتصال'. في الرسم التوضيحي أعلاه ، نقلب مؤشر LED.

بعد ذلك نتصل بالروتين الفرعي. ثم يعود البرنامج حتى نتمكن من إيقاف تشغيل مؤشر LED. نسمي الروتين الفرعي مرة أخرى ، فقط في حالة اكتمال الروتين الفرعي ، يعود البرنامج والتعليمات اللاحقة التي يتعرف عليها هي 'goto Start'. لأي شخص قد يكون مفتونًا ، كان طول برنامجنا الأول 120 بايت.

من خلال استخدام الروتين الفرعي ، يمكننا تقليل حجم برنامجنا إلى 103 بايت. قد لا يبدو هذا رائعًا ، ولكن بالنظر إلى حقيقة أن لدينا فقط 1024 بايت بشكل عام داخل الموافقة المسبقة عن علم ، فإن كل مبلغ صغير يستفيد.

في التعليمات التالية ، دعونا نتحقق من القراءة من المنافذ.

حتى الآن ، كنا نؤلف إلى المنفذ A حتى نتمكن من تشغيل وإيقاف تشغيل LED. في هذه المرحلة ، سنرى كيف سنقرأ دبابيس الإدخال / الإخراج على المنافذ.

قراءة منافذ الإدخال / الإخراج

هذا بالضبط للتأكد من أننا قادرون على ربط دائرة خارجية ، والتأثير على أي مخرجات محددة تقدمها.

إذا حفظت من دوراتنا السابقة ، إذا كنت ترغب في إنشاء منافذ الإدخال / الإخراج ، فنحن بحاجة إلى الانتقال من البنك 0 إلى البنك 1. وسوف نحقق ذلك في البداية:

في هذه المرحلة ، قمنا بإصلاح البتة 0 من المنفذ A للإدخال. يجب علينا الآن فحص ما إذا كان الدبوس مرتفعًا أم منخفضًا. لتحقيق ذلك ، يمكن للمرء أن يستخدم واحدًا فقط من أمرين:

BTFSC و BTFSS.

تشير تعليمات BTFSC إلى 'أجرِ اختبارًا بسيطًا على السجل وكذلك الشيء الذي نعينه.

في حال كانت القيمة 0 ، في هذه الحالة نحذف التعليمات اللاحقة '. تتضمن BTFSS 'إجراء اختبار بسيط في السجل والبت الذي نؤسسه. في حالة ضبطه على 1 ، فإننا نتجاوز التعليمات اللاحقة.

أي واحد نستخدمه ، يتم تحديده بدقة من خلال الطريقة التي نتمنى أن يستجيب بها برنامجنا أثناء دراسة المدخلات. كتوضيح ، في حالة انتظارنا للإدخال ليكون 1 ، فقد نتمكن من استخدام تعليمات BTFSS بالطريقة التالية:

الكود هنا:

BTFSS PortA ، 0 ابدأ المتابعة هنا:
:

سيتحول البرنامج فقط إلى 'استمر هنا' بشرط أن يكون الجزء 0 في PortA مجدولًا إلى 1.

سنقوم حاليًا بكتابة برنامج يمكن أن يوجه مؤشر LED بمعدل واحد ، ولكن إذا كان المفتاح مقيدًا ، فسيومض مؤشر LED مرتين بشكل أبطأ.

من الممكن أن تمارس هذا البرنامج بمفردك ، لكننا ما زلنا ندرج القائمة بطريقة ما.

يمكنك محاولة وتأليف البرنامج بأكمله ، للتحقق مما إذا كنت قد فهمت المبادئ. سنستخدم الدائرة المكافئة كما في السابق ، مع تضمين مفتاح RA0 المرفق بالموافقة المسبقة عن علم والقضيب الموجب لإمدادنا.

ما أنجزناه هنا هو تشغيل LED. بعد ذلك ، حددت ما إذا كان المفتاح مغلقًا.

في حالة تقييدها ، أقوم بعد ذلك بالاتصال بالروتين الفرعي الخاص بالتأخير. يوفر لنا هذا تأخيرًا مكافئًا كما كان من قبل ، ولكننا في هذه المرحلة نتواصل معه مرتين.

نفس الشيء ينطبق عندما يكون مؤشر LED مطفأ. في حالة عدم إغلاق المفتاح ، فسنقوم بتسجيل فترات التشغيل والإيقاف السابقة.

هل كنت تتابع هذه الدروس من البداية ، فربما تسعى لفهم أنك اكتشفت حاليًا عشرة من 35 تعليمات لـ PIC 16F84! وكل جزء من هذه الأشياء يتم تعلمه بمجرد تشغيل وإيقاف تشغيل LED.

حتى الآن ، قمنا بتكوين PIC وميض LED وإيقاف تشغيله.

بعد ذلك تمكنا من استخدام PIC من خلال تضمين مفتاح ، وبالتالي تغيير سرعة الفلاش.

استخدام مساحة الذاكرة بكفاءة

المشكلة الوحيدة هي أن البرنامج طويل جدًا وغير فعال إلى حد ما في مساحة الذاكرة. بدا الأمر جيدًا أثناء تضمين الأوامر لأول مرة ، ولكن يجب أن تكون هناك طريقة أسهل لتنفيذها. بشكل إيجابي ، سنقوم بتحليل كيفية قيامنا حرفيًا بتشغيل وإيقاف تشغيل LED.

movlw 02hmovwf PORTAmovlw 00hmovlw بورتا

في البداية قمنا بتعبئة سجلنا بـ 02h ، وبعد ذلك قمنا بنقله إلى سجل PortA الخاص بنا لتشغيل مؤشر LED. لإيقاف تشغيله ، قمنا بتعبئة w بـ 00h وبعد ذلك قمنا بتحويله إلى سجل PortA الخاص بنا.

بين كل هذه الإجراءات الروتينية ، اضطررنا للتواصل مع روتين فرعي للتأكد من أنه يمكننا ملاحظة وميض LED.

لذلك ، احتجنا إلى نقل مجموعتين من المعلومات عدة مرات (مرة واحدة إلى w register ثم إلى PORTA) وكذلك استدعاء روتين فرعي مرتين (مرة واحدة للتشغيل ثم مرة واحدة للإيقاف). وبالتالي ، كيف يمكننا تحقيق ذلك بكفاءة إضافية؟ بسيط جدا.

نحن نستخدم تعليمات مختلفة تعرف باسم XORF. تعمل تعليمات XORF على وظيفة 'OR' حصرية في السجل الذي نصت عليه بالمعلومات التي نقدمها. أعتقد أنه يجب علي توضيح ما هو OR الحصري في العالم قبل أن نواصل. في حالة وجود مدخلين ، ومخرج واحد ، يمكن أن يكون الإدخال 1 فقط إذا كان ، وطالما ، يختلف المدخلان. على الرغم من أنها متطابقة ، فمن المحتمل أن يكون الناتج 0. الجدول التالي هو جدول الحقيقة ، للأفراد الذين يختارون التحقق من هذه:

أ ب F0 0 00 1 11 0 11 1 0

سوف نتحقق في هذه المرحلة مما يحدث إذا جعلنا B تمامًا مثل الناتج السابق ، وقمنا ببساطة بتغيير قيمة A:

أ ب ف
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

إذا حافظنا على قيمة A مثل 1 ، وقمنا Exclusive OR مع الإخراج ، فسيتم تبديل الإخراج. في حالة عدم قدرتك على ملاحظة ذلك من جدول الحقيقة ، يمكن مشاهدته أدناه باستخدام النظام الثنائي:

0 الإخراج الحالي
EX-OR مع 1 1 إخراج جديد
EX-OR مع 1 0 إخراج جديد

ربما يمكنك أن تجد أنه من خلال استخدام OR حصريًا للإخراج بـ 1 ، سنقوم الآن بتبديل الناتج من 0 إلى 1 إلى 0.
ومن ثم ، لتشغيل وإيقاف تشغيل LED الخاص بنا ، فإننا لا نطلب سوى بضع جمل:

موفلو 02 ح
XORWF DOOR، 1

ما سنحققه بالضبط هو إضافة سجل w مع 02h. نحن في هذه الحالة حصريًا أو نستخدم هذا الرقم بغض النظر عما هو موجود على PortA الخاص بنا. في حالة ما إذا كانت البتة 1 هي 1 ، فستتغير إلى 0. في حالة أن البتة 1 هي 0 ، فسوف تتغير إلى 1. دعنا نفحص هذا الرمز مرة أو مرتين ، لعرض كيفية تشغيله الثنائي:

باب
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

لا يتعين علينا في الواقع تحميل القيمة المتطابقة في سجل w الخاص بنا في كل مرة ، لذلك من الممكن تحقيق ذلك مرة واحدة في البداية ، والرجوع ببساطة إلى أمر التبديل الخاص بنا. بالإضافة إلى ذلك ، لا يتعين علينا تحديد قيمة في سجل PortA الخاص بنا. السبب؟ بالتأكيد ، نظرًا لأنه في حالة التشغيل ، يكون الرقم 1 ، يمكننا بسهولة تبديله. أنا ، بدلاً من ذلك ، 0 عند التشغيل ، يمكننا حتى الآن تبديله.

لذلك قد ترغب في رؤية الكود المشكل حديثًا. يمثل الأول رمز LED الوامض الخاص بنا ، بينما يُظهر الثاني الرمز مع إضافة المفتاح:

دعنا نتمنى أن تجد أنه ببساطة من خلال استخدام تعليمات واحدة سهلة ، قمنا الآن بتقليص حجم برنامجنا. الحقيقة هي ، من أجل عرض مقدار ما يمكننا تقليل برامجنا من خلاله ، فقد أظهرنا البرنامجين ، فقط ما تم تكوينه ، وأبعادهما في الجدول أدناه:

أبعاد البرنامج (بايت)
وميض LED أصلي 120
تم إضافة روتين فرعي LED وامض 103
استخدام وظيفة XOR LED الوامضة 91
الصمام مع التبديل الأصلي 132
124- مصباح LED مع وظيفة التبديل XOR

لذلك ، لم نكتشف فقط بعض الإرشادات الجديدة ، بل قمنا بالتأكيد بالإضافة إلى ذلك بتقليل حجم البرامج النصية لدينا!

أدناه ، سنقوم بتحليل كيف يمكنك تذبذب البتات الفردية ، وإجراء بعض العمليات الحسابية المباشرة ، وكذلك جداول البيانات.

مدراء منطقيون

خلال البرنامج التعليمي الأخير ، قدمت عملية OR الحصرية. تُفهم وظيفة ExOR على أنها عامل منطقي.

في هذا البرنامج التعليمي سوف أنور العوامل المنطقية الإضافية التي تروج لها الموافقة المسبقة عن علم. لن يكون هناك أي نوع من الحالات في برامج النقطة ، ومع ذلك سوف نتعلم طرقًا سهلة لاستخدام المشغلين من خلال تطبيق مناطق صغيرة من التعليمات البرمجية.

وتحلل الدالة AND أساسًا بتتين وتقدم 1 ما إذا كانتا متطابقتين ، و 0 في حالة كونها مميزة. على سبيل المثال ، إذا ذكرنا 1 و 1 ، تكون النتيجة 1 ، بينما في حالة إعلاننا 1 و 0 ، ستكون النتيجة 0.

وغني عن القول ، نحن قادرون على تقييم الكلمات أيضًا ، بالإضافة إلى أن جميع وظائف AND التي تنجزها هي مراجعة المصطلحين شيئًا فشيئًا. يوضح المثال أدناه أن كلمتين من 8 بت ستصبحان AND مع المنتج:

11001011
و 10110011
يساوي 10000011

آمل أن توافق ، ستحصل النتيجة ببساطة على 1 عندما تكون 2 1 جنبًا إلى جنب مع بعضها البعض في زوج من الكلمات. نحن قادرون على استخدام وظيفة AND للتحقق من المنافذ ، على سبيل المثال.

في حال كنا نتحقق من عدد قليل من دبابيس الإدخال / الإخراج المرتبطة بدائرة ، وعلينا أن نراقب حالة معينة يكون فيها عدد قليل فقط من المسامير مرتفعًا ، وفي هذه الحالة يمكننا أن نقرأ إلى حد كبير المنفذ ، وبعد ذلك والنتيجة مع الحالة التي كنا نفحصها ، مماثلة للمثال أعلاه.

توفر لنا الموافقة المسبقة عن علم مكونين لـ AND.
هم ANDLW و ANDWF. يسمح لنا ANDLW بتنفيذ وظيفة AND مع تفاصيل سجل W ، والمبلغ الذي نحدده.

بناء الجملة هو: ANDLW حيث هو بالضبط ما سنذهب إليه ومحتويات W به.

سيتم تخزين نتيجة الدالة AND مباشرة في سجل W.
يسمح لنا ANDWF بتنفيذ وظيفة AND في سجل W وسجل مختلف ، على سبيل المثال PORT. بناء الجملة هو: ANDWF، d وهو السجل الذي نتحمس له ، على سبيل المثال يظهر PORTA ، و d الموافقة المسبقة عن علم حيث يجب أن تضع النتيجة. إذا كانت d = 0 ، يتم وضع النتيجة في سجل W ، و d = 1 يتم حفظ النتيجة النهائية في السجل الذي حددناه. يعرض الجزءان من الكود أدناه مثالًا جيدًا لكل وظيفة AND.

الأول هو فحص حالة PORTA ، حيث نحتاج إلى التحقق مما إذا كانت المدخلات هي 1100. يمكننا إعادة النتيجة إلى سجل W

موفلو 1100
ANDWF 05h، 0 قد يتحقق الرسم التوضيحي الثاني الآن من محتويات سجل W:
ANDLW 1100

أو

لقد اكتشفنا الآن وظيفة OR واحدة ، على وجه الدقة XOR. يتطور هذا إلى 1 إذا لم تكن بتتان متماثلتان ، لكنهما مختلفتان. يمكنك العثور على دالة OR أخرى تسمى IOR ، وهي OR الشاملة. ستُنشئ هذه الوظيفة 1 في حالة كون أي من البتتين هو 1 ، ولكن بالإضافة إلى ذلك إذا كانت كل بت 1. يوجد أدناه جدول حقائق واضح لتوضيح ذلك:

أ ب س / ف
0 0 0
0 1 1
1 0 1
1 1 1

ما هي العمليات الحسابية

يضيف

هذه الوظيفة تحقق ما تدعي عادة. يساهم برقمين! في حالة تجاوز نتيجة إضافة الرقمين 8 بتات ، فمن المحتمل أن يتم تعيين علم CARRY في هذه الحالة. توجد علامة CARRY في العنوان 03h بت 0.

عند جدولة هذه القطعة ، تجاوز الرقمان 8 بتات. عندما تكون القيمة 0 ، تكون النتيجة في هذه الحالة ضمن 8 بتات. كما في السابق ، تقدم لنا الموافقة المسبقة عن علم نمطين من ADD ، وتحديدا ADDLW و ADDWF. كما قد تفترض ، هذا يشبه تمامًا الوظيفة المذكورة أعلاه. تقدم ADDLW محتويات سجل W التي نصت عليها. الصيغة هي: ADDLW ADDWF أضف محتويات سجل W وبعض السجلات الأخرى التي نعينها.

الصيغة هي: ADDWF ، d حيث

الفرعية

في هذه المرحلة ، أعتقد أنه لا يمكنك افتراض ما تقوم به هذه الوظيفة! في الواقع ، كنت تشك في ذلك ، هذه الوظيفة
يطرح بت من الآخر. مرة أخرى ، توفر لنا الموافقة المسبقة عن علم ذوقين: SUBLW و SUBWF. بناء الجملة مشابه تمامًا لوظيفة ADD ، بصرف النظر عن أنك تكتب SUB بدلاً من ADD!

الزيادة في حالة رغبتنا في تضمين 1 في رقم في الموافقة المسبقة عن علم ، يمكننا بالتأكيد الاستفادة من وظيفة ADD ، واستخدام الرقم واحد. ~ تكمن الصعوبة في ذلك في أنه يجب علينا أولاً وضع الرقم في سجل W ، ثم استخدام عنصر تحكم ADDLW 1 لزيادة الرقم. في حالة رغبتنا في تضمين 1 في السجل ، فقد يكون الأمر أسوأ. يجب أولاً وضع الرقم 1 في سجل W ، بعد ذلك استخدم ADDWF ، 1. لذلك ، على سبيل المثال ، لتضمين 1 في الموقع 0C ، على سبيل المثال ، سنحتاج إلى امتلاك الجزء التالي من البرنامج النصي:

movlw 01
addwf 0 ج ، 1

توجد طريقة أسهل لإجراء ذلك. يمكننا ممارسة الأمر INCF. الصيغة هي: INCF ، d حيث ، هو السجل ، أو المكان الذي نهتم به ، ويظهر d الموافقة المسبقة عن علم حيث يجب وضع النتيجة. في حالة d = 0 ، تكون النتيجة ضمن سجل W ، وفي حالة d = 1 ، يتم تعيين النتيجة في السجل الذي حددناه.

من خلال استخدام هذه التعليمات الفردية ، يمكننا في الواقع خمسين بالمائة من الترميز. في حالة رغبتنا في استعادة النتيجة في سجل W ، في هذه الحالة باستخدام المثال أعلاه ، ربما يتعين علينا تضمين أمر إضافي لتحويل عناصر 0C مرة أخرى إلى سجل W ، وبعد ذلك وضع سجل 0C مرة أخرى إلى لا مهما كان.

يوجد أمر زيادة. إنه INCFSZ. قد يؤدي هذا الأمر إلى زيادة السجل الذي حددناه ، ولكن إذا كان السجل يساوي 0 بعد الزيادة (سيحدث ذلك أثناء تضميننا من 1 إلى 127) بعد ذلك من المحتمل أن تمر الموافقة المسبقة عن علم بالتعليمات اللاحقة. يعكس جزء الكود أدناه هذا:

حلقة incfsz 0C
حلقة الانتقال
:
:
باقي البرنامج.

في الجزء أعلاه من الكود ، ستتم زيادة 0C بمقدار 1. نمتلك بعد ذلك تعليمات تخبر PIC بالعودة إلى علامتنا المسماة Loop ، وزيادة 0C بمقدار 1 مرة أخرى. يستمر هذا حتى C يساوي 127. في هذه الحالة ، عندما نزيد 0C بمقدار 1 ، فإن 0C سوف يتطابق الآن مع 0. يمكن لتعليمات INCFSZ أن تخبر الموافقة المسبقة عن علم بحذف التعليمة التالية ، والتي في هذه الحالة هي تصريح goto ، ومن ثم فإن الموافقة المسبقة عن علم ستمضي قدما في ما تبقى من البرنامج.

إنقاص

لقد ناقشنا الآن وظيفة الإنقاص في التدريب السابق ، لذلك لن أراجعها بعد الآن.

إطراء

التعليمات الأخيرة في هذه المناقشة ستعكس كل جزء في السجل الذي حددناه. الصيغة هي: COMF ، d حيث

فهم عمليات البت

يمكن استخدام هذا ، على سبيل المثال ، لمبادلة دبابيس المنفذ بسرعة من الإخراج إلى الإدخال وما إلى ذلك. تسمح لنا وظائف البت بتشكيل بت واحد داخل التعبير. إنها تسمح لنا بالمضي قدمًا وتعيين والتخلص من البتات المفردة في السجلات أو الأرقام التي نحددها.

في ختام هذه الدورة ، سنكشف عن برنامج مصمم لإنشاء مجموعة من أضواء التسلسل التي تمضي قدمًا ، ثم الاتجاه المعاكس. لقد لاحظنا أن هذا قد تم إنجازه في وقت سابق عندما فحصنا وظيفة OR الحصرية ، حيث قمنا حصريًا بترتيب المنافذ بتعبير. لقد لاحظنا حتى الآن بعض الوظائف الصغيرة عندما نؤسس المنافذ على PIC ، و

اسمحوا لي أن أكرر استخدامها هنا.

BCF

سوف تمسح هذه التعليمات بعض الشيء الذي نص عليه في السجل الذي نحدده. النحو
يكون:
BCF ،

لقد استخدمنا هذا سابقًا للتبديل من الصفحة 1 إلى الصفحة 0 عن طريق إزالة بعض الشيء في سجل الحالة. يمكننا أيضًا استخدامه لإصلاح بعض الشيء إلى 0 في أي سجل / موقع مختلف. على سبيل المثال ، في حالة رغبتنا في تعيين البتة الثالثة في 11001101 المحفوظة في القسم 0 ج إلى 0 ، فربما
إدراج:

BCF 0C ، 03

BSF

ستصلح هذه التعليمات أي جزء نضعه في 1 في أي سجل نشير إليه. استخدمنا هذا سابقًا للانتقال من الصفحة 0 إلى الصفحة 1. الصيغة النحوية هي: BSF ، ويتم استخدامها بالضبط بنفس طريقة BCF أعلاه.

BTFSCUp حتى الآن يمكننا تعيين أو مسح بعض الشيء في السجل. ومع ذلك ، تخيل ما إذا كنا بحاجة إلى التحقق بشكل أساسي مما إذا كان البت هو 1 أو 0 في السجل؟

بالتأكيد ، من الممكن استخدام BTFSC. ينص على سجل اختبار البت F ، وتخطي إذا كان واضحًا. ستقوم هذه التعليمات بتحليل البت الذي نخصصه في السجل. في حال كانت البتة تساوي 0 ، فإن التعليمات ستعلم الموافقة المسبقة عن علم لتمرير التعليمات اللاحقة.

قد نستخدم هذه التعليمات في حالة رغبتنا في التحقق من علامة ، على سبيل المثال علامة الحمل. هذا يعفينا من الحاجة إلى قراءة سجل الحالة والبحث عن البتات الفردية لمعرفة العلامات التي تم إصلاحها. 29 على سبيل المثال ، في حالة رغبتنا في التحقق مما إذا تم ضبط علامة Carry على 1 بعد إضافة رقمين ، فيمكننا كتابة ما يلي:

BTFSC 03h، 0
استمر هنا إذا تم ضبطه على 1
أو هنا إذا تم ضبطه على 0

في حالة أن حالة البت هي 1 ، في هذه الحالة سيتم إكمال التعليمات اللاحقة لـ BTFSC. في حالة ضبطه على 0 ، في هذه الحالة يتم تخطي التعليمات اللاحقة. يعرض الجزء التالي من التعليمات البرمجية التي يمكن استخدامه فيها:

عقدة :
:
:
BTFSC 03،0
حلقة الانتقال

في الكود أعلاه ، ستخرج الموافقة المسبقة عن علم ببساطة من الحلقة في حالة تعريف البتة 0 من سجل الحالة (أو علامة الحمل) على 0. وإلا فسيتم تنفيذ الأمر goto.

BTFSS

تنص هذه التعليمات على Bit Test Register F ، وتخطي إذا تم ضبطها. يمكن أن يكون هذا مشابهًا لتعليمات BTFSC ، بصرف النظر عن أن الموافقة المسبقة عن علم ستحذف التعليمات اللاحقة إذا تم تعيين البت الذي قمنا بتقييمه على 1 ، بدلاً من 0.

CLRF

ستصلح هذه التعليمات التفاصيل الكاملة للسجل إلى 0. الصيغة هي:

CLRF
لقد استخدمنا هذا مسبقًا لضبط إخراج المنافذ على 0 ، من خلال تطبيق CLRF 85h. علاوة على ذلك ، استخدمناها لإصلاح المنافذ لتشمل جميع المسامير للإخراج باستخدام CLRF
05 ح.

CLRW

قد يكون هذا مشابهًا لتعليمات CLRF ، باستثناء مسح سجل W. بناء الجملة بسيط جدًا:

CLRW

RLF و RRF

ستنقل هذه الاتجاهات قليلاً في سجل فتحة واحدة إلى اليسار (RLF) أو اليمين (RRF) في السجل. على سبيل المثال ، إذا احتجنا إلى 00000001 وقمنا باستخدام RLF ، فقد يكون لدينا في هذه الحالة 00000010. في هذه المرحلة ، ما الذي يحدث في حالة وجود 10000000 وطبقنا تعليمات RLF؟ بالتأكيد ، سيتم وضع الرقم 1 في علم الحمل. في حالة تطبيقنا لتعليمات RLF مرة أخرى ، سيظهر الرقم 1 مرة أخرى في البداية. يحدث نفس الشيء ، ولكن على العكس ، لتعليمات قوة الرد السريع. توضح الحالة الموضحة أدناه هذا بالنسبة لتعليمات RLF ، حيث يمكننا رؤية 8 بتات من السجل ، بالإضافة إلى علم الحمل:

ج 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
RLF 1 00000000
RLF 0 00000001

برنامج مثال

سنرى الآن مثالًا لرمز يمكن للمرء تجميعه وقيادته. سيولد ضوء تسلسلي يبدأ من PortA bit 0 ، ويذهب إلى PortB bit 8 و
ثم يعود.
قم بتوصيل مصابيح LED بكل واحد من دبابيس المنفذ. سيكون لدينا بعض الشيء
الإجراءات المشار إليها في هذا البرنامج التعليمي.

TIME EQU 9FH متغير لحلقة التأخير.
عنوان PORTB EQU 06H المنفذ B.
عنوان TRISB EQU 86H Port B Tristate.
عنوان PORTA EQU 05H Port A.
TRISA EQU 85H Port A عنوان ثلاثي.
STATUS EQU 03H حدد صفحة تسجيل.
COUNT1 EQU 0CH سجل حلقة.
COUNT2 تسجيل حلقة EQU 0DH.

حالة البنك السعودي الفرنسي ، 5 انتقل إلى الصفحة 1
MOVLW 00H والإعداد
MOVWF TRISB كلا المنفذين A و B
MOVLW 00H للإخراج ،
MOVWF TRISA ثم ارجع إلى
BCF STATUS ، 5 ​​صفحة 0.
MOVLW 00H منفذ Clear A.
MOVWF باب

بداية البرنامج الرئيسي

رونموفلو
01H تعيين البت الأول MOVWF
PORTB على المنفذ B.CALL
تأخير ، انتظر قليلاً
تأخير
حرّك البت على المنفذ B إلى اليسار ، ثم توقف مؤقتًا
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 يؤدي هذا إلى نقل البت إلى علم الحمل
انتقل الآن إلى المنفذ A ، وحرك الجزء الأيسر قليلاً
PORTA ، 1 يؤدي هذا إلى نقل البت من العلامة الصفرية إلى PortACALL
تأخير المكالمة
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
حرّك البت للخلف على Port ARRF
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
باب ، مكالمة واحدة
تأخير المكالمة
تأخير
PORTA ، 1 هذا ينقل البتة إلى علامة الصفر الآن حرك البتة
مرة أخرى على منفذ BRRF
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير
PORTB ، 1 مكالمة
تأخير المكالمة
تأخير الآن عدنا إلى حيث بدأنا ، اذهب
اركض لنذهب مرة أخرى.

يوجد خيار رائع في مجموعة التدريب يسمح لك باستخدام جدول البيانات.

جدول البيانات هو مجرد قائمة من اقتباسات البيانات ، حيث يتم النظر في كل شيء بناءً على بعض الاعتبارات.
على سبيل المثال ، يمكن أن يكون لديك دائرة تستخدم PIC والتي تحسب عدد الحالات التي يصبح فيها دبوس الإدخال مرتفعًا في ثانية واحدة. بعد ذلك يمكنك عرض الرقم على شاشة عرض ذات 7 أجزاء.

بمجرد بدء التوقيت ، تبدأ الموافقة المسبقة عن علم في حساب عدد المناسبات التي يرتفع فيها الدبوس. بعد ثانية واحدة يزور الجدول ويلقي نظرة سريعة على البيانات ، يجب أن يعرض الرقم على الشاشة الذي يرمز إلى مقدار المواقف التي ارتفع فيها الدبوس. يمكن أن يكون هذا مفيدًا ، لأننا لا نحدد الرقم الذي يمكن أن يكون حتى تنتهي الموافقة المسبقة عن علم تقديرها.

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

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

10 سنوات ك = 0
11 ك = ك + 1
12 إذا كان K> 10 ثم انتقل إلى 20 أيضًا ، فانتقل إلى 11
20 طباعة ك
21 نهاية

يبدأ البرنامج في السطر 10. بمجرد جدولة K إلى 0 ، فإنه يتقدم بعد ذلك إلى السطر 11. بعد أن قمنا بتضمين 1 إلى K ، ننتقل بعد ذلك إلى السطر 12.

في هذه المرحلة ، قد نشعر بالفضول إذا كانت K أعلى من 10. وفي حالة حدوث ذلك ، نتجه بعد ذلك إلى السطر 20 ، وإلا سنعود إلى السطر 11.

يوثق السطر 20 K ، ويختتم السطر 21 البرنامج. تستخدم BASIC إحصائيات الخط لمساعدة المبرمج في الاحتفاظ بسجل لأين توجد المشكلات ، حيث إن الملصقات غير مصرح بها. توظف الموافقة المسبقة عن علم ملصقات للهروب بين الوجهات - أو هل يمكن فعلاً ذلك؟

نحن نستخدم الملصقات للتأكد من أننا على دراية بمكان وجود المشكلات ، وكذلك لضمان قدرتنا على إبلاغ الموافقة المسبقة عن علم بطريقة بسيطة عن مكان البحث.

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

كلما أبلغنا الموافقة المسبقة عن علم لزيارة أحد الملصقات المحددة ، فإنه يتفهم مكان الذاكرة ، وبالتالي يعزز جهاز الكمبيوتر حتى يرى وجهة الذاكرة تلك. هذه هي بالضبط نفس الطريقة التي نتحقق بها من برنامج BASIC أعلاه. يوجد أدناه جزء من التعليمات البرمجية ، مع مساحات الذاكرة ، أو عناصر الكمبيوتر ، بجانب كل تعليمات:

تعليمات الكمبيوتر الشخصي 000 movlw 03
0001 موفوف 0 ج
0002 حلقة decfsc 0C
0003 غوتو لوب
0004 نهاية

في العرض أعلاه ، قمنا بتثبيت جهاز الكمبيوتر على 0000. في هذا لدينا التعليمات movlw 03. عندما تقوم PIC بتنفيذ هذه البيانات ، فإنها تزيد من جهاز الكمبيوتر حتى يتم مسح التعليمات اللاحقة. في هذه المرحلة ، ترى الموافقة المسبقة عن علم movwf 0C. يتم زيادة جهاز الكمبيوتر مرة أخرى.

الآن تدرس الموافقة المسبقة عن علم decfsc 0C. في حال كانت تفاصيل 0C ليست 0 ، في هذه الحالة يتم زيادة الكمبيوتر بمقدار 1 ، بالإضافة إلى التعليمات التالية ، goto Loop ، تُعلم الكمبيوتر بالعودة إلى الموضع 0003 ، حيث توجد الحلقة المذكورة. في حالة كانت تفاصيل 0C تساوي 0 ، يُنصح الكمبيوتر الشخصي بالزيادة بمقدار 2 ، ببساطة قم بحذف التعليمات اللاحقة.

فهم جداول البيانات

هذا يضع الكمبيوتر في الموضع 0004 ، حيث ينتهي البرنامج. يتم تحديد الوجهات بواسطة المُجمِّع ، ولا يجب أن نهتم بشكل عام بما ينجزه الكمبيوتر. حتى نجد الحاجة إلى السيطرة عليها تمامًا مثلما نفعل عند استخدام جداول البيانات. الطريقة الأكثر ملاءمة لوصف كيفية عمل جدول البيانات ، هي البدء برسم توضيحي.

جهاز كمبيوتر معادل 02
movlw 03
طاولة الاتصال
:
الجدول addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
إرجاع

التعليمات الأولية هي تخصيص ملصق الكمبيوتر بعنوان عداد البرامج (02 س). سنكون بعد فترة وجيزة من وضع قيمة 03h في سجل w. بعد ذلك نتواصل مع الطاولة. يعمل السطر الأول في جدول الروتين الفرعي على زيادة تفاصيل W سجل (03h) إلى عداد البرنامج.

يؤدي هذا إلى تشغيل عداد البرنامج للرفع بمقدار 3 ، أو لوضعه بطريقة مختلفة ، ويحفز عداد البرنامج للمضي قدمًا في 3 خطوط. بينما يصل العداد إلى 3 أسطر لأسفل ، تتعرف الموافقة المسبقة عن علم على عودة التعليمات. يرسل هذا الأمر القيمة التي تليها إلى W سجل ، وبعد ذلك تعود من الروتين الفرعي. تشير RETLW أساسًا إلى Return ، Literal to W.

انظر لقد وضعت فاصلة بعد كلمة العودة. نظرًا لأننا في روتين فرعي ، فإننا نطلب تعليمات الإرجاع إلى سطحه. لذلك فإن RET في التعليمات. بعد تعليمات RETLW يوجد رقم ، وهذا بالضبط ما يتم وضعه في سجل W.

في هذه الحالة ، يكون هذا هو الشكل 3. يمكننا تعيين أي كمية إلى سجل W ، طالما تم دمج هذا الرقم مع Program Counter في الروتين الفرعي للجدول ، فسوف نكتشف تعليمة معادة. في الرسم التوضيحي أعلاه ، يشير هذا إلى أننا قادرون على امتلاك أي رقم من 1 إلى 7. في حالة تجاوزنا الإجراء الفرعي ، قد نتمكن من إنهاء أداء قسم إضافي من البرنامج. لهذا السبب ، عادة ما تكون خطوة ذكية لوضع جدول البيانات بالضبط في نهاية برنامج الموافقة المسبقة عن علم ، لذلك إذا تجاوزنا في هذه الحالة ، فسنصل إلى نهاية البرنامج على أي حال.

قد يكون موضوع المقاطعات هو الأطول والأكثر صعوبة.

لا يمكنك العثور على أي طريقة غير معقدة لتفصيل المقاطعات ، ولكن مع قليل من الحظ في نهاية هذا الجزء ، قد تتمكن من تطبيق المقاطعات في برامجك الخاصة.
لقد فصلنا القسم إلى مرحلتين. وذلك لتمكين فصل الموضوع إلى أقسام ، وأيضًا لتزويدك بميزة سهلة للفهم.

ما هي المقاطعة بالضبط؟ بالتأكيد ، كما يشير المصطلح ، المقاطعة هي تقنية أو إشارة تمنع المعالج الدقيق / المتحكم الدقيق من أي شيء يؤديه إلى حدوث شيء مختلف.

اسمح لي أن أقدم لك توضيحًا يوميًا. تعتقد أنك تسترخي في منزلك وتتحدث إلى شخص آخر. فجأة يصدر صوت الهاتف.

توقفت عن الحديث وأمسك الهاتف للتحدث إلى المتصل. بمجرد إجراء تفاعلك الهاتفي ، قررت العودة إلى التحدث مع الفرد قبل رنين الهاتف. من الممكن التفكير في الروتين الأساسي أثناء الدردشة مع شخص ما ، حيث يؤدي رنين الهاتف إلى تعطيل محادثتك ، وفاصل الروتين هو طريقة التحدث على الهاتف.

بينما تنتهي المناقشة عبر الهاتف ، تعود إلى روتينك الأساسي للدردشة. هذا الرسم التوضيحي هو بالضبط كيفية مقاطعة المعالج لاتخاذ إجراء.

يعمل البرنامج الأساسي ، وينفذ وظيفة معينة في الدائرة ، ولكن عند حدوث انقطاع ، يتوقف البرنامج الأساسي بينما يتم تنفيذ روتين مختلف. ينتهي الروتين ، ينتقل المعالج إلى الروتين الأساسي تمامًا كما كان من قبل.

فهم المقاطعات

تمتلك الموافقة المسبقة عن علم 4 مصادر للمقاطعة. يمكن تقسيمها إلى مجموعتين. اثنان من مصادر المقاطعات التي يمكن استخدامها خارجيًا للموافقة المسبقة عن علم ، بينما الآخران هما عمليتان داخليتان. اسمحوا لي أن أوضح النوعين الخارجيين هنا. سيتم وصف النوعين الآخرين في دروس مختلفة بمجرد وصولنا إلى أجهزة ضبط الوقت وتخزين البيانات.

إذا قمت بفحص دبوس الخروج من الموافقة المسبقة عن علم ، ستلاحظ أن الدبوس 6 هو RB0 / INT. في هذه المرحلة ، من الواضح أن RB0 هو المنفذ B بت 0. يمثل INT أنه يمكن أيضًا تكوينه كطرف خارجي للمقاطعة. علاوة على ذلك ، يمكن أيضًا استخدام دبابيس المنفذ B من 4 إلى 7 (المسامير من 10 إلى 13) للمقاطعات. قبل أن نتمكن من استخدام INT أو دبابيس Port B أخرى ، يجب أن ننجز مهمتين. يجب أولاً إبلاغ الموافقة المسبقة عن علم بأننا سنستخدم المقاطعات.

بعد ذلك ، يجب أن نحدد أي منفذ B سنستخدمه كمقاطعة بدلاً من دبوس I / O. داخل الموافقة المسبقة عن علم يمكنك العثور على سجل يعرف باسم INTCON وهو على العنوان 0Bh. في هذا السجل سوف تكتشف 8 بتات يمكن تمكينها أو تعطيلها. يُعرف البت 7 من INTCON باسم GIE. هذا هو تمكين Interrngupt العالمي. يؤدي تثبيت هذا إلى 1 إلى إعلام الموافقة المسبقة عن علم أننا سنستخدم مقاطعة.

يُعرف بت 4 من INTCON باسم INTE ، تمكين INTerrupt. إن وضع هذا البت على 1 ينقل إلى PIC أن RB0 سيكون دبوس مقاطعة. يقوم تكوين البت 3 ، المسمى RBIE ، بإعلام PIc بأننا سنستخدم بتات المنفذ B من 4 إلى 7. في هذه المرحلة ، تدرك الموافقة المسبقة عن علم متى يمكن أن يكون هذا الدبوس مرتفعًا أو منخفضًا ، وعليه إيقاف ما يقوم به والمتابعة مع المقاطعة نمط. في هذه المرحلة ، يجب علينا إبلاغ الموافقة المسبقة عن علم ما إذا كانت المقاطعة ستكون على الأرجح على الحافة الصاعدة (0V إلى + 5V) أو على حافة الهبوط (+ 5V إلى 0V) لتحويل الإشارة.

ببساطة ، هل نرغب في أن تنقطع الموافقة المسبقة عن علم في كل مرة تتحرك فيها الإشارة من منخفض إلى مرتفع ، أو من الأعلى إلى الأدنى. عن طريق الانحراف ، يمكن إثبات ذلك ليتم وضعه على حافة الارتفاع.

تمت جدولة 'تشغيل' الحافة في سجل إضافي يسمى سجل OPTION ، على العنوان 81h. الجزء الذي نتحمس له هو الجزء 6 ، والذي يشار إليه غالبًا باسم INTEDG.

يؤدي ضبط هذا على 1 إلى تعطيل الموافقة المسبقة عن علم على حافة التركيب (الحالة الافتراضية) وضبطها على 0 يحفز الموافقة المسبقة عن علم لتعطيل الحافة المنزلقة. إذا كنت ترغب في تنشيط الموافقة المسبقة عن علم على الحافة الصاعدة ، فلا داعي بالتأكيد لفعل أي شيء لهذه النقطة.

في هذه المرحلة ، للأسف ، يوجد سجل الخيار في البنك 1 ، مما يعني أننا نستمتع بالتعديل من البنك 0 إلى البنك 1 ، وقم بتعيين البت في سجل الخيار ، وبعد ذلك العودة إلى البنك 0. المفتاح هنا هو إنجاز كل جزء من سجلات البنك 1 في إضراب واحد ، على سبيل المثال إنشاء دبابيس المنفذ ، بعد ذلك يعود إلى البنك 0 إذا كنت قد انتهيت.

حسنًا ، بناءً على ذلك ، قمنا بإخطار PIC بالدبوس الذي من المحتمل أن يكون هو المقاطعة ، وأين يتم تشغيل الحافة ، ما الذي يحدث في البرنامج والموافقة المسبقة عن علم في أي وقت تحدث فيه المقاطعة؟ زوجان من الأشياء تحدث. أولاً ، تم جدولة 'العلم'.

يقوم هذا بإعلام المعالج الداخلي للموافقة المسبقة عن علم بحدوث مقاطعة. بعد ذلك ، يقدم عداد البرنامج (الذي تحدثت عنه في البرنامج التعليمي السابق) نصائح إلى عنوان محدد داخل الموافقة المسبقة عن علم. دعنا نتحقق بسرعة من كل هذه الأشياء بشكل فردي. إشارة المقاطعة في سجل INTCON الخاص بنا ، يكون البت 1 هو علامة المقاطعة ، ويسمى INTF. في هذه المرحلة ، كلما ظهرت أي مقاطعة ، فمن المحتمل أن يتم تثبيت هذه العلامة على 1.

عندما لا يكون هناك مقاطعة ، يتم وضع العلم على 0. بالإضافة إلى أن هذا هو كل الإنجازات تقريبًا. في هذه المرحلة ، قد تفكر في 'ما هي النقطة؟' بالتأكيد ، على الرغم من أن هذه العلامة مجدولة إلى 1 ، فإن الموافقة المسبقة عن علم غير قادرة ولن تتفاعل مع مقاطعة أخرى. لذلك ، دعونا نعبر عن أننا نحدث مقاطعة. من المحتمل أن يتم تثبيت العلم على 1 ، وقد تنتقل الموافقة المسبقة عن علم إلى روتيننا لعمل المقاطعة.

عندما لا تكون هذه العلامة ثابتة على 1 ، ويسمح لـ PIC بمواصلة الرد على المقاطعة ، فإن نبض الدبوس باستمرار يمكن أن يحافظ على عودة الموافقة المسبقة عن علم إلى بداية روتين المقاطعة الخاص بنا ، ولا يكملها بأي حال من الأحوال. بالعودة إلى توضيحي للهاتف ، فإنه يشبه رفع الهاتف ، وفور الشروع في مناقشته يبدأ في الرنين مرة أخرى لأن شخصًا آخر يرغب في التحدث معك.

يُنصح بإكمال حوار واحد ، ثم إمساك الهاتف مرة أخرى للتحدث مع الشخص التالي. يمكنك أن تجد مشكلة صغيرة مع هذا العلم. على الرغم من أن الموافقة المسبقة عن علم تحدد بسرعة هذه العلامة على 1 ، فإنها لا تعينها مرة أخرى 0! يجب أن يمارس هذا النشاط المبرمج - أي أنت. يمكن تحقيق ذلك دون عناء ، لأنني على يقين من أنه يجب تحقيق ذلك بعد تنفيذ الموافقة المسبقة عن علم لروتين المقاطعة.

موقع الذاكرة عندما تقوم بتشغيل PIC مبدئيًا ، أو في حالة وجود إعادة تعيين ، تلميحات عداد البرامج لمعالجة 0000 ساعة ، والتي يمكن أن تكون على الفور في بداية ذاكرة البرنامج. ولكن ، في حالة حدوث مقاطعة ، سيشير عداد البرنامج إلى العنوان 0004h.

لذلك ، بينما نقوم بتأليف برنامجنا الذي سيشتمل على مقاطعات ، يجب أولاً إبلاغ PIC للقفز فوق العنوان 0004h ، والحفاظ على روتين المقاطعة الذي يبدأ عند العنوان 0004h منفصل عن باقي البرنامج.

هذا يمكن أن يكون خالي من المتاعب لأداء. في البداية ، بدأنا برنامجنا بأمر يعرف باسم ORG. يشير هذا الأمر إلى الأصل ، أو البدء. نحن نتمسك به بعنوان. نظرًا لأن الموافقة المسبقة عن علم تبدأ بالعنوان 0000h ، نكتب ORG 0000h. بعد ذلك يجب علينا تجاوز العنوان 0004h. نحقق ذلك من خلال وضع تعليمات GOTO ، مصحوبة بعلامة تشير إلى برنامجنا الأساسي.

بعد ذلك نلتزم بأمر GOTO هذا مع ORG آخر ، هذه اللحظة بالعنوان 0004h. بعد هذا الأمر ، ندخل روتين المقاطعة الخاص بنا. في هذه المرحلة ، قد نتمكن من كتابة روتين المقاطعة الخاص بنا مباشرة باتباع أمر ORG الثاني ، أو يمكننا وضع عبارة GOTO التي تشير إلى روتين المقاطعة.

إنه حقًا متعلق بالخيار من جانبك. لإبلاغ PIC الذي تقدمه ، وصلنا إلى نهاية روتين المقاطعة ، يجب علينا وضع الأمر RTFIE في نهاية الروتين. يشير هذا الأمر إلى العودة من روتين المقاطعة. وبينما تلاحظ الموافقة المسبقة عن علم ذلك ، يشير عداد البرنامج إلى الوضع النهائي الذي كانت عليه الموافقة المسبقة عن علم قبل حدوث المقاطعة. لقد أنشأنا أدناه قسمًا موجزًا ​​من التعليمات البرمجية لعرض ما سبق:

هناك بعض الأشياء التي يجب أن تعلمها عند استخدام المقاطعات. تميل البداية إلى أنه إذا كنت تستخدم السجل المتطابق في برنامجك الأساسي وروتين المقاطعة ، فضع في اعتبارك أن تفاصيل السجل ستتغير على الأرجح عند حدوث المقاطعة.

على سبيل المثال ، دعنا نستخدم w register لإعادة توجيه البيانات إلى برنامج Port A الأساسي ، لذلك يمكنك أيضًا استخدام سجل w في روتين المقاطعة لتحويل البيانات من وجهة إلى أخرى.

في حالة عدم توخي الحذر ، سيشمل السجل w القيمة الأخيرة التي تلقاها أثناء وجوده في روتين المقاطعة ، لذلك عندما تعود من المقاطعة ، سيتم تسليم هذه المعلومات إلى المنفذ A بدلاً من القيمة التي كانت تمتلكها من قبل حدثت المقاطعة.

الوسيلة المتعلقة بذلك هي حفظ تفاصيل w سجل للحظات قبل استخدامها مرة أخرى في روتين المقاطعة. والثاني هو حقيقة أنه يمكنك العثور على تأخير بين وقت حدوث مقاطعة ووقت حدوث مقاطعة لاحقة. بينما تفهم ، فإن PIC تمتلك ساعة خارجية ، والتي يمكن أن تكون بلورية أو يمكن أن تكون مجموعة مقاومة مكثف.

بغض النظر عن تردد هذه الساعة ، تقسمها PIC على 4 ثم تستخدم هذا لتوقيتها الداخلي. على سبيل المثال في حالة وجود بلورة 4 ميجا هرتز مرتبطة بالموافقة المسبقة عن علم الخاصة بك ، في هذه الحالة ستقوم الموافقة المسبقة عن علم بتنفيذ التعليمات عند 1 ميجا هرتز. يُعرف هذا التوقيت الداخلي بدورة التعليمات. في هذه المرحلة ، تدعي ورقة البيانات (بلا شك في طباعة صغيرة) أنك تحتاج إلى تمكين 3 إلى 4 جولات تعليمات بين المقاطعات.

سيكون لدي لتمكين 4 جولات. السبب وراء التأخير هو أن الموافقة المسبقة عن علم تتطلب وقتًا للقفز إلى عنوان المقاطعة والعلامة والعودة بعيدًا عن روتين المقاطعة. لذلك ، ضع هذا في ذهنك إذا كنت تعمل مع دائرة بديلة لتنشيط مقاطعة للموافقة المسبقة عن علم.

في هذه المرحلة ، النقطة المهمة هي حقيقة أنك إذا استخدمت البتات من 4 إلى 7 من المنفذ B كمقاطعة. لا يمكنك اختيار دبابيس معينة في المنفذ B لتعمل كمقاطعة.

لذلك ، في حالة السماح بهذه المسامير ، فمن المحتمل أن تكون كلها متاحة. لذلك ، على سبيل المثال ، لا يمكنك ببساطة الحصول على البتتين 4 و 5 - فمن المرجح أن يتم تمكين البتتين 6 و 7 في نفس الوقت. ما هو بالضبط الغرض من الحصول على أربع بتات لتمثيل مقاطعة؟ بالتأكيد ، قد يكون لديك دائرة متصلة بالموافقة المسبقة عن علم ، في حالة ارتفاع أي من الخطوط الأربعة ، في هذه الحالة قد تكون هذه مشكلة تتطلب من الموافقة المسبقة عن علم للتأثير على الفور.

أحد الأمثلة على ذلك يمكن أن يكون إنذارًا لأمن المنزل ، حيث يتم ربط أربعة مستشعرات بمنافذ المنفذ B من 4 إلى 7. يمكن لأي مستشعر معين أن يدفع PIC لإطلاق إنذار ، ونظام إشارات الإنذار هو روتين المقاطعة. يؤدي هذا إلى فحص المنافذ باستمرار ويسمح للموافقة المسبقة عن علم بالاستمرار في الأمور المختلفة. في البرنامج التعليمي التالي ، سننشئ برنامجًا لإدارة مقاطعة.

لقد تعاملنا مع الكثير من الأساسيات في البرنامج التعليمي الأخير ، لذلك أشعر أن الوقت قد حان لأننا قمنا بتكوين برنامجنا الأول.

سيحسب البرنامج الذي سنكتبه عدد المناسبات التي نفتح فيها المفتاح ، ثم نعرض الرقم.

سيحسب البرنامج من 0 إلى 9 ، ويمكن عرضه على 4 مصابيح LED في شكل ثنائي ، إلى جانب المدخلات أو المقاطعة على الأرجح على RB0.

الشيء الأول الذي يجب علينا القيام به هو إبلاغ PIC للقفز فوق العنوان الذي يشير إليه 'عداد البرامج' كلما حدثت مقاطعة.

ستلاحظ أننا نستخدم طريقة فريدة لعرض الأرقام السداسية العشرية. قبل حدوث ذلك ، استخدم F9h حيث يشير h إلى النظام الست عشري. يمكننا كتابة هذا كـ 0xF9 ، وهو الهيكل الذي سنستخدمه من الآن فصاعدًا.

نحتاج الآن إلى إخبار الموافقة المسبقة عن علم أننا سنستخدم المقاطعات ، ونستخدم RB0 pin 6 كدبوس مقاطعة:

bsf INTCON، 7GIE - تمكين المقاطعة العالمية (1 = تمكين)
bsf INTCON، 4INTE - تمكين المقاطعة RB0 (1 = تمكين)
سأقوم بمسح علامة المقاطعة فقط في حالة (لا أثق بأي شيء أبدًا!)
bcf INTCON ، 1INTF - مسح بت العلم فقط في حالة

حاليًا يجب علينا إنشاء منفذين. ضع في اعتبارك أنه نظرًا لأننا نستخدم الآن RB0 كدبوس مقاطعة ، فيجب إنشاء هذا كمدخل:

سنستخدم متغيرًا يسمى COUNT لتخزين عدد مرات التبديل. يمكننا ببساطة زيادة القيمة في المنفذ A ، لكنك سترى لماذا أستخدم متغيرًا عندما نكتب روتين المقاطعة الخاص بنا.

لذلك ، يتكون برنامجنا الرئيسي ، وفي هذه المرحلة يجب علينا إبلاغ الموافقة المسبقة عن علم بكيفية المضي قدمًا كلما حدثت مقاطعة. في هذا المثال ، من المحتمل أن تكون مقاطعتنا هي المفتاح. ما نود أن يكون PIC هو واحد إلى COUNT قابل للتعديل في كل مرة يتم فيها تقييد المفتاح.

ومع ذلك ، نرغب فقط في إظهار عدد المناسبات التي يغلق فيها المفتاح من 0 إلى 9. أعلاه ، ذكرت أننا قد نكون قادرين ببساطة على زيادة القيمة في المنفذ A في كل مرة يكون هناك مقاطعة. ومع ذلك ، يحتوي المنفذ A على 5 بتات ، في حالة زيادة المنفذ ببساطة ، فسنمتلك أعلى عدد وهو 31. هناك تفسيران لماذا اخترت عدم الانتقال إلى 31.

في البداية ، سنستخدم شاشة من 7 مقاطع ، والتي يمكن أن تنتقل فقط من 0 إلى 15 (0 إلى F في سداسي عشري). بعد ذلك ، أود أيضًا أن أعرض عليك بعض الأوامر الحسابية التي عثرت عليها في الدروس القليلة الماضية.

لذلك سنواصل روتين المقاطعة لدينا. في الوقت الحالي ، أول ما يجب أن ننجزه هو تخزين تفاصيل سجلنا لفترة وجيزة ، نظرًا لأننا طبقنا هذا لتحويل محتويات COUNT إلى PORTA. في حالة عدم حفظه ، في هذه الحالة قد نتمكن من تقديم رقم مختلف تمامًا بسبب حساباتنا. لذلك دعونا نحقق ذلك أولاً:

في هذه المرحلة ، نفهم ما إذا كانت قيمة COUNT هي 9 أو أكثر. ما نحتاج إلى تحقيقه الآن هو إذا كانت COUNT أكبر من 9 ، أو إعادتها إلى 0 ، أو العودة إلى البرنامج الرئيسي للتأكد من أننا قادرون على تسليمها إلى Port A.
التعليمات في حالة جدولة علم الحمل ، أي COUNT = 10:

الشيء الوحيد المتبقي الآن هو الإدخال بشكل جماعي وكذلك تحديد القيم لثوابتنا ، والتي يمكننا تنفيذها بشكل صحيح في بداية برنامجنا.

في كل مرة تقوم فيها بتنشيط المفتاح ، سيتم احتساب المصابيح في شكل ثنائي من 0000 إلى 1010 ثم العودة إلى 0000.

يوضح الشكل التالي مخطط الدائرة المتوافق مع الكود الموضح أعلاه. ومن المثير للاهتمام أنك ستجد أن مكثف التوقيت قد تم تضمينه في التصميم. هذه حيلة صغيرة لطيفة تحصل من خلالها على حرية تجنب إدراج المكثف في حالة عدم وجود أي مكثف معك خلال ذلك الوقت.

هنا تلعب السعة دورًا عبر السعة الشاردة عبر دبوس المذبذب والأرض.
بالطبع قد لا يبدو أنها طريقة ذكية جدًا لتجنب المكثف عمليًا لأن القيمة الشاردة قد تختلف باختلاف الظروف المعينة.

قسم آخر يمكن رؤيته في الدائرة هو شبكة التنديد عبر المحول. هذا يمنع التداخل أثناء التبديل الميكانيكي ويمنع الخلط بين الموافقة المسبقة عن علم إذا كان التبديل عبارة عن تبديل واحد أو تبديل متعدد.




زوج من: دائرة توقيت المحرك ثنائي الاتجاه القابلة للبرمجة التالي: كيف تعمل دوائر Buck-Boost