آلية برمجة المتحكمات من عائلة AVR الجزء 1
مقدمة
قبل البدء في شرح برمجة المتحكمات لابد من شرح أنواع الذواكر المختلفة التي تتواجد في المتحكمات أولا
يوجد في المتحكمات بشكل عام ثلاث أنواع من الذواكر :
- flash memory : الذاكرة المخصصة للبرنامج التنفيذي و هي نوع خاص من أنواع الـ EEPROM ، تحتفظ بمحتواها بعد قطع التغذية عن المتحكم .
- SRAM : الذاكرة الديناميكية و التي تستخدم بتخزين المتحولات المؤقتة أثناء تنفيذ البرنامج ، لا تحتفظ بالقيم بعد قطع التغذية عن المتحكم .
- EEPROM : ذاكرة مخصصة للمتحولات التي يراد بقاؤها بعد قطع التغذية عن المتحكم (مثل باراميترات النظام : كقيمة سرعة محرك ابتدائية .. إلخ) ، تحتفظ بمحتواها بعد قطع التغذية عن المتحكم .
أنواع الذواكر الخاصة :
- السجلات العامة : عدد من السجلات التي تستخدم كذاكرة مؤقتة أيضاً (يوجد 32 سجل عام في متحكم أتميغا 8 ) .
- السجلات الخاصة : و هي السجلات التي يكون لها غرض مخصص كالتحكم بسرعة شيء ما أو جهة دخل/خرج لرجل ما من الأرجل ، مثال : DDR هو سجل خاص لتحديد الرجل كدخل أو خرج و يوجد سجل من هذا النوع لكل بوابة مثلاً : DDRA .
لكل شيء مما ذكر عنوان يميزه عن غيره ، يمكن الوصول إليه من خلال هذا العنوان .
لماذا نحتاج للبرمجة في كل مرّة ؟
لشرح ذلك لابد شرح آلية برمجة المتحكمات بشكل مبسط ففي كل مرة تفتح واجهة بيئة تطوير الأردوينو IDE أو واجهة بيئة تطوير أخرى للكتابة بلغة السي العادية ، و تكتب كود معين و تنتهي من الكتابة ، فإنك ملزم بأن تقوم بترجمة compile ما كتبت ، و فعلياً هي عملية تحويل هذه التعليمات البرمجة لصيغة تفهمها الإلكترونيات ، و هي الأصفار و الواحدات ، و بشكل أدق تقوم بترجمة ما كتبته لرموزه الحقيقة بالأصفار و الواحدات ، فالسجل الذي كتبت اسمه و أسندت له قيمة ، هو فعلياً عبارة عن عنوان يجب على المترجم معرفته بلغة الأصفار و الواحدات و بالتالي ينشئ المترجم ملف يسمى HEX و هو الملف النهائي الذي يجب أن يُتعامل معه ، يحوي ترتيب من القيم الثنائية (المعبر عنها بشكل سداسي عشر) .
بعد ذلك تقوم أنت و من خلال دارة معينة (USBasp مثلاً ) برفع هذا البرنامج إلى المتحكم الخاص بك ، و بشكل أدق إلى الذاكرة Flash (غالباً) و ذاكرة EEPROM (عند الطلب) و هذه الذواكر هي مخصصة للقراءة فقط أثناء العمل و لا يمكن الكتابة عليها إلا في طور البرمجة ، لذلك أي تعديل مهما كان بسيط في كود البرنامج فأنت ملزم بترجمة الكود و رفعه من جديد .
[the_ad id=”2268″]
ملف intel HEX
هو الملف النهائي الذي ينتج عن عملية الترجمة و هو الذي يمرر إلى عملية الرفع (أو الحرق أو البرمجة) العتادية أو سمها ما شئت ، و لهذا الملف صيغة موحدة مرجعية يمكن الرجوع لها إلى صفحة الويكيبيديا ، و لكن باختصار هو عبارة عن ملف يحوي أرقام مكتوبة بالصيغة السداسية عشر ( كل رقم هو عبارة عن 4 بيتات و بالتالي يتألف هذا الترميز من 16 رمز من 0 إلى 9 و من A إلى F ) .
كل سطر في هذا الملف يتألف من ست أقسام :
- قسم البداية : عبارة عن الفاصلة المنقوطة .
- عدد البايتات : رقم من خانتين سداسيتي عشر ، مثلاً 10 أي 32 بايت .
- العنوان : قيمة العنوان الذي يبدأ تخزين المعلومات لديه و الموجودة في نفس السطر ضمن الملف ، و هي 4 خانات سادسية عشر أي 16 بيت و بالتالي 64 كيلو بايت (عنوان) ، و يمكن التغلب على هذه المحدودية من خلال طريقة موضحة بشكل أكبر في صفحة الويكيبيديا .
- نوع الحقل (السطر) : خانتين سداسيتي عشر تأخذ قيم من 00 إلى 05 و هي مسؤولة عن تحدد طبيعة السطر ، مثلاً : 00 تحدد أن سطر هو معلومات ، 01 تحدد نهاية الملف .
- البيانات (المعلومات) : مكتوبة بشكل سداسي عشر (أي رقمين سداسي عشر يشكلان بايت) .
- التأكد : خانتين تدلان عدد الواحدات الموجودة ضمن البيانات و يتم الرجوع لهذا الرقم للتأكد من عدم حدوث أي خطأ في البيانات .
#define F_CPU 16000000 #include <avr/io.h> #include <avr/delay.h> int main(void){ DDRB=0xFF; while(1){ PORTB^=1; _delay_ms(1000); } }
البرنامج أعلاه هو لإضاءة الليد الموصولة مع البوابة PORT B الموجودة في المتحكم أتميغا 8 لمدة ثانية ثم إطفائها .
و عند ترجمة الكود باستخدام AVR GCC ضمن بيئة تطوير eclipse يظهر الملف النهائي HEX (تتبّع كيف ينطبق عليه ما شُرح سابقاً ) :
:1000000012C019C018C017C016C015C014C013C044 :1000100012C011C010C00FC00EC00DC00CC00BC06C :100020000AC009C008C011241FBECFE5D4E0DEBF5E :10003000CDBF02D00FC0E4CF8FEF87BB81E088BB7C :100040002FEF33ED40E3215030404040E1F700C056 :080050000000F5CFF894FFCF8A :00000001FF
البرمجة بالموضع ISP
الطريقة الشائعة في برمجة المتحكمات هي باستخدام بروتوكول SPI ، و علينا أن نميز بين الاختصارين لأهميتهم :
ISP : In-System Programming
SPI : Serial Peripheral Interface
حيث الأخير هو بروتوكول موصف عتادياً داخل المتحكم و الأول هو مفهوم لبرمجة المتحكمات داخل النظام النهائي الموضوعة فيه ، و بالواقع هي تمييز عن الطرق القديمة التي كانت تستوجب نزع المتحكم من النظام و وضعه في مبرمجة خاصة .
تتألف توصيلات البرمجة من 3 أسلاك أساسية و عملياً 6 ، حيث يتألف البروتوكول SPI من ثلاث اسلاك هي :
MOSI : Master Out Slave In
MISO : Master In Slave Out
SCK : Serial ClocK
يتضح من الأسم أن الأول يخرج منه البيانات من المبرمجة إلى المتحكم المراد برمجته و الثاني بالعكس و أما الأخير فهو للتزامن إذ أن المبرمجة (السيد) تتحكم بسرعة الإرسال ة توقيته للمتحكم (التابع) .
عملياً لكي تتم البرمجة يجب أن يتم محي البرنامج القديم من المتحكم و كذلك البقاء في حالة إعادة تهيئة reset ، و أيضاً يتم تزويد المتحكم المراد برمجته بتغذية من المبرمجة لتقيل تعقيد البرمجة و أيضاً رجل للأرضي للتأكد من توحيد الأرضي بين المتحكم و المبرمجة .
بالتالي فإن رأس البرمجة المخصص لهذه العملية هو التالي :
و توضع الصورة التالية هذا الرأس في مبرمجة USBasp
يمكن الاطلاع على التفاصيل بشكل أكبر في الملف المساعد المقدم من شركة أتميل لمتحكمات AVR .
هل ما يتم برمجته هو الـ flash و الـ eeprom فقط ؟
يضاف إلى ذلك في متحكمات الـ AVR ما يسمى الفيوزات ، و هي نوع من السجلات الخاصة و التي تضبط إعداد معين في المتحكم و من هنا جاءت تسميتها ، و لا يتم التحكم بها إلا من خلال برمجتها أي أنها غير قابلة للوصول من قبل المبرمج .
يمتلك متحكم مثل أتميغا 8 سجلين فيوزات (بايتين) و لكل بت من هذا السجل معنا و يتم شرح عمل كل بيت من خلال جداول موجود في دفتر مواصفات كل متحكم datasheet
و من أشهر استخدام الفيوزات هو تحديد مصدر الساعة الذي يمكن أن يكون داخلي أو خارجي ، و أيضاً تحديد السرعة .
يجب الانتباه أثناء العمل مع الفيوزات على عدم التلاعب بها بشكل عشوائي إذا أن معظم الحالات تؤدي إلى قفل المتحكم الذي يدخل في حالة رفض للبرمجة (حتى يتم فك القفل و استعادة الفيوزات ) .
ملاحظات هامة في برمجة المتحكمات
- من الحالات التي تؤدي إلى قفل المتحكم هي ضبط الفيوزات على مصدر ساعة خارجي مع عدم وجوده و يمكن عندها الاستعاد من خلال تطبيق تردد 1MHZ على XTAL1 و يمكن الاطلاع أكثر عبر قراءة درس على موقع AVRfreak .
- للتخلص من مشاكل الحسابات الخاطئة لـ Hfuse و Lfuse يمكن استخدام آلات حاسبة خاصة لهذه المهمة .
- تأتي متحكمات الأتميغا بتردد داخلي افتراضي 1 ميغا و هناك قانون يقول أن سرعة الساعة في بروتوكول SPI لا يجب أن تتجاوز ربع التردد الرئيسي لذلك من المهم استخدام تردد بطيء عند البرمجة ( و هذا سبب وجود جامبر في دارة USBasp ) و بعد ضبط التردد لقيم كبيرة مثل 8 ميغا يمكن استخدام سرعات برمجة أعلى بأمان .
- تأكد من توحيد الأرضي بين المبرمجة و المتحكم المراد برمجته .
في الجزء الثاني سيتم الحديث بشكل عملي أكثر عن البرمجة و البرامج المستخدمة من أجلها مثل AVRDUDE .