آلية برمجة المتحكمات (جزء 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: AVR device initialized and ready to accept instructions

      Reading | ################################################## | 100% 0.01s

      avrdude: Device signature = 0x1e9307
      avrdude: reading input file “0xce”
      avrdude: writing lfuse (1 bytes):

      Writing | ################################################## | 100% 0.02s

      avrdude: 1 bytes of lfuse written
      avrdude: verifying lfuse memory against 0xce:
      avrdude: load data lfuse data from input file 0xce:
      avrdude: input file 0xce contains 1 bytes
      avrdude: reading on-chip lfuse data:

      Reading | ################################################## | 100% 0.00s

      avrdude: verifying …
      avrdude: 1 bytes of lfuse verified
      avrdude: reading input file “0xd9″
      avrdude: writing hfuse (1 bytes):

      Writing | ################################################## | 100% 0.02s

      avrdude: 1 bytes of hfuse written
      avrdude: verifying hfuse memory against 0xd9:
      avrdude: load data hfuse data from input file 0xd9:
      avrdude: input file 0xd9 contains 1 bytes
      avrdude: reading on-chip hfuse data:

      Reading | ################################################## | 100% 0.00s

      avrdude: verifying …
      avrdude: 1 bytes of hfuse verified

      avrdude: safemode: Fuses OK

      avrdude done.  Thank you.

    4. لم ننتهي بعد يجب ضبط الفيوزات لقيمة معينة حسب ما ستقوم باختياره (كريستالة خارجية أو داخلية …) و لكن نحن في مثالنا اعتمدنا على توصيل محدد و قمنا بحساب الفيوزات عبر آلة حاسبة   و قمنا بتنفيذ الأمر التالي (لفهم أكبر لموضوع الفيوزات راجع الداتا شيت) :
      avrdude -c usbasp -p m8 -U lfuse:w:0xce:m -U hfuse:w:0xd9:
    5. انتهينا و من المفروض أن تعمل الآن بشكل صحيح .

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

تسمى 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