تعتبر المتحكمات الصغرية أو الـ Microcontrollers من أهم المحاور التي
يدور حولها اهتمام العاملين في مجال التقنيات الإلكترونية بمختلف فروعها
واختصاصاتها فضلا عن الهواة والطلاب، لكنها في نفس الوقت تمثل حجر العثرة
أمام المبتدئين رغم كل الكتب والمقالات التقنية التي تقدمها الشركات
المصنعة لهذه (الكائنات) إلى جانب تدريسها في الجامعات والمعاهد، وستكون
هذه السلسلة من المقالات إضافة أخرى للمواد التعليمية الموجهة للمبتدئين،
وباللغة العربية، وبالرغم من كل الظروف ومن الشح الذي نعاني منه في المواد
العلمية باللغة العربية، سأحاول في هذه السلسلة أن أبسط المفاهيم وأدفع
القارئ الكريم إلى عمق هذه التقنية بأسرع وقت وبأقل جهد، ودون الانشغال
بتفاصيل قد تعقد الموضوع بلا فائدة تذكر، وأبشركم من الآن، لن تروا مخططا
للذاكرة أو شرحا لنواة المتحكم أو حتى شيئا من لغة التجميع قبل أن تتمكنوا
من تشغيل المتحكم وبرمجته واستخدامه في تطبيقات أظنها لا تخطر على بالكم
الآن... فأهلا بالجميع..
هذه بعض الأسئلة قد تخطر ببال أي قارئ، ولتلطيف الأجواء قليلا قبل المعمعة القادمة، أنصح بتحضير كوب من الشاي:
قارئ : متحكمات.. متحكمات.. ما القضية ؟؟ ما هي المتحكمات ؟؟ ولماذا تملك هذا القدر الكبير من الشهرة ؟؟ هل تستحق ذلك بالفعل ؟؟
الكاتب : المتحكم يا سيدي عبارة عن حاسوب صغير، فكلمة
Micro تدل على حجمه الصغير الذي لا يتجاوز في بعض الأحيان حجم طرف الإصبع، و
controller تدل على مجال استخدامه، ألا وهو التحكم، وبأي شيء يخطر
ببالـ.....ك
قارئ (مقاطعا) : يا رجل ! حاسوب ؟ و يتحكم بأي شيء ؟ وبهذا الحجم ؟ ظننت أن هذه مجلة علمية... وداعا
الكاتب : على رسلك يا عزيزي، ألم تسأل عن سبب شهرتها ؟
المتحكمات الصغرية بهذه الميزات أحدثت تحولا كبيرا في الصناعة
الإلكترونية، وأهم ما فعلته هو تبسيط التصميم بتقليل العناصر المستخدمة،
وبالتالي تخفيض ملحوظ في التكلفة إلى جانب تقليل الاستهلاك في الطاقة، وهو
ما فتح الباب أمام هذه التطورات المذهلة في الأجهزة المحمولة بمختلف
وظائفها، ولن أسهب كثيرا في سرد إنجازاتها لأن هدف هذه المقالة هو الأخذ
بيد القارئ المبتدئ نحو دخول هذا العالم،واستخدام هذه الوحوش الصغيرة في
عمله..
قارئ : معقول ؟ هل من الممكن تعلم استخدام هذه التقنيات بمجرد قراءة مقالة في مجلة ؟
الكاتب : نعم كل شيء ممكن، وكما تراه مكتوبا في
الأعلى، هذه السلسة تهدف لتبسيط المفاهيم، و الدخول مباشرة إلى العمق دون
الانشغال بمعارك جانبية، فهل ستتركني لأكمل الدرس أم ماذا ؟
قارئ : تفضل، أرنا ما لديك...
الكاتب : أرجو من الجميع التزام الصمت وإغلاق أجهزة الجوال.. فقد بدأ الدرس الأول..
النظم المؤتمتة:يتلخص مفهوم أتمتة أي نظام بأنه استبدال التدخل البشري في النظام جزئيا
أو كليا بتجهيزات وأنظمة إلكترونية لاسيما عندما تكون الدقة والسرعة غايتين
أساسيتين. لا بد لأي نظام مؤتمت من عقل مدبر بديل عن التدخل البشري وهو
ضيفنا في هذه السلسلة... المتحكم الصغري..
المتحكمات والمعالجات:يختلف المتحكم الصغري Microcontroller عن المعالج الصغري Microprocessor
بأن هذا الأخير مجرد عنصر ضمن منظومة المتحكم الصغري، والذي يمتلك بدوره
معالجا صغريا، ذاكرة للبرنامج وأخرى للمعطيات، بوابات إدخال \ إخراج،
مؤقتات، عدادات، مولد نبضات الساعة، والكثير من العناصر الأخرى، لذلك
فالمتحكم الصغري جاهز لوحده تقريبا ليكون نواة لأي نظام مؤتمت، بينما يحتاج
المعالج الصغري إلى الكثير من العناصر إلى جانبه ليؤدي عمله، لذلك
فالأنظمة التي تعتمد على المعالجات الصغرية تعد مرتفعة التكلفة بالمقارنة
مع نظيرتها المعتمدة على المتحكمات الصغرية.
المتحكمات الصغرية:تحتوي الأسواق العالمية طيفاً واسعاً جداً من المتحكمات الصغرية،
وعائلات كثيرة تصعب المقارنة بينها، وتختلف كل منها اختلافات جذرية عن
الأخرى، فقد يكون أحدها مناسبا لتطبيق ما دون آخر، وأشهر هذه العائلات هي
متحكمات PIC من شركة
Microchip،
ومتحكمات AVR من شركة Atmel، وPSoC من Cypress، وARM من Philips على سبيل
المثال لا الحصر.. والحديث خلال هذه السلسلة سيدور حول مجموعة من المتحكمات
الصغرية من العائلتين PIC16 وPIC18 من شركة
Microchip
الرائدة في تصنيع المتحكمات الصغرية، وأرجو ألا يبدأ (كما في العادة)
السجال بين مناصري PIC ومحبي AVR والانشغال بسرد مميزات كل عائلة و(فرد
العضلات) عن الاستفادة الحقيقية من هذه المتحكمات..
متحكمات PIC من شركة Microchip:سنبدأ هذه السلسلة بتشغيل المتحكم PIC16F877A، وسأحاول تغطية كافة
مميزات هذا المتحكم خلال بضعة مقالات إن شاء الله، ثم سننتقل سوية إلى
العائلة PIC18 للحصول على إمكانيات أكثر تطوراً لا تتوفر في العائلة
PIC16..
لماذا اخترت PIC16F877A كبداية ؟؟ ببساطة لأنه صاحب أعلى شعبية
بين رفاقه، إضافة لتوفره بكثرة في السوق المحلية بأسعار جيدة (نسبياً)،
وبالطبع المميزات التي يتمتع بها والتي يكفي فهمها لدخول عالم المتحكمات
بقوة، وأخيرا لأنه رافقني طيلة السنوات الخمس الماضية وأزعم أنني أعرفه
جيدا بعد هذه الخمس وأستطيع تقديمه للإخوة القراء بأبسط الطرق إن شاء
الله..
بعض المفاهيم الأساسية قبل البداية :يعتبر المتحكم نظاما حاسوبيا مصغرا كما ذكرنا سبقا، فالمتحكم PIC16F877A
يحتوي على وحدة معالجة مركزية CPU، ذاكرة وصول عشوائي RAM، ذاكرة لتخزين
البرنامج من نوع Flash، وذاكرة لتخزين المعطيات من نوع EEPROM، و33 طرفا
للإدخال والإخراج.
ذاكرة الوصول العشوائي RAM: تتالف هذه الذاكرة من قسمين : قسم يدعى سجلات الأغراض الخاصة Special
Function Registers أو SFR، وظيفتها التحكم بأجزاء المتحكم المختلفة
كالمعالج ووحدات الإدخال والإخراج والمؤقتات وغيرها، فالتغيير في القيم
المخزنة في هذه السجلات يسبب تغيراً في وظائف المتحكم كإيقاف المؤقت أو
إخراج قيمة على بوابة خرج... وسنأتي على هذه التفاصيل في الدروس القادمة إن
شاء الله. أما القسم الآخر من هذه الذاكرة فهو سجلات الأغراض العامة،
وتستخدم لتخزين المتغيرات أثناء العمل كقراءة درجة الحرارة من حساس مثلا،
أو قراءة مداخل المتحكم.. وتجدر الإشارة إلى أن الذاكرة RAM تفقد محتوياتها
عند انقطاع التغذية الكهربائية.
ذاكرة البرنامج Flash:تستخدم هذه الذاكرة لتخزين برنامج المتحكم الذي سيقود النظام بكامله،
لذلك فهي من النوع Flash للمحافظة على البرنامج حتى عند انقطاع التغذية
الكهربائية، وهي قابلة للمسح وإعادة البرمجة كهربائياً، ويمكن أن تكون هذه
الذاكرة في متحكمات أخرى من النوع OTP القابلة للبرمجة مرة واحدة والتي
تتميز بتكلفتها المنخفضة لذلك تستخدم في الإنتاج بكميات كبيرة، أو EPROM
التي تمسح بالأشعة فوق البنفسجية..
ذاكرة المعطيات EEPROM:قابلة للبرمجة والمسح كهربائيا ولا تفقد محتوياتها عند فقدان التغذية
الكهربائية، تستخدم هذه الذاكرة لتخزين إعدادات النظام والمعطيات التي تجب
المحافظة عليها حتى عند فقدان التغذية الكهربائية ككلمات المرور مثلا..
المتحكم PIC16F877A:هو عبارة عن دارة متكاملة تملك 40 طرفا، ويمتلك هذا المتحكم كما ذكر
سابقا مجموعة متنوعة من الميزات، يمكنكم الاطلاع على تفاصيلها في النشرة
الفنية للمتحكم، وهي باختصار :
- وحدة معالجة مركزية CPU عالية الأداء
- ذاكرة برنامج بسعة 8k
- ذاكرة وصول عشوائي RAM بسعة 368 بايت
- ذاكرة معطيات EEPROM بسعة 256 بايت
- عدد المداخل \ المخارج : 33
- مبدل تماثلي \ رقمي بدقة 10-bit و8 قنوات
متطلبات التشغيل الأساسية :نحتاج لتشغيل المتحكم PIC16F877A إلى عدة متطلبات أساسية في أي تصميم ومهما كان الغرض من الدارة، وهي :
التغذية : يحتاج
أي متحكم إلى تغذية كهربائية، وتختلف قيمة الجهد المطلوب من متحكم لآخر،
فبعض المتحكمات تعمل على 3.3V، وبعضها يعمل على الجهد 5V، ومنها ما يحتاج
قيما أقل من ذلك لجهد التغذية الكهربائية، لكن المتحكم الذي سنعمل معه خلال
هذه السلسلة يحتاج إلى تغذية كهربائية بقيمة 5V، وبالرجوع إلى النشرة
الفنية لهذا المتحكم يمكننا أن نلاحظ أن المجال المسموح به لجهد التغذية
هو (4.5V – 5.5V).
نبضات الساعة : تتحكم نبضات
الساعة بعمل وحدة المعالجة في المتحكم بشكل مباشر لأنها هي التي تخبر
المعالج بزمن تنفيذ العمليات المطلوبة واستدعاء العمليات التالية، وفي
متحكمات PIC تنفذ وحدة المعالجة تعليمة واحدة كل أربع نبضات متتالية من
نبضات الساعة. يمكن الحصول على هذه النبضات بطرق عديدة سنفصلها في دروس
لاحقة، إلا أننا سنستخدم المهتزات الكريستالية منذ الآن. يعمل المتحكم
PIC16F877A مع نبضات ساعة يصل ترددها إلى 20MHz كحد أقصى، لذلك سنستخدم
مهتزا كريستاليا تردده 20MHz لتأمين نبضات الساعة لوحدة المعالجة في
المتحكم، وذلك يعني أن المعالج سيعمل بتردد 5MHz.
مدخل التصفير : يمتلك
المتحكم PIC16F877A مدخلا يسمى MCLR اختصارا للعبارة Master Clear، ووظيفة
هذا المدخل كما تبدو من اسمه هي تصفير المتحكم عند الرغبة بذلك. تتم عملية
التصفير بتطبيق مستوى منخفض على هذا المدخل (صفر منطقي)، وحتى يبدأ
المتحكم بالعمل من جديد تجب إعادة القيمة المطبقة عليه إلى المستوى المرتفع
(واحد منطقي)، لذلك سنستخدم البنية الموضحة في المخطط، والمؤلفة من مفتاح
لحظي ومقاومة متصلة بالتغذية (5V)، في الحالة الطبيعية سيكون الدخل على
مدخل التصفير مساويا لجهد التغذية أي 5V (واحد منطقي) عن طريق المقاومة،
وعند الضغط على المفتاح اللحظي ستصبح قيمة الدخل مساوية لجهد الأرضي أي 0V
(صفر منطقي) والذي سيسبب تصفير المتحكم، وعند تحرير المفتاح سيعود المتحكم
إلى العمل مجددا لأن مدخل التصفير سيعود للقيمة واحد منطقي.
برنامج المتحكم : يحتاج
المتحكم إلى برنامج ينظم عمله لينفذ العملية المطلوبة منه، وإلا سيكون بلا
فائدة مطلقا. من الممكن كتابة هذا البرنامج بلغة التجميع Assembly الخاصة
بالمتحكم، لكنني أرى أن بداية الطريق مع هذه اللغة خطأ فادح يرتكبه من يدرس
هذه التقنيات لأنها تعقد الموضوع بلا فائدة ملموسة، وسبب ذلك -من وجهة
نظري- أن كتابة برامج كاملة بلغة التجميع صار أمرا شبه مستحيل عند العمل مع
أنظمة حقيقية خاصة عند التعامل مع تقنيات معقدة نسبيا كشبكات Ethernet أو
منافذ USB. ما الحل إذا ؟؟ سنستخدم في هذه السلسلة لغة C الشهيرة، وسنحتاج
بالتالي إلى مترجم Compiler خاص بمتحكمات PIC ليولد البرنامج المطلوب بلغة
الآلة انطلاقا من لغة C.
اخترت لهذه السلسلة المترجم الشهير mikroC PRO
الذي كسر كل حواجز التعقيد وذلل المصاعب أمام المبتدئين، وصحيح أنه ليس
الأفضل بين منافسيه بالمقاييس الاحترافية، لكنه يتفوق عليهم بغنى مكتبته
بالتوابع ووفرة الأمثلة المرفقة إضافة إلى الشعبية العالية التي يتمتع بها
في أوساط الهواة.
المبرمجة : نحتاج بعد كتابة برنامج المتحكم بنجاح إلى
أداة ما لنقل هذا البرنامج إلى ذاكرة المتحكم. تدعى هذه الأداة بالمبرمجة،
وقد بلغت أشكالها ووظائفها حدودا غير قابلة للحصر هنا، وربما أفرد لذلك
مقالة خاصة لاحقا. لكنني من الآن أنصح كل متابع لهذه السلسلة وراغب في
إكمال المشوار أن يختصر الطريق على نفسه ويشتري أحد المبرمجات الأصلية من
الشركة الصانعة للمتحكم
Microchip، لأنه كما يقولون أهل مكة أدرى بشعابها، وأهل
Microchip
أدرى بمتحكماتها، وأنصح باستخدام ICD2 أو ICD3 لمن ينوي الاحتراف، أو
PICKit 2 لمجرد اللهو والتسلية، فإن لم تتوفر أحد هذه المبرمجات لسبب أو
لآخر، صار من المحتم عليك أن تضيع وقتك وتصنع مبرمجتك الخاصة كما فعلت أنا،
وشبكة الإنترنت مليئة بالمبرمجات فالكرة في ملعبك الآن !
التطبيق العملي الأول :عرفنا مسبقا أن المتحكم يمتلك مداخلا ومخارج للتخاطب مع الوسط المحيط به
وتنفيذ العمليات المطلوبة منه، وهذه المداخل والمخارج مجموعة في بوابات.
من المفترض أن تكون المعلومات السابقة كافية لتشغيل المتحكم PIC16F877A
للمرة الأولى، وسنتعلم في هذه الجولة كيفية إخراج قيم رقمية على البوابة
PORTB.
الدارة التي سنستخدمها بسيطة جدا، وهي مؤلفة من المتحكم الصغري
PIC16F877A، دارة الهزاز، دارة التصفير، والثنائيات الباعثة للضوء LEDs
التي ستعبر عن القيم الرقمية الخارجة من البوابة PORTB بشكل ضوئي لنتمكن من
مشاهدتها. لاحظ أن كل ثنائي ضوئي يتصل بمقاومة قيمتها 220Ω لتحديد التيار
الذي يمر فيه.
جميع العمليات التي تتم في البرنامج لأداء الوظيفة المطلوبة تتم عبر
سجلات ضمن ذاكرة المتحكم. يمتلك المتحكم مجموعة من السجلات تسمى TRISx، وهي
التي تحدد وظيفة البوابة كمخرج أو مدخل.
بما أننا سنعمل مع البوابة
PORTB، فالسجل المقابل لها اسمه TRISB، وكل ما يجب أن نعرفه عن هذا السجل
هو أن البت المساوي للصفر سيجعل من الطرف المقابل له مخرجا، والبت المساوي
للواحد سيجعل الطرف المقابل له مدخلا، فإن كان TRISB=11110000 ستعمل
الأطراف RB7-RB4 كمداخل، والأخرى RB3-RB0 كمخارج.
كتابة البرنامج :قم بتحميل المترجم mikroC Pro من موقع الشركة
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] وقم بتشغيله لنبدأ معا بكتابة البرنامج خطوة خطوة.
من القائمة Project اختر الأمر New Project لإنشاء مشروع جديد:
ستظهر هذه النافذة لترحب بك في مشروعك الجديد، اضغط Next للمتابعة :
من هذه النافذة سيتم اختيار المتحكم الخاص بالمشروع، وهو في مشروعنا
المتحكم PIC16F877A (يمكنك معرفة المتحكمات التي يدعمها البرنامج من هذه
القائمة) :
في هذه الخطوة نقوم بإدخال تردد المهتز المستخدم في المشروع، وهو 20MHz كما ذكرنا سابقا :
قم بإنشاء مجلد خاص بالمشروع على قرصك الصلب، ثم حدد هذا المجلد من خلال
النافذة التالية واحفظ ملف المشروع باسم يعبر عن وظيفة المشروع حتى لا
تختلط عليك الأمور فيما بعد :
تطلب منك هذه النافذة إضافة ملفات إلى مشروعك، ونحن الآن لا نحتاج لذلك
لبساطة المثال الذي نعمل عليه، تخطى هذه النافذة بالضغط على Next دون إضافة
أي ملف:
ستظهر الآن النافذة الأخيرة التي تخبرك بأن المشروع تم إنشاؤه بنجاح وبقيت أمامنا الآن كتابة البرنامج فقط.
البرنامج :البرنامج الذي سنقوم بكتابته معا بسيط جدا وأتمنى ألا يجد أحد من القراء صعوبة في فهمه، وهو مبين في الشكل:
- void main() {
- TRISB = 0b00000000;
- while (1){
- PORTB = 0b11111111;
- Delay_ms(1000);
- PORTB = 0b00000000;
- Delay_ms(1000);
- }
- }
يبدأ تنفيذ البرنامج في لغة C من التابع main، ونلاحظ أن التعليمة
الأولى تحمل السجل TRISB بالقيمة 00000000 لتجعل من البوابة PORTB مخرجا
بكامل أطرافها. تدل العبارة 0b في بداية القيمة المسندة للسجل أن هذه
القيمة مكتوبة بالترميز الثنائي، وإن أردنا أن نكتبها بالترميز الست عشري
علينا استخدام الرمز 0x للدلالة على أن الترميز المستخدم هو الست عشري
(تصبح القيمة 0x00)، كما نستطيع كتابة هذه القيمة بالترميز العشري دون
الحاجة لأي رمز ونكتب فقط 0.
بعد تهيئة البوابة PORTB كمخرج، يدخل البرنامج في حلقة غير منتهية لينفذ
ما بداخلها بشكل مستمر. تبدأ هذه الحلقة بإخراج القيمة 0b11111111 على
البوابة PORTB (تكافئ تماما 0xFF أو 255) لتعمل الثنائيات الضوئية المتصلة
بالبوابة.
التعليمة التالية هي تعليمة تأخير لا يتم فيها تنفيذ أي شيء، وإنما فقط
انتظار انتهاء الوقت المحدد (1000mSأو ثانية واحدة) قبل انتقال البرنامج
للتعليمة التالية التي تقوم بإخراج قيمة مختلفة على بوابة الخرج.
تنتهي وظيفة البرنامج عند هذه النقطة، وباختيار الأمر Build من القائمة
Project أو من شريط الأدوات سيقوم المترجم بتحويل هذا البرنامج إلى ملف له
الصيغة hex التي تناسب المتحكم في مجلد المشروع. قم الآن ببرمجة المتحكم
بهذا الملف باستخدام المبرمجة وركب الدارة المبينة سابقا وشاهد عمل هذا
البرنامج على أرض الواقع.
الآن يتوجب على كل قارئ لهذا الدرس كتابة ثلاثة برامج مختلفة لإظهار قيم
مختلفة على بوابات المتحكم الأخرى، وبأزمنة تأخير مختلفة.. هذا هو الواجب.
المصدر/www.noortronics.net/