لغة سي و متحكماتمقالات

آلية برمجة المتحكمات من عائلة AVR الجزء 2

لقد تعرفنا في الجزء الأول على معنى برمجة المتحكمات و مكوناتها و على أنواع الذواكر و تحدثنا عن ملفات الHEX و بنيتها و كيف نصل لها في النهاية . و حان الآن وقت التحدث بشيء عملي يهمنا جميعاً أثناء عملنا مع المتحكمات و الإلكترونيات القابلة للبرمجة و تحديداً عبر بروتوكول SPI.

مقدمة

من أجل برمجة المتحكمات نحن بحاجة إلى ما يسمى المبرمجات programmers و كل منها يختلف بحسب البروتوكول و المنفذ الذي تستخدمه و من هذه الانواع :

  • SPI programmer
  • Jtag programmer
  • parallel programmer (LPT)
  • com programmer (RS-232)
  • أنواع أخرى يمكن مطالعتها بالتفصيل

تركيزنا على مبرمجات يمكن وصلها مع اليو إس بي و أيضاً تُستخدم لبرمجة المتحكمات عبر منفذ ال SPI .

محمل الإقلاع bootloader

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

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

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

لنبدأ العمل

programmerstut

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

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

avrdude

باختصار إن مهمة هذه البرمجية التي تعمل على أنظمة التشغيل الثلاثة : لينكس – ماك – ويندوز هي :

AVRDUDE is an utility to download/upload/manipulate the ROM and EEPROM contents of AVR microcontrollers using the in-system programming technique (ISP).

إذا كنت من مستخدمي لينكس يمكنك تحميل هذا البرنامج على جهازك من software center أو من خلال synaptic packages ، و لمستخدمي الويندور يمكنهم تحميل برنامج winavr و الذي هو عبارة عن سلسلة أدوات (مفسر – منقح – …إلخ) و تسمى علمياً tool chain  و من ضمن هذه الأدوات avrdude .

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

الشكل العام لتعليمة ال avrdude

تعليمة AVRdude

أهم الخيارات المتاحة

  • اسم المبرمجة : بكتابة c- كخيار في سطر التعليمة avrdude لتحديد نوع المبرمجة مثلاً : arduino – avrisp – usbasp – …. .
  • المتحكم المراد برمجته : بكتابة p- كخيار في سطر التعليمة avrdude لتحديد المتحكم المراد برمجته ، و لهذا دور في أمور منها تحديد توقيع المتحكم أو ما يسمى  signature حيث يوجد عادة  في متحكمات ال avr  توقيع و هو عبارة عن رقم خاص  كما هو موضح في الجدول :
    avrsignature
    avrsignature2
  • سرعة الاتصال : بكتابة b- كخيار في سطر التعليمة ، و هذا الخيار مهم لتأكيد كون سرعة الاستقبال في الكود المنفذ على متحكم ” المُبرمجة” يساوي سرعة avrdude لأنه اختلاف السرعتين سيئدي إلى أخطاء في التزامن .
  • المنفذ التسلسلي : بكتابة P- كخيار في سطر التعليمة . اسم المنفذ يتخلف من نظام تشغيل لآخر فغالباً ما يكون من نمط dev/ttyACM بالنسبة للينكس و COM بالنسبة للويندوز .
  • الأمر التنفيذي : بكتابة U- كخيار في سطر التعليمة ، و من ثم تحديد الأمر بالصياغة التالية : memtype:op:filename و قد تحدثنا في الجزء الأول عن أنواع الذواكر و أنواع العمليات ، و لكن يبقى القول أن المقصود من عملية التأكد هي مطابقة محتوى ذاكرة المايكرو بقيمة معينة ، و عملية القراءة ؛ بقراءة محتوى الذاكرة و تخزينها في الملف المحدد اسمه . و يمكن أن يكتب الأمر التنفيذي كالتالي : memtype:op:filename:format و يقصد بـ format نوع الملف المستخدم فكما تحدثنا في الجزء الأول عن نوع hex فإنه هناك أنواع أخرى مثل bin … .
  • خيارات مختلفة : من الظلم إختصار خيارات avrdude بهذه الأسطر القليلة و  لكل خيار حالة استخدام خاصة و هي مشروحة بوضوح في كتيب البرنامج و يمكن الاطلاع عليها من خلال كتابة man avrdude على سطر الأوامر في لينكس .

تجربة عملية في برمجة المتحكمات

  • بعد أن قمتَ بتحمل avrdude في لينكس يمكنك بدء التعامل معه عبر سطر الأوامر أو ما يسمى terminal .
  • بعد أن قمت بتحمل  winavr على ويندوز يمكنك التعامل مع avrdude عبر run>cmd .
  • لنقم الآن بتجربة تحمل البرنامج البسيط الذي كتبناه في الجزء الأول (مع الانتباه إلى تصحيح التردد إلى 8 ميغا حيث سنستخدم أتميغا 8 ) .
    program_cir

    1. نوصل مبرمجة usbasp مع الحاسب و يجب أن تلاحظ صحة التوصل من خلال تنفيذ  الأمر lsusb عبر التيرمينال (مستخدمي لينكس) ليظهر لك مثلاً :
      Bus 004 Device 033: ID 16c0:05dc VOTI shared ID for use with libusb
      و لمستخدمي وينذوز يجب أن يظهر جهاز جديد كما في الصورة
      devicemanager_usbasp
    2. بعد أن تقوم بوضع المتحكم أتميغا 8 … الآن قم عبر سطر الأوامر بالدخول إلى مسار الملف الذي يوجد فيه ملف الhex ، ثم قم بتنفيذ الأمر التالي :
      avrdude -c usbasp -p m8 -U flash:w:avrcode.hexيجب أن تحصل على الرسالة التالية :
    3. لم ننتهي بعد. يجب ضبط الفيوزات لقيمة معينة حسب ما ستقوم باختياره (كريستالة خارجية أو داخلية …) و لكن نحن في مثالنا اعتمدنا على توصيل محدد و قمنا بحساب الفيوزات عبر آلة حاسبة  و قمنا بتنفيذ الأمر التالي (لفهم أكبر لموضوع الفيوزات راجع الداتا شيت) :
      avrdude -c usbasp -p m8 -U lfuse:w:0xce:m -U hfuse:w:0xd9:
    4. انتهينا و من المفروض أن تعمل الآن بشكل صحيح .

برمجة المتحكمات باستخدام أردوينو

تسمى Arduino as an AVR ISP (In-System Programmer) و هو عبارة عن برنامج يخصّص بعض الأرجل في الأردوينو لتكول أرجل لبرمجة متحكم خارجي ، و يتم التعامل بعد ذلك مع الأردوينو كمبرمجة avrisp و المدعومة أيضاً من avrdude . لاستخدام الأردوينو كمبرمجة :

  1. حمل أحدث نسخة من سكيتش arduinISP و ذلك من مستودع الأردوينو البرمجي على github ، و قم بتحميله على الأردوينو .
  2. قم بالتوصليلات المشروحة في موقع أردوينو الرئيسي
    BreadboardAVR
  3. استخدام التعليمة بالشكل التالي :
    avrdude -c avrisp -p m8 -P /dev/ttyACM0 -b 19200 -U flash:w:avrcode.hex
    مع الانتباه اننا قمنا بتحديد سرعة الاتصال بين البرنامج و الأردوينو لأن سكيتش المبرمجة يعتمد على انشاء اتصال بهذه السرعة Serial.begin(19200) و استخدام سرعات أخرى يؤدي إلى عدم المزامة .

واجهات رسومية

تسهلاً للتعامل مع avrdude هناك كثير من الطرق الرسومية مثل استخدام إضافة ال avr الخاصة ببرنامج eclipse و التي تجعل من عملية الرفع عبارة عن ضغطة زر بعد ضبط الإعدادات بشكل صحيح ، و هناك واجهات أخرى خاصة لبرنامج avrdude تحديداً

guiforavrdude

Yahya Tawil

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.