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

آلية برمجة المتحكمات من عائلة 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 ) .

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

  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 لمدة ثانية ثم إطفائها .

atmeg8_pinout

و عند ترجمة الكود باستخدام AVR GCC ضمن بيئة تطوير eclipse يظهر الملف النهائي HEX (تتبّع كيف ينطبق عليه ما شُرح سابقاً ) :

:1000000012C019C018C017C016C015C014C013C044
:1000100012C011C010C00FC00EC00DC00CC00BC06C
:100020000AC009C008C011241FBECFE5D4E0DEBF5E
:10003000CDBF02D00FC0E4CF8FEF87BB81E088BB7C
:100040002FEF33ED40E3215030404040E1F700C056
:080050000000F5CFF894FFCF8A
:00000001FF
http://en.wikipedia.org/wiki/Intel_HEX
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 ، و أيضاً يتم تزويد المتحكم المراد برمجته بتغذية من المبرمجة لتقيل تعقيد البرمجة و أيضاً رجل للأرضي للتأكد من توحيد الأرضي بين المتحكم و المبرمجة .

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

ISP

و توضع الصورة التالية هذا الرأس في مبرمجة 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

USBasp_desc

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

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

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

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

fuse_table

fusel_table

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

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

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

  • من الحالات التي تؤدي إلى قفل المتحكم هي ضبط الفيوزات على مصدر ساعة خارجي مع عدم وجوده و يمكن عندها الاستعاد من خلال تطبيق تردد 1MHZ على XTAL1 و يمكن الاطلاع أكثر عبر قراءة درس على موقع AVRfreak .
  • للتخلص من مشاكل الحسابات الخاطئة لـ Hfuse و Lfuse  يمكن استخدام آلات حاسبة خاصة لهذه المهمة .
  • تأتي متحكمات الأتميغا بتردد داخلي افتراضي 1 ميغا و هناك قانون يقول أن سرعة الساعة في بروتوكول SPI لا يجب أن تتجاوز ربع التردد الرئيسي لذلك من المهم استخدام تردد بطيء عند البرمجة ( و هذا سبب وجود جامبر في دارة USBasp ) و بعد ضبط التردد لقيم كبيرة مثل 8 ميغا يمكن استخدام سرعات برمجة أعلى بأمان .
  • تأكد من توحيد الأرضي بين المبرمجة و المتحكم المراد برمجته .

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

Yahya Tawil

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

اترك تعليقاً

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

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

زر الذهاب إلى الأعلى