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

مقدمة

قبل البدء في شرح برمجة المتحكمات لابد من شرح أنواع الذواكر المختلفة التي تتواجد في المتحكمات أولا

يوجد في المتحكمات بشكل عام ثلاث أنواع من الذواكر  :

أنواع الذواكر الخاصة :

لكل شيء مما ذكر عنوان يميزه عن غيره ، يمكن الوصول إليه من خلال هذا العنوان .

لماذا نحتاج للبرمجة في كل مرّة ؟

لشرح ذلك لابد شرح آلية برمجة المتحكمات بشكل مبسط ففي كل مرة تفتح واجهة بيئة  تطوير الأردوينو IDE أو واجهة  بيئة تطوير أخرى للكتابة بلغة السي العادية ، و تكتب كود معين و تنتهي من الكتابة ، فإنك ملزم بأن تقوم بترجمة compile ما كتبت ، و فعلياً هي عملية تحويل هذه التعليمات البرمجة لصيغة تفهمها الإلكترونيات ، و هي الأصفار و الواحدات ، و بشكل أدق تقوم بترجمة ما كتبته لرموزه الحقيقة بالأصفار و الواحدات ، فالسجل الذي كتبت اسمه و أسندت له قيمة ، هو فعلياً عبارة عن عنوان يجب على المترجم معرفته  بلغة الأصفار و الواحدات و بالتالي ينشئ المترجم ملف يسمى HEX و هو الملف النهائي الذي يجب أن يُتعامل معه ، يحوي ترتيب من القيم الثنائية (المعبر عنها بشكل سداسي عشر) .

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

[the_ad id=”2268″]

ملف intel HEX

هو الملف النهائي الذي ينتج عن عملية الترجمة و هو الذي يمرر إلى عملية الرفع (أو الحرق أو البرمجة) العتادية أو سمها ما شئت ، و لهذا الملف صيغة موحدة مرجعية يمكن الرجوع لها إلى صفحة الويكيبيديا ، و لكن باختصار هو عبارة عن ملف يحوي أرقام مكتوبة بالصيغة السداسية عشر ( كل رقم هو عبارة عن 4 بيتات و بالتالي يتألف هذا الترميز من 16 رمز من 0 إلى 9 و من A إلى F ) .

كل سطر في هذا الملف يتألف من ست أقسام :

  1. قسم البداية : عبارة عن الفاصلة المنقوطة .
  2. عدد البايتات : رقم من خانتين سداسيتي عشر ، مثلاً 10 أي 32 بايت .
  3. العنوان : قيمة العنوان الذي يبدأ تخزين المعلومات لديه و الموجودة في نفس السطر ضمن الملف ، و هي 4 خانات سادسية عشر أي 16 بيت و بالتالي 64 كيلو بايت (عنوان) ، و يمكن التغلب على هذه المحدودية من خلال طريقة موضحة بشكل أكبر في صفحة الويكيبيديا .
  4. نوع الحقل (السطر) : خانتين سداسيتي عشر تأخذ قيم من 00 إلى 05 و هي مسؤولة عن تحدد طبيعة السطر ، مثلاً : 00 تحدد أن سطر هو معلومات ، 01 تحدد نهاية الملف .
  5. البيانات (المعلومات) : مكتوبة بشكل سداسي عشر (أي رقمين سداسي عشر يشكلان بايت) .
  6. التأكد : خانتين تدلان عدد الواحدات الموجودة ضمن البيانات و يتم الرجوع لهذا الرقم للتأكد من عدم حدوث أي خطأ في البيانات .
#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
http://en.wikipedia.org/wiki/Intel_HEX

البرمجة بالموضع ISP

الطريقة الشائعة في برمجة المتحكمات هي باستخدام بروتوكول SPI ، و علينا أن نميز بين الاختصارين لأهميتهم :

ISP : In-System Programming
SPI Serial Peripheral Interface

حيث الأخير هو بروتوكول موصف عتادياً داخل المتحكم و الأول هو مفهوم لبرمجة المتحكمات داخل النظام النهائي الموضوعة فيه ، و بالواقع هي تمييز عن الطرق القديمة التي كانت تستوجب نزع المتحكم من النظام و وضعه في مبرمجة خاصة .

تتألف توصيلات البرمجة من 3 أسلاك أساسية و عملياً 6 ، حيث يتألف البروتوكول SPI من ثلاث اسلاك هي :

MOSI : Master Out Slave In
MISO : Master ISlave Out
SCK : Serial ClocK

يتضح من الأسم أن الأول يخرج منه البيانات من المبرمجة إلى المتحكم المراد برمجته و الثاني بالعكس و أما الأخير فهو للتزامن إذ أن المبرمجة (السيد) تتحكم بسرعة الإرسال ة توقيته للمتحكم (التابع) .

عملياً لكي تتم البرمجة يجب أن يتم محي البرنامج القديم من المتحكم و كذلك البقاء في حالة إعادة تهيئة reset ، و أيضاً يتم تزويد المتحكم المراد برمجته بتغذية من المبرمجة لتقيل تعقيد البرمجة و أيضاً رجل للأرضي للتأكد من توحيد الأرضي بين المتحكم و المبرمجة .

بالتالي فإن رأس البرمجة المخصص لهذه العملية هو التالي :

و توضع الصورة التالية هذا الرأس في مبرمجة USBasp

J2 Jumper for firmware upgrade (not self-upgradable)Set this jumper for flashing the ATMega(4)8 of USBasp with another working programmer. J3 SCK optionIf the target clock is lower than 1,5 MHz, you have to set this jumper.Then SCK is scaled down from 375 kHz to about 8 kHz

يمكن الاطلاع على التفاصيل بشكل أكبر في الملف المساعد المقدم من شركة أتميل لمتحكمات AVR .

هل  ما يتم برمجته هو الـ flash و الـ eeprom فقط ؟

يضاف إلى ذلك في متحكمات الـ AVR ما يسمى الفيوزات ، و هي نوع من السجلات الخاصة و التي تضبط إعداد معين في المتحكم و من هنا جاءت تسميتها ، و لا يتم التحكم بها إلا من خلال برمجتها أي أنها غير قابلة للوصول من قبل المبرمج .

يمتلك متحكم مثل أتميغا 8 سجلين فيوزات (بايتين) و لكل بت من هذا السجل معنا و يتم شرح عمل كل بيت من خلال جداول موجود في دفتر مواصفات كل متحكم datasheet

و من أشهر استخدام الفيوزات هو تحديد مصدر الساعة الذي يمكن أن يكون داخلي أو خارجي ، و أيضاً تحديد السرعة .

يجب الانتباه أثناء العمل مع الفيوزات على عدم التلاعب بها بشكل عشوائي إذا أن معظم الحالات تؤدي إلى قفل المتحكم الذي يدخل في حالة رفض للبرمجة (حتى يتم فك القفل و استعادة الفيوزات ) .

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

في الجزء الثاني سيتم الحديث بشكل عملي أكثر عن البرمجة و البرامج المستخدمة من أجلها مثل AVRDUDE .

Exit mobile version