الميكرومراقب PIC16F84A: الهيكلة والذاكرة والسجلات
يتعرّف التلميذ على الميكرومراقب PIC16F84A: توزيع أرجله ودارة تشغيله الدنيا، وهيكلته الداخلية، وتنظيم ذاكرته، وسجلاته الأساسية STATUS وTRISx وPORTx وOPTION_REG وINTCON وTMR0، وكلمة التهيئة، وينتهي الدرس بتمارين محلولة بنمط البكالوريا.
يتكوّن الدرس من 8 أجزاء: 1. مفهوم الميكرومراقب وتسمية PIC16F84A وتوزيع أرجله، 2. الدارة الدنيا للتشغيل: التغذية والمذبذب ودورة الآلة وإعادة التهيئة، 3. الهيكلة الداخلية: بنية هارفارد ووحدات الميكرومراقب، 4. تنظيم الذاكرة: ذاكرة البرنامج والذاكرة RAM والذاكرة EEPROM، 5. السجلات الأساسية: W وSTATUS وTRISx وPORTx، 6. سجلات المؤقت والمقاطعات: OPTION_REG وINTCON وTMR0، 7. كلمة التهيئة (Configuration Word)، 8. تمارين محلولة بنمط البكالوريا.
1. مفهوم الميكرومراقب وتسمية PIC16F84A وتوزيع أرجله
ما هو الميكرومراقب؟
الميكرومراقب (microcontrôleur) دارة مندمجة قابلة للبرمجة تجمع في شريحة واحدة كل ما يلزم لمعالجة المعلومات: وحدة معالجة، وذاكرة للبرنامج، وذاكرة للمعطيات، ومنافذ دخول وخروج، ومؤقتاً، ودارة توقيت. يكفي أن نضيف إليه تغذية ومذبذباً (بلوراً) حتى يعمل وحده.
أما الميكرومعالج (microprocesseur) فهو وحدة معالجة فقط: يحتاج إلى ذاكرات ودارات منافذ خارجية تُوصل به عبر النواقل. لذلك يُوصف الميكرومراقب بأنه «حاسوب صغير في شريحة واحدة».
في النظام الآلي يقع الميكرومراقب في جزء التحكم، ويؤدي الوظيفة «عالِج» من سلسلة المعلومات:
- يستقبل على مداخله إشارات الملتقطات والأزرار (نهاية الشوط، الخلية الضوئية، زر التشغيل dcy…)؛
- ينفّذ البرنامج المسجّل في ذاكرته، تعليمة بعد تعليمة؛
- يرسل على مخارجه الأوامر نحو المنفذات المتصدرة (المرحلات، الملامسات، الموزعات الكهربائية) عبر دارة واجهة.
> الميكرومراقب يجسّد التكنولوجيا المبرمجة: لتغيير سلوك النظام نغيّر البرنامج، ولا نغيّر الأسلاك.
تسمية PIC16F84A
الدارة من صنع الشركة Microchip، ويُقرأ اسمها هكذا:
| الجزء | المعنى | |---|---| | PIC | Peripheral Interface Controller: مراقب الوسائط المحيطة | | 16 | عائلة المدى المتوسط (Mid-Range)، تعليماتها مكتوبة على 14 بتاً | | F | ذاكرة البرنامج من نوع Flash: تُمحى وتُبرمج كهربائياً مرات عديدة | | 84 | رقم الدارة في العائلة | | A | النسخة المحسّنة من الدارة PIC16F84 | | اللاحقة `-04` أو `-20` | التردد الأعظمي للساعة: 4 MHz أو 20 MHz |
الخصائص الأساسية
| الخاصية | القيمة | |---|---| | ذاكرة البرنامج Flash | 1024 كلمة من 14 بتاً (1K × 14) | | الذاكرة الحية RAM للمستعمل | 68 بايتاً | | ذاكرة المعطيات EEPROM | 64 بايتاً | | خطوط الدخول والخروج | 13 خطاً: 5 في PORTA و8 في PORTB | | عدد التعليمات | 35 تعليمة (بنية RISC) | | المؤقت | TMR0 على 8 بتات مع قاسم تردد قابل للبرمجة | | المكدس | 8 مستويات | | مصادر المقاطعة | 4 | | التغذية | من 4 V إلى 5,5 V، وعملياً 5 V | | التردد الأعظمي | 20 MHz |
توزيع الأرجل

يبيّن الشكل العلبة PDIP ذات 18 رجلاً منظوراً إليها من الأعلى: الثلمة تحدّد جهة الرجل 1، والترقيم ينزل من 1 إلى 9 على اليسار ثم يصعد من 10 إلى 18 على اليمين؛ اللون الأزرق لخطوط المنفذ A، والأخضر لخطوط المنفذ B، والبرتقالي للتغذية والمذبذب وإعادة التهيئة.
| الرجل | الاسم | الوظيفة | |---|---|---| | 17 و18 و1 و2 | RA0 وRA1 وRA2 وRA3 | خطوط المنفذ A | | 3 | RA4/T0CKI | الخط RA4، أو مدخل ساعة خارجية للمؤقت TMR0 | | 4 | $\overline{\mathrm{MCLR}}$ | إعادة التهيئة، نشطة بالمستوى المنخفض | | 5 | VSS | الأرضي 0 V | | 6 | RB0/INT | الخط RB0، أو مدخل المقاطعة الخارجية | | من 7 إلى 13 | من RB1 إلى RB7 | خطوط المنفذ B؛ الخطوط RB4 إلى RB7 تولّد مقاطعة عند تغيّر حالتها | | 14 | VDD | التغذية الموجبة +5 V | | 15 | OSC2/CLKOUT | مربط المذبذب | | 16 | OSC1/CLKIN | مربط المذبذب أو مدخل ساعة خارجية |
حالة خاصة: الرجل RA4
مخرج RA4 من نوع المصرف المفتوح (open drain): يستطيع أن يفرض المستوى 0 فقط. إذا استُعمل مخرجاً يجب وصله بمقاومة سحب نحو VDD حتى يظهر المستوى 1. لذلك تُترك RA4 غالباً مدخلاً، أو تُستعمل مدخلاً لساعة المؤقت (T0CKI).
تيار المخارج
مخرج الميكرومراقب يزوّد ثنائية ضوئية مباشرة، لكن تياره محدود: الحد الأقصى المطلق من رتبة 20 إلى 25 mA للرجل الواحد حسب وثيقة الصانع، ونصمّم عملياً لتيار حوالي 10 mA. أما المرحل والمحرك فيُغذّيان دائماً عبر مقحل (transistor)، لأن توترهما وتيارهما يتجاوزان ما يتحمله المخرج.
أمثلة محلولة
مثال 1 (قراءة مخطط بأرقام الأرجل): في مخطط ربط، الملتقط N موصول بالرجل 1، والتماس a بالرجل 18، ومصباح التوقف بالرجل 17، والمرحل بالرجل 2. حدّد خطوط المنافذ واتجاهها.
- الرجل 1 هي RA2 (مدخل N)، والرجل 18 هي RA1 (مدخل a)؛
- الرجل 17 هي RA0 (مخرج نحو المصباح)، والرجل 2 هي RA3 (مخرج نحو المرحل).
المداخل إذن RA1 وRA2، والمخارج RA0 وRA3.
مثال 2 (مقاومة حماية ثنائية ضوئية): ثنائية ضوئية توترها 2 V وتيارها المطلوب 10 mA، موصولة بالمخرج RB3 الذي يعطي 5 V في الحالة 1.
$ R = \dfrac{V_{DD} - V_{LED}}{I} $
ومنه $R = \dfrac{5 - 2}{0{,}01} = 300\ \Omega$، فنختار القيمة القياسية $330\ \Omega$ ويصير التيار $I = 3/330 \approx 9{,}1\ mA$، وهو أقل من الحد المسموح.
أخطاء شائعة
- الخلط بين رقم الرجل ورقم البت: RA0 هي الرجل 17 وليست الرجل 1.
- وضع التغذية على الرجلين 14 و7 كما في الدارات 74xx: في PIC16F84A الأرضي VSS هو الرجل 5.
- استعمال RA4 مخرجاً دون مقاومة سحب، فلا يظهر المستوى 1 أبداً.
- ربط مرحل مباشرة بمخرج الميكرومراقب دون مقحل.
2. الدارة الدنيا للتشغيل: التغذية والمذبذب ودورة الآلة وإعادة التهيئة
العناصر اللازمة لتشغيل الميكرومراقب
لا يعمل الميكرومراقب إلا إذا توفرت له ثلاثة أشياء: التغذية، وإشارة الساعة التي يولّدها المذبذب، ودارة إعادة التهيئة على الرجل MCLR.

يبيّن الشكل التغذية +5 V على الرجل 14 والأرضي على الرجل 5، والبلور Q بتردد 4 MHz بين الرجلين 16 و15 مع المكثفين C1 وC2 نحو الأرضي، والمقاومة R بين $\overline{\mathrm{MCLR}}$ (الرجل 4) و+5 V مع الزر RESET نحو الأرضي.
التغذية
- VDD (الرجل 14) على +5 V، وVSS (الرجل 5) على 0 V؛
- تأتي التغذية عادة من منظم 7805؛
- يوضع مكثف فك الاقتران 100 nF قريباً من الرجلين 14 و5 لامتصاص الطفيليات.
المذبذب (قاعدة الزمن)
يولّد المذبذب إشارة الساعة التي تضبط سرعة تنفيذ البرنامج. يُختار نمطه من بين أربعة أنماط بواسطة البتين FOSC1 وFOSC0 من كلمة التهيئة (الجزء 7):
| النمط | العنصر | مجال التردد التقريبي | الاستعمال | |---|---|---|---| | LP | بلور منخفض التردد | حتى 200 kHz | استهلاك ضعيف | | XT | بلور أو رنّان | حتى 4 MHz | الأكثر استعمالاً (4 MHz) | | HS | بلور عالي التردد | من 4 MHz إلى 20 MHz | سرعة كبيرة | | RC | مقاومة ومكثف | بضعة MHz | لا يحتاج دقة |
- في الأنماط LP وXT وHS يوصل البلور بين OSC1 وOSC2، ومع كل مربط مكثف نحو الأرضي قيمته من رتبة 15 إلى 33 pF مع بلورات XT وHS المعتادة (في مواضيع البكالوريا غالباً 22 pF أو 27 pF مع بلور 4 MHz)؛ أما بلور LP بتردد 32 kHz فيحتاج مكثفات أكبر (من 68 إلى 100 pF).
- في النمط RC توصل مقاومة خارجية (بين 5 kΩ و100 kΩ) ومكثف (أكبر من 20 pF) بالمربط OSC1، ويُخرج المربط OSC2 إشارة ترددها ربع تردد المذبذب. التردد هنا غير دقيق، فلا يُستعمل هذا النمط في التأجيلات الدقيقة.
دورة الآلة (cycle machine)
يقسم الميكرومراقب إشارة الساعة داخلياً على 4 ليحصل على أربع مراحل Q1 وQ2 وQ3 وQ4 تكوّن دورة آلة واحدة $T_{cy}$:
$ T_{cy} = 4\,T_{osc} = \dfrac{4}{f_{osc}} $
- مع بلور 4 MHz: $T_{osc} = 0{,}25\ \mu s$ و$T_{cy} = 1\ \mu s$، أي مليون دورة في الثانية؛
- مع 20 MHz: $T_{cy} = 0{,}2\ \mu s$.
التنفيذ الأنبوبي (pipeline): بفضل البنية الداخلية (الجزء 3)، يجلب الميكرومراقب التعليمة الموالية من ذاكرة البرنامج في الوقت الذي ينفذ فيه التعليمة الحالية:
| الدورة | الأولى | الثانية | الثالثة | الرابعة | |---|---|---|---|---| | الجلب | التعليمة 1 | التعليمة 2 | التعليمة 3 | التعليمة 4 | | التنفيذ | — | التعليمة 1 | التعليمة 2 | التعليمة 3 |
لذلك تُنفذ أغلب التعليمات في دورة واحدة. التعليمات التي تغيّر عداد البرنامج (GOTO وCALL وRETURN) تأخذ دورتين، لأن التعليمة التي جُلبت مسبقاً تُرمى. وتعليمات الاختبار مع القفز (مثل BTFSS وDECFSZ) تأخذ دورة واحدة، أو دورتين عندما يتحقق القفز.
إعادة التهيئة (RESET)
الرجل $\overline{\mathrm{MCLR}}$ (Master Clear، الرجل 4) نشطة بالمستوى المنخفض:
- المقاومة R (مثلاً 10 kΩ) نحو VDD تبقيها في 1، فيعمل البرنامج؛
- الضغط على الزر RESET يضعها في 0، فيتوقف الميكرومراقب؛
- عند التحرير يبدأ البرنامج من جديد من العنوان 0000h لذاكرة البرنامج.
مصادر أخرى لإعادة التهيئة: وصل التغذية (Power-on Reset)، وانقضاء مؤقت الحراسة (Watchdog). وعند وصل التغذية يمكن تفعيل مؤقت التشغيل (Power-up Timer) الذي يبقي الدارة في حالة إعادة التهيئة حوالي 72 ms حتى تستقر التغذية، ثم ينتظر مؤقت انطلاق المذبذب 1024 دورة من دورات البلور حتى يستقر.
> بعد كل إعادة تهيئة: عداد البرنامج على 0000h، وكل خطوط المنفذين مداخل (كل بتات TRISA وTRISB على 1)، والبنك 0 هو المختار، و$\mathrm{OPTION\_REG} = \mathrm{FFh}$.
جعل الخطوط مداخل عند الانطلاق اختيار أمان: لا يُشغَّل أي منفذ متصدر قبل أن يحدد البرنامج الاتجاهات.
أمثلة محلولة
مثال 1: بلور 8 MHz. احسب $T_{cy}$ ومدة مقطع برنامج فيه 40 تعليمة بسيطة و5 تعليمات GOTO.
- $T_{cy} = 4/(8 \times 10^{6}) = 0{,}5\ \mu s$؛
- عدد الدورات: $40 \times 1 + 5 \times 2 = 50$ دورة؛
- المدة: $50 \times 0{,}5 = 25\ \mu s$.
مثال 2: برنامج يجب أن ينفذ 250000 دورة آلة في 0,1 s. ما التردد اللازم وما نمط المذبذب؟
- $T_{cy} = 0{,}1/250000 = 0{,}4\ \mu s$؛
- $f_{osc} = 4/T_{cy} = 4/(0{,}4 \times 10^{-6}) = 10\ MHz$، فالنمط هو HS.
أخطاء شائعة
- حساب $T_{cy} = 1/f_{osc}$ ونسيان القسمة على 4.
- اختيار النمط XT مع بلور 20 MHz: الصحيح HS.
- وصل $\overline{\mathrm{MCLR}}$ بالأرضي أو تركها دون مقاومة: الميكرومراقب يبقى في حالة إعادة التهيئة.
- اعتبار GOTO وCALL تعليمات بدورة واحدة في حساب المدة.
3. الهيكلة الداخلية: بنية هارفارد ووحدات الميكرومراقب
بنية هارفارد (Harvard)
في البنية الكلاسيكية فون نيومان (von Neumann) يوجد ناقل واحد وذاكرة واحدة للتعليمات والمعطيات معاً، فلا يمكن جلب تعليمة وقراءة معطى في الوقت نفسه.
أما الميكرومراقب PIC16F84A فيستعمل بنية هارفارد: ذاكرة البرنامج وذاكرة المعطيات منفصلتان، ولكل منهما ناقلها:
- ناقل البرنامج عرضه 14 بتاً: كل تعليمة تُكتب في كلمة واحدة من 14 بتاً؛
- ناقل المعطيات عرضه 8 بتات: السجلات والمعطيات كلها على 8 بتات.
النتيجة: يمكن جلب التعليمة الموالية أثناء تنفيذ التعليمة الحالية (التنفيذ الأنبوبي)، فتُنفذ أغلب التعليمات في دورة آلة واحدة.
ويتبع الميكرومراقب بنية RISC (Reduced Instruction Set Computer): 35 تعليمة بسيطة فقط، سهلة الحفظ وسريعة التنفيذ.
المخطط الكتلي

يبيّن الشكل على اليسار جهة البرنامج (عداد البرنامج والمكدس وذاكرة Flash وسجل التعليمة ووحدة فك الترميز)، وعلى اليمين ناقل المعطيات ذا 8 بتات والوحدات الموصولة به (RAM وEEPROM وALU وW وSTATUS وTMR0 والمنفذان).
| الوحدة | دورها | |---|---| | ذاكرة البرنامج Flash (1K × 14) | تحفظ تعليمات البرنامج، ولا تُمحى عند قطع التغذية | | عداد البرنامج PC (13 بتاً) | يحمل عنوان التعليمة التي ستُجلب، ويزداد بـ1 بعد كل تعليمة | | المكدس (8 مستويات) | يحفظ عناوين الرجوع عند استدعاء برنامج فرعي (CALL) أو مقاطعة | | سجل التعليمة ووحدة فك الترميز | يستقبلان التعليمة، ثم يولّدان إشارات التحكم في الوحدات | | الوحدة الحسابية والمنطقية ALU | تنجز العمليات (جمع، طرح، AND، OR، XOR، إزاحة…) على 8 بتات | | سجل العمل W | وسيط كل العمليات: أحد طرفي العملية يمر عبره | | السجل STATUS | يحفظ أعلام نتيجة ALU واختيار البنك | | الذاكرة RAM | السجلات الخاصة SFR و68 سجلاً عاماً للمتغيرات | | الذاكرة EEPROM (64 × 8) | معطيات تبقى محفوظة بعد قطع التغذية | | المؤقت TMR0 | عداد 8 بتات للتأجيل أو لعدّ نبضات خارجية | | المنفذان PORTA وPORTB | الاتصال بالملتقطات والمنفذات المتصدرة | | دارة التوقيت وإعادة التهيئة | الساعة، ومؤقت التشغيل، ومؤقت الحراسة WDT |
كيف تُنفذ تعليمة؟
- يضع PC عنوان التعليمة على ذاكرة البرنامج؛
- تُنقل الكلمة ذات 14 بتاً عبر ناقل البرنامج إلى سجل التعليمة؛
- تُفك وتُنفذ: مثلاً تجمع ALU محتوى W ومحتوى سجل من RAM، وتكتب النتيجة، وتحدّث أعلام STATUS؛
- يزداد PC بـ1، إلا إذا كانت التعليمة قفزاً أو استدعاءً.
المكدس (pile)
عند التعليمة CALL يُحفظ عنوان الرجوع في المكدس، وتعيده التعليمة RETURN. للمكدس 8 مستويات فقط، وهو ليس جزءاً من RAM ولا يمكن قراءته بالبرنامج. إذا تداخلت 9 استدعاءات، كُتب الاستدعاء التاسع فوق الأول (المكدس دائري)، فيرجع البرنامج إلى عنوان خاطئ دون أي إنذار.
مثال محلول: لماذا 14 بتاً؟
التعليمة MOVLW k تشحن ثابتاً k من 8 بتات في W. ترميزها في وثيقة الصانع هو $\mathrm{11\,00xx\,kkkk\,kkkk}$: ستة بتات لرمز العملية وثمانية بتات للثابت (البتان x غير مهمين ويكتبهما المجمع 0).
- التعليمة MOVLW 0x0A ترمَّز إذن $11\,0000\,0000\,1010_{(2)}$، أي 300Ah؛
- لو كانت ذاكرة البرنامج على 8 بتات لاحتاجت هذه التعليمة كلمتين، أي دورتي جلب.
حساب السعات:
- ذاكرة البرنامج: $1024 \times 14 = 14336$ بتاً؛
- ذاكرة المستعمل RAM: $68 \times 8 = 544$ بتاً؛
- ذاكرة EEPROM: $64 \times 8 = 512$ بتاً.
عداد البرنامج على 13 بتاً يستطيع عنونة $2^{13} = 8192$ كلمة، لكن 10 بتات تكفي للكلمات 1024 الموجودة ($2^{10} = 1024$)، فالعناوين من 0400h إلى 1FFFh غير منجزة.
أخطاء شائعة
- الظن أن البرنامج يُحفظ في EEPROM: البرنامج في Flash، والذاكرة EEPROM للمعطيات.
- اعتبار W سجلاً من RAM له عنوان: W سجل داخلي لا يظهر في خريطة الذاكرة.
- الخلط بين عرض ناقل البرنامج (14 بتاً) وعرض ناقل المعطيات (8 بتات).
- استدعاء برامج فرعية متداخلة أكثر من 8 مستويات.
4. تنظيم الذاكرة: ذاكرة البرنامج والذاكرة RAM والذاكرة EEPROM
ذاكرة البرنامج
ذاكرة البرنامج من نوع Flash، سعتها 1024 كلمة من 14 بتاً، وعناوينها من 0000h إلى 03FFh.

يبيّن الشكل عداد البرنامج `PC` والمكدس بمستوياته الثمانية، ثم ذاكرة البرنامج بعنوانين محجوزين: شعاع إعادة التهيئة 0000h وشعاع المقاطعة 0004h، ثم مجال المستعمل حتى 03FFh، والمجال غير المنجز من 0400h إلى 1FFFh.
- شعاع إعادة التهيئة (0000h): بعد كل إعادة تهيئة يبدأ التنفيذ من هنا؛
- شعاع المقاطعة (0004h): عند كل مقاطعة يقفز البرنامج إلى هنا.
لذلك يبدأ البرنامج عادة بالتوجيه `ORG 0x00` متبوعاً بقفزة `GOTO` نحو البرنامج الحقيقي، حتى لا يُكتب فوق شعاع المقاطعة.
ذاكرة المعطيات RAM وسجلاتها
الذاكرة RAM مقسمة إلى بنكين (banque 0 وbanque 1)، في كل بنك 128 عنواناً:
- العناوين من 00h إلى 0Bh في البنك 0 (ومن 80h إلى 8Bh في البنك 1) هي السجلات الخاصة (SFR) التي تتحكم في الميكرومراقب؛
- العناوين من 0Ch إلى 4Fh هي 68 سجلاً عاماً (GPR) نضع فيها متغيرات البرنامج؛ والعناوين من 8Ch إلى CFh في البنك 1 تؤدي إلى السجلات نفسها.

يبيّن الشكل خريطة البنكين: بالأزرق السجلات الموجودة في البنكين معاً (STATUS وINTCON وPCL وFSR وPCLATH وINDF)، وبالأصفر السجلات الموجودة في البنك 1 فقط (OPTION_REG وTRISA وTRISB وEECON1 وEECON2)، وبالأخضر السجلات العامة.
لماذا البنوك؟
التعليمة التي تتعامل مع سجل تحمل عنوانه على 7 بتات فقط، أي 128 عنواناً. البت الثامن من العنوان هو البت RP0 (البت 5 من السجل STATUS):
| السجل | العنوان | بالثنائي | RP0 | العنوان في التعليمة | |---|---|---|---|---| | PORTA | 05h | $0000\,0101$ | 0 | 05h | | TRISA | 85h | $1000\,0101$ | 1 | 05h | | TMR0 | 01h | $0000\,0001$ | 0 | 01h | | OPTION_REG | 81h | $1000\,0001$ | 1 | 01h |
> TRISA وPORTA لهما نفس العنوان ذي 7 بتات (05h): البت RP0 وحده يقرر أيهما يُكتب. للوصول إلى TRISA وTRISB وOPTION_REG يجب وضع $\mathrm{RP0} = 1$ أولاً.
أما السجلات STATUS وINTCON وPCL وFSR وPCLATH والسجلات العامة فنصل إليها من البنكين دون تغيير RP0.
تعريف المتغيرات
نعطي اسماً لكل سجل عام نستعمله بالتوجيه EQU:
عدد السجلات العامة: من 0Ch إلى 4Fh يوجد $\mathrm{4Fh} - \mathrm{0Ch} + 1 = \mathrm{44h} = 68$ سجلاً. العناوين من 50h إلى 7Fh غير منجزة: الكتابة فيها لا تحفظ شيئاً، وقراءتها تعطي 0.
الذاكرة EEPROM
سعتها 64 بايتاً (العناوين 00h إلى 3Fh)، تحفظ المعطيات بعد قطع التغذية. لا تظهر في خريطة RAM، بل نصل إليها بطريقة غير مباشرة عبر السجلات EEADR (العنوان) وEEDATA (المعطى) وEECON1 وEECON2 (التحكم). مثال الاستعمال: حفظ عدد القطع المنتجة في اليوم حتى لا يضيع عند انقطاع التيار.
| الذاكرة | النوع | السعة | تحفظ عند قطع التغذية؟ | |---|---|---|---| | البرنامج | Flash | 1024 × 14 بت | نعم | | السجلات العامة | RAM | 68 × 8 بت | لا | | المعطيات | EEPROM | 64 × 8 بت | نعم |
مثال محلول
حدّد لكل سجل البنك الذي يوجد فيه وقيمة RP0 اللازمة: PORTB، TRISB، INTCON، متغير في العنوان 2Ah.
- PORTB في 06h: البنك 0، فنضع $\mathrm{RP0} = 0$؛
- TRISB في 86h: البنك 1، فنضع $\mathrm{RP0} = 1$؛
- INTCON في 0Bh و8Bh: في البنكين، فلا يهم RP0؛
- المتغير 2Ah: سجل عام بين 0Ch و4Fh، يظهر في البنكين (2Ah وAAh)، فلا يهم RP0.
أخطاء شائعة
- استعمال 36 سجلاً عاماً (من 0Ch إلى 2Fh) كما في الدارة القديمة PIC16F84: في PIC16F84A يوجد 68 سجلاً حتى 4Fh.
- تعريف متغير في العنوان 50h أو أكثر: هذه العناوين غير منجزة.
- كتابة OPTION_REG والبنك 0 مختار: تُكتب القيمة في TMR0 (01h).
- الخلط بين عنوان في EEPROM وعنوان في RAM.
5. السجلات الأساسية: W وSTATUS وTRISx وPORTx
سجل العمل W
سجل العمل W (registre de travail) سجل من 8 بتات داخل الوحدة الحسابية والمنطقية، ليس له عنوان في الذاكرة RAM. كل ثابت يُكتب في سجل يمر عبره: `MOVLW` تشحن الثابت في W، ثم `MOVWF` تنقله إلى السجل.
سجل الحالة STATUS
السجل STATUS (العنوان 03h، ويظهر أيضاً في 83h) يحمل أعلام نتيجة آخر عملية، وبت اختيار البنك.

يبيّن الشكل البتات الثمانية من البت 7 على اليسار إلى البت 0 على اليمين: البتان IRP وRP1 غير مستعملين، وRP0 لاختيار البنك، و$\overline{\mathrm{TO}}$ و$\overline{\mathrm{PD}}$ للقراءة فقط، وZ وDC وC أعلام الوحدة الحسابية.
| البت | الاسم | الدور | |---|---|---| | 7 | IRP | غير مستعمل في PIC16F84A، يُترك على 0 | | 6 | RP1 | غير مستعمل، يُترك على 0 | | 5 | RP0 | اختيار البنك: 0 للبنك 0، و1 للبنك 1 | | 4 | $\overline{\mathrm{TO}}$ | يصير 0 عند انقضاء مؤقت الحراسة (قراءة فقط) | | 3 | $\overline{\mathrm{PD}}$ | يصير 0 بعد تنفيذ التعليمة SLEEP (قراءة فقط) | | 2 | Z | يصير 1 إذا كانت نتيجة العملية صفراً | | 1 | DC | حمل من البت 3 نحو البت 4 (نصف البايت) | | 0 | C | حمل من البت 7 (فيضان)؛ في الطرح يساوي 1 إذا لم يحدث استلاف |
تغيير البنك:
مثالان للأعلام:
- المتغير Count يحتوي 1، والتعليمة `DECF Count,F` تجعله 0، فيصير $Z = 1$؛
- W يحتوي 200 والسجل يحتوي 100: المجموع 300 أكبر من 255، فيُحفظ $300 - 256 = 44$ (أي 2Ch) ويصير $C = 1$ و$Z = 0$.
سجلا الاتجاه TRISA وTRISB
لكل خط من المنفذ بت في سجل الاتجاه (TRIS من tri-state):
> البت 1 يجعل الخط مدخلاً (Input)، والبت 0 يجعله مخرجاً (Output). للحفظ: 1 يشبه الحرف I، و0 يشبه الحرف O.
- TRISB (86h): 8 بتات، البت 0 يخص RB0 والبت 7 يخص RB7؛
- TRISA (85h): 5 بتات مفيدة فقط (من البت 0 لـRA0 إلى البت 4 لـRA4)، والبتات 7 و6 و5 غير منجزة وتُقرأ 0؛
- السجلان في البنك 1، وبعد إعادة التهيئة كل بتاتهما على 1.
سجلا المعطيات PORTA وPORTB
PORTA (05h) وPORTB (06h) في البنك 0. الكتابة فيهما تضع المستويات على الخطوط المبرمجة مخارج، وقراءتهما تعطي المستويات الموجودة على الأرجل.
دارات الواجهة

يبيّن الشكل ثلاث دارات نموذجية:
- مدخل: الزر BP بين +5 V والرجل RB0، ومقاومة 10 kΩ نحو الأرضي: الزر محرر يعطي 0، والزر مضغوط يعطي 1؛
- مخرج نحو ثنائية: RA2 عبر مقاومة 330 Ω: الثنائية تشتعل عندما $\mathrm{RA2} = 1$؛
- مخرج نحو مرحل: RB7 عبر مقاومة 4,7 kΩ نحو قاعدة المقحل T (2N2222)، والوشيعة KA للمرحل بين +12 V والمجمّع، والثنائية D على التفرع مع الوشيعة لحماية المقحل من فرط التوتر عند القطع. تيار القاعدة $I_B \approx (5 - 0{,}7)/4700 \approx 0{,}9\ mA$ يكفي لإشباع المقحل مع مرحل صغير.
يمكن أيضاً وصل الزر بين الرجل والأرضي دون مقاومة خارجية، بتفعيل مقاومات السحب الداخلية للمنفذ B (البت $\overline{\mathrm{RBPU}}$ من OPTION_REG على 0، انظر الجزء 6). عندئذ الزر المضغوط يعطي 0.
طريقة ملء TRISA وTRISB
- نحدد لكل خط ما يتصل به: ملتقط أو زر يعني مدخلاً (1)، ومقحل أو ثنائية يعني مخرجاً (0)؛
- الخطوط غير المستعملة نبرمجها كما يطلب الموضوع (غالباً مداخل، أي 1)؛
- نكتب البتات من البت 7 إلى البت 0، أي RB0 هو البت الأيمن؛
- نحوّل إلى الست عشري بتجميع البتات أربعة أربعة.
مثال محلول
نظام: المداخل على RA0 وRA2 وRA3 وRA4 ومن RB0 إلى RB5، والمخارج على RA1 وRB6 وRB7.
| البت | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |---|---|---|---|---|---|---|---|---| | TRISB | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | | TRISA | — | — | — | 1 | 1 | 1 | 0 | 1 |
فيكون $\mathrm{TRISB} = 0011\,1111_{(2)} = \mathrm{0x3F}$ و$\mathrm{TRISA} = 1\,1101_{(2)} = \mathrm{0x1D}$ (البتات غير المنجزة تُكتب 0).
نكتب القيم الابتدائية في PORTA وPORTB قبل تحويل الخطوط إلى مخارج، حتى لا يُشغَّل أي مرحل لحظة التهيئة.
أخطاء شائعة
- قلب القاعدة: كتابة 1 لمخرج و0 لمدخل.
- نسيان `BSF STATUS,RP0` قبل كتابة TRISx: تُكتب القيمة في PORTx.
- نسيان `BCF STATUS,RP0` بعد التهيئة: كل كتابة لاحقة في PORTB تذهب إلى TRISB.
- قراءة الثنائي من الجهة الخطأ: RB0 هو البت الأيمن.
- اعتبار البتات Z وDC وC للقراءة فقط: يمكن كتابتها، والقراءة فقط تخص $\overline{\mathrm{TO}}$ و$\overline{\mathrm{PD}}$.
6. سجلات المؤقت والمقاطعات: OPTION_REG وINTCON وTMR0
المؤقت TMR0
TMR0 (العنوان 01h) عداد تصاعدي على 8 بتات: يعدّ من 00h إلى FFh، ثم يفيض فيرجع إلى 00h ويضع العلم T0IF (البت 2 من INTCON) في 1. له 256 حالة، ويمكن قراءته والكتابة فيه في أي وقت. يعمل بنمطين:
- مؤقت (timer): يعدّ دورات الآلة الداخلية $F_{osc}/4$، فيقيس زمناً؛
- عداد (compteur): يعدّ نبضات خارجية تصل على الرجل RA4/T0CKI.

يبيّن الشكل مسار الإشارة: المبدّل T0CS يختار الساعة الداخلية $F_{osc}/4$ (0) أو الرجل RA4/T0CKI (1) بعد البوابة XOR التي يختار بها T0SE الجبهة، ثم يختار المبدّل PSA المرور بقاسم التردد (0) أو تجاوزه (1)، ثم تُزامن الإشارة وتدخل TMR0، وعند الفيضان يصير $\mathrm{T0IF} = 1$.
السجل OPTION_REG
OPTION_REG (العنوان 81h، في البنك 1) يضبط TMR0 والمقاطعة الخارجية ومقاومات السحب. بعد إعادة التهيئة يساوي FFh.

يبيّن الشكل بتات السجلين، أربعة في كل صف: البتات 7 إلى 4 في الصف الأول والبتات 3 إلى 0 في الثاني، مع دور مختصر تحت كل اسم.
| البت | الاسم | القيمة 1 | القيمة 0 | |---|---|---|---| | 7 | $\overline{\mathrm{RBPU}}$ | مقاومات السحب الداخلية للمنفذ B معطلة | مفعّلة | | 6 | INTEDG | مقاطعة RB0/INT على الجبهة الصاعدة | على الجبهة النازلة | | 5 | T0CS | TMR0 يعدّ نبضات الرجل RA4/T0CKI | يعدّ دورات الآلة الداخلية | | 4 | T0SE | العدّ على الجبهة النازلة لـRA4/T0CKI | على الجبهة الصاعدة | | 3 | PSA | قاسم التردد مسند إلى مؤقت الحراسة WDT | مسند إلى TMR0 | | 2 و1 و0 | PS2 وPS1 وPS0 | نسبة قاسم التردد (الجدول الموالي) | — |
قاسم التردد (prédiviseur): الأزمنة في العمود الأخير لبلور 4 MHz ($T_{cy} = 1\ \mu s$) وTMR0 ينطلق من 0:
| PS2 PS1 PS0 | نسبة TMR0 | نسبة WDT | زمن فيضان TMR0 | |---|---|---|---| | 000 | 1:2 | 1:1 | 512 µs | | 001 | 1:4 | 1:2 | 1024 µs | | 010 | 1:8 | 1:4 | 2048 µs | | 011 | 1:16 | 1:8 | 4096 µs | | 100 | 1:32 | 1:16 | 8192 µs | | 101 | 1:64 | 1:32 | 16384 µs | | 110 | 1:128 | 1:64 | 32768 µs | | 111 | 1:256 | 1:128 | 65536 µs |
> أصغر نسبة لـTMR0 مع القاسم هي 1:2. لكي يعدّ TMR0 كل نبضة (نسبة 1:1) نسند القاسم إلى WDT بوضع $\mathrm{PSA} = 1$.
السجل INTCON
INTCON (العنوان 0Bh، ويظهر في 8Bh، أي في البنكين) يحمل بتات تفعيل المقاطعات وأعلامها:
| البت | الاسم | الدور | |---|---|---| | 7 | GIE | التفعيل العام لكل المقاطعات | | 6 | EEIE | تفعيل مقاطعة نهاية الكتابة في EEPROM | | 5 | T0IE | تفعيل مقاطعة فيضان TMR0 | | 4 | INTE | تفعيل المقاطعة الخارجية RB0/INT | | 3 | RBIE | تفعيل مقاطعة تغيّر حالة RB4 إلى RB7 | | 2 | T0IF | علم فيضان TMR0 | | 1 | INTF | علم المقاطعة RB0/INT | | 0 | RBIF | علم تغيّر حالة RB4 إلى RB7 |
الأعلام تصير 1 حتى لو كانت المقاطعات معطلة، فيمكن اختبارها في حلقة؛ والبرنامج هو الذي يمسحها: `BCF INTCON,T0IF`.
زمن الفيضان
$ t = T_{cy} \times K \times (256 - N_0) $
حيث K نسبة القاسم (و$K = 1$ إذا كان $\mathrm{PSA} = 1$)، و$N_0$ القيمة الابتدائية المشحونة في TMR0. لعدة فيضانات نضرب في عددها n. هذه العلاقة تقريبية: تهمل تعليمات الحلقة والدورتين اللتين يتوقف فيهما TMR0 بعد كل كتابة فيه.
أمثلة محلولة
مثال 1 (فيضان كامل): بلور 4 MHz، $\mathrm{PS} = 111$، $N_0 = 0$: $t = 1 \times 256 \times 256 = 65536\ \mu s \approx 65{,}5\ ms$.
مثال 2 (ساعة خارجية): TMR0 يعدّ نبضات تصل على RA4/T0CKI على الجبهة الصاعدة، بقاسم 1:128، ومقاومات السحب معطلة، وINTEDG غير مستعمل (0):
| $\overline{\mathrm{RBPU}}$ | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 | |---|---|---|---|---|---|---|---| | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
فيكون $\mathrm{OPTION\_REG} = 1010\,0110_{(2)} = \mathrm{0xA6}$. حسب وثيقة الصانع $\mathrm{T0SE} = 0$ للجبهة الصاعدة و$\mathrm{T0SE} = 1$ للجبهة النازلة. بعض مواضيع البكالوريا أرفقت ملحقاً يعكس هذا المعنى (1 للصاعدة)، فيصير الجواب وفق ذلك الملحق $1011\,0110_{(2)} = \mathrm{0xB6}$: في الامتحان نتبع دائماً الملحق المرفق بالموضوع.
مثال 3 (قاعدة زمن 4 ms ثم ثانية واحدة): بلور 4 MHz، قاسم 1:32، و125 نبضة في كل فيضان:
- $N_0 = 256 - 125 = 131$، أي 0x83؛
- $t = 1 \times 32 \times 125 = 4000\ \mu s = 4\ ms$؛
- لثانية واحدة: $1\ s / 4\ ms = 250$ فيضاناً؛
- $\mathrm{OPTION\_REG} = 1000\,0100_{(2)} = \mathrm{0x84}$ (ساعة داخلية، القاسم لـTMR0، $\mathrm{PS} = 100$).
مؤقت الحراسة WDT
مؤقت الحراسة (chien de garde) مذبذب داخلي مستقل، مدته الاسمية حوالي 18 ms. إذا كان مفعّلاً ولم ينفذ البرنامج التعليمة CLRWDT قبل انقضائه، يعيد تهيئة الميكرومراقب. عند $\mathrm{PSA} = 1$ يطيل القاسم مدته حتى النسبة 1:128، أي حوالي 2,3 s.
أخطاء شائعة
- اعتبار $\mathrm{PS} = 000$ نسبة 1:1: هي 1:2 لـTMR0.
- نسيان أن $\overline{\mathrm{RBPU}}$ نشط بـ0: البت 1 يعطّل مقاومات السحب.
- كتابة OPTION_REG في البنك 0: القيمة تذهب إلى TMR0.
- انتظار أن يمسح الميكرومراقب T0IF وحده.
- عدّ 255 بدل 256 في الفيضان الكامل.
7. كلمة التهيئة (Configuration Word)
ما هي كلمة التهيئة؟
كلمة التهيئة (mot de configuration) كلمة من 14 بتاً في العنوان 2007h، خارج مجال البرنامج. لا يكتبها البرنامج أثناء التشغيل، بل يكتبها جهاز البرمجة مع البرنامج. تحدد العتاد قبل أن يبدأ التنفيذ: نمط المذبذب، ومؤقت الحراسة، ومؤقت التشغيل، وحماية الشفرة.
نكتبها في ملف البرنامج بالتوجيه `CONFIG` (بشرطتين سفليتين)، بعد التوجيه `#include` لأن الرموز معرّفة في الملف المُدرج:
بتات كلمة التهيئة
| البتات | الاسم | القيمة 1 | القيمة 0 | |---|---|---|---| | 13 إلى 4 | CP | حماية الشفرة معطلة | كل ذاكرة البرنامج محمية من القراءة | | 3 | $\overline{\mathrm{PWRTE}}$ | مؤقت التشغيل معطل | مؤقت التشغيل مفعّل (حوالي 72 ms) | | 2 | WDTE | مؤقت الحراسة مفعّل | مؤقت الحراسة معطل | | 1 و0 | FOSC1 وFOSC0 | انظر الجدول الموالي | — |
| FOSC1 FOSC0 | النمط | |---|---| | 00 | LP | | 01 | XT | | 10 | HS | | 11 | RC |
> انتبه: $\overline{\mathrm{PWRTE}}$ نشط بالمستوى المنخفض (0 يفعّل)، بينما WDTE نشط بالمستوى العالي (1 يفعّل).
الرموز المعرّفة في الملف p16F84A.inc
كل رمز كلمة من 14 بتاً كل بتاتها 1 ما عدا الحقل الذي يخصه، والمؤثر `&` يجري عملية AND بتاً ببت:
| الرمز | القيمة | الرمز | القيمة | |---|---|---|---| | `_CP_ON` | 000Fh | `_CP_OFF` | 3FFFh | | `_PWRTE_ON` | 3FF7h | `_PWRTE_OFF` | 3FFFh | | `_WDT_ON` | 3FFFh | `_WDT_OFF` | 3FFBh | | `_LP_OSC` | 3FFCh | `_XT_OSC` | 3FFDh | | `_HS_OSC` | 3FFEh | `_RC_OSC` | 3FFFh |
أمثلة محلولة
مثال 1: `_CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC`.
- البتات 13 إلى 4 (CP) كلها 1؛
- $\overline{\mathrm{PWRTE}} = 0$ (مفعّل)، و$\mathrm{WDTE} = 0$ (معطل)، و$\mathrm{FOSC} = 01$ (XT)؛
- الكلمة: $11\,1111\,1111\,0001_{(2)}$، أي 3FF1h.
للتحقق يكفي الحساب على الرقم الأخير: F وB و7 وD بالثنائي هي 1111 و1011 و0111 و1101، وجداؤها المنطقي 0001، أي 1.
مثال 2 (العكس): في موضوع، كلمة التهيئة 3FF9h. ما الإعدادات؟
- 3FF9h هي $11\,1111\,1111\,1001_{(2)}$؛
- CP كلها 1: الحماية معطلة؛
- البت 3 يساوي 1: مؤقت التشغيل معطل؛
- البت 2 يساوي 0: مؤقت الحراسة معطل؛
- البتان 1 و0 يساويان 01: النمط XT.
السطر هو `CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC`.
مثال 3: بلور 20 MHz، دون حراسة، مع مؤقت التشغيل، دون حماية: الرقم الأخير 0010، فالكلمة 3FF2h.
لماذا هذه الاختيارات في التمارين؟
- مؤقت الحراسة معطل: إذا فُعّل دون أن ينفذ البرنامج CLRWDT بانتظام، يعيد تهيئة الميكرومراقب كل حوالي 18 ms (أو أكثر حسب القاسم)، فيبدو البرنامج كأنه «يتجمد ويعيد الانطلاق».
- مؤقت التشغيل مفعّل: ينتظر حوالي 72 ms عند وصل التغذية حتى تستقر، قبل بدء التنفيذ.
- الحماية معطلة: يمكن قراءة البرنامج والتحقق منه؛ نفعّلها في المنتوج النهائي لحماية الشفرة.
أخطاء شائعة
- كتابة `_CONFIG` بشرطة واحدة: الصحيح `CONFIG`.
- وضع `CONFIG` قبل `#include`: الرموز لم تُعرّف بعد.
- اعتبار $\mathrm{PWRTE} = 1$ تفعيلاً: البت نشط بـ0.
- الخلط بين ترتيب البتات: FOSC في البتين 1 و0 (الأدنى).
- اختيار `_XT_OSC` مع بلور 20 MHz: الصحيح `_HS_OSC`.
8. تمارين محلولة بنمط البكالوريا
التمرين 1: باب مرآب آلي
دفتر الشروط: باب مرآب يتحكم فيه ميكرومراقب PIC16F84A ببلور 4 MHz. الضغط على dcy (جهاز التحكم عن بعد) والباب مغلق يفتح الباب (المرحل KA1 يغذي الملامس KM1 للمحرك) حتى الملتقط fh (الباب مفتوح). بعد مهلة يُغلق الباب (المرحل KA2 للملامس KM2) حتى الملتقط fb (الباب مغلق). مصباح الإشارة H يومض أثناء الحركة، والحاجز الضوئي b يوقف الإغلاق إذا قطع جسمٌ الحزمة. كل مدخل يعطي 1 عندما يكون نشطاً، وكل مخرج يغذي مرحله عبر مقحل (كما في الجزء 5).

يبيّن الشكل المداخل dcy وfh وfb وb على RA0 وRA1 وRA2 وRA3، والمخارج نحو KA1 وKA2 وH على RB4 وRB5 وRB6، والمقاومة R1 على $\overline{\mathrm{MCLR}}$، والبلور Q مع المكثفين C1 وC2.
الأسئلة:
- ما دور العناصر Q وC1 وC2، ودور المقاومة R1؟
- احسب مدة دورة الآلة.
- حدّد المداخل والمخارج، ثم املأ TRISA وTRISB بالثنائي وبالست عشري (الخطوط غير المستعملة تُبرمج مداخل).
- اكتب برنامج التهيئة، مع إطفاء كل المخارج عند الانطلاق.
- في أي بنك توجد TRISA وTRISB وPORTB؟ وما دور البت RP0؟
- اكتب سطر كلمة التهيئة (دون حماية، دون حراسة، مع مؤقت التشغيل) وقيمتها.
الحل:
- البلور Q (4 MHz) مع C1 وC2 (22 pF مثلاً) يكوّنون المذبذب في النمط XT، وهو قاعدة الزمن التي تولّد إشارة الساعة. المقاومة R1 تبقي $\overline{\mathrm{MCLR}}$ في المستوى 1 (المدخل نشط بـ0)، فيعمل البرنامج.
- $T_{cy} = 4/f_{osc} = 4/(4 \times 10^{6}) = 1\ \mu s$.
- المداخل: RA0 وRA1 وRA2 وRA3، وRA4 غير مستعمل فهو مدخل. المخارج: RB4 وRB5 وRB6؛ والخطوط RB0 إلى RB3 وRB7 غير مستعملة فهي مداخل.
| البت | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |---|---|---|---|---|---|---|---|---| | TRISA | — | — | — | 1 | 1 | 1 | 1 | 1 | | TRISB | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
$\mathrm{TRISA} = 1\,1111_{(2)} = \mathrm{0x1F}$ و$\mathrm{TRISB} = 1000\,1111_{(2)} = \mathrm{0x8F}$.
- برنامج التهيئة:
- TRISA (85h) وTRISB (86h) في البنك 1، وPORTB (06h) في البنك 0. البت RP0 (البت 5 من STATUS) يختار البنك: $\mathrm{RP0} = 1$ للبنك 1، و$\mathrm{RP0} = 0$ للبنك 0.
- `CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC`، وقيمتها 3FF1h.
التمرين 2: محطة عدّ القارورات
دفتر الشروط: على بساط ناقل، تمر القارورات أمام خلية ضوئية تعطي نبضة لكل قارورة، موصولة بالرجل RA4/T0CKI. القارورة تُعدّ على الجبهة النازلة للنبضة. بعد 12 قارورة يكون الصندوق ممتلئاً، فيُستبدل. البلور 4 MHz، ومقاومات السحب للمنفذ B غير مستعملة.
الأسئلة:
- ما الخط الذي يستقبل إشارة الخلية؟ وما قيمة بته في TRISA؟
- أعط قيمة OPTION_REG ليعدّ TMR0 كل جبهة نازلة دون قاسم ($\mathrm{INTEDG} = 0$ و$\mathrm{PS} = 000$).
- ما القيمة الابتدائية لـTMR0 حتى يحدث الفيضان بعد 12 قارورة بالضبط؟
- أي بت يعلن امتلاء الصندوق؟ وكيف نعيد تسليح العدّ لصندوق جديد؟
- في نسخة ثانية يُستعمل TMR0 مؤقتاً لإيقاف البساط ثانية واحدة بعد كل صندوق: ساعة داخلية، قاسم 1:32، و$N_0 = 131$. أعط OPTION_REG، وزمن الفيضان، وعدد الفيضانات اللازمة.
الحل:
- الخط RA4 (الرجل 3)، وهو مدخل: البت 4 من TRISA يساوي 1.
- $\overline{\mathrm{RBPU}} = 1$، $\mathrm{INTEDG} = 0$، $\mathrm{T0CS} = 1$ (ساعة خارجية)، $\mathrm{T0SE} = 1$ (جبهة نازلة)، $\mathrm{PSA} = 1$ (القاسم لـWDT فيعدّ TMR0 بنسبة 1:1)، و$\mathrm{PS} = 000$: $\mathrm{OPTION\_REG} = 1011\,1000_{(2)} = \mathrm{0xB8}$.
- يحدث الفيضان بعد $256 - N_0$ نبضة: $256 - N_0 = 12$ ومنه $N_0 = 244$، أي 0xF4.
- العلم T0IF (البت 2 من INTCON) يصير 1 عند الفيضان. لإعادة التسليح: نشحن 244 من جديد في TMR0، ونمسح T0IF.
- $\mathrm{OPTION\_REG} = 1000\,0100_{(2)} = \mathrm{0x84}$ ($\mathrm{T0CS} = 0$، $\mathrm{PSA} = 0$، $\mathrm{PS} = 100$). زمن الفيضان: $t = 1 \times 32 \times (256 - 131) = 4000\ \mu s = 4\ ms$. عدد الفيضانات: $1\ s / 4\ ms = 250$.
التمرين 3: تصحيح برنامج تهيئة
دفتر الشروط: ثنائية ضوئية على RB0 (مخرج)، وأربعة أزرار على RB4 إلى RB7 موصولة نحو الأرضي (تحتاج مقاومات السحب الداخلية)، وRB1 إلى RB3 غير مستعملة (مداخل). TMR0 بالساعة الداخلية وقاسم 1:256. مؤقت الحراسة معطل. كتب تلميذ البرنامج التالي:
السؤال: في هذا البرنامج سبعة أخطاء. استخرجها وصحّحها.
الحل:
- التوجيه مكتوب `_CONFIG` بشرطة واحدة: الصحيح `CONFIG` بشرطتين.
- التوجيه موضوع قبل `#include`: يجب أن يأتي بعده، لأن الرموز `_CP_OFF` و`_XT_OSC` وغيرها معرّفة في الملف المُدرج.
- `_WDT_ON` يناقض دفتر الشروط ويعيد تهيئة الدارة دورياً: الصحيح `_WDT_OFF`.
- `MOVWF OPTION_REG` نُفذت في البنك 0، فكُتبت القيمة في TMR0: يجب نقلها بعد `BSF STATUS,RP0`.
- 0xF0 تجعل RB0 إلى RB3 مخارج وRB4 إلى RB7 مداخل، والمطلوب RB0 وحده مخرجاً: $\mathrm{TRISB} = 1111\,1110_{(2)} = \mathrm{0xFE}$.
- التعليمة `BCF STATUS,RP0` ناقصة قبل `BSF PORTB,0`: البنك 1 ما زال مختاراً، فتكتب التعليمة 1 في البت 0 من TRISB ويصير RB0 مدخلاً، فلا تشتعل الثنائية.
- لا يوجد التوجيه `END` ولا حلقة نهائية، فيواصل الميكرومراقب تنفيذ ما بعد البرنامج.
أما القيمة 0x07 نفسها فليست خطأً: $0000\,0111_{(2)}$ تعطي $\overline{\mathrm{RBPU}} = 0$ (مقاومات السحب مفعّلة للأزرار)، و$\mathrm{T0CS} = 0$ (ساعة داخلية)، و$\mathrm{PSA} = 0$، و$\mathrm{PS} = 111$ (1:256)، كما يطلب دفتر الشروط؛ الخطأ في موضع كتابتها فقط.
البرنامج المصحح:
هذا البرنامج لا يستعمل المقاطعات، فيمكن أن يبدأ مباشرة من العنوان 0x00 دون القفز فوق شعاع المقاطعة 0004h.
ملاحظة للامتحان
- في كل سؤال TRIS: ارسم جدول البتات من 7 إلى 0 قبل التحويل إلى الست عشري، واحترم تعليمة الموضوع في الخطوط غير المستعملة.
- كل وصول إلى TRISA أو TRISB أو OPTION_REG محاط بـ`BSF STATUS,RP0` و`BCF STATUS,RP0`.
- في OPTION_REG وكلمة التهيئة تذكّر البتات النشطة بـ0: $\overline{\mathrm{RBPU}}$ و$\overline{\mathrm{PWRTE}}$.
- اكتب الوحدة والعلاقة في كل حساب زمني: $T_{cy} = 4/f_{osc}$ ثم $t = T_{cy} \times K \times (256 - N_0)$.
الجزء الأول من الدرس مفتوح للجميع، وبقيته مع الاشتراك.