لقد تعرفنا في الجزء الأول على معنى برمجة المتحكمات و مكوناتها و على أنواع الذواكر و تحدثنا عن ملفات الHEX و بنيتها و كيف نصل لها في النهاية . و حان الآن وقت التحدث بشيء عملي يهمنا جميعاً أثناء عملنا مع المتحكمات و الإلكترونيات القابلة للبرمجة و تحديداً عبر بروتوكول SPI.
مقدمة
من أجل برمجة المتحكمات نحن بحاجة إلى ما يسمى المبرمجات programmers و كل منها يختلف بحسب البروتوكول و المنفذ الذي تستخدمه و من هذه الانواع :
- SPI programmer
- Jtag programmer
- parallel programmer (LPT)
- com programmer (RS-232)
- أنواع أخرى يمكن مطالعتها بالتفصيل
تركيزنا على مبرمجات يمكن وصلها مع اليو إس بي و أيضاً تُستخدم لبرمجة المتحكمات عبر منفذ ال SPI .
محمل الإقلاع bootloader
من الجدير بالذكر أنه هناك نوع آخر من المبرمجات و الذي يعتبر برمجي و يسمى محمّل الإقلاع bootloader و يمكن أن يعمل على بروتوكولات مختلفة حسب إمكانيات المايكرو كونترولر المستخدم ، مثلاً محمل الإقلاع المستخدم في الأردوينو (أتميغا 328 ) هو برنامج يتوضع في مكان محدد محجوز من الذاكرة يبقى ثابتا في الذاكرة ففي كل مرة نرفع برنامجاً جديداً فإنه يحمّل هذا البرنامج في قسم المستخدم و ينقل التحكم إليه و عند ورود طلب برمجة جديد يعاود الكرة و بالواقع البووتلودر يمكن أن يكون لأمور بسيطة كالتي نواجهها في المايكرو من برمجتهم و يصل في التعقيد إلى حد نظم التشغيل المضمنة عند بدء التنفيذ و نقل التحكم لنظام التشغيل .
و من أحد مساوئ محمل الإقلاع أنه يحجز حجم محدد (حسب ما يحدده المبرمج عبر فيوزات خاصة يتم ضبطها و حسب الحجم الذي يتطلبه بالطبع) فحالياً البووتلودر في أردوينو أونو يحجز 0.5 كيلو بايت و في إصدارات قديمة كان يحجز 2 كيلو مما يشكل ربع الذاكرة لو تحدثنا عن الإصدارات التي كانت تعمل على أتميغا 8 .
لكن من أفضل محاسنه أنه يلغي الحاجة لمبرمجات خارجية مما يعني اختصاراً في التكلفة و التعب عند العمل مع العتاد .
لنبدأ العمل
كما ترون من الصورة فإننا سنقوم بتجربة برمجة المتحكمات من خلال طريقتين : الأولى عن طريق بمبرمجة 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
أهم الخيارات المتاحة
- اسم المبرمجة : بكتابة c- كخيار في سطر التعليمة avrdude لتحديد نوع المبرمجة مثلاً : arduino – avrisp – usbasp – …. .
- المتحكم المراد برمجته : بكتابة p- كخيار في سطر التعليمة avrdude لتحديد المتحكم المراد برمجته ، و لهذا دور في أمور منها تحديد توقيع المتحكم أو ما يسمى signature حيث يوجد عادة في متحكمات ال avr توقيع و هو عبارة عن رقم خاص كما هو موضح في الجدول :
- سرعة الاتصال : بكتابة 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 ) .
- نوصل مبرمجة usbasp مع الحاسب و يجب أن تلاحظ صحة التوصل من خلال تنفيذ الأمر lsusb عبر التيرمينال (مستخدمي لينكس) ليظهر لك مثلاً :
Bus 004 Device 033: ID 16c0:05dc VOTI shared ID for use with libusb
و لمستخدمي وينذوز يجب أن يظهر جهاز جديد كما في الصورة
- بعد أن تقوم بوضع المتحكم أتميغا 8 … الآن قم عبر سطر الأوامر بالدخول إلى مسار الملف الذي يوجد فيه ملف الhex ، ثم قم بتنفيذ الأمر التالي :
avrdude -c usbasp -p m8 -U flash:w:avrcode.hexيجب أن تحصل على الرسالة التالية :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.
- لم ننتهي بعد. يجب ضبط الفيوزات لقيمة معينة حسب ما ستقوم باختياره (كريستالة خارجية أو داخلية …) و لكن نحن في مثالنا اعتمدنا على توصيل محدد و قمنا بحساب الفيوزات عبر آلة حاسبة و قمنا بتنفيذ الأمر التالي (لفهم أكبر لموضوع الفيوزات راجع الداتا شيت) :
avrdude -c usbasp -p m8 -U lfuse:w:0xce:m -U hfuse:w:0xd9: - انتهينا و من المفروض أن تعمل الآن بشكل صحيح .
- نوصل مبرمجة usbasp مع الحاسب و يجب أن تلاحظ صحة التوصل من خلال تنفيذ الأمر lsusb عبر التيرمينال (مستخدمي لينكس) ليظهر لك مثلاً :
برمجة المتحكمات باستخدام أردوينو
تسمى Arduino as an AVR ISP (In-System Programmer) و هو عبارة عن برنامج يخصّص بعض الأرجل في الأردوينو لتكول أرجل لبرمجة متحكم خارجي ، و يتم التعامل بعد ذلك مع الأردوينو كمبرمجة avrisp و المدعومة أيضاً من avrdude . لاستخدام الأردوينو كمبرمجة :
- حمل أحدث نسخة من سكيتش arduinISP و ذلك من مستودع الأردوينو البرمجي على github ، و قم بتحميله على الأردوينو .
- قم بالتوصليلات المشروحة في موقع أردوينو الرئيسي
- استخدام التعليمة بالشكل التالي :
avrdude -c avrisp -p m8 -P /dev/ttyACM0 -b 19200 -U flash:w:avrcode.hex
مع الانتباه اننا قمنا بتحديد سرعة الاتصال بين البرنامج و الأردوينو لأن سكيتش المبرمجة يعتمد على انشاء اتصال بهذه السرعة Serial.begin(19200) و استخدام سرعات أخرى يؤدي إلى عدم المزامة .
واجهات رسومية
تسهلاً للتعامل مع avrdude هناك كثير من الطرق الرسومية مثل استخدام إضافة ال avr الخاصة ببرنامج eclipse و التي تجعل من عملية الرفع عبارة عن ضغطة زر بعد ضبط الإعدادات بشكل صحيح ، و هناك واجهات أخرى خاصة لبرنامج avrdude تحديداً