Simply_avr.pdf

  • Uploaded by: Alei El Din Ali
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Simply_avr.pdf as PDF for free.

More details

  • Words: 43,358
  • Pages: 291
Loading documents preview...
‫سلسلة ” تعلم ببساطة “‬ ‫تهدف سلسلة كتب” تعلم ببساطة “ إلى توفير علوم اﻹلكترونيات الحديثة باللغة العربية‬ ‫بصسسورة مجانيسسة ومفتوحسسة المصسسدر مسسع الحفاظ علسسى المبدأ السسساسي “البسسساطة” في شرح‬ ‫المعلومات‪ ،‬جميع الكتب موجهة للعامة من هواة اﻹلكترونيات و طلبة الكليات الهندسة‪.‬‬

‫رخصة الكتاب‬ ‫كتاب "تعلم ‪ AVR‬ببساطة" منشورل مجاناال للجميع تحت رخصة المشاع البداعي الدصدارة الرابعة‬ ‫‪ Creative Common v4 CC-NC-SA‬بشروط النسبة – المشاركة بالمثل – عدم الستغلل التجاري‪.‬‬

‫رخصةل المشاعل البداعي‪CC-NC-‬ل )غيرل تجارية(ل لك كامل الحق في نسخ وتوزيع وتعديل أو‬

‫الاضافة أو حتى طباعة الكتاب ورقياا كما تشاء وأشجعك على ذلك أيضاا شرط عدم إستغلل الكتاب‬

‫تجاري اا بأي دصورة مباشرة أو غير مباشرة‪ ،‬كما يجوز طباعة الكتاب وتوزيعة بشكل عام شرط أن يباع بسعر‬ ‫التكلفة دون أي ربح‪.‬‬ ‫المشاركةل بالمثل‪SA-‬ل إذا تم اشتقاق أي عمل من هذا الكتاب بصورة إلكترونية أو مادية مثل عمل‬ ‫كتاب آخر أو محااضرة تعليمية ) أو حتى كورس متكامل( أو فيديو فيجب أن يتم بصورة مجانية و بنفس‬ ‫الرخصة ) المشاع البداعي‪ :‬النسبة‪ ،‬المشاركة بالمثل‪ ،‬الغير تجارية(‪ .‬يمكنك التعرف أكثر على رخصة‬ ‫المشاع البداعي من الموقع الرسمي ‪creativecommons.org‬‬ ‫جميع كتب سلسلة "تعلم ببساطة" منشورة بنفس الرخصة‬ ‫يمكنك تحميل السلسلة من الموقع ‪http://simplyarduino.com/?page_id=889‬‬ ‫للتوادصل مع المؤلف‬ ‫‪[email protected]‬‬ ‫الغلف ممصمم بواسطة نور الدين – سوريا‬ ‫‪http://fb.com/NourHamda.Portfolio‬‬ ‫‪[email protected]‬‬ ‫عبدالله علي عبدالله‬ ‫‪ 1437‬هـ الموافق ‪ 2015‬م‪.‬‬

‫إهداء‬ ‫… ‪..............................................................................................‬‬

‫إهداء‬ ‫أبي و أمي … لولاكما ما تعلمت حرفا ا ‪..‬‬ ‫أساتذة هندسة الحاسبات بجامعة حلوان وأخص منهم‪،‬‬

‫أ‪.‬د‪ .‬محمد العدوي‬

‫شكراا لنك أحببت العربية‪ ،‬شكراا جزيلا على كل كتبك الرائعة‪ ،‬فهي ذخر للمة‬

‫أ‪.‬د‪ .‬علاء حمدي‬

‫شكراا على تبسيطك للعلم‪ ،‬يعلم الله كم البهجة الذي أدخلته على قلوب الطلبة ‪((:‬‬

‫د‪ .‬أحمد يوسف‬

‫شكراا على إخلدصك‪ ،‬تحملك للطلبة والدصرار على إيصال العلم‪ ،‬شكراا‬

‫‪4‬‬

‫شكر اا لكل من شارك‬ ‫… ‪..............................................................................................‬‬

‫شكراا لكل من شارك‬ ‫م‪ .‬أحمد أأسامة – شكرا ا للمساهمة بفصل الـ ‪UART‬‬

‫م‪ .‬يحيى طو يل – شكرا ا على نصائحك ومقالات "عتاديات" الرائعة‬ ‫شكرا ا لكل من ساهم بمراجعة الكتاب‬

‫م‪ .‬حمدي سلطان‪ ،‬م‪ .‬سعيد الشايب‪ ،‬أحمد م‪ .‬أبو زيد‪،‬‬

‫إسلام الليثي‪ ،‬محمد عويس‪ ،‬هاجر شرف‪ ،‬لميس الموصلي‪.‬‬

‫ولكل من ساهم بنصيحة أو تعليق ب بّنناء‪ ،‬شكرا ا لـكم جميعا ا‬

‫‪5‬‬

‫الفهرس‬ ‫… ‪..............................................................................................‬‬

‫الفهرس‬

‫حول الكتاب – اﻹصمدار ‪11.............................................................1.0‬‬ ‫فصول الكتاب ‪11............................................................................................‬‬

‫لماذا سنستخدم ‪ ANSI – C‬؟‪15..........................................................................‬‬ ‫حرب الممتحككمات ‪ -‬من هو الفضل الص ‪ AVR‬أم الص ‪ PIC‬؟‪16..........................................‬‬

‫م‬ ‫‪ .1‬مقمدمة عن الظنظمة المممدمةجة‪22....................................................‬‬ ‫‪ 1.1‬معنى النظام المدمج ‪23..................................................Embedded System‬‬ ‫‪ 1.2‬مكونات النظام المدمج ‪24...........................................................................‬‬ ‫‪ 1.3‬مراحل تطوير النظمة المدمجة ‪25................................................................‬‬

‫م‬ ‫‪ .2‬ظنظرة عامة على متحككمات ‪34...............................................AVR‬‬ ‫‪ 2.1‬تركيب الممتحككم الدقيق ومعمارية ‪35......................................................AVR‬‬ ‫‪ 2.2‬مميزات معمارية الص ‪37.........................................................................AVR‬‬ ‫‪ 2.3‬كيف تختار بين عائلت الص ‪ AVR‬المختلفة‪39.....................................................‬‬ ‫‪ 2.4‬قراءة دليل البيانات ‪42...............................................................Datasheet‬‬ ‫‪ 2.5‬الخصائص العامة للممتحككم ‪43......................................ATmega16/ATmega32‬‬ ‫‪ 2.6‬أطراف الممتحككم ‪47...................................................................ATmega16‬‬ ‫‪ 2.7‬عائلة ‪49.......................................................................................ATTiny‬‬ ‫‪ 2.8‬تمارين إضافية‪52.....................................................................................‬‬ ‫‪ 2.9‬مراجع إضافية ‪53.....................................................................................‬‬

‫‪ .3‬تةجهيز أدوات التةجارب‪55.............................................................‬‬ ‫‪ 3.1‬الممبرمجات ‪56..........................................................................................‬‬ ‫‪ 3.2‬المكونات اللكترونية ‪62.............................................................................‬‬

‫‪6‬‬

‫الفهرس‬ ‫… ‪..............................................................................................‬‬ ‫‪ 3.3‬أدوات إضافية ‪65.....................................................................................‬‬ ‫‪ 3.4‬تجهيز البرمجيات ‪66.................................................................................‬‬ ‫‪ 3.5‬مراجع إضافية ‪73.....................................................................................‬‬

‫‪ .4‬أساسيات التحكم ‪75..............................................GPIO Basics‬‬ ‫‪ 4.1‬المثال الول‪77.....................................................................Hello World :‬‬ ‫‪ 4.2‬شرح المثال الول وأساسيات برمجة الص ‪89................................................AVR‬‬ ‫‪ 4.3‬المثال الثاني‪ :‬استخدام ‪ 4‬دايود ضوئي‪96......................................................‬‬ ‫‪ 4.4‬المثال الثالث‪ :‬تشغيل جميع أطراف ‪99.......................................PortA, Port B‬‬ ‫‪ 4.5‬المثال الرابع‪ :‬تشغيل المقاطعة السباعية ‪102....................................7segment‬‬ ‫‪ 4.6‬المثال الخامس‪ :‬قراءة الدخل الرقمي ‪107.................................Inputs reading‬‬ ‫‪110.............................................................Pull Up & Pull Down Resistor 4.7‬‬ ‫‪ 4.8‬خادصية الص ‪113..................................................................Internal Pull-Up‬‬ ‫‪ 4.9‬المثال السادس‪ :‬تشغيل ‪ 3‬دايودات ‪ 3 +‬مفاتيح‪114.........................................‬‬ ‫‪117.......................................................Bouncing effect & De-bouncing 4.10‬‬ ‫‪ 4.11‬حساب المقاومة المستخدمة قبل الحمال ‪119...............................................‬‬

‫تودصيل أحمال بتيارات كبيرة ‪121.......................................................................‬‬

‫تشغيل الممحركات ‪123................................................................................DC‬‬ ‫‪ 4.12‬تشغيل الممحرك في كل التجاهين ‪125.........................................................‬‬

‫‪ .5‬قواعمد لغة السي للظنظمة الممدمةجة‪129..........................................‬‬ ‫‪ 5.1‬أنواع البيانات في النظمة المدمجة ‪130.........................................Data-types‬‬ ‫‪ 5.2‬العمليات الحسابية ‪135.............................................Arithmetic Operations‬‬ ‫‪ 5.3‬العمليات المنطقية ‪136.......................................................Logic Operation‬‬ ‫‪ 5.4‬عمليات الزاحة ‪139..........................................................Shift operations‬‬ ‫‪ 5.5‬التحكم على مستوى البت الواحدة ‪142............................................Single Bit‬‬ ‫‪ 5.6‬القراءة من بت واحدة ‪144....................................................Read single bit‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل ‪146................................‬‬ ‫‪7‬‬

‫الفهرس‬ ‫… ‪..............................................................................................‬‬ ‫‪147..............................................................................Fuses & Lockbits 6.1‬‬ ‫‪154..........................................................................................LockBits 6.2‬‬ ‫‪ 6.3‬المذبذبات والص ‪155.................................................................Clock Source‬‬ ‫‪ 6.4‬قيم الفيوزات لضبط السرعة ‪162..................................................................‬‬ ‫‪ 6.5‬الطاقة وسرعة تشغيل الممتحككمات‪166...........................................................‬‬ ‫‪ 6.6‬كيف تبرمج الفيوزات ‪169...........................................................................‬‬ ‫‪ 6.7‬كيف تعالج الفيوزات الممبرمجة بصورة خاطئة؟ ‪171..........................................‬‬

‫‪ .7‬الممقاطعة ‪174...........................................................Interrupt‬‬ ‫‪ 7.1‬مقدمة عن الممقاطعة ‪175........................................................The interrupt‬‬ ‫‪ 7.2‬المثال الول‪ :‬تشغيل الممقاطعة ‪177........................................................INT0‬‬ ‫‪ 7.3‬المثال الثاني‪ :‬تشغيل الممقاطعة ‪ INT0‬مع ‪185...........................................INT1‬‬

‫‪ .8‬التمصال التسلسلي بروتوكول ‪188.........................................UART‬‬ ‫‪ 8.1‬مقدمة عن التصال التسلسلي ‪189................................................................‬‬ ‫‪ 8.2‬التسلسلي الغير متزامن ‪192...................................................Asynchronous‬‬ ‫‪ 8.3‬تهيئة الص ‪ UART‬الداخلي لمتحكمات ‪194...................................................AVR‬‬ ‫‪ 8.4‬المثال الول‪ :‬تهيئة الص ‪ UART‬للعمل كمرسل ‪196................................................‬‬ ‫‪ 8.5‬المثال الثاني‪ :‬تهيئة ال ‪ UART‬للعمل كمستقبل‪200............................................‬‬ ‫‪ 8.6‬المثال الثالث‪ :‬الرسال والستقبال في وقت واحد‪202.......................................‬‬ ‫‪ 8.7‬إرسال مجموعة بيانات مثل السلسل النصية‪205.............................................‬‬ ‫‪ 8.8‬دوال إضافية ‪209.....................................................................................‬‬

‫م‬ ‫‪ .9‬الممحول التناظري‪-‬الرقمي ‪212.............................................. ADC‬‬ ‫‪ 9.1‬مقدمة عن المحول التناظري‪-‬الرقمي ‪213.................................................ADC‬‬ ‫‪ 9.2‬تركيب الص ‪ ADC‬داخل الممتحككم ‪215................................................ATmega16‬‬ ‫‪ 9.3‬المثال الول‪ :‬قراءة جهد متغير باستخدم مقاومة متغيرة‪217..............................‬‬ ‫‪ 9.4‬حسابات الص ‪224.................................................................................ADC‬‬

‫‪8‬‬

‫الفهرس‬ ‫… ‪..............................................................................................‬‬

‫‪ .10‬المعالج التمهيمدي وصناعة المكتبات البرمةجية‪227..........................‬‬ ‫‪ 10.1‬الوامر التنفيذية والوامر التوجيهية ‪228.....................................................‬‬

‫بعض استخدامات ‪228............................................................C - preprocessor‬‬ ‫‪ 10.2‬قواعد الوامر التوجيهية ‪229..................................C - preprocessor syntax‬‬ ‫‪232......................................................................function-like macros 10.3‬‬ ‫‪ 10.4‬قواعد كتابة الماكرو ‪232.....................................................macros syntax‬‬ ‫‪ 10.5‬مراجع إضافية ‪233.................................................................................‬‬ ‫‪ 10.6‬تصميم المكتبات البرمجية في لغة السي‪234.................................................‬‬ ‫‪ 10.7‬خطوات دصناعة المكتبة‪235......................................................................‬‬ ‫‪ 10.8‬تجربة المكتبة في برنامج ‪238................................................ATmel studio‬‬

‫‪ .11‬أظنظمة الوقت الحقيقي ‪245...............................................RTOS‬‬ ‫‪ 11.1‬مقدمة عن أنظمة الوقت الحقيقي ‪246..............................Real Time Systems‬‬ ‫‪ 11.2‬طرق تصميم الص ‪247.....................................Real Time Embedded systems‬‬ ‫‪ 11.3‬كيف تعمل النواة ‪250............................................................RTOS Kernel‬‬ ‫‪ 11.4‬مقدمة عن نظام ‪251................................................................FreeRTOS‬‬ ‫‪ 11.5‬الهيكل البرمجي للص ‪252....................................................................RTOS‬‬ ‫‪ 11.6‬تشغيل ‪ FreeRTOS‬على جميع ممتحككمات ‪253..........................................AVR‬‬ ‫‪ 11.7‬المثال الول‪265............................................Blinking 3 leds with 3 tasks :‬‬

‫‪ .12‬المملحقات اﻹضافية‪271.............................................................‬‬ ‫مملحق‪ :‬تنصيب برنامج ‪ CodeBlocks‬على نظام ويندوز ‪272......................................‬‬ ‫مملحق‪ :‬ترجمة الملفات باستخدام ‪278.....................................................makefile‬‬

‫مملحق‪ :‬رفع ملف الص ‪ Hex‬على الممتحككم الدقيق‪282..................................................‬‬ ‫مملحق‪ :‬كيف تستخدم لوحات آردوينو لتعلم برمجة ‪287.....................................AVR‬‬

‫قائمة المراجع‪291........................................................................‬‬

‫‪9‬‬

‫مقدمة‬ ‫” العلم مغرس كـل فخر فافتخـر ‪ ...‬واحذر يفوتـك فخـر ذاك المغـرس‬ ‫واعلم بأن العـلم ليس يناله‬

‫‪ ...‬من هـمـ ه في مطعـ م أو ملبـس‟‬

‫الإمام الشافعي‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫هذا الكتاب موجه إلى كل من يرغب بدخول مجال تطوير النظم المدمجة ‪Embedded Systems‬‬ ‫بصصصصورة احترافيصصصة والبصصصدء بتعلصصصم أساسصصصيات هصصصذا المجصصصال الممتصصصع بأسصصصلوب عملصصصي معتمصصصد علصصصى‬

‫التجارب‪.‬‬

‫لقصصد حردصصصت علصصى أن يكصصون الشصصرح باللغصصة العربيصصة بخطصصوات يسصصيرة ومفصصصلة ومصصع ذلصصك سصصأحافظ‬

‫علصصى اسصصتخدام بعصصض المصصصطلحات النجليزيصصة فصصي الشصصرح حصصتى تعتصصاد علصصى هصصذه المصصصطلحات‬ ‫ويصبح من اليسير لك قراءة المراجع النجليزية‪.‬‬ ‫الكتصصاب ليصصس ممصصصمم ليكصصون مرجصصع شصصامل بقصصدر مصصاهو مصصوجه ليكصصون بدايصصة انطلق نحصصو احصصتراف‬

‫المجصصال‪ ،‬الحقيقصصة أن هصصذا العلصصم ل يمكصصن احتصصواؤه أبصصداا فصصي كتصصاب أو مرجصصع حصصتى وإن كصصان ‪1000‬‬

‫دصفحة‪ ،‬لذا قمصت بإضصافة مصصادر تعليميصة بعصصد كصل فصصل تشصرح المزيصصد مصن التجصارب والمعلومصات‬

‫عن نقاط هذا الفصل فاحرص على قراءة هذه المصادر الضافية لتستزيد من العلم‪.‬‬

‫فصول الكتاب‬

‫الفصل اﻷول‪ :‬مقدمة سريعة عن النظمة المدمجة والمكونات المسصصتخدمة فصصي بنائهصصا وكيفيصصة‬ ‫اختيار هذه المكونات لتحقيق أقصى استفادة بأقل سعر وشرح عام لمراحل التطوير بدايصصة مصصن‬

‫الفكرة وإنتهائاا بالمنتج الذي يباع للمستهلك‪.‬‬

‫الفصننل الثنناني‪ :‬يقصصصدم شصصصرح مبسصصصط للصصصتركيب الصصصداخلي للمتحكصصصم الصصصدقيق مصصصع شصصصرح لخصصصواص‬

‫ومميصصزات الممتحككمصصات مصصن نصصوع ‪ AVR‬وكيفيصصة قصصراءة دليصصل البيانصصات ‪ Datasheet‬الخادصصصة بهصصا‬ ‫واستخلص أهم المعلومات‪.‬‬

‫الفصننل الثننالث‪ :‬يوضصصح هصصذا الفصصصل الدوات الصصتي سنسصصتخدمها فصصي تطصصوير النظمصصة المدمجصصة‬ ‫سصصصصصواء كصصصصصانت العتصصصصصاد "المكونصصصصصات اللكترونيصصصصصة" ‪ Hardware‬أو الدوات البرمجيصصصصصة ‪ToolChain‬‬ ‫)‪(Softwares‬‬

‫‪11‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫الفصننل الرابننع‪ :‬مصصن هنصصا نبصصدأ رحلصصة تعلصصم الممتحككمصصات الدقيقصصة وسصصنبدأ مصصع أساسصصيات تشصصغيل‬

‫أطراف الممتحككم الدقيق وتشغيل المنافذ لتعمل كصصدخل أو كخصصرج ‪ .GPIO‬كمصصا سصصنقوم بمجموعصصة‬ ‫من التجارب لتشغيل العنادصر اللكترونية البسيطة مثل ‪..LEDs, Switchs, 7-Segments‬الخ‪.‬‬

‫الفصننل الخننامس‪ :‬شصصصرح لهصصصم القواعصصصد والصصصصيغ الشصصصهير للغصصصة السصصصي المعياريصصصة والمسصصصتخدمة‬ ‫بشكل كبير في تطوير النظمة المدمجة‪ .‬تتميز الصيغ المعيارية بإمكانية تطبيقها على مختلصصف‬

‫الممتحككمات الدقيقة طالماا أن المترجم الخاص بها يدعم لغة السي‪.‬‬

‫الفصل السادس‪ :‬شرح العدادات المتقدمة لمتحكمات ‪ AVR‬مثصصل مفهصصوم الفيصصوزات ووظائفهصصا‬ ‫المختلفة مثصل تغيصر سصرعة التشصغيل ‪ Clock Rate‬واسصتهلك الطاقصة‪ ،‬حمايصة البرامصج الموجصودة‬

‫على الممتحككم من السرقة أو التعديل وتشغيل بعض الخصائص المتقدمة الخرى‪.‬‬

‫الفصل السابع‪ :‬سنتعرف في ه ذا الفصصل علصى كيفيصة تشصغيل المقاطعصات الخارجي ة ‪External‬‬ ‫‪ Interrupts‬وفائصصدة هصصذه الخادصصصية الرائعصصة الصصتي تتيصصح دصصصناعة تطبيقصصات ذات اسصصتجابة عاليصصة‬

‫السرعة للحداث الخارجية‪.‬‬

‫الفصننل الثننامن‪ :‬شصصصرح أحصصصد أشصصصهر طصصصرق إرسصصصال البيانصصصات بصصصصورة تسلسصصصلية بيصصصن الممتحككمصصصات‬ ‫الدقيقصصة والعصصالم الخصصارجي وذلصصك عصصبر بروتوكصصول ‪ UART‬والصصذي يعتصصبر أشصصهر بروتوكصصول معيصصاري‬

‫لتبادل البيانات‪.‬‬

‫الفصل التاسع‪ :‬في هذا الفصل سنتعرف على كيفية قراءة الجهود الكهربية المتغيرة ‪Analog‬‬ ‫وتحويلها إلى قيم رقمية وذلك باستخدام المحول التنصصاظري‪-‬الرقمصصي المدمصصج داخصل ممتحككمصصات‬

‫‪.AVR‬حيث يمكن استغلل هذا المحول في قراءة الحساسات التناظرية أو أي عنصر إلكصصتروني‬ ‫له خرج كهربي متغير‪.‬‬ ‫الفصنننل العاشنننر‪ :‬شصصصرح أكصصصواد ‪ C preprocessor‬حيصصصث سصصصنتعرف علصصصى الفصصصارق بيصصصن الوامصصصر‬ ‫التنفيذية والوامر التوجيهية وأهميتها بصورة مفصصصلة مثصصل المصصر ‪ include#‬وكصذلك ‪define‬‬ ‫وكذلك سصصنتعرف علصصى كيفيصصة دصصناعة المكتبصصات البرمجيصة ‪ .libraries‬مصع شصرح مثصال لعمصصل ‪uart‬‬

‫‪ driver‬على دصورة مكتبة‪.‬‬

‫‪12‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫الفصل الحادي عشر‪ :‬طرق استخدام أنظمة تشغيل الوقت الحقيقي ‪ Real Time OS‬لتشغيل‬ ‫المهصصصصصام المتعصصصصصددة ‪ Multitasking‬وأنظمصصصصصة السصصصصصتجابة السصصصصصريعة‪ .‬حيصصصصصث سصصصصصيتم تنصصصصصاول نظصصصصصام‬ ‫‪ FreeRTOS‬في هذا الفصل باعتباره أفضل نظام ‪ RTOS‬مجاني )ومفتوح المصدر(‪.‬‬

‫وفي النهاية مضاف مجموعة من المملحقات التدريبية‪ ،‬كل ملحق يشرح مهارة تقنية مختلفة‬ ‫الكتاب موجه خصيصاا إلى طلبة الكليات الهندسية مثل‪:‬‬ ‫تخصص هندسة الحسابات والتصالت‪.‬‬

‫✔‬ ‫✔‬

‫تخصص هندسة اللكترونيات و الكهرباء‪.‬‬

‫✔‬

‫تخصص ميكاترونكس‪.‬‬

‫هواة اللكترونيات بشكل عام‪.‬‬

‫✔‬

‫يتطلب قراءة هذا الكتاب بعض المعرفة الممسبقة‪:‬‬ ‫✔‬

‫أساسيات لغة السي ‪ C‬بشكل عام مثل استخدام المتغيرات والثوابت ‪if - for – while‬‬

‫✔‬

‫أساسيات اللكترونيات والكهرباء مثل المقاومات‪ ،‬المكثفات‪ ،‬البطاريات ‪ ..‬إلخ‬

‫إذا لم يكن لديك اي خبرة بما سبق فأنصحك بقراءة المراجع التعليمية العربية )في نهاية‬ ‫الكتاب( حيث تحتوي على موارد عربية رائعة لشرح علم اللكترونيات من الصفر‬ ‫لتشصصغيل البرمجيصصات الصصتي سنسصصتخدمها فصصي تطصصبيق المثلصصة المصصذكورة فصصي الكتصصاب سصصتحتاج أن‬

‫تمتلك حاسب آلي بالمكانيات التالية على القل‪:‬‬ ‫•‬

‫معالج بنتيوم ‪ 4‬أو أعلى مثل ‪Core2Due – Core i3 – i5 - i7‬‬

‫•‬

‫ذاكرة عشوائية ‪ RAM‬سعة ‪ 1‬جيجا أو أكثر‬

‫•‬

‫مساحة تخزينية فارغة ‪ 5‬جيجا على القل‬

‫•‬

‫نظام تشغيل ‪ Windows‬أو ‪) Linux‬مصصع العلصم أن التطصصبيق الساسصصي سصصيكون علصى نظصام‬ ‫ويندوز(‪.‬‬

‫يمكنصصك الحصصصول علصصى نسصصخة مجانيصصة)مصصدى الحيصصاة( مصصن برنامصصج ‪ Atmel stduio‬مصصن الموقصصع‬ ‫الرسمي مع العلم أن الموقع يتطلب تسجيل حساب )مجاني( لتحميل البرنامج‪.‬‬ ‫‪http://www.atmel.com/tools/ATMELSTUDIO.aspx‬‬

‫‪13‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫كما يمكنك الحصول على نسخة مجانية )لمدة شهر( من برنامج المحاكاة بروتس ‪ Protues‬من‬ ‫الموقع الرسمي ‪http://www.labcenter.com‬‬

‫سيتم استخدام كل البرنامجين بصورة أساسية في شرح التجارب المذكورة في الكتاب‪.‬‬ ‫ملحظة‪ :‬برامج المحاكاة مثل بروتس تتطلب استهلك قدر كبير من الذاكرة و المعالج لذا‬ ‫احرص على إغلق أي تطبيقات أخرى ل تستخدمها عند تشغيل برنامج بروتس‬ ‫سيرتكز الكتاب على شرح الممتحككمات الدقيقة من نوع ‪ AVR – 8 bit‬الممصممة بواسطة الشركة‬

‫العملقة ‪ ATmel‬لما لها من مميزات رائعة‪ ،‬وسيكون الشرح مبني على لغة السصصي ‪ C‬المعياريصصة أو‬ ‫كمصصا تعصصرف باسصصم )‪ ANSI – C (C89, C99‬وسصصيتم اسصصتخدام المصصترجم ‪ AVR-GCC‬المضصصمن مصصع‬

‫برنامصصج ‪ATmel Studio‬ولصصن يتصصم اسصصتخدام البرامصصج الصصتي تغيصصر طصصرق البرمجصصة المعياريصصة مثصصل‬ ‫‪.(Arduino IDE, Code vision, MikroC‬‬

‫‪14‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫أتخيصصل أنصصك بعصصد هصصذه المقدمصصة قصصد تتسصصاءل ‪ ..‬لمصصاذا سصصيرتكز الشصصرح علصصى لغصصة السصصي المعياريصصة‬

‫‪ ANSI – C‬و سبب اختياري للص ‪ AVR‬بدلا من الص ‪... PIC‬‬

‫لماذا سنستخدم ‪ ANSI – C‬؟‬

‫لماذا نستخدم ‪ ANSI - C‬بدلا من اللغات ومعصايير البرمجصة املخصصرى مثصل ‪ Bascom‬أو ‪Flow Code‬‬ ‫بالرغم أن هذه الطرق قد تكون أسهل في البرمجة؟ لكي نفهم الجابة علينا أولا أن نتعرف علصى‬

‫كلمة ‪ ANSI‬وهي اختصار المعهد الوطني المريكي للمعايير )‪(ANSI‬‬

‫هذا المعهد قام بوضع معيار موحد للغة السي وذلك حتى تصبح الكواد المكتوبة بها دصالحة على‬

‫منصات مختلفة )حتى وإن تطلبت تعديلت بسيطة(‪ .‬فمثلا يمكنك كتابة برنامج بلغة السي على‬ ‫نظصصام وينصصدوز ومصصن ثصصم تقصصوم بعمصصل ترجمصصة لصصه دون تعصصديل ليعمصصل علصصى نظصصام لينكصصس أو العكصصس‬

‫وباستخدام نفس المترجم ‪.Compiler‬‬

‫إن تعلم لغة السي المعيارية والتدرب على تقنيات كتابة الكواد بها يعطيك القدرة علننى التعامننل‬

‫مع أنواع كثيرة جداا من الممتحككمات الدقيقنة‪ ،‬فمث ا‬ ‫ل بعصد انتهائصك مصن هصذا الكتصاب سصتكون قصادراا‬ ‫علصصى قصصراءة الكصصواد المكتوبصصة لمتحكمصصات ‪ ARM‬بصصدون مجهصصود كصصبير‪ ،‬بصصل قصصد تجصصد أن الوامصصر شصصبه‬

‫جلت ‪ Registers‬التي سنتحدث عنهصصا فصصي‬ ‫متطابقة في الكثير من الحالت )باختلف أسماء الممس ك‬ ‫الفصول القادمصة(‪ .‬ليصس هصذا فحسصب بصل س تجد أن تعلصم برمجصة أي ممتحككصم آخصر أدصصصبحت عمليصة‬

‫سهلة جداا طالما أن المترجم الخاص بهذا الممتحككم يدعم السي المعيارية‪.‬‬

‫مصصن أجصصل هصصذه السصصباب سصصنتعامل فقصصط مصصع البرامصصج الصصتي تصصدعم هصصذه اللغصصة مباشصصرة مثصصل ‪ATmel‬‬

‫‪ Studio‬و ‪ CodeBlocks‬أمصصا بصصاقي البرامصصج مثصصل ‪ CodeVision‬تجعلصصك تتعلصصم بعصصض الممارسصصات‬ ‫السصصيئة فصصي كتابصصة الكصصود والصصتي قصصد ل تتوافصصق مصصع معصصايير الصصص ‪ ANSI – C‬وبعصصض البرامصصج تضصصيف‬

‫مكتبات تغير طريقة البرمجة بالكامصل )مثصصل آردوينصو( وهصصذا أيضصاا ل أنصصصحك باسصصتعماله إذا كنصصت‬ ‫تهدف احتراف تصميم النظمة المدمجة‪.‬‬

‫‪15‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬

‫حرب الممتحككامات ‪ -‬من هو الأفضل الـ ‪ AVR‬أم الـ ‪ PIC‬؟‬ ‫هذا السؤال دائم اا ما يتبادر لكل من يعمل أو بدأ يدخل مجال النظمة المدمجة‪ ،‬دائماا سصصنجد هصصذا‬ ‫الصصصراع القصصائم بيصصن فريصصق متحمصصس للصصص ‪ AVR‬وآخصصر للصصص ‪ ،PIC‬الحقيقصصة أن حسصصم هصصذا الصصصراع أمصصر‬ ‫دصعب للغاية لكن اسمح لي أن أعرفك على بعض جوانب هذه الحرب ‪..‬‬ ‫في البداية لنعترف بشيء هام‪ ،‬في مجال الصنظم المدمجة ل يوجد ما يسمى "ما هو أفضل‬ ‫ممتحككم دقيق" بصورة ممطللقة ولكن هناك "من النسب" للستخدام في تطبيق معين‬

‫في بعض الحيان نحتاج أن نصمم نظام تحكم بسعر رخيص جداا ول نحتاج لقدرات خارقصصة أو‬

‫ممتحككمات متطورة لتشغيله لذا نبحث عن الممتحككم "الرخص" والصصذي يكفصصي فقصصط لهصصذه المهمصصة‬ ‫لصصذا ل تسصصتغرب أن علمصصت أن الممتحككمصصات )‪ STM8 (8-bit‬تعتصصبر مصصن أكصصثر الممتحككمصصات مبيعصصاا فصصي‬

‫العالم لنها أرخص من كل من ‪ AVR‬وال ‪ PIC‬الص ‪ 8‬بت وتتفوق عليهم في تقديم قصصدرات مناسصصبة‬

‫بسعر منخفض‪.‬‬ ‫لكصصن دعنصصا نعصصود للسصصؤال الدصصصلي والمتسصصبب فصصي حصصرب طويلصصة بيصصن المطصصورين ‪ ..‬مصصن الفضصصل الصصص‬

‫‪ AVR‬أم ‪ PIC‬؟ للجابصصة سصصأقوم بعقصصد بعصصض المقارنصصات التقنيصصة والماليصصة بيصصن ممتحككمصصات كصصل مصصن‬ ‫‪ AVR – 8 bit‬و الص ‪PIC – 8 bit‬‬

‫أولا ‪ :‬مقارنة السرعة‬ ‫هنا سنجد أن ممتحككمصات الصصص ‪ AVR – 8 bit‬تتفصوق بفصارق كصبير ج داا ويعتصبر أدائهصا أسصرع بنحوصص ‪4‬‬

‫أضعاف من مثيلتها في الص ‪ PIC – 8 bit‬وذلك لن ممتحككمات الص ‪ AVR‬تستطيع أن تنفذ عدد أوامر‬ ‫في الثانية الواحدة = التردد الذي تعمل به أما الص ‪ PIC‬فيمكنه تنفيذ مربع هذا العدد‬

‫مثلا لصصصو معنصصصا ممتحككصصصم ‪ AVR‬و ‪ PIC‬وكلهمصصصا يعمصصصل بصصصتردد = ‪ 16‬ميجصصصاهرتز )‪ 16‬مليصصصون هرتصصصز(‬

‫سصصنجد أن الصصص ‪ AVR‬يمكنصصه تنفيصصذ ‪ 16‬مليصصون أمصصر برمجصصي فصصي الثانيصصة الواحصصدة ‪Instruction per‬‬ ‫‪ second‬بينما الص ‪ PIC‬بنفس السرعة يستطيع أن ينفذ فقط ‪ 4‬مليون أمر في الثانية الواحدة‪.‬‬

‫‪16‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫يرجع هذا المر إلى تقنية الص ‪ Pipeline‬الصتي تتميصز بهصا جميصع ممتحككمصات الصصص ‪ AVR‬ول تتواج د إل‬

‫في بعض فئات الص ‪ PIC‬المتطورة نسبياا‪.‬‬

‫أيضاا تحتوي معظم شصصرائح الصصص ‪ AVR‬علصى بعصض الدوات الصتي تسصصرع مصصن تنفيصذ الوامصصر مثصل الصصص‬

‫‪ Hardware multiplier‬وهصصي وحصصدة معالجصصة لعمليصصات الضصصرب الحسصصابية يمكنهصصا تنفيصصذ عمليصصة‬ ‫الضرب في ‪ 2‬نبضة فقط )سنتعرف على النبضات ومفهوم التردد في فصل الفيصصوزات والتحكصصم‬ ‫في سصصرعة التشصغيل(‪ .‬بينمصصا ممتحككمصصات الصصص ‪ PIC‬المماثلصة ل تحتصوي علصصى هصذا المصر وقصد تسصتغرق‬

‫نفس عملية الضرب عليها نحو ‪ 40‬ضعف الوقت المطلوب على الص ‪.AVR‬‬

‫ثانياا‪ :‬التصميم الداخلي ومعالجة البيانات‬ ‫عندما نكتب برنامج بلغة التجميع ‪ Assembly‬نجد فارقاا ضخم بين كليهما حيث يتمتصصع الصصص ‪AVR‬‬

‫جل عام ‪" Register‬ريجستر" يمكصصن اسصصتخدامهم فصصي معالجصصة وتخزيصصن البيانصصات‬ ‫بوجود ‪ 32‬ممس ك‬ ‫جل الصصتراكم‬ ‫جل واحد فقصصط )ممسصص ك‬ ‫المؤقتة بسرعة وكفاءة بينما يجبرك الص ‪ PIC‬على استخدام ممس ك‬ ‫‪ (Accumulator‬فصصي معظصصم الوامصصر وهصصذا يعنصصي أن البرامصصج المكتوبصصة علصصى الصصص ‪ AVR‬أكصصثر كفصصاءة‬

‫وأسرع بكثير من البرامج المكتوبة على الص ‪.PIC‬‬ ‫مثال على ذلك‪ ،‬البرنامج التصالي مكتصوب بلغصة السصي ومصصمم لكصي يبحصث عصن أكصبر قيمصة داخصل‬

‫مصصصفوفة مصصن الرقصصام ‪ Array‬وتصصم تشصصغيل نفصصس الكصصود علصصى مجموعصصة مصصن الممتحككمصصات الدقيقصصة‬

‫مثل ‪ ATmega16‬و ‪ PIC18F‬و ‪MSP‬‬

‫)‪int max(int *array‬‬ ‫{‬ ‫;‪char a‬‬ ‫;‪int maximum=-32768‬‬ ‫)‪for (a=0;a<16;a++‬‬ ‫)‪if (array[a]>maximum‬‬ ‫;]‪maximum=array[a‬‬ ‫;)‪return (maximum‬‬ ‫}‬

‫‪17‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫الجدول التالي يوضح عدد الص ‪) cylces‬نبضصات الصصص ‪ (Clock‬وعصدد الوامصر بلغصة السصمبلي و سصرعة‬ ‫التنفيصصصصذ النهائيصصصصة )بالميكروثانيصصصصة( للكصصصصود السصصصصابق علصصصصى مختلصصصصف الممتحككمصصصصات‪ ،‬لحصصصصظ كيصصصصف أن‬

‫‪ atmega16‬بصصالرغم مصصن أنصصصه يعمصصصل بسصصرعة ‪ 16‬ميجصصا إل أنصصه اسصصصتطاع أن يتفصصصوق علصصصى كصصصل مصصصن‬

‫‪ PIC16C74‬وكذلك ‪ PIC18F452‬الذي يعمل بسرعة ‪ 40‬ميجاهرتز‪.‬‬

‫ملحظة‪ :‬المقارنة الكاملة ستجدها داخل ملف ‪ AVR_introduction‬المرفق مع الكتاب وهو‬ ‫ملف رسمي من شركة ‪ Atmel‬يوضح مميزات هذه العائلة من الممتحككمات الدقيقة‬

‫ثالثاا‪ :‬استهلك الطاقة‬ ‫هنا يتفوق الص ‪ PIC‬على الص ‪ AVR‬بفارق واضصصح‪ ،‬حيصث تتميصصز ممتحككمصات البيصصك باسصصتهلك منخفصصض‬ ‫للطاقصصة )سصصواء علصصى مسصتوى فصصارق الجهصد أو التيصصار الكهربصي(‪ .‬ومصصع ذلصك نجصد شصركة ‪ Atmel‬قصد‬

‫حسصصنت كصصثيراا بعصصض إدصصصدارات الصصص ‪ AVR‬بتقنيصصات اسصصتهلك منخفضصصة للطاقصصة مثصصل ‪Pico Power‬‬ ‫‪ Save‬لكن ستظل ممتحككمات البيك أفضل من الص ‪ AVR‬في هذا الجانب‪.‬‬

‫رابعاا‪ :‬البرمجة والدعم المجتمعي‬ ‫شصصصركة ‪ ATmel‬منصصصذ بدايصصصة تصصصصنيع الصصصص ‪ AVR‬قصصصد اعتمصصصدت علصصصى مترجمصصصات ‪ compilers‬مفتوحصصصة‬ ‫المصصصدر وتصصدعم الصصص ‪ ANSI – C‬مباشصصرة مثصصل ‪ AVR-GCC‬المجصصاني ممصصا تسصصبب فصصي جعلهصصا الخيصصار‬ ‫المفضصصصل لصصصدى الهصصصواة والمحصصصترفين )وهصصصو نفصصصس السصصصبب الصصصذي جعصصصل مصصصصممي لوحصصصات آردوينصصصو‬

‫يختارون شرائح الص ‪ AVR‬بدلا من الص ‪ PIC‬لصناعة آردوينو(‪.‬‬

‫‪18‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬ ‫أمصصا شصصركة ‪ Microchip‬فقصصد اتخصصذت مسصصاراا ممختكلصصف‪ ،‬حيصصث نجصصد أن برنامصصج ‪ MPLAB‬يخصصالف الصصص‬ ‫‪ ANSI – C‬خادصة عند كتابة برامج لعائلت مثل ‪ PIC16F‬مما يجعل تعديل الكواد المكتوبة بهصصا‬ ‫لستخدامها مرة أخرى أو نقلها لمتحكمات أخرى عملية دصعبة‪.‬‬ ‫هنا مجصدداا يتفصوق الصص ‪ ،AVR‬كمصا أنصه هنصاك دليصل واضصح أيضصاا علصى التفصوق القصوي وهصو مصدى كصبر‬ ‫حجم "مجتمع" الهواة والمطورين والمواقع اللكترونيصة الجنبيصة الصتي تصدعم الصص ‪ AVR‬والصتي لصن‬

‫تجد مثلها في حالة الص ‪.PIC‬‬

‫خامساا‪ :‬السعر مقارنة بالمميزات المدمجة‬ ‫في السواق المحلية تعتبر ممتحككمات الص ‪ AVR‬وال ‪ PIC‬متقاربة جصصداا فصصي السصصعر لنفصصس العصصائلت‬

‫)عائلننننة الممتحككمننننات‪ :‬هصصصصي مجموعصصصصة مصصصصن الممتحككمصصصصات الدقيقصصصصة الصصصصتي تشصصصصترك فصصصصي خصصصصصائص‬ ‫وإمكانيصصات مشصصتركة مثصصل سصصعة الصصذاكرة أو الحجصصم أو الطاقصصة المسصصتهلكة ‪ ..‬الصصخ( فمثلا نجصصد فصصي‬

‫السوق المصري أن سعر الص ‪ ATmega16‬مساوي تقريباا للص ‪ 25) PIC16F877a‬جنية مصري وقت‬ ‫كتابة هذه السطور وهو ما يساوي ‪ 3.5‬دولر(‬

‫لكننن نجصصد أن ‪ ATmega16‬يصصوفر قصصدرات ممضصصاعفة مقارنصصة بسصصعر ‪ Pic16F‬منهصصا مثلا‪ :‬التميجصصا‬

‫أسصصرع ‪ 4‬مصصرات مصصن البيصصك ‪ +‬تصصوفير نحصصو ‪ 3‬أضصصعاف عصصدد مخصصارج الصصص ‪ PWM‬ونحصصو ضصصعف معصصدل‬ ‫سصصحب التيصصار لكصصل طصصرف مصصن أطصصراف الممتحككصصم كمصصا أن الصصذاكرة فصصي الصصص ‪ ATmega16‬تسصصاوي مصصرة‬ ‫ونصف حجم الذاكرة في الص ‪.PIC16F877‬‬

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

‫نستنتج من ذلك أنه في حالة الرغبة بتطوير نظام سريع الستجابة أو يقوم بعمليات‬

‫حسابية معقدة وبسعر مناسب فإن الص ‪ AVR‬هو الخيار المثل لغلب النظمة المدمجة‬ ‫المعتمدة على الممتحككمات ‪ 8‬بت الرخيصة‬

‫‪19‬‬

‫حول الكتاب – اﻹصدار ‪1.0‬‬ ‫… ‪..............................................................................................‬‬

‫سادساا‪ :‬التوافر الكمي في اﻷسواق‬ ‫هنصصا نجصصد أن شصصركة ‪) MicroChip‬المصصصنعة للصصص ‪ (PIC‬تتفصصوق علصصى ‪ ATmel‬فكل السصصوقين المحلصصي‬ ‫والعالمي نجد أن منتجات ‪ Microchip‬متوفرة ويسهل الودصول إليها مقارنة بالص ‪. AVR‬‬ ‫هصصذه هصصي أهصصم السصصصباب الصصصتي قصصد تجعلصصك تفضصصصل الصصص ‪ AVR‬عصصن البيصصك وقصصد تحسصصم الصصصراع بيصصن‬

‫الممتحككمات الص ‪ 8‬بصت‪ ،‬لكصن مجصدد اا تصذكر أنصه فصصي بعصض الحصالت يكصون عليصك اختيصار ممتحككصم لنصصه‬ ‫النسب والفضل سعراا‪.‬‬

‫وتستمر الحرب مع مقارنات إضافية‬ ‫إذا أحببصصت أن تقصصرأ المزيصصد عصصن حصصرب المقارنصصات بيصصن الصصص ‪ AVR‬والصصص ‪ PIC‬فعليصصك بهصصذه المقارنصصات‬ ‫الرائعة والتي ستوضح جوانب إضافية من هذه المقارنات‬ ‫‪➢ www.kanda.com/pic-vs-avr.php‬‬ ‫‪➢ www.youtube.com/watch?v=DBftApUQ8QI‬‬ ‫‪➢ arstechnica.com/civis/viewtopic.php?f=11&t=409115‬‬ ‫‪➢ stackoverflow.com/questions/140049/avr-or-pic-to-start-programming‬‬‫‪microcontroller‬‬

‫‪20‬‬

‫الفصل اللول‬ ‫” هؤلاء الذين يمتللكون الجنون الكافي ليؤمنوا أن‬

‫بإمكانهم تغيير العالم‪ ،‬هم من يغيرونه بالفعل ‟‬

‫ستيف جوبز – شر يك مؤسس لشركة ‪Apple‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬

‫✔ معنى النظام المدمج‬

‫✔ مكونات النظمة المدمجة‬ ‫✔ مراحل تطوير المنتجات اللكترونية المعتمدة على النظمة المدمجة‬ ‫✔ كيفية اختيار الممتحككم الدقيق المناسب‬

‫‪22‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 1.1‬معنى النظام المدمج‬

‫‪Embedded System‬‬

‫النظصام المدمصج أو كمصصا يسصصمى فصصي بعصصض الحيصصان "النظصصام الممضصمن" هصو أي نظصصام حاسصصوبي دصصصغير‬

‫الحجم يقوم بمجموعة من الوظائف التي تخدم أداة أو منتج معيصن‪ ،‬وغالبصاا ل تبصاع هصذه النظمصة‬

‫المدمجصصة للنصصاس مباشصصرة ولكنهصصا تكصصون "مدمجصصة ‪ "Embedded‬مصصع منتصصج معيصصن‪ ،‬فمثلا عنصصد شصصراء‬

‫سيارة حديثة أو فرن ميكروويف أو غسالة كهربائية أو حتى مكيف هواء فإن ك س تجد أن جمي ع‬ ‫هذه المنتجات أدصبحت تحتوي على حواسيب دصصغيرة تقدم وظصائف تحك م ذكي ة ممصا يجعصل كصل‬

‫المنتجات السابقة تحتوي على نظم مدمجة‪.‬‬ ‫تستخدم النظمة المدمجة في مجموعة واسعة جداا من التطبيقات‪ ،‬أشهرها‪:‬‬ ‫•‬

‫التحكنننم اللننني مثصصصصل النظمصصصصة المدمجصصصصة‬ ‫الموجصصصصصصصصصود فصصصصصصصصصي المصصصصصصصصصصانع‪ ،‬الطصصصصصصصصصائرات‪،‬‬

‫الصواريخ والقمصصار الصصصناعية وأي ماكينصصة‬ ‫تعمل بصصصورة تلقائيصصة )أوتوماتيكيصة( هصذه‬

‫النظمة جميعها ت م‬ ‫صمم لغرض واحصصد فقصصط‬ ‫وهو التحكم في منتج معين‪.‬‬ ‫•‬

‫المنتجات الخدمية مثصصل المنتجصصات الصصتي‬ ‫عصصصصصادة نشصصصصصتريها لنفسصصصصصنا فصصصصصي المنصصصصصزل أو‬ ‫المكتصصصصصصصصصصصب مثصصصصصصصصصصصل مكيصصصصصصصصصصصف الهصصصصصصصصصصصواء أو‬

‫الميكروويصصصصف الصصصصذي يحتصصصصوي علصصصصى نظصصصصام‬ ‫تحكم إلكتروني في الحرارة‪.‬‬ ‫•‬

‫المنتجننات الترفيهيننة مثصصل منصصصات اللعصصاب ‪ Xbox, Gameboy, Wii‬وكصصذلك المنتجصصات‬ ‫التي أدصبحت تحمل ودصف " ذكية" مثل الهواتف الذكية‪ ،‬السصصاعات الذكيصصة وحصصتى أنظمصصة‬ ‫التلفاز الحديثة جميعها تعتبر أنظمه مدمجة‪.‬‬

‫‪23‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬ ‫أنظمة التصالت الحديثة والتي لها نصيب كبير مصصن هصذا المجصصال خادصصصة بعصصد ظهصصور‬

‫•‬

‫تقنيصصات التصصصال اللسصصلكي مثصصل ‪ Bluetooth‬والصصص ‪ Wifi‬حيصصث تحصصولت الجيصصال القديمصصة‬ ‫مصصن أنظمصصة التصصصالت الصصتي كصصانت تعتمصصد علصصى الصصص ‪ Analog Electronics‬إلصصى تقنيصصات‬ ‫المعالجصصصة الرقميصصصة المعتمصصصدة علصصصى النظمصصصة المدمجصصصة فمثلا جميصصصع أجهصصصزة الموجهصصصات‬

‫‪ Routers‬الصصصتي تصصصوفر لنصصصا النصصصترنت مصصصا هصصصي إل ‪ Embedded Linux Systems‬وكصصصذلك‬

‫أنظمصصة الراديصصو القابلصصة للبرمجصصة ‪ SDR‬وشصصبكات المحمصصول هصصي أيضصصاا نصصوع مصصن النظمصصة‬

‫المدمجة عالية الداء‪.‬‬

‫‪ 1.2‬مكونات النظام المدمج‬

‫عادة تتكون النظم المدمجة من ‪ 3‬مكونات رئيسية‬ ‫•‬

‫الممتحككم الدقيق ‪ MicroController‬والذي يعتبر العقل الممتحككم في النظام‪.‬‬

‫•‬

‫أدوات الدخننننال ‪ Input devices‬مثصصصصل الحساسصصصصات المختلفصصصصة‪ ،‬أزار الضصصصصغط أو أي‬

‫•‬

‫أدوات إخنننراج ‪ Output devices‬والصصصتي متسصصصمى فصصصي بعصصصض الحصصصالت ‪Actuators‬‬

‫وسيلة إدخال معلومات للممتحككم‪.‬‬

‫وتعتصصبر كصصل مصصا يتحكصصم بصصه الصصص ‪ Microcontroller‬مثصصل الممحركصصات ‪ ،Motors‬الشاشصصات‬

‫‪ ،LCD‬سماعات دصوتية … الخ‪.‬‬

‫يتم اختصار أدوات الدخال والخراج بكلمة ‪ I/O‬وهي اختصار )‪(Input/Output Devices‬‬

‫‪24‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 1.3‬مراحل تطوير الأنظمة المدمجة‬

‫قبصصصل أن نبصصصدأ تعلصصصم دصصصصناعة النظمصصصة المدمجصصصة علينصصصا أن نفهصصصم الخطصصصوات الصصصتي تسصصصاعدك علصصصى‬

‫التخطيصصط لمشصصروع ناجصصح وفعصصال‪ ،‬فمثلا إذا جاءتصصك فكصصرة لجهصصاز رائصصع‪ ،‬كيصصف تنفصصذها؟ مصصا هصصي‬ ‫الدوات التي ستستخدمها؟ ما هي مراحل تطوير المشروع لتصل إلى منتج نهائي؟‪..‬‬ ‫الصصصورة التاليصصة توضصصح الخطصصوات الصصتي يتبعهصصا مصصصممو النظمصصة المدمجصصة فصصي تطصصوير أي منتصصج‬ ‫بدايصصة مصصن الفكصصرة حصصتى دصصصناعة المنتصصج بصصصورة تجاريصصة‪ ،‬كمصصا نصصرى هنصصاك مسصصاران أساسصصيان وهمصصا‬ ‫تصميم الص ‪ software‬وتصميم الص ‪.Hardware‬‬

‫تطوير الكود وتوليد‬ ‫ملف الـ ‪Hex0‬‬

‫تصحيح اﻷخطاء‬ ‫واضافة وظائف جديدة‬

‫تصميم البرمجيات‬ ‫‪Software Design‬‬

‫اختبار الكود‬ ‫فكرة‬

‫تجميع البرمجيات والعتاد‬ ‫في نموذج اختبار أولي‬ ‫‪Prototype‬‬ ‫‪ +‬اختبار شامل للنظام‬

‫تحديد اﻷهداف‬ ‫والوظائف‬

‫لوحة تجارب‬ ‫تصميم العتاد‬ ‫‪Hardware Design‬‬

‫صناعة المنتج‬ ‫بصورة تجارية‬

‫تصميم اللوحة المطبوعة‬ ‫‪PCB Design‬‬

‫‪Test Kit‬‬

‫ا ‪ :‬مراحل تطوير برامج الممتحككامات الدقيقة‬ ‫أول ا‬ ‫مثصصل جميصصع أنظمصصة الحواسصصيب فصصي العصصالم نجصصد أن الممتحككمصصات الدقيقصصة ل يمكنهصصا أن تعمصصل دون‬ ‫برنامصصج يكتصصب بصصداخلها وهصصذا البرنامصصج يجصصب أن يكتصصب بالصصصيغة الثنائيصصة الرقميصصة ‪ Binary‬فقصصط‬ ‫الصصصفر والواحصصد‪ ،‬هصصذه الصصصيغة غيصصر مناسصصبة للفهصصم بالنسصصبة للبشصصر ويصصصعب تفسصصيرها‪ .‬لصصذا تقصصوم‬ ‫الشصصصركات المصصصصنعة للمعالجصصصات والممتحككمصصصات الدقيقصصصة بصصصصناعة بعصصصض الدوات البرمجيصصصة الصصصتي‬ ‫متسهل على المطورين أن يصنعوا برامج بلغات مفهومة وقابلة للقراءة‪.‬‬ ‫في البداية كانت الشركات تصمم برمجيات التجميع ‪ Assemblers‬التي تصصوفر للمطصصور مجموعصصة‬ ‫من الوامر تسمى بأوامر التجميع ‪. Assembly Instructions‬‬

‫‪25‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬ ‫والصصتي كصصانت أوامصصر قصصصيرة وسصصهلة نسصصبياا مثصصل ‪) ADD‬اجمصصع رقميصصن( أو ‪) SUB‬اطصصرح رقميصصن(‬ ‫‪,‬ولكن كان هناك عيصصوب كصثيرة لكتابصصة البرامصصج بهصذه اللغصصة مثصل الحجصصم والصوقت‪ ،‬حصتى أن بعصض‬ ‫البرامج كانت تصل إلى عشرات اللف من السطور‪ .‬وكان هناك مثل شهير يقول "كتابة برنامج‬ ‫معقد بلغة اﻷسمبلي موازي لحفر أساسات ناطحة سحاب باستخدام ملعقة"‪.‬‬ ‫ظل المر هكصصذا فصصترة مصصن الزمصصن حصتى ظهصصرت اللغصصات عاليصة المسصصتوى ‪High level language‬‬ ‫مثل لغة السي‪ .‬وهي لغات متسهل كتابة الكود البرمجي وتحويله إلى لغة اللة تلقائياا عن طريق‬ ‫المترجمات ‪ Compilers‬وبذلك أدصبحت عملية تطوير الكود أسهل بكثير‪.‬‬ ‫باستخدام لغة السي يمكننا تطوير برامج الممتحككمات الدقيقة كالتالي‪:‬‬ ‫‪ .1‬كتابة البرنامج بلغة السي‪ :‬في هذه المرحلة نستخدم لغة السي للتعصصبير عصصن الوظصصائف‬ ‫التي نريد تنفيذها من الممتحككم الدقيق‬ ‫‪ .2‬توليد ملف الن ‪ : Hex‬ملف الهيكس هو الملف الذي يحتوي على البرنامج الحقيقي الذي‬ ‫سيخزن داخل ذاكرة الممتحككم ويتم توليده تلقائياا من تحويل الكود المكتوب بلغة السي‬ ‫إلى الوامر البرمجية بصيغة الص ‪ hex‬عن طريق الص ‪) toolchain‬سصصنتحدث عنهصصا بالتفصصصيل‬ ‫في الفصل التالي(‪.‬‬

‫‪26‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬ ‫‪ .3‬رفع البرنامج من الحاسوب إلى ذاكرة الممتحككم‪ :‬هصصذه المرحلصصة الصصتي يتصصم كتابصصة )أو كمصصا‬ ‫يسميها البعض بعملية حرق ‪ (burn‬البيانات الرقمية داخل ذاكرة الممتحككم ليبدأ بتنفيذها‬ ‫حيصصصث يقصصصوم برنامصصصج الرفصصصع ‪ uploader‬بقصصصراءة ملصصصف الهيكصصصس وتحويصصصل القيصصصم المسصصصجلة‬ ‫بداخله إلى بيانصصات ثنائيصة ‪ binary‬ثصصم يقصصوم بكتابتهصا داخصصل العنصوانين المخصصصة لهصا فصي‬ ‫ذاكرة الممتحككم‪.‬‬

‫‪ .4‬اختبار البرنامج واكتشاف اﻷخطاء‪ :‬في هذه المرحلة يتم تشغيل الممتحككم الصصدقيق علصصى‬ ‫لوحصصة التجصصارب أو علصصى ‪ Test Kit‬للتأكصصد مصصن أن البرنامصصج ينفصصذ المطلصصوب أو لكتشصصاف أي‬ ‫أخطصصاء‪ ،‬وقصصد يتصصم تكصصرار هصصذا المصصر عشصصرات المصصرات حصصتى نصصصل إلصصى برنامصصج يصصؤدي جميصصع‬ ‫الوظائف المطلوبة منه بأقل نسبة خطأ‪.‬‬

‫للقيام بكل ما سبق سنحتاج لمجموعة من اﻷدوات البرمجية والمكونات اللكترونية وهو ما‬ ‫سيتم شرحه بالتفصيل في الفصل التالي‪.‬‬

‫‪27‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬

‫ثانياا ‪ :‬مراحل تطوير العتاد‬ ‫لتطوير أي مشروع سنحتاج أن نودصصل الممتحككصم الصدقيق بالمكونصات اللكترونيصة الصتي س يتحكم‬ ‫بهصصا وهصصو مصصا يعصصرف بمفهصصوم الصصص ‪) Devices Interfacing‬مواجهصصة الجهصصزة المختلفصصة( فصصالمتحكم‬ ‫الصصدقيق ل يعمصصل بمفصصرده وإنمصصا يحتصصاج أجهصصزة أخصصرى ليسصصتقبل منهصصا قصصراءات )مثصصل الحساسصصات‬ ‫‪ (Sensors‬أو ليتحكم بها مثل الشاشات والمحركات‪.‬‬ ‫هناك طريقتين أساسيتين لعمصصل ذلصصك وهمصا‪ ،‬اسصصتخدام اللوحصات التطويريصة ‪Development Kit‬‬ ‫أو استخدام لوحة التجارب ‪ ،Breadboard‬كل طريقة لها مميزات وعيوب‪.‬‬ ‫الن ‪Development Kit‬‬

‫هي لوحة اختبار مكونة من الممتح ككم الدقيق ‪ +‬مجموعة كبيرة من العنادصصصر اللكترونيصصة المتصصصلة‬ ‫بصصصه بصصصصورة جصصصاهزة للتشصصصغيل مثصصصل شاشصصصة ‪ ،LCD‬لوحصصصة مفاتيصصصح‪ ،‬أزرار تحكصصصم‪ ،‬حساسصصصات حراريصصصة‬ ‫وضوئية‪ ،‬ريلي ‪ Relay‬وبعض أدوات التصال الرقمية مثل ممحول ‪ RS232‬وقد يوجصد بهصصا أكصصثر أو‬

‫‪28‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬ ‫أقل من ذلك‪ .‬هذه اللوحات متسصهل عمليصة التطصوير بصصورة كصبيرة فهصي تحتصوي علصى معظصم مصا قصد‬ ‫تحتصصاجه علصصى لوحصصة واحصصدة جصصاهزة ومتصصصلة ببعضصصها البعصصض وبالتصصالي لصصن تحتصصاج لشصصراء مكونصصات‬ ‫أخرى أو تودصيل عنادصر إضافية وستوفر عليك وقت بناء الدوائر اللكترونية‪.‬‬ ‫الصور التالية هي لمجموعة مختلفة من للن ‪Development kits‬‬

‫‪29‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬ ‫مرفق مع الكتاب مجلد يحتوي على تصميمات لمجموعة لوحات تطويرية مفتوحة المصدر‬

‫مخصصة للص ‪ AVR‬أغلبها مصمم للممتحككم الدقيق ‪ ATmega32/ATmega16‬و يمكنك دصناعتها‬ ‫بنفسك بتكلفة أقل من شرائها‪.‬‬ ‫لوحة التجارب ‪Breadboard‬‬ ‫الطريقة الثانية هصصي اسصصتخدام لوحصصة التجصصارب البلسصصتيكية والصصتي تسصصاعدك علصصى بنصصاء أي دائصصرة‬ ‫إلكترونية باستخدام السلك‪ ،‬تتميز هذه اللوحة بأنه يمكنك بناء أي دائرة قد تخطصصر علصصى بالصصك‬ ‫فمن السصهل أن تفصصك وتركصصب أي عنصصر أو شصريحة إلكترونيصة )مصصن نصوع ‪ (DIP‬علصصى هصذه اللوحصة‪،‬‬ ‫سصصيتم اسصصتخدام هصصذه الطريقصصة فصصي الكتصصاب لنهصصا الخيصصار الرخصصص والكصصثر تصصوافراا فصصي كصصل البلد‬ ‫العربية‪.‬‬

‫‪30‬‬

‫‪ .1‬ممدقدمة عن الظنظمة الممدمجة‬ ‫… ‪..............................................................................................‬‬

‫معلومة إضافية‪ :‬الشرائح اللكترونية الص )‪ DIP (Dual in-line Package‬هي التي تمتلك دصفين‬ ‫من الرجل المعدنية والتي يمكن تودصيلها بثقوب على لوحة التجارب أو الص ‪ PCB‬أما ‪SMD‬‬ ‫وهي اختصار لكلمة ‪ Surface Mount Device‬هي الشرائح دصغيرة الحجم و تمتلك أرجل‬ ‫معدنية دصغيرة جداا ويتم لحامها على سطح الص ‪ PCB‬فقط‬

‫)‪ATmega32 (DIP‬‬

‫‪ATmega32 (SMD‬‬

‫دصور مختلفة لنواع تغليف ممتحككمات ‪ AVR‬بجميع أنواع وأحجام الص ‪ DIP‬والص ‪SMD‬‬

‫‪31‬‬

‫الفصل الثاني‬ ‫علملا ا‬ ‫”نحن ننتاج ما نفعله بتكرار‪ ،‬الجودة إذا ا ليست ع‬ ‫بل هي ممتنتج العادات الجيدة ‟‬

‫أرسطو – فيلسوف يوناني‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬

‫✔ تركيب الممتحككم الدقيق‬ ‫✔ مميزات معمارية ‪AVR‬‬

‫✔ كيف تختار الممتحككم المناسب من عائلت ‪ AVR‬المختلفة‬ ‫✔ مقدمة عن قراءة دليل البيانات ‪Datasheet‬‬ ‫✔ نظرة عامة على الممتحككم ‪ATmega16‬‬ ‫✔ نظرة عامة على الممتحككم ‪ATTiny84‬‬

‫‪33‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.1‬تركيب الممتحكك م الدقيق ومعمار ية‬

‫‪AVR‬‬

‫الممتحككم الدقيق هو حاسوب متكامل على شريحة واحدة ‪ Computer On Chip‬ميسصصتخلدم فصصي‬ ‫التحكم بمجموعة من الجهزة الخرى‪ .‬ومثصصل جميصصع الحواسصصيب يحتصصوي الممتحككصصم الصصدقيق علصصى‬ ‫نفس مكونات الداخلية للحاسب اللي ولكن بقدرات مختلفة من حيصصث الكصصم والقصصوة‪.‬‬

‫الصصصورة‬

‫التالية تمثل التركيب الداخلي للص ‪AVR‬‬

‫الممعالج ‪ Micro-processor‬قلب الممتحككم الدقيق ويتكون من وحدة الحساب والمنطق ‪ALU‬‬ ‫المسصصؤولة عصصن جميصصع العمليصصات الحسصصابية والمنطقيصصة مصصع وحصصدات قصصراءة الوامصصر مصصن الصصذاكرة‪+‬‬

‫جلت العامصصصة والخادصصصصة ‪ Register‬والصصصتي سصصصنتعرف عليهصصصا فصصصي الفصصصصول‬ ‫مجموعصصصة مصصصن الممسصصص ك‬ ‫القادمصصة‪ .‬يتصصم التحكصصم فصصي سصصرعة المعالصصج مصصن خلل دائصصرة المذبصصذب ‪ Oscillator‬حيصصث تسصصاوى‬

‫سرعة المعالج عدد النبضات الناتجة من دائرة المذبذب )التردد(‪.‬‬

‫‪34‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫الننذاكرة ثابتننة وتنقسصصم إلصصى نصصوعين‪ ،‬الول‪ :‬ميسصصتخلدم فصصي تخزيصصن البرامصصج وتسصصمى بصصالفلش‬ ‫‪ Flash Memory‬وهي تماثل الهارديسك ‪ Hard-disk‬ف ي الحاسصب الشخصصي ويحصب البعصض أن‬

‫يسصصميها ‪ .Program memory‬أمصصا النصصوع الثصصاني فتسصصمى الصصص ‪ EEPROM‬وهصصي ذاكصصرة مخصصصصة‬ ‫لتخزيصصصن القيصصصم الصصصصغيرة والهامصصصة مثصصصل بعصصصض الثصصصوابت أو المتغيصصصرات الصصصتي تصصصؤثر فصصصي برنامصصصج‬

‫الممتحككم ويجب أن تحفظ من الضياع‪.‬‬

‫الننننذاكرة مؤقتننننة ‪ SRAM‬وهصصصصي اختصصصصصار لصصصصص ‪ ،Static RAM‬وهصصصصي تماثصصصصل الصصصصذاكرة العشصصصصوائية‬ ‫الموجودة في الحواسيب الشخصية التي نستخدمها‪.‬‬ ‫جلت ‪ Registers‬وهصصي أحصصد دصصصور الصصذاكرة وتماثصصل الصصذاكرة المؤقتصصة مصصن حيصصث الصصتركيب‬ ‫الممسنن ك‬

‫وطريقصصة العمصصل ولكنهصصا تسصصتخدم فصصي التحكصصم بجميصصع إعصصدادات ووظصصائف الممتحككصصم الصصدقيق كمصصا‬

‫سنرى في الفصول القادمة تبعاا‪.‬‬

‫الوحنندات الطرفيننة )‪ peripheral units (sets‬وهصصي مجموعصصة مصصن الوحصصدات الصصتي تسصصاعد‬

‫الممتح ككصصم الصصدقيق فصصي أداء وظيفتصصه الساسصصية )وهصصي التحكصصم بصصأجهزة أخصصرى( مصصن أمثصصال هصصذه‬ ‫الوحدات‪ ،‬المنافذ العامة ‪ ،PORTS‬المحول التناظري الرقمصصي ‪ ،ADC‬المؤقتصصات ‪ ،Timers‬وحصصدات‬

‫التصصصصال ومعالجصصصة البيانصصصات التسلسصصصلية مثصصصل ‪ USART, SPI, i2C‬و بعصصصض ممتحككمصصصات ‪ AVR‬قصصصد‬ ‫تحتوي على أنظمة للتشفير مدمجة بداخلها ‪ .. CryptoAuthentication‬الخ‪.‬‬

‫ما الفرق بين الذاكرة العشوائية )المؤقتة( داخل الحواسيب الشخصية والممتحككمات‬ ‫الدقيقة ولماذا تسمى ‪ Static‬وليس ‪Dynamic‬؟‬

‫الفارق الساسي هو العنصر الذي تصنع منه الذاكرة‪ ،‬حيث تتميز ذاكرة الممتحككمات بأنها تصنع‬ ‫من الص ‪ Flip-Flop‬الذي يتميز بالقدرة على الحتفاظ بالبيانات بأقل تيار كهربي ممكن وبالتالي‬ ‫فهو الخيار الفضل من ناحية الستهلك للطاقة كما أن البيانات الموجودة عليه ل تحتاج‬ ‫لعملية تجديد ‪ Refreshing‬مثل الذاكرة "‪ ”dynamic RAM‬الموجودة في الحواسيب‬

‫التقليدية والتي تصنع من المكثفات الطفيلية ‪ Parasitic Capacitors‬والتي تحتاج دائماا‬

‫لعملية تجديد ‪ Refreshing‬وإل تضيع البيانات المخزنة بداخلها مع مرور الوقت )أكثر من ‪10‬‬ ‫مللي ثانية كفيلة باختفاء البيانات من ‪ (DRAM‬كما أنها تستهلك الكثير من الطاقة بسبب هذه‬ ‫العملية‪.‬‬

‫‪35‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫ما الفارق بين الن ‪ Flash‬والن ‪ EEPROM‬بالرغم أن كلهما تقنياا يعتبر ‪EEPROM‬؟‬ ‫الص ‪ EEPROM‬هي اختصار لعبارة ‪Electrical Erasable Programmable Read Only‬‬ ‫‪ Memroy‬والتي تعني الذاكرة التي تستخدم للقراءة فقط ويتم برمجتها كهربياا‪.‬‬

‫الممتحككمات الدقيقة غالباا ما تحتوي على نوعين من الص ‪ EEPROM‬الولى تسمى الص ‪ Flash‬لنها‬ ‫سريعة جداا في كتابة البيانات وقد تصل سرعة الكتابة عليها إلى واحد ‪ MegaBit/S‬فمثلا‬ ‫قد تكتب ‪ 1‬بايت بداخل الفلش في زمن ‪ 1‬ميكروثانية فقط‪ .‬بينما الص ‪ EEPROM‬التقليدية‬

‫بطيئة للغاية مقارنة بالفلش حيث أن كتابة ‪ 1‬بايت بداخلها قد يستغرق ‪ 1‬مللي ثانية )يعني‬ ‫أبطأ بنحو ‪ 1000‬مرة من الص ‪.(Flash‬‬

‫‪ 2.2‬مميزات معمار ية الـ‬

‫‪AVR‬‬

‫يقصصصد بكلمصصة معماريصصة ‪ Architecture‬طريقصصة تودصصصيل المكونصصات الداخليصصة للممتحككصصم مصصع بعضصصها‬

‫البعض ومدى حجم البيانصصات الصتي تسصتطيع هصذه المكونصات أن تعالجهصصا‪ .‬فمثلا جميصصع ممتحككمصات‬

‫‪ AVR‬يوجصصد بهصصا المكونصصات السصصابق ذكرهصصا وبينهصصا العديصصد مصصن الشصصياء المشصصتركة‪ .‬لكصصن سصصنجد أنصصه‬ ‫هناك اختلفات رئيسية بين العديد من ممتحككمات الص ‪AVR‬‬

‫بعض الخصائص المشتركة بين جميع ممتحككمات ‪AVR‬‬ ‫•‬

‫معمارية ‪ Harvard‬هذه المعمارية الحديثة نسصبياا تعنصي أن المعالصصج المركصزي يسصتطيع‬ ‫أن يتوادصصصصصل مصصصصع الصصصصذاكرة ‪ RAM‬و الصصصصص ‪ ROM‬فصصصصي نفصصصصس الصصصصوقت حيصصصصث نجصصصصد أن جميصصصصع‬

‫ممتحككمصصصات الصصصص ‪ AVR‬تسصصصتطيع أن تكتصصصب فصصصي الصصصص ‪ RAM‬وتقصصصرأ مصصصن الصصصص ‪ ROM‬فصصصي نفصصصس‬ ‫اللحظصة‪ .‬علصصى عكصصس المعماريصات القديمصصة مثصصل ‪ Von Neumann‬والصتي تسصصمح للمعالصصج‬ ‫أن يقوم بعمل شيء واحد فقط )إما القراءة أو الكتابة في نفس اللحظة(‪.‬‬

‫•‬

‫‪ Single Cycle Execution‬معظصصصم ممتحككمصصصات ‪ AVR‬تمتلصصصك القصصصدرة علصصصى تنفيصصصذ أوامصصصر‬

‫برمجيصصة = سصصرعة المعالصصج فمثلا إذا كصصان تصصردد المعالصصج = ‪ 16‬ميجصصا )‪ 16‬مليصصون نبضصصة(‬

‫فهصصذا يعنصصي أن الممتحككصصم يسصصتطيع أن ينفصصذ ‪ 16‬مليصصون أمصصر فصصي الثانيصصة الواحصصدة‪ .‬ويرجصصع‬

‫‪36‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫الفضل إلى وجود نسختين من أنظمة قراءة الذاكرة وفك تشفير الوامر ‪2x program‬‬ ‫‪ counter + 2x instruction decoder‬وكل النسختين تعملن معاا في نفس الوقت مما‬

‫يضاعف سرعة وعدد الوامر التي يتم نسخها من الذاكرة‪.‬‬ ‫•‬

‫‪ Self programming memory‬وتعتصصصبر أحصصصد مميصصصزات الصصصص ‪ AVR‬الرائعصصصة والصصصتي تعنصصصي‬ ‫إمكانيصصة اسصصتخدام الصصصذاكرة الفلش لتخزيصصن المتغيصصرات أثنصصاء تشصصغيل الممتحككصصم )كأنهصصا‬

‫تقوم بوظيفصة الصصص ‪ EEPROM‬التقليديصصة( حيصث يمكصصن اسصصتخدام بعصصض الوامصصر البرمجيصة‬

‫لتغير محتوى الص ‪ Flash memory‬أثناء تشغيل الممتحككم وبصدون اسصصتخدام أي مبرمجصصة‬ ‫خارجيصصصة )‪ .Programmer (burner‬يمكنصصصك معرفصصصة كافصصصة التفادصصصصيل مصصصن الملصصصف الصصصذي‬

‫أدصصصصدرته شصصصركة ‪ ATmel‬ويشصصصرح جميصصصع الوامصصصر البرمجيصصصة لهصصصذه الميصصصزة الرائعصصصة )بلغصصصة‬

‫السي(‪http://www.ATmel.com/Images/doc2575.pdf .‬‬

‫تختلف الممتحككمات فيمنا بينهنا علنى حسنب النن ‪ peripheral units‬الموجنودة بنداخلها وتقني ة‬ ‫معالجة البيانات سواء كانت ‪ 8‬أو ‪ 16‬أو ‪ 32‬بت‪.‬‬

‫ما معني ‪ 8‬بت أو ‪ 32‬بت؟‬

‫يعبر هذا الرقم عن حجصصم البيانصصات الصصذي يسصصتطيع المعالصصج المركصصز ‪ CPU‬داخصصل الممتحككصصم الصصدقيق‬ ‫أن يتعامل معه في النبضة الواحدة‪.‬‬

‫فمثل إذا كصصان الممتحككصصم مصصن نصصوع ‪ 8‬بصصت فصصإنه يسصصتطيع أن يجمصصع رقميصصن ‪ 8‬بصصت مصصع بعضصصهم فصصي‬

‫نبضة الواحدة‪ .‬لكن إذا جعلت المعالج يجمع رقمين بطول ‪ 16‬بت فإنه سيضصصطر أن يتعامصصل مصصع‬

‫الرقام على أكثر من مرة بحيث يجزأ الرقام إلى مجموعات ‪ 8‬بت فقط‪ .‬أما الممتحككمات الص ‪32‬‬ ‫بصصت تعنصصي أن المعالصصج يمتلصصك القصصدرة علصصى القيصصام بجميصصع العمليصصات الحسصصابية والمنطقيصصة علصصى‬

‫بيانات بطول ‪ 32‬بت في النبضة الواحدة‪.‬‬

‫‪37‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.3‬كيف تختار بين عائلات الـ ‪ AVR‬المختلفة‬

‫تعتصبر مهصارة اختيصار الممتحككصم المناسصب مصن أهصم مصا يجصب أن يتعلمصه أي مهنصدس نظصم مدمجصة‪.‬‬

‫حيث أن الشركات المنتجة للمتحكمات الدقيقة عصادة مصصا تصصنع المئصصات مصن الممتحككمصات الدقيقصة‬ ‫وتقسصصصمها إلصصى عصصصائلت تختلصصصف فيمصصصا بينهصصصا علصصصى حسصصب السصصصعر والمكانيصصصات لكصصصل ممتحككصصصم‪ .‬لصصذا‬

‫سيتوجب عليك أن تتقن إختيار الممتحككم المناسب لداء أفضل تصميم بأقل سعر ممكن‪.‬‬ ‫تعتبر أهم العوامل المؤثرة في تصنيف الممتحككمات الدقيقة هي‪:‬‬ ‫سرعة معالجة‬

‫عدد أطراف‬

‫عدد وإمكانيات‬

‫مساحة الذاكرة المجال أو البيئة‬

‫البيانات‬

‫التحكم العامة‬

‫الن ‪Peripheral‬‬

‫التي سيعمل بها‬

‫والستجابة‬

‫‪ GPIO‬والتي‬

‫‪Devices‬‬

‫المطلوبة‬

‫تمثل عدد‬

‫المتوفرة‬

‫المداخل‬

‫للممتحككم‬

‫والمخارج‬

‫المطلوبة والتي‬ ‫ستحدد حجم‬

‫الممتحككم مثل‬

‫البرنامج الذي‬

‫درجة الحرارة و‬

‫الممتحككم‬

‫الطاقة‬

‫سيوضع على‬

‫معدل استهلك‬

‫علصصى حسصصب العوامصصل الخمسصصة السصصابقة سصصنجد أن شصصركة ‪ ATmel‬قسصصمت ممتحككمصصات ‪ AVR‬إلصصى ‪6‬‬

‫عائلت أساسية منها أربعة عائلت عامصة ‪ General purpose microcontrollers‬ممصا يعنصي أنصه‬ ‫يمكصصصصن اسصصصصتخدامها لجميصصصصع مجصصصصالت النظصصصصم المدمجصصصصة ومختلصصصصف المنتجصصصصات‪ .‬وهنصصصصاك عصصصصائلتين‬

‫مصممتين لمنتجات محددة فقط‪:‬‬

‫العائلت العامة ‪General purpose microcontrollers‬‬ ‫‪megaAVR – 8 bit‬‬ ‫‪ATTiny – 8 bit‬‬ ‫‪AVR Xmega – 8 & 16 bit‬‬ ‫‪AVR - 32 bit‬‬

‫‪38‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫العائلت الممتخصصة ‪Special purpose microcontrollers‬‬ ‫‪ Automotive AVR‬هذه العائلة ممصممة للنظمة المدمجة الخادصصصة بالسصصيارات لصذا فهصصي تتميصصز‬ ‫بتحمصصل الظصصروف القاسصصية مثصصل درجصصات الحصصرارة المرتفعصصة )يمكنهصصا العمصصل فصصي بيئصصة تصصصل درجصصة‬ ‫حرارتهصصصا إلصصصى ‪ 150‬درجصصصة مئويصصصة(‪ ،‬كمصصصا تحتصصصوي علصصصى نظصصصم تشصصصفير خادصصصصة لحمايصصصة المعلومصصصات‬ ‫المخزنصصة بصصداخلها وكصصذلك تحتصصوي علصصى أنظمصصة حمايصصة مصصن مشصصاكل التيصصار الكهربصصي وفصصرق الجهصصد‬ ‫)مثل حدوث قصر في الدائرة ‪(short circuit‬‬ ‫‪ Battery Management‬عائلصصصة الممتحككمصصصات الخادصصصصة بصصصإدارة وتشصصصغيل البطاريصصصات‪ ،‬ومصصصصممة‬

‫لتدير عملية الشحن والتفريغ المن للبطاريات‬

‫سيرتكز الكتاب على شرح العائلة الولى والثانية ‪ mega, ATTiny‬باعتبارهم أشهر العائلت‬ ‫وأكثرها توافراا على مستوى العالم‬

‫الصورة التالية توضح ترتيصصب القصصوة والمميصصزات الصصتي تحتويهصا كصصل عائلصة‪ ،‬حيصث نجصد أن الخصط‬ ‫الفقصصي يعصصبر عصصن قصصوة الداة ‪ Performance‬والخطصصأ الرئسصصي يعصصبر عصصن مصصدى انخفصصاض اسصصتهلك‬

‫الطاقة‪.‬‬

‫‪39‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫عند الضغط على أي من أسماء العائلت بالعلى ستنتقل إلى دصفحة على موقصصع ‪ Atmel‬توضصصح‬

‫جميصصع أفصصراد هصصذه العائلصصة مصصن الممتحككمصصات مصصع عصصرض سصصريع لخصصصائص كصصل ممتحككصصم مثصصل حجصصم‬

‫الذاكرة وعدد أطراف الممتحككصم‪ .‬ه ذه الصصفحة تقصدم مقارنصة سصريعة بيصن الممتحككمصات لتسصاعدك‬

‫على اختيار الممتحككم النسب لمشروعك‪.‬‬

‫عند الضغط علصى اسصم أي مصن الممتحككمصات مثصل ‪ ATmega16‬س يتم نقلصك إلصى دصصفحة الممتحككصم‬

‫والتي تحتوي علصى جميصع البيانصات المتعلق ة به ذا الممتحككصم بمصا فصي ذلصك أهصم ملصف وهصو "دلينل‬

‫البيانننات ‪ "Datasheet‬والصصذي يتصصوفر منصصه نسصصختين‪" summery ،‬مختصصصر سصصريع" أو الصصدليل‬

‫الكامل ‪.complete‬‬

‫في هذا الكتاب دائما سنستخدم الدليل الكامل من أي ‪ .Datasheet‬لذا قم بتحميل كل من‬ ‫الدليل الخاص بالمتحكم ‪ ATmega16‬و ‪ATtiny84‬‬

‫مصصصن خلل الصصصصفحات السصصصابقة وملفصصصات الصصصص ‪ Datasheet‬يمكنصصصك تحديصصصد الممتحككصصصم الصصصدقيق الصصصذي‬ ‫يمتلصصك المكانيصصات المناسصصبة للمشصصروع الصصذي تريصصده‪ .‬بالتأكيصصد اختيصصار الممتحككصصم يجصصب أن يكصصون‬

‫مقترن بخبرتك في مجال البرمجة وتحسين الكواد المكتوبة للستفادة القصوى من الممتحككصم‪.‬‬

‫لصصصذا سصصصنجد أن مهصصصارة اختيصصصار الممتحككصصصم المناسصصصب سصصصتزداد عنصصصدما تتقصصصن برمجصصصة هصصذا النصصصوع مصصصن‬

‫الممتحككمات‪.‬‬

‫‪40‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.4‬قراءة دليل البيانات‬

‫‪Datasheet‬‬

‫تسصصاعدك الصصص ‪ Datasheet‬علصصى فهصصم الممتحككصصم الصصدقيق بصصصورة مفصصصلة فهصصي تحتصصوي علصصى طريقصصة‬

‫تشصصصصغيله وبرمجتصصصصه‪ ،‬وتحتصصصصوي أيضصصصصاا علصصصصى جميصصصصع البيانصصصصات التقنيصصصصة المتعلقصصصصة بصصصصالمتحكم مثصصصصل‪:‬‬

‫جلت‪ ،‬الطاقصصصة‪ ،‬تقنيصصصات البرمجصصصة‪ ،‬كيفيصصصة تفعيصصصل‬ ‫التصصصصميم الصصصداخلي‪ ،‬وظصصصائف الطصصصراف‪ ،‬الممسصصص ك‬

‫القدرات التي يملكها الممتحككم أو إلغائها … الخ‪ .‬وتعتبر المرجع الشامل لي ممتحككم‪.‬‬

‫سصصنتناول الموضصصوعات المختلفصصة فصصي دليصصل البيانصصات علصصى مصصدار فصصصول الكتصصاب بالكامصصل‪ ،‬حيصصث‬

‫سنتعلم في كل فصل أحد الخصائص التي تتمتصع بهصصا ممتحككمصصات ‪ AVR‬وسنحصصصل علصى تفادصصيل‬

‫هذه الخصائص من دليل البيانات‪.‬‬

‫هصصصذا الفصصصصل سصصصيركز علصصصى الجصصصزء الول مصصصن دليصصصل البيانصصصات والصصصذي غالبصصصاا مصصصا يكصصصون أول ‪ 5‬أو ‪8‬‬

‫دصفحات ويحتوي على النظرة العامة للممتحككم‪.‬‬

‫الصفحة الولى من دليل بيانات ‪ATmega16‬‬

‫‪41‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.5‬الخصائص العامة للممتحكك م‬

‫‪ATmega16/ATmega32‬‬

‫في الصفحة الولى من دليل البيانات نجد المعلومات المتعلقة بالخصائص العامة للممتحككم )مصصع‬

‫العلم أن هذه الخصصصائص تكصصون مشصتركة بيصصن معظصصم أفصصراد العائلصصة مصصن الممتحككمصصات وقصد تختلصصف‬

‫فيما بينها بفروقات بسيطة( وهي كالتالي‪:‬‬

‫المعمارية ‪Advanced RISC (Harvard based) Architecture‬‬ ‫يوضصصح هصصذا الجصصزء الخصصصائص العامصصة لتقنيصصة معالجصصة البيانصصات وسصصرعة الممتحككصصم الصصدقيق حيصصث‬

‫نجد أن الممتحككم يتمتع بالقدرات التالية‪:‬‬ ‫•‬

‫عدد ‪ single cycle execution Instruction – 131‬والتي تعني أن الممتحككم يمكن‬ ‫برمجتصصه باسصصتخدام ‪ 131‬أمصصر بلغصصة السصصمبلي ومعظصصم هصصذه الوامصصر يتصصم تنفيصصذها فصصي‬

‫نبضة واحدة فقط‪.‬‬ ‫•‬

‫‪ Mega Instruction Per Second (MIPS) 16‬وهي نفصصس الخادصصية السصصابقة والصصتي‬

‫تعنصصي أن الممتحككصصم يمكنصصه تنفيصصذ ‪ 16‬مليصصون أمصصر برمجصصي عنصصدما يتصصم تشصصغيله بصصتردد ‪16‬‬ ‫ميجصصاهرتز ) هصصذا بسصصبب أن معظصصم الوامصصر البرمجيصصة يمكنصصه تنفيصصذها فصصي نبضصصة واحصصدة‬

‫فقط(‪ .‬وتعبر هذه الخادصية عن أقصى سرعة معالجة للممتحككم الدقيق وتعتبر من أهصصم‬ ‫الخصائص التي تتمتع بها معالجات ‪.AVR‬‬ ‫مثال‪ :‬إذا كان لدينا برنامج مكون من ‪ 10‬أوامر بلغة السمبلي والمتحكم يعمل بسرعة ‪1‬‬ ‫ميجاهرتز )مما يعني أن زمن كل نبضة = ‪ 1‬ميكروثانية( فهذا يعني أن البرنامج سيستغرق‬ ‫تنفيذه زمن ‪ 10‬نبضات وهو ما يساوي ‪ 10‬ميكروثانية فقط‪.‬‬

‫•‬

‫‪ On-Chip 2 cycle multiplier‬فصصي الجيصصال القديمصصة مصصن المعالجصصات والممتحككمصصات‬ ‫الدقيقة كان يتم حسصاب عملي ة ضصرب الرقصام باسصتخدام الجمصع المتكصرر فمثل حادصصل‬

‫ضصصرب ‪ =10×12‬جمصصع رقصصم ‪ 12‬مصصع نفسصصه ‪ 10‬مصصرات )‪.....+12+12+12+12‬الصصخ(‪.‬‬ ‫وهذا يعني تنفيذ أمر "الجمع"‪ 10‬مرات )بلغة السمبلي( وبالتالي تستغرق وقصصت =‪10‬‬

‫نبضصصات‪ .‬أمصصا فصصي ممتحككصصم الصصص ‪ AVR‬نجصصد وحصصدة معالجصصة الضصصرب تقصصوم بتنفيصصذ أي عمليصصة‬ ‫ضرب في نبضتين فقط مما يسرع هذا النوع من العمليات الحسابية بصورة كبيرة‪.‬‬

‫‪42‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫الذاكرة عالية التحمل ‪High endurance Memory‬‬ ‫يوضح هذا الجزء الخصائص التي تمتاز بهصصا الصصذاكرة الموجصصودة داخصصل ممتحككمصصات ‪ AVR‬بأنواعهصا‬ ‫المختلفة مثل الص ‪ Flash‬والص ‪ RAM‬والص ‪ EEPROM‬ومن أهم هذه الخصائص التالي‪:‬‬ ‫•‬

‫‪ 16‬كيلننو بننايت مننن الننذاكرة الثابتننة ‪ Self-programmable Flash memory‬والصصتي‬

‫تسصصتخدم لحفصصظ البرنامصصج الصصذي سيشصصغل الممتحككصصم الصصدقيق وتتمتصصع بخادصصصية البرمجصصة‬ ‫الذاتية التي تحدثنا عنها سابقاا‪) .‬يمتلك ‪ ATmega32‬ذاكرة ثابتة ‪ 32‬كيلوبايت(‪.‬‬

‫•‬

‫‪ 512‬بايت )‪ 8 *512‬بت( من ذاكرة ‪EEPROM‬‬

‫•‬

‫‪ 1‬كيلوبايت من الذاكرة المؤقتة )العشوائية( ‪SRAM‬‬

‫•‬

‫إمكانية الكتابة)برمجة(\مسح محتوى ذاكرة الفلش نحو ‪ 10,000‬مرة‬

‫•‬

‫إمكانية الكتابة)برمجة(\مسح محتوى ذاكرة ‪ EEPROM‬نحو ‪ 100,000‬مرة‪.‬‬

‫•‬

‫الحتفاظ بالبيانات في كل من الن ‪ Flash‬والن ‪ EEPROM‬لمنندة زمنينة تصننل إلننى ‪100‬‬

‫عننام كامننل عنصصد تشصصغيل الممتحككصصم فصصي درجصصة حصصرارة ‪ 25‬درجصصة مئويصصة أو ‪ 25‬عصصام عنصصد‬

‫تشغيل الممتحككم في درجة حرارة ‪ 80‬درجصصة مئويصصة وهصذا يعنصصي أن الممتحككصصم يسصصتطيع‬ ‫العمل والحتفاظ بالبيانات لفترة طويلة جداا‪.‬‬

‫•‬

‫إمكانية استخدام ‪) Bootloader‬التفادصيل مذكورة في فصل الفيوزات(‪.‬‬

‫•‬

‫‪ True Read-While-Write Operation‬تعنصصي أن الممتحككصصم يسصصتطيع قصصراءة بيانصصات‬ ‫مصصصن الصصصص ‪ ROM‬بينمصصصا يقصصصوم بكتابصصصة بيانصصصات فصصصي الصصصص ‪ RAM‬فصصصي نفصصصس الصصصوقت علصصصى عكصصصس‬

‫الممتح ككمصصات القديمصصة والصصتي كصصانت تسصصتطيع أن تقصصوم باحصصدى هصصذه العمليصصات فقصصط فصصي‬ ‫نفس اللحظة‪.‬‬ ‫•‬

‫‪ Programming locks‬طبقصصة مصصن الحمايصصة لمنصصع سصصرقة البيانصصات المخزنصصة علصصى ذاكصصرة‬

‫الممتحككم باستخدام الص ‪) Lockbits‬التفصيل مذكورة في فصل الفيوزات(‪.‬‬

‫‪43‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫الجصصزاء التاليصصة مصصن دليصصل البيانصصات مثصصل ‪Jtag, Peripheral devices, Power consumption‬‬

‫سيتم شرحها في فصولها الخادصة‪.‬‬

‫‪Microcontroller packaging‬‬ ‫الحجصصصصم الحقيقصصصصي لشصصصريحة السصصصيليكون الصصصصتي‬

‫يتكصصون منهصصا الممتحككصصم الصصدقيق غالبصصاا مصصا يكصصون‬

‫دصصصصغير جصصصداا لدرجصصصة أنصصصه قصصصد يصصصصل إلصصصى حجصصصم‬

‫"رأس عصصصصصود ثقصصصصصاب" ممصصصصصا يجعصصصصصل اسصصصصصتخدامه‬ ‫مباشصصرة عمليصصة دصصصعبة‪ ،‬لصصذا يتصصم تصصصميم هيكصصل‬

‫خصصصصصارجي أكصصصصصبر حجمصصصصصاا مصصصصصن مصصصصصادة الصصصصصص ‪Epoxy‬‬

‫ويسصصصصصصمى الصصصصصصص ‪) Packaging‬الغلف( للممتحككصصصصصصم‬

‫دصورة توضح الممتحككم الدقيق من الداخل‬ ‫والذي ل يتخطى حجمه )في معظم‬

‫الحالت( أكثر من ‪ %10‬من حجم الغلف‬

‫الدقيق ‪,‬ويخصرج منصه بعصض الطصراف المعدني ة‬ ‫الصصصصصصصغيرة الصصصصصصتي تتصصصصصصصل بصصصصصصالمتحكم الصصصصصصدقيق‬

‫الحقيقي‪.‬‬

‫حجم شريحة السيليكون مقارنة بحجم إدصبع النسان‬

‫‪44‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫تتوفر الممتحككمات الدقيقة بكل النوعين من التغليف ‪ DIP‬و ‪ SMD‬و سنجد أن شركة أتمصصل عصصادة‬

‫مصصصا تقصصصوم بإدصصصصدار معظصصصم الممتحككمصصصات مصصصن عائلصصصة ‪ atmega‬و ‪ attiny‬بكل النصصصوعين ‪ DIP‬و ‪SMD‬‬ ‫فمثل سصصنجد فصصي الصصصفحة الثانيصصة مصصن دليصصل البيانصصات وحصصدات الصصص ‪ package‬الخادصصصة بصصالمتحكم‬

‫‪ ATmega16‬وهي‬

‫‪DIP‬‬ ‫‪SMD – TQFP‬‬

‫•‬ ‫•‬

‫ملحظة‪ :‬الص ‪ SMD‬يتوفر منه أحجام وأشكال مختلفة مثل ‪TQFP, BGA, QFN, MLF‬‬

‫عندما تقوم الشركات بصناعة منتج ما فإنها تفضل استخدام معظم الشرائح اللكترونية‬ ‫بتغليف ‪ ،SMD‬حيث تتميز برخص السعر مقارنة بالص ‪ DIP‬كما أنه يمكن تصميم دوائر تحتوي‬

‫على الكثير من المكونات بمساحة دصغيرة جداا بفضل الحجم الصغير الذي تتمتع به شرائح الص‬ ‫‪.SMD‬‬ ‫ونجد نتيجة لهذا المر أن العائلت المتطورة مثل ‪ AVR32‬أو ‪ Xmega‬غالباا ما يتم إنتاجها‬ ‫بتغليف ‪ SMD‬فقط وذلك لنها تحتوي على الكثير من الطراف )قد يصل إلى ‪ 120‬طرف( لذا‬ ‫سيكون من الصعب )والمكلف أيضاا( أن تصنع بتغليف ‪ DIP‬لن الحجم سيكون ضخم جداا‪.‬‬

‫‪45‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.6‬أطراف الممتحكك م‬

‫‪ATmega16‬‬

‫يتملصصك الممتحككصصم ‪ ATmega16‬مصصا مجموعصصة ‪ 40‬طصصرف ‪ – pin‬موزعصصة علصصى ‪ 4‬بورتصصات كصصل واحصصد‬ ‫منهصصصصم ‪ 8‬أطصصصصراف وهصصصصم ‪ PORTA, PORTB, PORTC, PORTD‬ومضصصصصاف إليهصصصصم مجموعصصصصة مصصصصن‬ ‫الطراف المتعلقة بالطاقة والتردد كما في الصورة التالية‪.‬‬

‫•‬

‫الطننرف ‪ RESET‬هصصذا الطصصرف يقصصوم بعمصصل ‪ RESET‬للممتحككصصم الصصدقيق ويعنصصي أنصصه سصصيعيد‬

‫جلت )يجعصل قيمتهصا بصصفر( ويعيصد تشصغيل البرنامصصج الموجصود ف ي‬ ‫تصفير جمي ع الممسص ك‬

‫ذاكصصرة الممتحككصصم مصصن البدايصصة‪ ،‬مصصع العلصصم أنصصه طصصرف ‪ active low‬يعنصصي يتصصم تفعيلصصه عنصصدما‬

‫يتصل بالرضي ‪ GND‬أو يحصل على إشارة ‪ LOW logic‬لذا يجصصب أن يودصصصل دائمصصاا بالصصص‬ ‫‪ VCC‬عصصن طريصصق مقاومصصة ‪ 10‬كيلصصو اوم )وإل سصصيظل الممتحككصصم يقصصوم بعمصصل ‪ RESET‬ولصصن‬

‫يشغل البرنامج الممخزن بالذاكرة أبداا(‪.‬‬

‫‪46‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫•‬

‫الطننرف ‪ VCC‬هصصذا الطصصرف الصصذي يسصصتقبل الطصصرف المصصوجب للبطاريصصة أو مصصصدر الطاقصصة‬

‫المسصصصتخدم )يجصصصب أن يكصصصون مصصصوجب بدايصصصة مصصصن ‪ 2.7‬فصصصولت حصصصتى ‪ 5.5‬فصصصولت بحصصصد‬

‫أقصى(‪.‬‬ ‫•‬

‫الطننرف ‪ GND‬الطصصرف الرضصصي للممتحككصصم ويتصصم تودصصصيله بصصالطرف الرضصصي للبطاريصصة أو‬

‫مصدر الكهرباء المستخدم‪ .‬قد تتساءل لما يمتلك الممتحككم زوج من اﻷطنراف ‪GND‬؟‬

‫السر هو تقليل الضجيج الكهربي ‪ ،Noise‬فعنصصدما يتواجصد أكصصثر مصصن مسصصار للرضصصي فصصإن‬

‫ذلك يحسن فصصي القضصصاء علصصى الصصص ‪ Noise‬خادصصصة إذا كصصان الممتحككصصم يقصصوم بتوليصصد إشصصارات‬

‫عالية السرعة )بالميجاهرتز(‪.‬‬ ‫•‬

‫الطرفننان ‪ XTAL1, XTAL2‬الطصصراف الصصتي يتصصم تودصصصيلها بصصدائرة المذبصصذب الخصصارجي‬

‫والصصتي سصصنتعرف علصصى جميصصع أنواعهصصا بالتفصصصيل فصصي فصصصل )الفيصصوزات‪ ،‬سصصرعة التشصصغيل‬

‫والطاقة(‪.‬‬ ‫•‬

‫الطننرف ‪ AVCC‬اختصصصار لكلمصصة ‪ ADC VCC‬هصصذا الطصصرف مسصصؤول عصصن تشصصغيل المحصصول‬

‫التنصصاظري الرقمصصي ‪ ADC‬الموجصصود داخصصل الممتحككصصم ويجصصب أن يتصصم تودصصصيله دائمصصاا بنفصس‬ ‫الجهد الذي يتصل به الص ‪.VCC‬‬

‫•‬

‫الطرف ‪ AREF‬اختصار كلمة ‪ Analog Refrence‬والذي سيتم شرحه بالتفصصصيل مصصع الصصص‬ ‫‪ADC‬‬

‫بصصاقي أطصصراف الممتحككصصم موزعصصة علصصى البورتصصات المختلفصصة ‪ A,B,C,D‬والصصتي تمتلصصك القصصدرة علصصى‬ ‫التحكم بالمكونات اللكترونية المختلفة كما تستطيع استقبال البيانات القادمصصة مصصن الحساسصصات‬

‫)سصصواء كصصانت رقميصصة أو تماثليصصة( لصصذا تسصصمى " منافصصذ إدخصصال\إخصصراج عامصصة" ‪ GPIO‬كمصصا تمتلصصك‬ ‫مجموعصصصصصة مصصصصصن الوظصصصصصائف الضصصصصصافية ‪ Alternative functions‬مثصصصصصل التصصصصصصالت التسلسصصصصصلية‪،‬‬ ‫المقاطعات ‪ ..‬الخ‪ ،‬والتي سنتعرف عليها تبعا في الفصول التالية‪.‬‬

‫‪47‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.7‬عائلة‬

‫‪ATTiny‬‬

‫تعتصصصصبر هصصصصذه العائلصصصصة مصصصصن الممتحككمصصصصات حديثصصصصة‬

‫نسصصصصبياا وهصصصصي مخصصصصصصة للسصصصصتخدامات الصصصصتي‬

‫تحتاج ممتحككم دقيق دصغير الحجم وسريع في‬ ‫ذات الصصوقت دون التضصصحية بصصالمميزات الكاملصصة‬

‫الصصصتي قصصصد تجصصصدها فصصصي معظصصصم الممتحككمصصصات لصصصذا‬ ‫قامت شركة ‪ ATmel‬بإنتاج هذا الجيصصل المتميصصز‬

‫مصصصن الممتحككمصصصات والمسصصصمى ‪ ATTiny‬اختصصصصاراا‬ ‫لعبارة ‪. ATmel Tiny‬‬

‫دصورة روبوت دصغير باستخدام الممتحككم‬ ‫‪ATTiny85‬‬

‫عنصصدما ننظصصر للصصصفحة الولصصى مصصن دليصصل البيانصصات للمتحكمصصات ‪ ATTiny 45/84/85‬نجصصد أن هصصذه‬

‫الممتحككمصصصصات تمتلصصصك معظصصصم القصصصدرات الموجصصصصودة فصصصي سلسصصصلة ‪ megaAVR‬فهصصصي تمتلصصصصك نفصصصس‬ ‫المعمارية وتعمل بسرعات تصل إلى ‪ 20‬ميجاهرتز مع القدرة على تنفيذ ‪ 20‬مليون أمر برمجي‬ ‫فصصصصصصي الثانيصصصصصصة الواحصصصصصصدة )هصصصصصصذا يعنصصصصصصي أنهصصصصصصا تتفصصصصصصوق علصصصصصصى الممتحككمصصصصصصات القصصصصصصدم نسصصصصصصبياا مثصصصصصصل‬

‫‪.(ATmega16/32/128‬‬

‫‪48‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫الفارق الساسي بين هذه العائلصة و ‪ megaAVR‬هصو الحجصم وع دد الطصراف الصتي تعمصل كصص ‪GPIO‬‬

‫حيث نجد أدصغر ممتحككم في هذه العائلة يملصصك ‪ 6‬أطصصراف فقصصط منهصصم ‪ GPIO 4‬و ‪ 2‬للطاقصصة مثصصل‬ ‫‪ .ATTiny4/5/9/10‬وتتميز ممتحككمات هذه العائلة بالقدرة على العمل بفرق جهد ‪ 1.8‬فولت‪.‬‬

‫مجموعة من أدصغر الممتحككمات من شركة أتمل مقارنة بعملة معدنية و تسمى ‪ATTiny10‬‬

‫بالرغم من الحجم الصغير جداا إل أن هذه الممتحككمصصات تتضصصمن معظصصم الصصص ‪Peripheral Devices‬‬

‫الموجصصودة فصصي ممتحككمصات ‪ megaAVR‬فمثل الممتحككصصم ‪ ATTiny85‬بصصالرغم مصصن امتلكصه ‪ 6‬أطصصراف‬ ‫تحكم فقط إل أنه يمكن تشغيلها كص ‪.GPIO, ADC, PWM, SPI‬‬

‫‪49‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬ ‫سنستخدم في التجارب القادمصة الممتحككصم ‪) ATtiny84‬بجصانب الممتحككصم ‪ (ATmega16‬والصذي‬

‫يمتلك ‪ 12‬طرف تحكم و ‪ 2‬طرف للطاقة‪.‬‬

‫أيضاا تتميز هذه الممتحككمات بالستهلك المنخفض جداا للطاقصصة‪ .‬حيصث يمكنهصصا العمصصل علصصى فصصارق‬ ‫جهد ‪ 1.8‬فولت واستهلك تيصار يصصل إلصى ‪ 300‬ميكروأمصبير = ‪ 0.000300‬أمصبير )‪ 300‬جصزء‬ ‫مصصن مليصصون مصصن المصصبير( وهصصو مصصا يعنصصي اسصصتهلك أقصصل بنحصصو ‪ 12‬مصصرة مصصن اسصصتهلك ممتحككمصصات‬

‫‪ megaAVR‬والتي تستهلك تيار كهربي بمقدار ‪ 1‬مللي أمبير )‪ 1000‬ميكروأمبير( على القل‪.‬‬ ‫إدارة استهلك الطاقة مشروحه بالتفصيل في الفصل السابع‬

‫‪50‬‬

‫‪ .2‬ظنظرة عامة على ممتحككمات ‪AVR‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 2.8‬تمارين إضافية‬ ‫•‬

‫قصصصارن بيصصصن الخصصصصائص الصصصتي يتمتصصصع بهصصصا الممتحككصصصم ‪ ATmega16‬والمتحكصصصم ‪ATmega32‬‬ ‫والمتحكم ‪ ATTiny84‬من حيث الذاكرة وعدد أوامر البرمجة‪.‬‬

‫•‬

‫كصصصم عصصصدد البورتصصصات الصصصتي يملكهصصصا الممتحككصصصم ‪ ATTiny84‬ومصصصا هصصصي أسصصصماؤها؟ هصصصل جميصصصع‬

‫•‬

‫إذا قمنصصا بكتابصصة برنامصصج مكصصون مصصن ‪ 100‬أمصصر بلغصصة السصصمبلي بصصدون اسصصتخدام أي أمصصر‬

‫البورتات تمتلك ‪ 8‬أطراف مثل الممتحككم ‪ ATmega16‬أم يوجد اختلف ؟‬

‫تأخير وتم تشغيل نفس البرنامج على الممتحككم ‪ ATmega16‬والمتحكم ‪ ،ATTiny84‬أي‬ ‫المتحكمين سيقوم بتنفيذ البرنامج أسرع ولماذا؟‬

‫نصيحة‪ :‬لمعرفة الحل انظر إلى فارق سرعة تنفيذ الوامر ‪ MIPS‬في الصفحة الولى من‬ ‫دليل البيانات لكل ممتحككم ثم احسب زمن تشغيل البرنامج على كل ممتحككم‪.‬‬

‫•‬

‫إذا كصصصان عصصصدد الوامصصصر البرمجيصصصة لنظصصصام تحكصصصم يصصصصل إلصصصى خمسصصصة كيلوبصصصايت فمصصصا هصصصو‬

‫الممتحككصصصم المناسصصصب لتشصصصغيل هصصصذا البرنامصصصج )اخصصصتر مصصصا يصصصصلح مصصصن بيصصصن ‪ATmega16,‬‬ ‫‪(ATmega32, attiny45, attiny85, ATtiny84‬؟ وإذا كصصصصصصان حجصصصصصصم البرنامصصصصصصج ‪17‬‬

‫كيلوبايت هل تصلح جميع اختياراتك السابقة؟‬

‫‪51‬‬

AVR ‫ ظنظرة عامة على ممتحككمات‬.2 .............................................................................................. …

‫ مراجع إضافية‬2.9 ATTiny ‫مقارنة شاملة بين عائلة الممتحككمات‬ ➢ www.microfusion.de/e-/Microcontroller/AVR-Overview/ATtiny.html ➢ en.wikipedia.org/wiki/Atmel_AVR_ATtiny_comparison_chart megaAVR ‫مقارنة شاملة بين عائلة‬ ➢ ATmega32-avr.com/avr-comparison/

‫ و‬ATTiny ‫مرفق مع الكتاب ملف مقارنة شامل بين أفراد الممتحككمات في كل العائلتين‬ megaAVR

52

‫الفصل الثالث‬ ‫” هناك اختياران مبدئيان في الحياة‪ :‬إما أن تتقبل‬

‫ظروف الوضع الحالي كما هي‪ ،‬أو أن تتقبل مسؤولية‬

‫تغيير هذا الوضع ‟‬

‫د‪ .‬دينيس ويتلي – كاتب ومحاضر أمريكي‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪ .3‬تجهيز أدوات التجارب‬

‫يوضح هذا الفصصصل الدوات الصصتي سنسصصتخدمها فصصي تطصصوير النظمصصة المدمجصصة‬ ‫سواء كانت العتصصاد "المكونصصات اللكترونيصصة" ‪ Hardware‬أو الدوات البرمجيصصة‬ ‫)‪ToolChain (Softwares‬‬ ‫✔ الممبرمجات )الحارقات ‪.(Burners‬‬ ‫✔ المكونات اللكترونية‬

‫✔ البرمجيات المستخدم في التطوير ‪Toolchain‬‬

‫‪54‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪ 3.1‬الممربرمجات‬ ‫تعتبر الممبرمجات من أهم القطصع اللكترونيصة لتعلصم الممتحككمصات الدقيقصة فهصي المسصؤولة عصن تحميصل‬ ‫البرنامج ال ذي نكتبصه علصى الحاسصب إلصى الممتحككصم الصدقيق نفسصه‪ .‬البعصض يحصب تسصميتها بالصصحارقات‬

‫‪ Burner‬نسبة إلى عملية حرق "الكود البرمجي" على الممتحككم‪.‬‬

‫يمكصصن اسصصتخدام العديصصد مصصن ال ممبرمجصصات المتصصوفرة فصصي السصصوق ولكصصن هنصصا سصصأذكر لصصك أفضصصل هصصذه‬

‫ال ممبرمجات وما يميزها ولك حرية الختيار بينها )أي واحدة منهم ستفي بالغرض(‪.‬‬

‫‪USBasp‬‬ ‫تعتصصصبر أحصصصد أبسصصصط وأشصصصهر الممبرمجصصصات الصصصتي تعمصصصل عصصصبر مصصصدخل ‪ usb‬التقليصصصدي وتتميصصصز بالسصصصعر‬

‫المنخفض حيث يمكنك دصناعتها بنفسك بتكلفة ‪ 3‬دولرات أو شرائها جاهزة بسعر يصصتراوح بيصصن‬

‫‪ 6‬إلى ‪ 9‬دولرات‪ ،‬كما أنها تحتوي على وضع الرفع البطيصصء ‪ slow clock rate mode‬وهصو مصصن‬

‫الوضاع المهمة في برمجة الممتحككمات عندما تعمل على سرعات منخفضة )سنتحدث عصصن هصصذا‬ ‫الوضع بالتفصيل في فصل التلعب بالترددات والطاقة( ‪ ،‬بهذا السعر المنخفصصض وسصصهولة البنصصاء‬

‫تعتبر ‪ USBasp‬أشهر مبرمجة الص ‪ AVR‬على الطلق‪.‬‬

‫الصور التالية هي أشكال مختلفة من نفس الممبرمجة‬

‫الإصدار الـ ‪ SMD‬من الممربرمجة ‪USBasp‬‬

‫الإصدار الـ ‪ DIP‬من الممربرمجة ‪USBasp‬‬

‫الموقع الرسمي للممبرمجة ‪ USBasp‬يحتوي على جميع ملفات التصميم التي يمكنك تحميلها‬ ‫مجاناا ودصناعتها بنفسك ‪www.fischl.de/usbasp‬‬

‫‪55‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪AVRISP mkII – Atmel‬‬ ‫الممبرمجصصة الرسصمية مصصن شصركة أتمصصل‪ ،‬وتعصد مصن الممبرمجصصات المتطصورة نسصبياا حيصث تصصدعم معظصصم‬ ‫عصصصائلت الصصصص ‪ AVR‬الصصصص ‪ 8‬بصصصت والصصصص ‪ 32‬بصصصت مثصصصل ‪ Xmega‬ويمكنهصصصا برمجصصصة الممتحككمصصصات بمختلصصصف‬ ‫السرعات من ‪ 500‬هرتز إلى ‪ 8‬ميجا هرتز )هذه السرعة تمثل سرعة نقل البيانات وليس سرعة‬

‫الممتحككم نفسه( ‪.‬‬

‫تعتصصبر ‪ AVRISP mkII‬أفضصصل مصصن ‪ USBasp‬بكصصثير حيصصث تصصدعم ‪ USBasp‬سصصرعات برمجصصة بحصصد‬

‫أقصى ‪ 5‬ميجا فقط – كما أنها تدعم برمجصصة الممتحككمصصات الصصتي تعمصصل بفصصرق جهصصد مصصن ‪ 1.8‬فصصولت‬ ‫حصصتى ‪ 5‬فصصولت‪ .‬بالتأكيصصد كصصل هصصذه المميصصزات تصصأتي علصصى حسصصاب السصصعر الصصذي يبلصصغ نحصصو ‪ 40‬دولر‬

‫تقريباا‪ .‬يمكنك قراءة كافة التفادصيل عنها من الرابط التالي‬ ‫‪http://www.ATmel.com/tools/AVRISPMKII.aspx‬‬

‫الممبرمجة ‪ AVRISP mkII‬من الخارج‬

‫الممبرمجة ‪ AVRISP mkII‬من الداخل‬

‫تحذير‪ :‬تنتشر بعض النسخ الصيني المزورة من هذه الممبرمجة بسعر منخفض )حوالي ‪10‬‬ ‫دولرات – ولديها نفس الغطاء الخارجي( احترس من هذه الممبرمجات لنها ل تحتوي على‬ ‫التصميم والمكونات الحقيقة للمبرمجة ‪ avrisp mkII‬وبالتالي ل تمتلك المميزات المذكورة‬ ‫سابقاا‪.‬‬

‫‪56‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪AVR Dragon‬‬ ‫إذا كنصصت تريصصد أقصصوى أداة للتعامصصل مصصع عصصائلت ‪ AVR‬إذاا عليصصك بهصصذا "التنيصصن" ‪ .‬تعتصصبر الممبرمجصصة‬

‫‪ AVR Dragon‬أقوى أداة للتعامل من ممتحككمات ‪ AVR‬فهي تعمل كمبرمجة ‪ SPI‬أو ‪ OCD‬أو ‪PDI‬‬

‫وكمنقح ‪ Jtag Debugger‬ويمكنها معالجة الفيوزات والبرمجة بالفولتية العالية ‪High voltage‬‬ ‫‪ burner – 12 Volt‬ويمكنها دصيانة الممتحككمات المعطوبة أو نسخ ومعالجصصة المحتصصوى المكتصصوب‬

‫على الممتحككمات )سيتم شرح الفيوزات بالتفصيل في الفصل الخاص بها(‪.‬‬

‫يمكنصصصك الطلع علصصصى تفادصصصصيل هصصصذه الممبرمجصصصة مصصصن موقصصصع ‪ Atmel‬الرسصصصمي مصصصن الرابصصصط التصصصالي‪:‬‬ ‫‪www.ATmel.com/webdoc/avrdragon‬‬

‫تتصصوفر هصصذه الممبرمجصصة بسصصعر ‪ 55‬دولر أمريكصصي‪ ،‬وتعتصصبر مصصن الدوات الممخصصصصة للمحصصترفين لمصصا‬ ‫تملكه من إمكانيات متطورة‪.‬‬

‫‪57‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫الممربرمجات ذات التغطية العامة ‪Universal Programmers‬‬ ‫هصصذا النصصوع مصصن الممبرمجصصات يمكنصصه التعامصصل مصصع جميصصع الممتحككمصصات الدقيقصصة وشصصرائح الصصذاكرة مصصن‬

‫مختلصصصصف الشصصصصركات فمثلا معظصصصصم هصصصصذه الممبرمجصصصصات يمكنهصصصصا برمجصصصصة ‪PIC, AVR, ARM, 8051,‬‬ ‫‪, EPROM‬والمزيد من الشرائح والممتحككمات‪ .‬غالباا تسصتخدمها شصركات الصصيانة والتطصوير لنهصا‬ ‫توفر الجهد وتوفر شراء العديد من الممبرمجات لمختلف النواع‪.‬‬

‫المشكلة الوحيدة لهذا النوع هصو سصصعرها المرتفصصع جصصداا والصصذي يبصصدأ مصصن ‪ 100‬دولر وحصتى ‪1200‬‬

‫دولر )قد يبدو رقم ‪ 1200‬دولر ضخم لكن لصك أن تتخيصل أن هصذه الممبرمجصصات يمكنهصا التعامصصل‬ ‫مع أكثر من ‪ 8000‬شريحة إلكترونية من مختلف الشركات على هذا الكوكب(‪.‬‬ ‫ل أنصحك بشراء هذا النوع إل إذا كنت ترغب في تعلم استخدام أكثر من نوع من‬ ‫الممتحككمات الدقيقة ول تريد أن تتعب نفسك بشراء مبرمجات مختلفة‪.‬‬

‫‪58‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪Arduino as ISP‬‬ ‫قصد يسصصتغرب البعصصض لمصصا تصصم وضصع آردوينصو فصي قائمصصة الممبرمجصصات‪ ،‬الحقيقصة أن لوحصصات آردوينصصو‬ ‫المختلفة يمكنها العمل كمنصة تطصصوير ‪ AVR‬لنهصصا مصصن السصصاس عبصصارة عصصن شصصريحة ‪Atmega328‬‬ ‫مضصصاف إليهصصا بعصصض المكونصصات البسصصيطة ‪ +‬ممحصصول ‪ .USB-ttl converter‬هصصذه اللوحصصات يمكنهصصا‬

‫برمجة ‪ AVR‬بطريقتين‪:‬‬ ‫الطريقنة اﻷولنى‪ :‬أن تقصوم برفصع برنامصج يسصمى ‪ ArduioISP‬علصى لوحصة آردوينصو والصذي س يقوم‬ ‫بتحويل اللوحصة إلصصى مبرمجصة مشصابهه لصصص ‪ USBasp‬ويمكنصك بعصدها أن تودصصصلها بصأي شصصريحة ‪AVR‬‬ ‫لتبرمجهصصا كمصصا فصصي الصصصورة التاليصصة والصصتي يتصصم اسصصتخدام لوحصصة آردوينصصو بهصصا لبرمجصصة شصصريحة‬

‫‪ ATmega32‬أو ‪ATmega16‬‬

‫‪59‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫الطريقنننة الثانينننة‪ :‬أن تسصصتخدم لوحصصة آردوينصصصو نفسصصصها كصصصص ‪ AVR development board‬حيصصث‬

‫يمكنك الكتابة بلغة السي ‪ ANSI- C‬داخل برنامج آردوينو‪.‬‬

‫في الواقع معيار آردوينو البرمجي ما هو إل لغة السي ومضصصاف إليهصصا بعصصض المكتبصصات البرمجيصصة‬

‫لذا يمكنك بسهولة أن تكتب أي برنامج ‪ ANSI - C‬داخل برنامج آردوينو‪.‬‬

‫الخبر الجيد أنه في حالة امتلكك لوحة آردوينصو فل داعصي لشصراء أي مبرمجصة إضصافية ويكفصي‬

‫فقط أن تشتري باقي المكونات المطلوبة وتستغل لوحة آردوينو لتقوم بهذا العمل‪.‬‬ ‫الروابط التالية تشرح استخدام آردوينو كمبرمجة )مثل الطريقة الولى(‪:‬‬

‫‪➢ www.youtube.com/watch?v=_ZL-YNOH_jA‬‬ ‫‪➢ www.arduino.cc/en/Tutorial/ArduinoISP‬‬ ‫‪➢ www.instructables.com/id/AVR-Programming-with-Arduino-AVRdude-and‬‬‫‪AVR-gcc/‬‬ ‫شخصننياا أسننتخدم الممبرمجننة ‪ USBasp‬فنني أغلننب اﻷوقننات وتعتننبر الممبرمجننة المفضننلة لنندي‬ ‫بسبب سعرها المنخفض وسهولة صناعتها في المنزل‪.‬‬ ‫في هذا الكتاب سنعتمد على شريحة ‪ ATmega16‬و شريحة ‪ ATTiny‬لذا فالطريقة الثانية من‬ ‫استخدام آردوينو كلوحة تطوير ‪ AVR‬وبالتحديد الممتحككم ‪ atmega328‬قد تحتاج أن تعدل‬ ‫بعض الكواد البرمجية المذكورة في الكتاب )خادصة الكواد المذكورة بدئاا من الفصل السابع‬ ‫حتى نهاية الكتاب( وذلك بسبب اختلف أسماء بعض الممسجلت ‪ Register‬وأسماء بعض‬ ‫المخارج والمداخل‪ ،‬لذا إذا رغبت في استخدام آردوينو كص ‪ AVR board‬فأحرص على تغير‬ ‫جلت لتناسب المثلة‪.‬‬ ‫أسماء الممس ك‬

‫أيضاا سيتم شرح الص ‪ Datasheet‬لكل ممتحككم‪ .‬والتي من خللها يمكنك تغيير هذه السماء‬

‫بسهولة و تطبيق كافة الكواد مع تعديلها قليلا لتتناسب مع الممتحككم ‪ Atmega328‬بدلا من‬ ‫الممتحككمات المذكورة سابقاا‪.‬‬

‫‪60‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪ 3.2‬المكونات اﻹلـكترونية‬

‫سصصتحتاج لبعصصض المكونصصات اللكترونيصصة لداء التجصصارب فصصي هصصذا الكتصصاب‪ ،‬بعصصض هصصذه المكونصصات‬

‫واجصصب تصصوافره والبعصصض الخصصر ميسصصتخلدم فقصصط فصصي التجصصارب الضصصافية لصصذا احصصرص علصصى اقتنصصاء‬

‫المكونصصات الصصتي سصصيكتب بجانبهصصا )واجننب( – أمصصا المكونصصات الصصتي سصصيكتب بجانبهصصا )اختينناري(‬ ‫فيمكنك الستغناء عنها )ومع ذلك أنصحك بشرائها حتى تستفيد بأكبر قدر من التجارب(‪.‬‬ ‫)واجننب( هصصذا هصصو الممتحككصصم الرئيسصصي الصصذي سصصنقوم بعمصصل‬

‫التجارب عليصصه‪ ،‬وفصصي حالصصة عصصدم تصصوافره لصصديك فصصي السصصوق‬

‫المحلصصصصي يمكنصصصصك اسصصصصتخدام البصصصصديل المماثصصصصل ‪ATmega32‬‬ ‫شريحة ‪ATmega16‬‬ ‫شريحة ‪ATTiny84‬‬

‫والصصصصذي يمصصصصاثله فصصصصي معظصصصصم الصصصصتركيب الصصصصداخلي باسصصصصتثناء‬

‫مساحة الذاكرة‪.‬‬

‫)اختياري( الممتحككم ‪ATTiny84‬‬ ‫)واجب( عدد ‪ 1‬كريستالة )ذات طرفين( ‪ 16‬ميجا‬

‫كريستالة‪ 16 :‬ميجاهرتز‬ ‫مكثف سيراميكي )واجب( عدد ‪ 2‬مكثف على القل‪.‬‬

‫‪ 22‬بيكوفصصصصصصصصصصصصصصصاراد هصصصصذه المكثفصصصصات سصصصصعرها رخيصصصصص جصصصصداا وحجمهصصصصا دصصصصصغير‬ ‫‪picofarad‬‬

‫وسصصصصهلة الضصصصصياع لصصصصذا يفضصصصصل أ ن تشصصصصتري منهصصصصا ‪ 10‬أو ‪20‬‬

‫قطعة )الص ‪ 20‬قطعة ستكلفك نصف دولر فقط(‪.‬‬ ‫كابل مبرمجة ‪ISP‬‬

‫)واجب( عدد ‪ 1‬كابل‬

‫ميسصصصتخلدم هصصصذا الكابصصصل فصصصي تودصصصصيل الممبرمجصصصة بصصصالمتحكم‬

‫الصصصدقيق )غالبصصصاا قصصصد تجصصصده مصصصع الممبرمجصصصة نفسصصصها عندئصصصذ ل‬ ‫داعي لشراءه(‪.‬‬

‫‪61‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫)واجننننب( عصصصصدد ‪ 10‬قطصصصصع دايصصصصود ضصصصصوئي )يفضصصصصل اللصصصصون‬ ‫الحمر أو الخضر( ويفضل عدم استخدام اللون البيض‬

‫دايودات ضوئية )ليد ‪(LED‬‬ ‫شصصصصريحة عصصصصرض أرقصصصصام "مقاطعصصصصة )واجب( عدد‪ 2 :‬قطعة‬ ‫سصصصصصصصصصصصصصصصصصصصصصصباعية"‬ ‫‪seven‬‬ ‫‪Segment‬‬

‫من المكونات الهامة والبسيطة فصصي ذات الصصوقت‪ ،‬تسصصتخدم‬

‫فصصصي عصصصرض الرقصصصام عصصصن طريصصصق ‪ 7‬دايصصصودات ضصصصوئية لصصصذا‬

‫تسصصصصصصمى الشصصصصصصريحة ذات المقصصصصصصاطع السصصصصصصبعة ‪Segment 7‬‬ ‫ويفضل الحصول على النوع ذا الطرف السصصالب المشصصترك‬

‫‪common cathode‬‬ ‫حسصصصصصصصصصصصصصصصصصصصصصصصصاس‬

‫الحصصصصصصصصصصصصصصصصصصصصصصصصرارة‬ ‫‪LM35‬‬ ‫مقاومصصصة ضصصصوئية‬ ‫‪LDR‬‬

‫)اختياري( عدد ‪ 1‬حساس حرارة والذي سنسصصتخدمه فصصي‬ ‫فصل الحساسات التماثلية‬

‫)اختينناري( عصصدد ‪ 1‬مقاومصصصة ضصصوئية والصصصتي سنسصصصتخدمها‬ ‫في فصل الحساسات التماثلية‬

‫مقاومصصصصصصصصصصصصة متغيصصصصصصصصصصصصرة‬ ‫‪potentiometer‬‬

‫)واجننب( عصصدد ‪ 1‬مقاومصصة متغيصصرة ذات ‪ 3‬أطصصراف تودصصصيل‬ ‫مع عمود دوران‬

‫محرك ‪DC Motor‬‬

‫)واجننب( عصصدد ‪ 1‬محصصرك تيصصار مسصصتمر مثصصل الموجصصود فصصي‬ ‫اللعاب مثل السيارات‬

‫محرك ‪Stepper‬‬ ‫‪Motor‬‬ ‫)‪(bipolar‬‬

‫)اختياري( عدد ‪ 1‬محرك خطوي من نوع ‪ bipolar‬له سلك ذا‬ ‫‪ 4‬أطراف ويستخدم في تقنيات التحكم للماكينات‪ ،‬يجب‬ ‫أن ل يستهلك تيار أكبر من ‪ 500‬مللي أمبير )نصف أمبير(‬ ‫وسنتعرف عليه بالتفصيل في فصل المحركات‪.‬‬

‫‪62‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫‪ L293 H-bridge‬دائرة قيادة‬

‫)اختياري( دائرة قيادة المحركات )قنطرة ‪ (H‬وتعتصصبر مصصن‬

‫أهصصم الشصصرائح الصصتي سنسصصتخدمها فصصي التحكصصم بالمحركصصات‬

‫سواء الص ‪ DC‬أو الص ‪Stepper Motor‬‬

‫)واجب( عصصدد ‪ 4‬مفاتيصصح ضصصغط ذات أربعصصة أطصصراف‪،‬إذا لصصم‬ ‫تكصصن متصصوفرة فصصي السصصوق المحليصصة يمكنصصك شصصراء مفاتيصصح‬

‫مفتاح ‪Push button‬‬ ‫مفتصصصصصصصصصصصصصصصصصصاح ‪DIP‬‬ ‫‪switch‬‬ ‫‪Resistors‬‬ ‫‪ 10‬كيلواوم‬ ‫‪ 330‬اوم‬

‫الضغط ذات الطرفين فقط‪.‬‬ ‫)اختينناري( عصصدد ‪ 1‬مصصصفوفة ‪ DIP – ON- OFF‬ذا ثمانيصصة‬ ‫مفاتيح أو يمكنك شراء ‪ 2‬مصفوفة ذات ‪ 4‬مفاتيح‬

‫)واجب( عدد ‪ 8‬مقاومات من كل القيم المذكورة‬ ‫)‪ 10‬كيلواوم و ‪ 330‬اوم( بقدرة ربع وات أو‪:‬‬ ‫‪watt 1/8‬‬ ‫)واجننب( عصصدد ‪ 20‬سصصلك يمكنصصك شصصراء السصصلك الخادصصصة‬ ‫بلوحصصصة التجصصصارب مباشصصصرة ‪ Male to Male Jumpers‬أو‬ ‫يمكنصصك أن تصصصنعها بنفسصك عصبر شصصراء سصلك )خصصط تليفصون‬

‫أرضصصصصي ‪ 0.6‬مللصصصصي( وتقطعيهصصصصا بنفسصصصصك‪ ،‬شخصصصصصياا أفضصصصصل‬ ‫أسلك تودصيل‬

‫اسصصتخدام السصصلك الجصصاهزة‪ ،‬ويفضصصل أن تكصصون بطصصول مصصا‬

‫بين ‪ 10‬إلى ‪ 15‬سنتي متر‪.‬‬ ‫)واجننننب( عصصصصدد ‪ 1‬لوحصصصصة تجصصصصارب ‪ ،Breadboard‬احصصصصرص‬ ‫علصصى اقتنصصاء لوحصصة كصصبيرة الحجصصم ومصصن النصصوع الجيصصد لنهصصا‬

‫لوحة تجارب ‪Breadboard‬‬

‫‪63‬‬

‫ستكون المنصة التي ستطبق عليها مختلف التجارب‪.‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪ 3.3‬أدوات إضافية‬

‫مصصصصن المحبصصصصذ أن تمتلصصصصك مجموعصصصصة مصصصصن الدوات الضصصصصافية حيصصصصث ستسصصصصاعدك كصصصصثيراا فصصصصي تعلصصصصم‬

‫الممتح ككمات الدقيقة واللكترونيات بشكل عام لذا احرص على اقتنائها إذا لم تكن لديك بالفعل‪.‬‬ ‫القائمة التالية هي مثال على ما ينبغي أن تمتلكه‪:‬‬ ‫•‬

‫جهاز قياس متعدد )‪Digital Multimeter (AVO meter‬‬

‫•‬

‫عدة اللحام )كاوية ‪ +‬حامل للكاوية ‪ +‬حامل لوحات إلكترونية ‪(PCB holder‬‬

‫•‬

‫قصدير لحام من نوع ‪30-70‬‬

‫•‬

‫مقص أسلك )قصافه( ‪ +‬قشارة أسلك‪.‬‬

‫•‬

‫عدسة مكبرة‬

‫•‬

‫‪64‬‬

‫مجموعة من المفكات ‪ +‬ماسكة أسلك )بنسه(‪.‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫‪ 3.4‬تجهيز الربرمجيات‬

‫البرمجيصصات المخصصصصة للنظمصصة المدمجصصة )أو كمصصا تسصصمى ‪ Firmware‬فيصصرم‪-‬ويصصر( يتصصم تصصصميمها‬ ‫باسصصصتخدام "مجموعصصصة أدوات التطصصصوير" أو كمصصصا تعصصصرف باسصصصم ‪ Development toolcahin‬مصصصن‬

‫الرائصصصع أن هصصذه الدوات متصصصوفرة لمتحكمصصصات الصصصص ‪ AVR‬مجانصصصاا وبصصصصورة مفتوحصصصة المصصصصدر لجميصصصع‬ ‫أنظمصصصة التشصصصغيل‪ ،‬هصصذا يعنصصصي أن جميصصع البرمجيصصصات الصصصتي سنسصصصتخدمها مجانيصصصة تمامصصصاا ويمكنصصصك‬ ‫استخدامها بحرية بأي دصورة سواء كانت تعليمية أو تجارية‪ .‬مجموعة الدوات هي‪:‬‬ ‫•‬

‫المنننترجم ‪ – AVR-GCC Compiler‬البرنامصصصج الشصصصهير ‪ GCC‬يعتصصصبر أشصصصهر مصصصترجم فصصصي‬

‫العالم وهو البرنامج الرئيسي في أدوات التطوير و المسؤول عن تحويصصل اللغصصات عاليصصة‬

‫المسصصتوى مثصصل ‪ ++C/C‬إلصصى ملفصصات تسصصتطيع اللت أن تفهمهصصا)بالتعصصاون مصصع برامصصج الصصص‬

‫‪ Linker‬و الصصصص ‪ (Assembler‬قصصصامت شصصصركة ‪ ATmel‬بتعصصصديل الصصصص ‪ GCC‬ليعمصصصل مصصصع الصصصص ‪AVR‬‬

‫مباشصصصرة بمختلصصصف الدصصصصدارات ‪AVR32-GCC‬‬

‫الكتاب سنستخدم ‪ AVR-GCC‬فقط‪.‬‬ ‫•‬

‫‪ AVR-GCC-G++, AVR-GCC,‬فصصصي هصصصذا‬

‫اﻷدوات المساعدة ‪ – binutils‬مجموعة من الدوات التي تساعد المصصترجم فصصي إتمصصام‬

‫عملية تحويل البرنامج من اللغة عالية المستوى إلصصى ملصصف ‪ hex‬متكامصصل )الهيكصصس ‪hex‬‬

‫هي دصيغة نصية تمثل الص ‪ binary‬في دصورة أبسط وأكثر اختصاراا(‪.‬‬ ‫•‬

‫المكتبننننات البرمجيننننة )‪ – Libraries (LibC-avr‬مجموعصصصصة مصصصصن الكصصصصواد والتعريفصصصصات‬

‫المكتوبصصة مسصصبقاا بلغصصات عاليصصة أو أقصصل مسصصتوى لتسصصهل عمليصصة البرمجصصة علصصى المطصصورين‬ ‫وتحتصصوي علصصى بعصصض الكصصواد والوامصصر الجصصاهزة والصصتي تختصصصر الكصصثير مصصن وقصصت كتابصصة‬

‫البرامج‪.‬‬ ‫•‬

‫المنقننح ‪ – GDP debugger‬هصصذا البرنامصصج ميسصصتخلدم فصصي اكتشصصاف الخطصصاء البرمجيصصة‬ ‫والمساعدة في حل المشاكل التي تواجه المطور أثناء تشغيل واختبار البرنامج‪.‬‬

‫•‬

‫برنامننج الرفننع ‪ – AVRdude‬البرنامصصج المسصصتخدم فصصي رفصصع الملفصصات مصصن الحاسصصوب إلصصى‬

‫الممتحككمصصصصات الدقيقصصصصة مصصصصن نصصصصوع ‪ AVR‬ويمكنصصصصه أيضصصصصاا أن يقصصصصوم بعكصصصصس هصصصصذه العمليصصصصة‬ ‫)اسصصتخراج البرامصصج المكتوبصصة علصصى الممتحككمصصات( كمصصا يمكنصصه قصصراءة محتويصصات الصصذاكرة‬ ‫‪ EEPROM‬وكتابة الفيوزات )كما سنرى في الفصل الخاص بالفيوزات(‪.‬‬

‫‪65‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫هناك طريقتان لستخدام هذه الدوات‪ ،‬الولى هي تحميل الصصص ‪ toolchain‬ثصصم اسصصتخدام أي ‪IDE‬‬ ‫أو حصصتى محصصرر نصصصوص يصصدعم لغصصة السصصي \ السصصي‪ ++‬والطريقصصة الثانيصصة أن يتصصم تحميصصل منصصصة‬

‫التطصصوير المتكاملصصة مصصن شصصركة أتمصصل ‪ – ATmel Studio‬هصصذا البرنامصصج يحتصصوي علصصى كصصل الدوات‬

‫السابقة مدمجة بداخله )باستثناء ‪ AVRdude‬فقط(‪.‬‬

‫الطريقصصة الولصصى تصصصلح لجميصصع أنظمصصة التشصصغيل ومناسصصبة جصصداا لنظمصصة ‪ Linux‬و ‪ Mac‬أمصصا الثانيصصة‬

‫مع السف برنامج ‪ ATmel Studio‬متوفر على نظام ويندوز فقط‪ ،‬علصصى أي حصصال سصصأقوم بشصصرح‬ ‫كل الطريقتين حتى يصبح لك حرية اختيار البرامج وحرية استخدام أي نظام تشغيل تريده‪.‬‬ ‫أيضصصاا يمكنصصك اسصصتخدام برنامصصج المحاكصصاة الشصصهير بروتصصس ‪ Protues‬فصصي محاكصصاة جميصصع المثلصصة‬ ‫المصصصذكورة فصصصي فصصصصول الكتصصصاب دون الحاجصصصة لشصصصراء مكونصصصات إلكترونيصصصة حقيقصصصة‪ .‬مصصصع العلصصصم أن‬

‫برنامج بروتس يمكنه العمل على نظام لينكس أيضاا عبر استخدام محاكي ويندوز ‪Wine HQ‬‬ ‫معلومة إضافية‪ :‬برنامج ‪ Atmel Studio‬يعمل بنفس الص ‪ toolchain‬المذكورة سابقاا ومنها‬

‫المترجم ‪ AVR-GCC‬كذلك نجد أن برنامج آردوينو ‪ Arduino‬يعمل بنفس ال ‪ ،toolchain‬وهذا‬ ‫يعني أنه يمكنك استخدام برنامج آردوينو كص ‪ IDE‬خفيفة لتكتب برامج بلغة السي\السي‪++‬‬ ‫لبرمجة الص ‪ AVR‬ولكني ل أحبذ هذا الخيار لنه يفتقر للكثير من الوظائف الحترافية والهامة‬ ‫لمبرمجي النظمة المدمجة‪.‬‬

‫‪66‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫تجهيز اﻷدوات على نظام ويندوز‬ ‫توجه إلى موقع شركة ‪ Atmel‬لتحميل برنامج ‪ Atmel Studio‬من الرابط التالي‬ ‫‪http://www.ATmel.com/tools/atmelstudio.aspx‬‬

‫اختر نسخة البرنامج المتكاملة والمضاف إليها باقة أدوات الص ‪) NET.‬هصذه النسصخة تحتصوي علصصى‬

‫كل الملفات المطلوبة( وعصصادة مصصا تتميصصز بحجمهصصا الكصصبير لصصذا احصصرص علصصى أن يكصصون لصصديك اتصصصال‬

‫سريع بالنترنت عند تحميل البرنامج‪.‬‬

‫سيطلب منك الموقع أن تسجل حساب جديد )أو تسجل دخصول إذا كصان لصديك حسصاب بالفعصل(‪،‬‬

‫الحسصصصاب مجصصصاني تمامصصصاا وسصصصيوفر لصصصك تحميصصصل جميصصصع أدوات الشصصصركة مجانصصصاا‪ .‬بعصصصد النتهصصصاء مصصصن‬ ‫تسجيل الحساب يمكنك تحميل البرنامج‪.‬‬

‫‪67‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫بعصصد النتهصصاء مصصن تنصصصيب ‪ Atmel studio‬سصصنقوم بتحميصصل برنامصصج ‪ AVRdudess‬وهصصو برنامصصج‬

‫‪ avrdude‬مضاف إليه واجهة رسومية رائعة ومزودة بالعديد مصصن الخيصصارات الصصتي متسصصهل برمجصصة‬

‫شرائح الص ‪ ،AVR‬يمكنك تحميل البرنامج من الموقع التالي‪:‬‬ ‫‪http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude‬‬

‫تنصيب تعريفات الممبرمجة ‪USBasp‬‬ ‫هصصذا الجصصزء قصصد يختلصصف علصصى حسصصب الممبرمجصصة الصصتي ستسصصتخدمها‪ ،‬شخصصصياا أسصصتخدم ‪USBasp‬‬

‫لنها;كما ذكرت سابقاا رخيصة ومفتوحصة المصصصدر ويمكنصصك دصصناعتها بنفسصصك‪ .‬لصصذا اخترتهصصا كصأداة‬ ‫رئيسية للبرمجة في هذا الكتاب‪.‬‬

‫ملحظصصصة‪ :‬إذا كنصصصت تسصصصتخدم أحصصصد مبرمجصصصات ‪ ATmel‬مثصصصل ‪ AVRISP‬أو ‪ AVR Dragon‬يمكنصصصك‬ ‫تحميل التعريفات الخادصة بها من نفس دصفحة برنامج ‪ATmel studio‬‬ ‫في البداية توجه إلى موقع ‪ USBasp‬الرسمي وقم بتحميل الملف المضغوط الصصذي يحتصصوي علصصى‬ ‫جميع ملفات المشروع )ملفات التصميم والتعريفات(‬

‫‪68‬‬

‫‪http://www.fischl.de/usbasp‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫بعد النتهاء من التحميل قم بتودصيل لوحة ‪ USBasp‬بالحاسوب وقم بفك ضغط الملصصف‪ ،‬لحصصظ‬

‫أنصصه بمجصصرد تودصصصيل ‪ USBasp‬سصصيخبرك نظصصام وينصصدوز بصصأنه لصصم يسصتطع أن ينصصصب التعريفصصات كمصصا‬ ‫في الصورة التالية‪:‬‬

‫افتح مدير الجهزة ‪ Device Manager‬واختر ‪ USBasp - Uknowen device‬ثم اضغط ‪install‬‬ ‫‪ new driver‬كما في الصورة التالية‪:‬‬

‫‪69‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬ ‫اختر مكان ملفات التعريفات )الموجودة داخل الملف الذي قمنا بتحميله سابقاا(‬

‫إذا ظهرت رسالة تطلب تأكيد تنصيب التعريفات قم بالضغط على ‪Install‬‬

‫رائع ! أنت الن جاهز لتبدأ العمل على دصناعة النظمة المدمجة بالص ‪(: AVR‬‬ ‫إذا كنت تستخدم نظام ‪ windows 8.1‬أو ‪ Windows 10‬يجب أن تقوم بإغلق )نظام‬ ‫التعريفات الموثقة(‪ ،‬يمكنك قراءة التفادصيل من الرابط التالي‬ ‫‪http://www.atadiat.com/usbasp_win_driver/‬‬ ‫‪https://openchrysalis.wordpress.com/2014/09/26/installing-usbasp-driver‬‬‫‪software-in-windows-8-1/‬‬

‫‪70‬‬

‫‪ .3‬تجهيز أدوات التجارب‬ ‫… ‪..............................................................................................‬‬

‫تجهيز اﻷدوات على أنظمة لينكس‬

‫في أنظمة لينكس \ ماك \ ‪ FreeBSD‬يمكنصصك تنزيصصل جميصصع برامصصج الصصص ‪ toolchain‬مصصن مسصصتودعات‬ ‫البرامج الرسمية لكل نظام تشغيل‪ ،‬كما ستحتاج لملف ‪ MakeFile‬والذي سيقوم بتحويصصل الكصصود‬

‫إلى ملف ‪ hex‬بصورة تلقائية )ملف الص ‪ MakeFile‬مرفق مع الكتاب(‪.‬‬

‫أيضاا ستحتاج ‪ IDE‬أو محرر نصوص يدعم البرمجصة مثصصل البرنامصصج الرائصع ‪) CodeBlocks‬والصذي‬ ‫أستخدمه شخصياا( أو ‪ Eclips‬أو ‪ Sublime‬أو المحرر النصي ‪ Geany‬أو ‪ Vim‬أو ‪.Emacs‬‬ ‫نظام ‪Ubuntu / Debian‬‬ ‫يمكنصصصك تنصصصصيب جميصصصع الدوات مباشصصصرة عصصصبر المصصصر التصصصالي )تكتصصصب فصصصي طرفيصصصة سصصصطر الوامصصصر‬ ‫‪(Terminal‬‬

‫‪sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude‬‬ ‫نظام ‪Fedora / RedHat / CentOS‬‬ ‫يمكنك استخدام برنامج ‪ yum‬أو ‪) DNF‬الموجود في نظام فيدورا لينكس ‪ 22‬أو أعلى( وذلك‬

‫عبر الوامر التالية‬

‫‪sudo yum install avr-gcc avr-binutils avr-libc avr-gdb avrdude‬‬ ‫لنظام فيدورا ‪ 22‬أو أعلى‬

‫‪sudo dnf install avr-gcc avr-binutils avr-libc avr-gdb avrdude‬‬

‫تنصيب تعريفات ‪ USBasp‬على لينكس‬ ‫يحتصصوي الملصصف الرسصصمي علصصى تعريفصصات نظصصام لينكصصس )متوافقصصة مصصع جميصصع النظمصصة بل اسصصتثناء(‬ ‫وهي عبارة عن ملصصف ‪ udev rules‬وسصكربت تنصصيب‪ ،‬كصل مصا عليصصك فعلصصه أن تفتصح المجلصصد الصصذي‬ ‫يحتوي على التعريفات وتشغل سكربت التنصيب بصلحية الرووت كما في الصورة التالية‪:‬‬

‫‪71‬‬

‫ تجهيز أدوات التجارب‬.3 .............................................................................................. …

‫ مراجع إضافية‬3.5

➢ http://www.ladyada.net/learn/avr/programmers.html ➢ http://avrprogrammers.com/programmers/all ➢ http://www.instructables.com/id/AVR-ISP-programmer ➢ http://www.instructables.com/id/Turn-Your-Arduino-Into-an-ISP ➢ http://elm-chan.org/works/avrx/report_e.html ➢ http://www.instructables.com/id/Programming-an-Atmel-AtTiny85-usingArduino-IDE-an/

72

‫الفصل الرابع‬ ‫ف ”ف إنف الخطرف الذيف يهددف اللكثيرينف مناف ليسف أنف نضعف أهدافااف عاليةف جدااف ‬

‫فلاف نستطيعف بلوغها‪،‬ف بلف أنف نضعف أهدافااف منخفضةف للغاية‪،‬ف ثمف نبلغهاف ‟‬

‫مايكلف أنجلوف –ف رسامف ونحاتف إيطالي‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬

‫فصصي هصصذا الفصصصل سصصنتعلم أساسصصيات تشصصغيل أطصصراف الممتحككصصم الصصدقيق وتشصصغيل المنافصصذ لتعمصصل‬ ‫كصصصدخل أو كخصصصرج‪ .‬كمصصصا سصصصنقوم بمجموعصصصة مصصصن التجصصصارب لتشصصصيغل بعصصصض العنادصصصصر اللكترونيصصصة‬

‫البسيطة مثل ‪..LEDs, Switchs, 7-Segments‬الخ‪.‬‬ ‫✔‬

‫المثال الول‪Hello World :‬‬

‫✔‬

‫أساسيات برمجة أطراف الص ‪AVR‬‬

‫✔‬

‫المثال الثاني‪ :‬تشغيل مجموعة دايودات ضوئية‬

‫✔‬

‫المثال الثالث‪ :‬تشغيل جميع أطراف البورت ‪ A‬والبورت ‪B‬‬

‫✔‬

‫المثال الرابع‪ :‬تشغيل المقاطعة السباعية ‪7Segment‬‬

‫✔‬

‫قراءة الدخل الرقمي‬

‫✔‬

‫‪Internal & Externel Pull-Up‬‬

‫✔‬

‫المثال السادس‪ :‬قراءة أكثر من مفتاح‬

‫✔‬

‫‪74‬‬

‫مفهوم الص ‪ Bouncing‬وطرق الص ‪De-Bouncing‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫في جميع التجارب التالية سنتبع أسصصلوب التصصصميم ‪ Design‬ثصصم المحاكصصاة ‪ Simulate‬ثصصم التنفيصذ‬

‫علصصى لوحصصة التجصصارب ‪ Prototype‬وذلصصك لتسصصهيل تعلصصم البرمجصصة‪ ،‬مصصع ملحظصصة أنصصه هنصصاك بعصصض‬

‫المثلة التي قد ل تصلح للمحاكاة ويجصصب أن تنفصصذ مباشصصرة علصصى لوحصة التجصارب كمصصا سصنرى فصصي‬

‫الفصول المتقدمة )مثل الص ‪ fuses‬وإدارة الطاقة(‪.‬‬

‫فكرة‬ ‫كتابة البرظنامج‬ ‫المحاكاة‬ ‫تطبيق فعلي‬ ‫ملحظة‪ :‬جميع التجارب على لوحة الختبارات ‪) Breadboard‬التطبيق الفعلي( ‪ +‬العديد من‬ ‫التجارب الضافية ستشرح على هيئة فيديوهات مستقله عن الكتاب‬

‫‪75‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.1‬المثال اﻷول ‪:‬‬

‫‪Hello World‬‬

‫يعتبر تشغيل دايود ضوئي وإطفصصاؤه لمصصدة زمنيصة معينصة ‪ Blinking Led‬هصو المثصصال الشصصهر لبصدء‬ ‫أي عملية تطوير في عصالم النظمصة المدمجصة‪ .‬فصي هصذا المثصال سصنتعرف علصى أساسصيات التحكصم‬

‫في أطراف الص ‪ AVR microcontrollers‬وتشغيلها كص ‪) GPIO‬منافذ إدخال وإخراج عامة(‪.‬‬

‫سنستخدم في هذا المثال دايود ضوئي ‪ Led‬يتم تودصيله على الطصصرف ‪ PA0‬ويمكنصك اسصتخدام‬

‫إمصصصا ‪ ATmega16‬أو ‪) ATtiny84‬كلهمصصصا يمتلكصصصان الطصصصرف ‪ (PA0‬كمصصصا هصصصو موضصصصح فصصصي المخطصصصط‬ ‫التالي‪:‬‬

‫ملحظة‪ :‬كلمة ممخطط ‪ Schematic‬تعني الرسمة التي تشرح تودصيل المكونات اللكترونية‬ ‫ببعضها البعض‪ ،‬دائماا ما يتم استخدام المخططات لشرح أي تصميم إلكتروني سواء كان‬

‫بسيطاا أو ممعقداا‪ .‬في هذا الكتاب سأستخدم برنامج بروتس لرسم معظم المخططات للدوائر‬ ‫التي سنقوم بتجربتها على مدار المثلة القادمة‪.‬‬

‫‪76‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫كتابة الربرنامج على ‪Atmel Studio‬‬ ‫قم بتشغيل برنامج ‪ Atmel stduio‬ثم اختر ‪New Project‬‬

‫من الصفحة التي ستظهر اختر مشروع جديد بلغة السي ‪ GCC – C- Executable‬وقم باختيار‬

‫اسم المشروع والمجلد الذي سيحفظ به المشروع من الشريط السفلي‪ .‬تذكر هذا المجلند جينداا‬ ‫ﻷنه سيحتوي على ملف الهيكس الذي سنستعمله في الخطوات التالية‪.‬‬

‫‪77‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫الن يمكنك اختيار عائلة ونوع الممتحككم الدقيق المستخدم‪ ،‬كما يمكنصك اسصتخدام مربصع البحصث‬

‫على الجانب اليمن من الصفحة )اختر الممتحككم ‪ ATmega16‬أو ‪.(ATtiny84‬‬

‫بعصصد النتهصصاء مصصن هصصذه الختيصصارات سصصتظهر شاشصصة البرمجصصة الرئيسصصيةوبداخلها "هيكصصل فصصارغ"‬ ‫‪ Empty template‬كما في الصورة التالية‬

‫‪78‬‬

GPIO Basics ‫ أساسيات التحكم‬.4 .............................................................................................. … ‫والن قم بكتابة أول برنامج‬ #define F_CPU 1000000UL #include #include int main(void) { DDRA = 0b00000001; while(1) { PORTA = 0b00000001; _delay_ms(500); PORTA = 0b00000000; _delay_ms(500); } return 0; } ‫شكل الكود بعد كتابه داخل البرنامج‬

79

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫ترجمة الـكود‬

‫لترجمة البرنامج وتحويلة من لغة السي إلى ملف الهيكس يمكنك الضغط على زر ‪ F7‬أو اختيار‬ ‫"بناء البرنامج" من قائمة ‪Build → Build Solution‬‬

‫بعصد النتهصاء مصن ترجمصة البرنامصصج سصصتجد ملصف الهيكصس فصي المجلصصد الصصذي اخترنصاه فصصي الخطصصوة‬ ‫الولى‪ ،‬الن يمكننصصا البصصدء فصي محاكصصاة التجربصة علصى برنامصصج بروتصس أورفصع ملصف الهيكصس علصصى‬

‫الممتحككم الدقيق مباشرة )على الص ‪(Breadboard‬‬

‫يمكنصصك اسصصتخدام طريقصصة تحويصصصل الملفصصات باسصصصتخدام المصصترجم ‪ GCC‬مباشصصرة دون اسصصصتخدام‬ ‫برنامج ‪ Atmel studio‬مثل ما هو مشروح في ملحق استخدام ‪makefile‬‬

‫‪80‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫محاكاة التجربة على برنامج بروتس‬ ‫والن سنقوم بمحاكاة التجربة علصصى برنامصصج بروتصصس الشصصهير والصصذي يعصصد أفضصصل برنامصصج محاكصصاة‬

‫فصصي مجصصال اللكترونيصصات خادصصصة مصصع الممتحككمصصات الدقيقصصة‪ .‬البرنامصصج مخصصصص للعمصصل علصصى نظصصام‬ ‫تشغيل ويندوز ومع ذلك يمكنك تشغيله على أنظمة لينكننس بسصصهولة باسصصتخدام محصصاكي برامصصج‬

‫ويندوز ‪) Wine‬وهو ما أفعله شخصياا ﻷنني أفضل استخدام نظام لينكس(‪.‬‬

‫يمكنك استخدام أي إدصدارة من برنامج بروتس سواء كانت ‪ SP2 7.8‬أو الدصدار ‪ 8.1‬مع‬ ‫العلم أن جميع الملفات المرفقة مع الكتاب تم تصميمها واختبارها على كل الدصدارين‬ ‫فصصي البدايصصة قصصم بعمصصل مشصصروع جديصصد ولنسصصميه ‪ ATmega16_blink_led‬واخصصتر المكصصان الصصذي‬ ‫تريد أن تحفظ به ملفات المشروع كما في الصور التالية‪:‬‬

‫اختر تصميم مخطط جديد ‪ Create a new schematic‬بالمقاس الفتراضي ‪Default‬‬

‫‪81‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫لن نحتاج أن نصنع تصميم ‪ PCB‬في الصصوقت الحصصالي‪ ،‬لصصذا قصصم باختيصصار ‪ Don't Create PCB‬ثصصم‬ ‫اختر في الصفحة التي تليها ‪No Firmware‬‬ ‫ملحظة‪ :‬الدصدارات الخادصة ببرنامج بروتس بدء من ‪ 8‬أو أعلى تدعم برمجة الممتحككمات‬ ‫من داخل البرنامج باستخدام المترجم ‪ AVRASM‬أو ‪ gcc-avr‬لكننا لن نستخدم هذه الخادصية‬ ‫الن وسنكتفي باستخدام برنامج ‪ Atmel studio‬أو ‪ CodeBlocks‬كبيئة برمجة مع ‪gcc-avr‬‬

‫والن أدصبح لدينا ملصف المخطصط ‪ Schematic‬جصاهز لنبصدأ بتودص يل المكونصات اللكترونيصة مصع‬ ‫بعضها البعض‪ ،‬في التجارب القادمة سنقوم باستخدام المكونات التالي ة )سصنقوم بإضصصافتها فصي‬

‫قائمة المكونات المستخدمة في المحاكاة من خلل الضغط على زر ‪ P‬من قائمة ‪devices‬‬

‫‪82‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫‪ATmega16‬‬

‫•‬

‫)‪LED (yellow‬‬

‫•‬

‫‪Resistor 330‬‬

‫•‬

‫‪LED bar‬‬

‫•‬

‫يمكنك استخدام خادصية البحث عن المكونات كما في الصور التالية‬

‫ابحث عن جميع المكونات المذكورة بالعلى ثم ضفها إلى القائمة‬

‫بعصصد إضصصافة جميصصع المكونصصات سصصنجد أن المسصصتطيل الجصصانبي الخصصاص بالمكونصصات أدصصصبح يحتصصوي‬

‫على معظم المكونات التي نحتاجها للتجارب القادمة كما في الصورة التالية‪:‬‬

‫‪83‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫والن سنبدأ في بناء أول دائصرة لتجربصة الصص ‪ ،Blinking led‬فصي البدايصة سصنقوم بوضصع الممتحككصم‬ ‫‪ ATmega16‬داخل إطار رسم برنامج بروتس كما في الصورة التالية‪:‬‬

‫ثصصم سصصنختار قائمصصة ‪ terminal‬مصصن برنامصصج بروتصصس )القائمصصة الصتي تحتصصوي علصصى رمصوز البطاريصصة –‬

‫المصصصصصوجب والسصصصصصالب( ومنهصصصصصا سنضصصصصصيف ‪ power‬ونقصصصصصوم بتودصصصصصصيلها بالمصصصصصدخل ‪ AREF‬و ‪AVCC‬‬

‫)سنتحدث عن كل المخرجين بالتفصيل في الفصل الخاص بالمحول التناظري\الرقمي ‪.(ADC‬‬

‫‪84‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫والن قم بإضصافة الصدايود الضصوئي والمقاومصة علصى المخصرج ‪ PA0‬ثصم ودصصل الطصرف السصالب مصن‬

‫الصصدايود علصصى علمصصة ‪) Ground‬يمكنصصك إضصصافتها مصصن قائمصصة ‪ Terminals‬أيضصصاا( كمصصا فصصي الصصصورة‬

‫التالية‪:‬‬

‫قم بإضافة مقاومة أخرى وودصلها بالمدخل ‪ RESET‬في الطصصرف اليسصصر مصن الممتحككصصم ثصصم ودصصصل‬

‫الطرف الخر بعلمة ‪ – Power‬وقم بتعديل قيمصة المقاومصة لتصصبح ‪ 10‬كيلصو )تكتصب ‪ (10k‬كمصا‬ ‫في الصورة التالية‪:‬‬

‫‪85‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫بذلك نكون قد انتهينا من تودصيل المكونات الساسية ويتبقى فقط إضصصافة ملصصف الهيكصصس ‪hex0‬‬

‫الخصصاص بصصالكود الصصذي كتبنصصاه علصصى برنامصصج ‪ CodeBlocks‬وذلصصك عصصبر الضصصغط بصصالزر اليمصصن علصصى‬

‫الممتحككم ‪ ATmega16‬واختيار "تعديل خصائص الممتحككصصم" ثصصم الضصصغط علصصى ‪Program File‬‬ ‫واختيصصصار ملصصصف الهيكصصصس الصصصذي دصصصصنعناه باسصصصتخدام ‪) Atmel stduio‬سصصصتجد الملصصصف فصصصي مجلصصصد‬

‫المشروع( كما في الصورة التالية‪:‬‬

‫‪86‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫وأخيراا قم بتعديل ‪ CKSEL Fuses‬باختيار ‪ Int. RC 1 Mhz‬كما في الصورة التالية‬

‫قصصصصم بحفصصصصظ العصصصصدادات عصصصصبر الضصصصصغط علصصصصى زر ‪ OK‬ثصصصصم قصصصصم‬

‫بتشصصغيل المحاكصصاة عصصبر الضصصغط علصصى زر ‪ play‬فصصي الشصصريط‬ ‫السصصصفلي لبرنامصصصج بروتصصصس والن يفصصصترض أن يضصصصئ الصصصدايود‬

‫الضوئي لمدة نصف ثانية وينطفئ لمدة نصف ثانية أخرى‪.‬‬

‫‪87‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.2‬شرح المثال اﻷول وأساسيات برمجة الـ‬

‫‪AVR‬‬

‫عادة ما تم تنقسم البرامج البسيطة للمتحكمات إلى ‪ 3‬أجزاء أساسية‪:‬‬ ‫•‬

‫استدعاء المكتبات وتعريف الثوابت‬

‫•‬

‫الدالة الرئيسية للبرنامج ‪Main Function‬‬

‫•‬

‫الدوال الضافية "إن وجدت"‬

‫هيكل الربرامج‬

‫الشكل التالي يوضح الهيكل الرئيسي لمعظم البرامج الخادصة بمتحكمات ‪AVR‬‬

‫استدعاء المكتبات والتعريفات‬

‫‪#define F_CPU 1000000UL‬‬ ‫>‪#include ‪#include
‫البرنامج الرئيسي‬

‫;‪PORTA = 0b00000001‬‬ ‫;)‪_delay_ms(500‬‬ ‫;‪PORTA = 0b00000000‬‬ ‫;)‪_delay_ms(500‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬

‫في الجزء الول من البرنامج نجد المر ‪ #defne F_CPU 1000000UL‬والتي تعني تعريف‬

‫الثابت ‪ F_CPU‬بقيمصة =‪ 1000000‬وه ذه السصرعة تعصبر سصرعة المعالصج الصداخلي )الصتردد الصذي‬

‫يعمل به المعالج داخل الممتحككم الدقيق(‪ .‬يجب دائماا أن نضع هذه العبارة في بدايصصة أي برنامصصج‬ ‫للمتحكمات الدقيقة‪ ،‬وكما سنرى في الفصول المتقدمة أنه يمكننا تغير هذا الرقم وكذلك سرعة‬

‫المعالج من ‪ 1‬ميجاهرتز إلى ‪ 16‬ميجاهرتز‪.‬‬ ‫ملحظصصة‪ :‬الرمصصز ‪ UL‬فصصي العبصصارة ‪ #define F_CPU 1000000UL‬يعنصصي كلمصصة ‪unsigned long‬‬ ‫وتستخدم للتحكم في حجم الثوابت والمتغيرات كما سنرى في الفصل القادم‪.‬‬

‫‪88‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫فصصي السصصطر الثصصاني والثصصالث‪ .‬قمنصصا باسصصتدعاء مكتبصصتين وهمصصا ‪ avr/io.h‬و ‪ util/delay.h‬ويتصصم‬ ‫ذلصصك باسصصتخدام المصصر الخصصاص باسصصتدعاء المكتبصصات ‪ #include‬ثصصم يكتصصب اسصصم المكتبصصة داخصصل‬

‫قوسين rel="nofollow">‪<....‬‬

‫•‬

‫>‪#include ‪#include
‫التجارب القادمة(‪.‬‬ ‫•‬

‫المكتبة الثانية ‪ delay.h‬هي المسصصؤولة عصصن التلعصصب بصصالزمن وحسصاب الصصوقت الصصذي يمصر‬ ‫على تشغيل المعالج وهي المكتبة التي تمكننصصا مصصن إضصصافة تصصأخير زمنصي أو التحكصصم فصصي‬

‫وقت تشغيل أي مخرج‪.‬‬

‫ملحظة‪ :‬كلمتي ‪ avr‬و ‪ util‬الموجودة قبل أسماء المكتبات تعبر عن أسماء "المجلدات‬

‫‪ ”Folders‬التي تتواجد بها هذه المكتبات‪ ،‬حيث قامت شركة ‪ ATmel‬بتوزيع المكتبات على‬ ‫مجلدات لتسهيل عملية تصنيفها‪.‬‬ ‫الجزء الثاني من البرنامج هو الدالة ‪ Main‬والتي ستحتوي بداخلها على البرنامج الحقيصصق الصصذي‬

‫يتم تشغليه على الممتحككم الدقيق‪ .‬غالبا ما يتم تقسيم الص ‪ Main‬إلى جزأين كالتالي‪:‬‬ ‫•‬

‫جلت ‪Registers configurations‬‬ ‫العدادات الخادصة بالممس ك‬

‫•‬

‫البرنامج الذي يتم تشغيله باستمرار ‪while loop‬‬ ‫{ )‪int main(void‬‬ ‫جلت ‪//‬‬ ‫هنا تكتب إعدادات الممس ك‬ ‫)‪while(1‬‬ ‫{‬ ‫هنا تكتب كافة الكواد البرمجية ‪//‬‬

‫التي سيتم تنفيذها بصورة مستمرة على الممتحككم الدقيق‬

‫‪//‬‬ ‫}‬ ‫;‪return 0‬‬

‫}‬ ‫‪89‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫إعدادات ممسجلات الدخل والخرج الرقمي ‪Digtial I/O‬‬ ‫تمتلك ممتحككمات ‪ AVR‬عدد ‪ 3‬مسجلت أساسيات للتحكم في أي بورت والتي يتم ضصصبطها فصصي‬

‫جلت هي‪:‬‬ ‫الص ‪ Main function‬أشهر هذه الممس ك‬

‫جل ‪DDRx Register‬‬ ‫الممس ك‬

‫‪DDR x → Data Direction Register.‬‬ ‫‪PORT x → Port Output Register.‬‬ ‫‪PIN x → Port Input Register.‬‬

‫جل ‪ 8‬بت يتحكم في "اتجاه البيانات" ويعتبر المسؤول عن التحكم فصصي أطصصراف‬ ‫‪ DDRx‬هو ممس ك‬

‫جل )وكصذلك‬ ‫أي بورت لتعمل إما كدخل ‪ Input‬أو خرج ‪ ،Output‬حصرف الن ‪ x‬فصصي نهايصصة اسصم الممسصص ك‬ ‫جلت( يعصصصبر عصصصن أحصصصد الرمصصصوز ‪ A,B,C,D‬وهصصصي أسصصصماء البورتصصصات‪ .‬فمثل ‪ DDRC‬هصصصو‬ ‫جميصصصع الممسصصص ك‬

‫جل اتجاه البيانات للبورت ‪ C‬والمسجل ‪ DDRA‬هو الخاص بالبورت ‪ A‬وهكذا ‪..‬‬ ‫ممس ك‬

‫كل بت داخل هذا الممس كجل تتحكم في أحد الطراف الخادصة بصصالبورت حيصصث يعصصبر رقصصم ‪ 1‬عصصن أن‬

‫هذا الطرف يعمل كخرج ‪ output‬أما ‪ 0‬فيعبر عن أن هذا الطرف يعمل كدخل ‪.input‬‬

‫عندما نضبط أحد الطراف لتعمل كخرج فهذا يعني أنه يمكن تودصصصيل أي عنصصصر إلكصصتروني بهصصذا‬

‫الطرف والتحكم به خلل إرسال إشصارات كهربيصة إلصى "‪ ”output signal‬هصذه العنادصصر قصد تكصون‬ ‫‪ ...Led, Motor, LCD, Relay, speaker‬الخ‪ .‬كما سنرى في التجارب القادمة‪.‬‬

‫أما إذا جعلنا هذا الطصرف يعم ل كصدخل عنصدها يمكن ك اسصتقبال إشصارة كهربيصة م ن خللصه "‪input‬‬ ‫‪ ”signal‬مثل الشارات القادمة من المفاتيح ‪ switch‬أو الحساسات ‪.sensors‬‬ ‫وكمصصصصصا نصصصصصرى فصصصصصي الجصصصصصدول التصصصصصالي )الخصصصصصاص بالمسصصصصصجل ‪ DDRA‬دصصصصصصفحة ‪ 66‬مصصصصصن دليصصصصصل بيانصصصصصات‬

‫‪ .(ATmega16‬نجد أنه يتكون من ‪ 8‬بت بدءاا من البت رقم ‪ 0‬إلى البت رقم ‪7‬‬

‫يتم التحكم في هذه البتات عبر وضع القيمة المطلوب بها مباشرة مثل أن نكتب المر‬

‫;‪DDRA = 0b00000001‬‬ ‫‪90‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫جل ‪ DDRA‬والتي تعني أن البت الولى فق ط‬ ‫هذا يعني أن نضع القيمة ‪ 00000001‬داخل الممس ك‬

‫= واحصصد أمصصا بصصاقي البتصصات = دصصصفر ممصصا يعنصصي أن الطصصرف ‪ PA0‬يعنصصي كخصصرج ‪ output‬أمصصا بصصاقي‬ ‫الطراف في البورت تعمل كدخل ‪ input‬كما في الصورة التالية‪:‬‬

‫وإذا قمنا بتعديل المر ليصبح‪:‬‬

‫;‪DDRA = 0b00000011‬‬ ‫فهذا يعني أن الطرف ‪ PA0‬و ‪ PA1‬تعمل كخرج أما الطراف من ‪ P2‬إلى ‪ PA7‬تساوي دصفر‬

‫وتعمل كدخل‪.‬‬

‫وإذا قمنا بكتابة المر السابق ليصبح‬

‫;‪DDRA = 0b00001111‬‬ ‫فهذا يعني أن أول ‪ 4‬أطراف من البورت ‪ PA0,1,2,3‬تعمل كخرج وأخر ‪ 4‬أطراف تعمل كدخل‬

‫‪91‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫ملحظة‪ :‬عندما نكتب رقم يبدأ ب ‪ 0b‬في لغة السي مثل ‪ 0b00011100‬فهذا يعني أننا‬

‫نكتب رقم بالصيغة الثنائية ‪ binary‬أما عندما نكتب رقم يبدأ ب ‪ 0x‬مثل ‪ 0xff‬فهذا يعني أن‬ ‫الرقم مكتوب بالصيغة ‪ .hexadecimal‬ويمكنك أن تتعرف أكثر على أنواع الصيغ عبر قراءة‬ ‫الملحق المسمى "أساسيات اﻷنظمة الرقمية"‪.‬‬

‫جلت والرقام الثنائية تبدأ العد من اليمين إلى اليسار وهذا يعني‬ ‫أيضاا لحظ أن جميع الممس ك‬ ‫أن الص ‪) LSB‬أول بت( هي البت الموجود على الطرف اليمن من الرقم ‪ 0bxxxxxxxx‬أما الص‬ ‫‪) MSB‬أخر بت( فهي الموجود على الطرف اليسر بعد الحرف ‪ b‬مباشرة ‪0bxxxxxxxx‬‬ ‫كمصصا هصصو ملحصصظ فصصي الصصصورة الخادصصصة بالمسصصجل ‪ DDRA‬سصصنجد هنصصاك كلمصصة تسصصمى ‪Initial value‬‬ ‫والتي تعني القيم الفتراضية لكل البتات والتي تسصاوي دصصفر ممصا يعنصي أن جمي ع الطصراف تعمصل‬

‫بصورة افتراضية كدخل‪.‬‬ ‫أيضصصاا سصصنجد أن أسصصفل كصصل بصصت كلمصصة ‪ Read/Write‬والصصتي تعنصصي أنصصه يمكنصصك تعصصديل محتصصوى هصصذا‬

‫جل ‪ write‬كمصصصصا فعلنصصصصا فصصصصي المصصصصر ‪ DDRA=0b00000001‬أو يمكنصصصصك قصصصصراءة محتصصصصواه ‪Read‬‬ ‫الممسصصصص ك‬ ‫جلت‪.‬‬ ‫وستتضح هذه الخادصية بالتفصيل في الفصل القادم حيث سنقوم بقراءة هذه الممس ك‬

‫جل ‪PORTx Register‬‬ ‫الممس ك‬ ‫جل ‪ PORTx‬فصصي الخصصصرج الرقمصصصي لي طصصرف‪ ،‬فمثلا عنصصصدما قمنصصا بتودصصصيل الصصدايود‬ ‫يتحكصصصم الممسصصص ك‬

‫جل‪ ،‬ومثل الص ‪ DDRx‬فإنه‬ ‫الضوئي على الطرف ‪ PA0‬قمنا بتشغيله وإطفاءه باستخدام هذا الممس ك‬

‫يمتلك ‪ 8‬بت كل بت منهم تتحكم في أحد الطراف لكل بورت‪.‬‬

‫جل ‪) PORTA‬دصفحة ‪ 66‬من دليل البيانات(‪.‬‬ ‫الصورة التالية مثال على الممس ك‬

‫‪92‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫جل تحمصل إمصا القيمصة ‪ LOW - 0‬أو القيمصة ‪ HIGH – 1‬وعنصدما يتصم وضصع‬ ‫كصل بصت فصي هصذا الممسص ك‬

‫القيمصصة = ‪ 1‬فهصصذا يعنصصي أن الممتحككصصم سننيخرج إشننارة كهربيننة ‪ logic HIGH‬والصصتي سصصتكون ‪5‬‬ ‫فولت )أو نفس قيمة فصارق الجهصصد الصصذي يعمصصل بصه الممتحككصصم(‪ .‬أمصصا إذا كصانت القيمصة = دصصفر فهصذا‬

‫يعنصصي أن الطصصرف سصصيكون ‪ LOW‬أو ‪ 0‬فصصولت وسصصيتنقل إلصصى وضصصع الصصص ‪) sink mode‬سصصيتم شصصرح‬ ‫‪ sink mode‬بالتفصيل في الفصل التالي(‪.‬‬ ‫في المثال السابق استخدمنا مجموعة الوامر‬

‫)‪while(1‬‬ ‫{‬ ‫;‪PORTA = 0b00000001‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTA = 0b00000000‬‬ ‫;)‪_delay_ms(1000‬‬ ‫}‬ ‫هذه الوامر كانت تستخدم للتلعب بالقيم الخادصة بالمسجل ‪ PORTA‬كالتالي‪:‬‬ ‫المصصر ‪ PORTA = 0b00000001‬يعنصصي تغييصصر قيمصصة البصصت الخادصصصة بصصالطرف ‪ PA0‬لتسصصاوي ‪ 1‬أمصصا‬ ‫بصصاقي البتصصات تسصصاوي ‪ 0‬وهصصذا يعنصصي إخصصراج إشصصارة كهربيصصة بقيمصصة )‪ HIGH (5 volt‬علصصى الطصصرف‬ ‫‪ PA0‬والتي ستجعل الدايود الضوئي المتصل بهذا الطصرف يضصيء نتيجصة الشصارة الكهربيصة أمصصا‬

‫باقي الطراف تكون )‪LOW (0 volt‬‬ ‫المر _)‪ delay_ms(1000‬يعني أن الممتحككم الدقيق سينتظر ‪ 1000‬مللي ثانية قبل تنفيصذ المصصر‬ ‫التالي )لحظ أن الص ‪ 1000‬مللي ثانية = ‪ 1‬ثانية(‪.‬‬ ‫المر ‪ PORTA = 0b00000000‬مثل المر السابق ولكن باختلف أن جميع البتات الن أدصبحت‬ ‫تساوي دصفر بما في ذلك البصت الخادصصة بصالطرف ‪ PA0‬ممصا سصيجل هصذا الطصرف يسصاوي ‪LOW (0‬‬

‫)‪ volt‬وسيؤدي ذلك إلى انطفاء الدايود الضوئي‪.‬‬

‫ثم يأتي المر _)‪ delay_ms(1000‬ليجعل الممتحككم الدقيق ينتظر ‪ 1000‬مللي ثانيصصة مصصرة أخصصرى‬ ‫قبل أن يعاد تنفيذ جميع الوامر السابقة بسبب الدالة )‪while (1‬‬

‫‪93‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫نظرة عامة على المثال اﻷول‬

‫الكود التالي هو نفس المثال بعد إضافة تعليقات على كل سطر تشرح وظيفته‪.‬‬ ‫تحديد سرعة المعالج ‪//‬‬

‫‪#define F_CPU 1000000UL‬‬

‫استدعاء المكتبات البرمجية ‪//‬‬

‫>‪#include ‪#include
‫تفعيل الطرف اﻷول ليعمل كخرج ‪//‬‬

‫استمر في هذا البرنامج إلى ما ل نهاية ‪//‬‬

‫)‪while(1‬‬ ‫{‬

‫قم بتشغيل البت اﻷولى‪//‬‬

‫;‪PORTA = 0b00000001‬‬

‫انتظر ‪ 1000‬مللي ثانية ‪//‬‬

‫;)‪_delay_ms(1000‬‬

‫قم بإطفاء البت اﻷولى ‪//‬‬

‫;‪PORTA = 0b00000000‬‬

‫انتظر ‪ 1000‬مللي ثاني‪//‬‬

‫;)‪_delay_ms(1000‬‬ ‫}‬ ‫نهاية البرنامج ‪//‬‬

‫; ‪return 0‬‬ ‫}‬

‫ملحظة‪ :‬العلمات ‪ //‬أو العلمات ‪ /* */‬تعني أن الكلم المكتوب هو تعليق ‪ comment‬ول‬

‫يحتسب ضمن أكواد البرنامج‪ ،‬ويعتبر استخدام التعليقات أمر هام جداا لتوضيح الكواد‪ .‬لذا‬ ‫أنصحك أن تكتب دائماا تعليق على كل سطر برمجي أو دالة في برنامجك‪.‬‬

‫العديد من محترفي البرمجة قد يقومون بكتابة التعليقات حتى قبل البدء في كتابة الكواد‬ ‫نفسها ويساعدهم ذلك على تنظيم الفكار وتحديد ما يجب أن يكتب بصورة منظمة‪ ،‬لذا‬

‫احرص دائماا على توضيح وشرح كل سطر برمجي تكتبة باستخدام ‪ comment‬يسبق هذا‬ ‫السطر‬

‫‪94‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.3‬المثال الثاني ‪ :‬استخدام ‪ 4‬دايود ضوئي‬

‫فصصي هصصذا المثصصال سنسصصتخدم ‪ 4‬دايصصوادت ضصصوئية حيصصث سصصنقوم بتطصصوير الكصصود المسصصتخدم فصصي‬

‫المثال الول ليعمل بع دد ‪ 4‬منن الندايودات ضنوئية‪ .‬وكمصا ه و موضصح فصي الصصورة التاليصة نجصد‬ ‫الصصصدايودات متصصصصلة علصصصى الطصصصراف مصصصن ‪ PA0‬إلصصصى ‪ PA3‬سصصصواء كنصصصت تسصصصتخدم ‪ ATmega16‬أو‬

‫‪.ATtiny84‬‬

‫في حالة استخدام ‪ ATTiny84‬تكون التودصيلت كالتالي‪:‬‬

‫‪95‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الـكود الربرمجي‬ ‫تحديد سرعة المعالج ‪//‬‬ ‫استدعاء المكتبات البرمجية ‪//‬‬

‫‪#define F_CPU 1000000UL‬‬ ‫ rel="nofollow">‪#include ‪#include
‫تفعيل أول ‪ 4‬أطراف كمخرج ‪//‬‬

‫;‪DDRA = 0b00001111‬‬ ‫)‪while(1‬‬ ‫{‬

‫شغل الطرف اﻷول ‪//‬‬

‫;‪PORTA = 0b00000001‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬

‫شغل الطرف الثاني مع اﻷول ‪//‬‬

‫;‪PORTA = 0b00000011‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬

‫شغل الطرف اﻷول‪ ،‬الثاني والثالث ‪//‬‬

‫;‪PORTA = 0b00000111‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬

‫شغل أول أربعة أطراف من البورت ‪//‬‬

‫;‪PORTA = 0b00001111‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬ ‫}‬ ‫;‪return 0‬‬

‫شرح الـكود‬

‫}‬

‫كمصصصا نصصصرى فصصصي المثصصصال بصصصالعلى‪ ،‬يعتصصصبر مطصصصابق لنفصصصس المثصصصال الول بصصصاختلف أننصصصا اسصصصتخدمنا ‪4‬‬

‫جل ‪ DDRA‬ليجعصل أول ‪ 4‬اطصصراف تعمصصل كخصرج ‪PA0, PA1,‬‬ ‫دايودات وبالتالي قمنصا بضصبط الممسص ك‬ ‫‪ PA2, PA3‬وبالتصصالي يمكصصن اسصصتغللها فصصي تشصصغيل الصصدايوادات الربعصصة‪ .‬ثصصم يصصأتي الكصصود المكتصوب‬

‫داخصصل )‪ while (1‬والصصذي يقصصوم بتغيصصر محتصصوى ‪ PORTA‬بصصصورة تصصصاعدية بحيصصث يشصصغل دايصصود‬ ‫واحد كل ‪ 500‬مللي ثانية )نصف ثانية(‪ .‬والصور التالية توضح ما سيحدث للدايودات‪.‬‬

‫‪96‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪97‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.4‬المثال الثالث ‪ :‬تشغيل جميع أطراف‬

‫‪PortA, Port B‬‬

‫فصصي هصصذا المثصصال سصصنقوم بتودصصصيل ‪ 16‬دايصصود علصصى جميصصع أطصصراف البصصورت ‪ A‬و ‪ B‬بحيصصث يتصصصل ‪8‬‬ ‫دايودات ضوئية لكل بورت كما هو موضح بالصورة التالية‬

‫فصصي حالصصة الممتحككصصم ‪ ATTiny84‬سصصيتم تودصصصيل ‪ 11‬دايصصود فقصصط )‪ (3+8‬لن البصصورت ‪ A‬يمتلصصك ‪8‬‬ ‫أطراف بينما البورت ‪ B‬يمتلك ‪ 3‬أطراف فقط كما هو موضح في الصورة التالية‬

‫‪98‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الـكود الربرمجي‬

‫تحديد سرعة المعالج ‪//‬‬ ‫استدعاء المكتبات البرمجية ‪//‬‬

‫تفعيل جميع أطراف ‪ Port A‬كخرج ‪//‬‬ ‫تفعيل جميع أطراف ‪ Port B‬كخرج ‪//‬‬

‫‪#define F_CPU 1000000UL‬‬ ‫ rel="nofollow">‪#include ‪#include
‫شغل جميع أطراف ‪// Port A‬‬

‫;‪PORTA = 0b11111111‬‬

‫شغل جميع أطراف ‪// Port B‬‬

‫;‪PORTB = 0b11111111‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬

‫إطفاء جميع أطراف ‪// Port A‬‬

‫;‪PORTA = 0b00000000‬‬

‫إطفاء جميع أطراف ‪// Port A‬‬

‫;‪PORTB = 0b00000000‬‬

‫انتظر نصف ثانية ‪//‬‬

‫;)‪_delay_ms(500‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬

‫شرح الـكود‬ ‫في البرامج السابق قمنا باسصتخدام المسصصجلين ‪ DDRA‬و ‪ DDRB‬لتشصغيل جميصصع أطصراف البصصورت‬

‫‪ A‬والبورت ‪ B‬لتعمل كخرج‪ .‬ثم قمنا باستخدام الممسجلين ‪ PORTA‬و ‪ PORTB‬لتشصغيل جميصع الصص‬ ‫‪ Leds‬على هذه الطراف لمدة نصف ثانية ثم إطفائها لنصف ثانية‪ .‬وهكذا إلى ما ل نهاية‪.‬‬ ‫الصورة التالية تمثل محاكاة البرنامج السابق على بروتس مع الممتحككم ‪ATmega16‬‬

‫‪99‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫تمارين إضافية‬ ‫•‬

‫قم بتشغل ‪ 8‬دايودات ضوئية على جميع أطصراف البصورت ‪ A‬واجعلهصصا تضصيء بصالترتيب‬ ‫التصصصالي مصصع تصصأخير ربصصصع ثانيصصة فقصصط بيصصصن كصصصل أمصصصر‪) .‬ل تنسصصى أن جميصصع أطصصصراف البصصورت‬

‫ستعمل كخرج(‬

‫‪00000001‬‬ ‫‪00000011‬‬ ‫‪00000111‬‬ ‫‪00001111‬‬ ‫‪10000000‬‬ ‫‪11000000‬‬ ‫‪11100000‬‬ ‫‪11110000‬‬ ‫•‬

‫مصصصاهو أقصصصصى عصصصدد مصصصصن الصصصدايودات الضصصصوئية يمكصصصن تودصصصصيله بصصصالمتحكم ‪ATmega16‬‬

‫والمتحكم ‪ ATtiny84‬؟‬

‫‪100‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.5‬المثال الرابع ‪ :‬تشغيل المقاطعة السباعية‬

‫‪7segment‬‬

‫"المقاطعة السباعية – تنطصق سصيفين سصيجمنت" ‪ 7segment‬وه ي عبصارة‬ ‫عصصن مسصصتطيل دصصصغير يحتصصوي علصصى ‪ 7‬مقصصاطع مضصصيئة باسصصتخدام دايصصودات‬ ‫ضوئية )مت وفرة بصاللون الحمصر والخضصر والزرق(‪.‬وتسصتخدم ف ي عصرض‬

‫الرقام وبعض حروف اللغة النجليزية‪.‬‬

‫تتصصوفر هصصذه القطعصصة اللكترونيصصة فصصي السصصواق بمختلصصف الحجصصام فمنهصصا مصصاهو دصصصغير جصصداا مثصصل‬ ‫المسصصتخدمة فصصي السصصاعات الرقميصصة الرخيصصصة ومنهصصا مصصاهو كصصبير الحجصصم مثصصل المسصصتخدمة فصصي‬ ‫إشارات المرور )اللوحة المضيئة التي تعرض الوقت المتبقي لتفتح إشارة المرور(‪.‬‬

‫تتكون السيفين سيجمنت من ‪ 7‬دايودات ضوئية متصلة ببعضها البعض إما عن طريق تودصصصيل‬ ‫الطصصصرف المصصصوجب وتسصصصمى ‪ common anode‬أو عصصصن طريصصصق تودصصصصيل الطصصصرف السصصصالب وتسصصصمى‬

‫‪) common cathode‬سنستخدم في التجارب التالية النوع ‪.(common cathode‬ويسمى كل‬ ‫دايصصود ضصصوئي بأحصصد حصصروف البجديصصة النجليزيصصة ‪ A,B,C,D,E,F,G‬كمصصا هصصو موضصصح فصصي الصصصورة‬

‫التالية‪:‬‬

‫‪101‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫لتشغيل هذا العنصر اللكتروني سنقوم بتودصيل الطصصراف السصصبعة ‪ a,b,c,d,e,f,g‬بأحصصد البورتصصات‬

‫في الممتحككم الدقيق )سنستخدم البورت ‪.(A‬‬

‫ملحظة‪ :‬بعض السيفن‪-‬سيجمنت المتوفرة في السواق )خاصة صغيرة الحجم( تحتوي‬

‫على طرف إضافي وهو دايود ضوئي دصغير موجود على الجانب اليمن السفلي ويستخدم‬ ‫في بعرض الفادصلة العشرية )‪ (.‬لكن برنامج بروتس ل يحتوي على هذا الدايود الضوئي لذا‬ ‫لن نستخدمه في المحاكاة(‪.‬‬

‫لعرض أي رقم من الرقام العشرية سنستخدم الجدول التالي والصصذي يوضصصح الحالصصة الصصتي يجصصب‬ ‫أن يكون عليها كل دايود ضوئي حتى يتم عرض رقم معين‪.‬‬

‫الشكل التالي يوضح طريقة تودصيل الممتحككم ‪ ATmega16‬بالسيفين‪-‬سيجمنت على البورت ‪.A‬‬ ‫وسنقوم بكتابة كود بسيط يعرض الرقام من ‪ 0‬إلى ‪ 9‬بالترتيب وبتأخير زمني ‪ 1‬ثانية بين كل‬

‫رقم‪.‬‬

‫‪102‬‬

GPIO Basics ‫ أساسيات التحكم‬.4 .............................................................................................. …

‫الـكود الربرمجي‬ #define F_CPU 1000000UL #include #include int main(void) { DDRA =0b11111111; while(1) { PORTA = 0b00111111; _delay_ms(1000); PORTA = 0b00110000; _delay_ms(1000); PORTA = 0b01011011; _delay_ms(1000); PORTA = 0b01001111; _delay_ms(1000); PORTA = 0b01100110; _delay_ms(1000);

// Number 0 // Number 1 // Number 2 // Number 3 // Number 4

103

GPIO Basics ‫ أساسيات التحكم‬.4 .............................................................................................. … PORTA = 0b01101101; _delay_ms(1000); PORTA = 0b01111101;

// Number 5 // Number 6

_delay_ms(1000); PORTA = 0b00000111;

// Number 7

_delay_ms(1000); PORTA = 0b11111111;

// Number 8

_delay_ms(1000); PORTA = 0b01101111;

// Number 9

_delay_ms(1000); } return 0; } .‫الصور التالية تمثل المحاكاة بعد ترجمة الكود السابق‬

104

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫شرح الـكود‬

‫البرنامصصصج السصصصابق قصصصام بتشصصصغيل السصصصيفن سصصيجمنت بحيصصصث تعصصصرض جميصصصع الرقصصصام مصصصن ‪ 0‬إلصصصى ‪9‬‬

‫جل ‪.PORTA‬‬ ‫بصورة متتابعة وذلك عبر كتابة قيمة الرقم المطلوب داخل الممس ك‬

‫جل ‪PORTA‬‬ ‫هناك ملحظة هامة حول هذا الكود وهي أن الرقام التي يتم وضعها داخل الممسصص ك‬

‫تعتصصبر معكوسصصة عصصن الجصصدول المكتصصوب بصصالعلى وذلصصك بسصصبب أن الطصصراف الصصتي قمنصصا بتودصصصيلها‬

‫على برنامج بروتس تم عكسها فبدلا من تودصيل ‪ a,b,c,d,e,f,g‬تم تودصيلها ‪.g,f,e,d,c,b,a‬‬

‫أيضاا يمكنك كتابة بعض الحروف النجليزية البسيطة مثصصل ‪ A,C,F,E,H,L‬كصل مصا عليصصك فعلصه هصو‬ ‫إضافة الجزء التالي للكود بالعلى )داخل الص ‪.(while loop‬‬

‫;‪PORTA = 0b01110111‬‬ ‫‪// Letter A‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTA = 0b00111001‬‬ ‫‪// Letter C‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTA = 0b01110001‬‬ ‫‪// Letter F‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTA = 0b00111000‬‬ ‫‪// Letter L‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTA = 0b01110110‬‬ ‫‪// Letter H‬‬ ‫;)‪_delay_ms(1000‬‬ ‫الصور التالية توضح عرض حروف البجدية النجليزية باستخدام السيفن‪-‬سيجمنت‬

‫‪105‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.6‬المثال الخامس ‪ :‬قراءة الدخل الرقمي‬

‫‪Inputs reading‬‬

‫في هذا المثال سنتعرف على طصصرق قصراءة الصصدخل الرقمصصي ‪ Digital Inputs‬وذلصك عصبر مجموعصة‬

‫من التجصارب باسصتخدام المفاتيصح ‪ .Switchs‬سصيتم اسصتخدام مفتصاح الضصغط ‪ Push button‬مصع‬

‫مقاومصصة ‪ 10‬كيلصصو اوم متصصصلة علصصى الرضصصي كصصدخل للطصصرف ‪ PB0‬وذلصصك للتحكصصم بتشصصغيل دايصصود‬ ‫ضوئي متصل على الطرف ‪ PA0‬كما هو موضح بالصورة التالية‪:‬‬

‫لعمل نفس الدائرة باستخدام الممتحككم الدقيق ‪ATTiny84‬‬

‫‪106‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الـكود الربرمجي‬

‫‪#define F_CPU 1000000UL‬‬ ‫>‪#include
‫شرح الـكود‬

‫بصصصصورة افتراضصصصية تعمصصل جميصصصع أطصصراف الممتحككمصصصات الدقيقصصة كصصصدخل ‪) Input port‬ليصصس ‪AVR‬‬

‫فحسب وإنما معظم الممتحككمات الدقيقة من مختلف الشركات( لذا نجصصد الكصصود السصصابق ل يقصصوم‬

‫بضصبط أطصراف البصورت ‪ B‬لتعمصل ك دخل‪ ،‬ومصع ذلصك يمكنصك كتابصة المصر ‪DDRB = 0b00000000‬‬

‫للتأكيد أن أطراف الممتحككم تعمل كدخل‪.‬‬

‫جل‬ ‫يقوم الممتح ككم الدقيق بصورة تلقائية بقصراءة محتويصات جمي ع الطصراف ويخزنهصا ف ي الممسص ك‬ ‫جل ‪ PINB‬يقصوم بتسصجيل‬ ‫‪) PIN x‬حيث تمثل ‪ x‬اسصم البصورت مثصل ‪ … A,B,C,D‬إلصخ( فمثلا الممسص ك‬ ‫جل‬ ‫قيمة الجهد الداخل على جميع أطصراف البصصورت ‪ B‬بصصصورة مسصتمرة ويتصم تحصصديث هصذا الممسص ك‬

‫بنفصصس سصصرعة عمصصل الممتحككصصم الصصدقيق فمثلا إذا كصصان الممتحككصصم يعمصصل بسصصرعة ‪ 1‬ميجصصاهرتز فهصصذا‬

‫‪107‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫جل ‪ PINB‬يتم تحديثة مليون مصرة فصي الثانيصة وفصي كصل مصرة يقصصوم بقصصراءة جميصع‬ ‫يعني أن الممس ك‬ ‫أطراف البورت ‪.B‬‬

‫جل ‪ PINx‬على ‪ 8‬بتات كل بت تمثل قراءة الجهد على أحصصد أطصصراف البصصورت‪ ،‬فمثلا‬ ‫يحتوي الممس ك‬

‫جل ‪ PINB‬نجصصصد أنصصصه يتكصصصون مصصصن البتصصصات التاليصصصة )جميصصصع جصصصداول ‪ PINx‬متصصصوفرة فصصصي دليصصصل‬ ‫الممسصصص ك‬ ‫البيانات(‪.‬‬

‫البت رقم دصفر ‪ PINB0‬تمثل قراءة الطرف ‪ PB0‬والبت رقصم ‪ 1‬تمثصل قصراءة الطصرف ‪ PB1‬والبصت‬

‫رقم ‪ 2‬تمثل قراءة الطرف ‪ … PB2‬إلخ‪.‬‬

‫جلت ‪ PINx‬من نوع ‪ Read only‬مما يعني أنه يمكنك‬ ‫جل ‪ PINB‬وجميع الممس ك‬ ‫ملحظة‪ :‬الممس ك‬ ‫أن تقرأ منها فقط ول يمكنك أن تغير محتواها بنفسك بكتابة أي اكود برمجية حيث يتم‬ ‫جلت تلقائياا‪.‬‬ ‫تحديث الممس ك‬

‫في حالة عدم تطبيق أي جهد على أطراف الممتحككم تكون قيمة البتات = دصفر ويتم تغيصر هصذه‬ ‫القيمة عند تطبيق جهد على الطرف الموازي لكل بت‪ .‬مثلا لصصو قمنصصا بتطصصبيق جهصد ‪ 5‬فصصولت علصصى‬

‫جل ‪ PINB‬تسصصصصاوي ‪ 0b00000111‬وإذا قمنصصصصا‬ ‫البصصصصت ‪ PB0‬و ‪ PB1‬و ‪ PB2‬سصصصصنجد أن قيمصصصصة الممسصصصص ك‬ ‫بتطبيق جهد على جميع البتات سنجد القيمة أدصبحت ‪ 0b11111111‬وهكذا ‪...‬‬

‫فصصي البرنامصصج السصابق اسصتخدمنا الجملصصة الشصرطة )‪ if (condition‬لتشصغيل الصصدايود الضصصوئي عنصصد‬

‫الضغط على الزر حيث كتبنا المر‪.‬‬

‫)‪if(PINB == 0b00000001‬‬ ‫};‪{PORTA = 0b00000001‬‬ ‫جل ‪ PINB‬تسصصاوي ‪) 0b00000001‬يعنصصي تصصم الضصصغط‬ ‫والصصذي يعنصصي أنصصه إذا كصصانت قيمصصة الممسصص ك‬

‫على الزر المتصل بص ‪ (PB0‬قم بتشغيل الدايود الضوئي عبر المر ‪PORTA = 0b00000001‬‬ ‫‪else‬‬

‫};‪{PORTA = 0b00000000‬‬ ‫وفي حالة عدم تطبيق هذا الشرط ‪ else‬قم بإطفاء الدايود عبر ‪PORTA = 0b00000000‬‬ ‫‪108‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪4.7‬‬

‫‪Pull Up & Pull Down Resistor‬‬

‫من أشهر الكلمات التي قد تسمعها في عالم اللكترونيات الرقمية هي المقاومة رافعة الجهد أو‬

‫خافضة الجهد ‪ Pull-Up & Pull-Down‬هذه المقاومات التي تتراوح قيمتها بين ‪ 2.2‬كيلواوم‬

‫إلى ‪ 10‬كيلوأوم تستخدم بصورة أساسية في دخل النظمة الرقمية ‪ Digital Inputs‬بداية من‬ ‫البوبات المنطقية البسيطة مثل ‪ AND, OR, NOT‬وانتهائاا بالممتحككمات الدقيقة‪.‬‬

‫إذ اا لماذا استخدامنا هذا النوع من المقاومات مثل المقاومة الن ‪ 10‬كيلو أوم مع المفتاح في‬ ‫المثال السابق؟ ولماذا لم نوصل المفتاح بالن ‪ VCC‬مباشرة؟ هناك ‪ 3‬أسباب لهذا المر‪..‬‬ ‫السننتخدام اﻷول )إلغنناء النندخل العننائم(‪ :‬جميصصع المكونصصات اللكترونيصصة الرقميصصة الصصتي تتعامصصل‬

‫بالصصصفر والواحصصد تعصصاني مصصن مشصصكلة خطيصصرة جصصداا تسصصمى المنطقصصة العائمصصة ‪ Floating Area‬أو‬

‫‪) Nosie Margin‬نطاق الشوشرة( هذه المنطقة هي فارق الجهد بين الص )‪ Logic (0‬والص )‪Logic (1‬‬ ‫وتستخدم المقاومات ‪ pull-up or down‬في حل هذه المشكلة‪.‬‬ ‫والسبب في ذلك أن معظصم المكونصات اللكتروني ة تعتصبر أي جه د‬ ‫دخل ‪ input voltage‬بين دصفر و ‪ 0.8‬فولت هو ‪ 0‬أو كما يسمى‬

‫‪ Low‬يبنما أي جهصصد بيصصن ‪ 2‬وحصصتى ‪ 5‬فصصولت يعتصصبر ‪ 1‬رقمصصي ‪HIGH‬‬

‫لكصصصصن إذا كصصصصان هنصصصصاك دخصصصصل بقيمصصصصة ‪ 0.9‬فصصصصولت أو ‪ 1.25‬أو ‪1.9‬‬

‫تحدث مشنكلة المنطقنة العائم ة حيصث ل تسصتطيع اللكترونيصات‬ ‫الرقميصة أن تتعصصرف علصصى هصذا الجهصصد وبالتصصالي ل يمكنهصصا أن تحصصدد‬

‫بدقصصة هصصل هصصو )‪ HIGH(1‬أم )‪ LOW(0‬وتبصصدأ بالتصصصرف العشصصوائي‬ ‫)وقد تصاب الدائرة بنوع من الجنون(‪.‬‬ ‫بطبيعة الحال جميع الجهزة اللكترونية تصدر نوع من الصصص ‪ Electric noise‬شوشصصرة كهربيصصة بمصصا‬ ‫في ذلك جسد النسان لصذا عنصد تصرك أي ط رف ‪ input‬فصإنه يتعصرض لشوشصرة كهربيصة بفصرق جهصد‬

‫دصغير نسبياا مما يتسبب في دخول الجهاز بوضع الص ‪.Floating Area‬‬

‫وجود مقاومة متصلة بطرف الدخل والطرف الرضي يضمن تماماا أن الطرف = دصفر حصصتى مصصع‬ ‫وجود الشوشصصرة ول يتصم تغييصصر هصذا الجهصد إل عنصد إدخصال جهصد كصبير نسصبياا مصصن المفتصاح مثصصل ‪5‬‬

‫فولت‪ .‬وتكون قيمة المقاومة بين ‪ 2.2‬إلى ‪ 10‬كيلوأوم‪.‬‬

‫‪109‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫يمكنك أن تجرب بنفسك تأثير المنطقة العامة عبر المثال السابق حيث يتصصم تركيصب الصصدائرة كمصصا‬

‫هصصصي علصصصى لوحصصة التجصصصارب ‪ breadboard‬بصصصدون مقاومصصصة ‪ 10‬كيلصصصو‪ .‬ثصصصم حصصصاول أن تضصصصغط الصصصزر‬ ‫وشصصاهد مصصاذا سصصيحدث )سصصتجد أن الممتحككصصم الصصدقيق يبصصدأ باتخصصاذ قصصرارت عشصصوائية بمجصصرد أن‬

‫تقترب يدك من الممتحككم(‪.‬‬

‫السننتخدام الثنناني )عكننس الجهنند الننداخل(‪ :‬فصصي بعصصض الحصصالت يكصصون مطلصصوب عكصصس الجهصصد‬

‫الداخل من المفتاح‪ ،‬في المثصصال السصصابق تصصم تودصصصيل المقاومصصة مصصع المفتصصاح بأسصصلوب ‪Pull-Down‬‬

‫مما يجعل المفتاح ميدخل جهد ‪ 5‬فولت للطرف ‪ PB0‬عند الضغط عليه وعند ترك المفتصصاح يكصصون‬ ‫الجهد دصفر فولت )أرضي(‪.‬‬

‫‪Press Button = HIGH‬‬ ‫‪Releas Button = LOW‬‬ ‫يمكصصن اسصصتخدام المقاومصصة الرافعصصة ‪ Pull-up Resistor‬لعكصصس هصصذا الجهصصد وبصصذلك يصصصبح الجهصصد‬

‫الساسي للطرف ‪ PB0‬هو ‪ HIGH‬وعند ضغط المفتاح يتحول هذا الجهد إلى دصفر )أرضي(‪.‬‬ ‫‪Press Button = LOW‬‬ ‫‪Releas Button = HIGH‬‬ ‫يتم تودصيل المقاومة الرافعة ‪ Pull-up‬بحيث ينعكس مكانها بين الص ‪ VCC‬والمفتاح والصور‬

‫التالية توضح الفرق بين تودصيله الص ‪ Pull-UP‬وال ‪Pull-Down‬‬

‫‪Pull-Down‬‬

‫‪Pull-Up‬‬

‫ملحظة‪ :‬قد تستخدم مقاومات الص ‪ Pull-Up & Pull-Down‬مع بروتوكولت التصالت مثل‬

‫‪ i2C‬لعكس جهد النبضات ويتم استخدام مقاومات بقيمة تتراوح بين ‪ 2.2‬إلى ‪ 4.7‬كيلوأوم‬

‫‪110‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫السننتخدام الثننالث )ممحننول تيننار إلننى جهنند(‪ :‬بعصصض الحساسصصات الشصصهيرة‬

‫مثصصصل الميكروفصصصون ‪ Microphone‬أو المقاومصصصة الضصصصوئية ‪ LDR‬أو الحراريصصصة‬ ‫‪ NTC‬تقوم بتحويل الحرارة أو الضوء إلصى تغيصر فصي التينار الكهربصي ولي س‬

‫تغير ف ي الجهند ممصا يمثصل مشصكلة فصي فهصم ه ذه الحساسصصات‪ .‬حي ث نجصد أن جميصع الممتحككمصات‬ ‫الدقيقة التي تحتوي على ‪ ADC‬يمكنها قراءة تغير الجهد فقط ول تستطيع التعرف على التيار‬ ‫الكهربي المتغير لذا يتصم اسصتخدام مقاومصصة ‪ Pull-Down‬أو ‪ Pull-Up‬لتحويصصل التيصصار المتغيصصر إلصى‬

‫جهد‪.‬‬

‫‪111‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.8‬خاصية الـ‬

‫‪Internal Pull-Up‬‬

‫تمتلك معظم ممتحككمات الص ‪ AVR‬خادصية جميلة جداا وهي أن أطراف البورتات تمتلصصك )مقاومصصة‬ ‫الرفع الداخلية ‪ (internal pull-up‬هذه المقاومة تجعلك تستخدم المفاتيصصح الصصتي تريصصدها بصصدون‬

‫أي مقاومصصات إضصصافية‪ .‬الشصصكل التصصالي يوضصصح تركيصصب مقاومصصة الرفصصع الداخليصصة وهصصي عبصصارة عصصن‬

‫ترانزستور ‪ +‬مقاومة ‪ Rpu‬حيث يتحكم الترانزستور في تفعيل المقاومة أو إلغائها‪.‬‬ ‫بصصصورة افتراضصصية يتصصم إلغصصاء تفعيصصل هصذه المقاومصصة ويجصصب‬ ‫عليك أن تشغلها بنفسك وذلك عصصبر جعصصل الطصصرف المطلصصوب‬

‫جل ‪PORTx‬‬ ‫يعمصصصصل كصصصصدخل ‪ input‬ثصصصصم الكتابصصصصة فصصصصي الممسصصصص ك‬ ‫لتفعيل هذه المقاومة‬

‫جل ‪ PORTx‬لصصصن يعمصصصل لكتابصصصة قيصصصم الخصصصرج‬ ‫لحصصصظ أن الممسصصص ك‬

‫ولكصصصصصن هنصصصصصا سيسنننننتخدم لتفعينننننل الترانزسنننننتور الخننننناص‬

‫بمقاومننة الننن ‪ pull-up‬فقننط‪ .‬أيضصصاا تصصذكر أنصصه بعصصد تفعيصصل المقاومصصة يصصصبح تصصأثير الضصصغط علصصى‬ ‫المفتاح معكوس مما يعني أن قصراءة ‪ PINx‬تصصبح ‪ 0‬فصي حالصة الضصغط علصى المفتصاح وتصصبح ‪1‬‬

‫ترك المفتاح‪.‬‬

‫الصورة التالية توضح شكل تودصيل المفتاح مع تفعيل الص ‪internal pull-up‬‬

‫‪112‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.9‬المثال السادس ‪ :‬تشغيل ‪ 3‬دايودات ‪ 3 +‬مفاتيح‬

‫فصصي هصصذا المثصصال سنسصصتخدم ‪ 3‬مفاتيصصح مصصع تفعيصصل خادصصصية الصصص ‪ Internal pull-up‬وبصصذلك سصصنوفر‬ ‫استخدام ‪ 3‬مقاومات ‪ 10‬كيلو‪ .‬وسيتحكم كل مفتاح في تشغيل عدد من الدايودات بحيث‪:‬‬ ‫•‬

‫إذا تم الضغط على المفتاح المتصل بالطرف ‪ PB0‬يتم تشغيل دايود واحد فقط‬

‫•‬

‫إذا تم الضغط على المفتاح المتصل بالطرف ‪ PB1‬يتم تشغيل ‪ 2‬دايود‬

‫•‬

‫إذا تم الضغط على المفتاح المتصل بالطرف ‪ PB2‬يتم تشغيل ‪ 3‬دايود‬

‫جل ‪ PINx‬معكوسة لذا‬ ‫تذكر أنه بعد تشغيل مقاومة الرفع تصبح قراءة المفتاح والممس ك‬ ‫سنجد القيمة الفتراضية للمسجل ‪ PINx = 0b11111111‬وعند الضغط على أي مفتاح‬

‫ستتحول البت المقابلة له إلى دصفر‪ ،‬فمثلا الضغط على المفتاح المتصل ب ‪ PB0‬سيجعل قيمة‬ ‫‪ PINB‬تساوي ‪0b11111110‬‬

‫‪113‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الـكود الربرمجي‬ ‫‪#define F_CPU 1000000UL‬‬ ‫ rel="nofollow">‪#include
‫تفعيل خرج لتشغيل الثل ث دايودات ضوئية ‪//‬‬

‫)‪int main(void‬‬ ‫{‬ ‫;‪DDRA =0b00000111‬‬

‫تأكيد أن جميع أطراف البورت تعمل كدخل‪//‬‬

‫;‪DDRB = 0b00000000‬‬

‫تفعيل مقاومة الرفع لكل أطراف البورت ‪// B‬‬

‫;‪PORTB = 0b11111111‬‬

‫)‪while(1‬‬ ‫{‬ ‫‪if (PINB == 0b11111110) {PORTA = 0b00000001;} // Button 1 pressed‬‬ ‫‪else if (PINB == 0b11111101) {PORTA = 0b00000011;} // Button 2 pressed‬‬ ‫‪else if (PINB == 0b11111011) {PORTA = 0b00000111;} // Button 3 pressed‬‬ ‫};‪else {PORTA = 0b00000000‬‬ ‫}‬ ‫;‪return 0‬‬

‫شرح الـكود‬

‫}‬

‫في البداية قمنا بتشغيل جميع أطراف البورت ‪ B‬لتعمل كدخل )تذكر أن هذه الخطوة اختيارية‬

‫وهدفها التأكيد فقط( ثم قمنا بتفعيل جميع مقاومات الص ‪ Pull-UP‬على أطصصراف البصصورت ‪ B‬وذلصصك‬

‫عبر المر ‪PORTB = 0b11111111‬‬ ‫جل ‪ PINB‬ومقارنصصة محتصصواه مصصع مجموعصصة مصصن‬ ‫ثصصم بصصدء البرنامصصج الساسصصي فصصي قصصراءة الممسصص ك‬

‫الشروط بحيث إذا كصانت القيمصصة = ‪) 0b11111110‬تصم الضصغط علصى الصزر المتصصل ب ‪(PB0‬‬ ‫يتم تشغيل الدايود المتصل بالطرف ‪PA0‬‬

‫‪114‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫وإذا كصصصانت القيمصصصة تسصصصاوي ‪ 0b11111101‬فهصصصذا يعنصصصي انصصصه تصصصم الضصصصغط علصصصى الصصصزر المتصصصصل‬ ‫بالطرف ‪ PB1‬وسيؤدي ذلك لتشغيل الدايودات على الطراف ‪ PA0 + PA1‬ونفس المر مع‬ ‫الزر الثالث )المتصل بالطرف ‪ (PB2‬والذي سيشغل الدايودات الثلثة ‪.PA0, PA1, PA2‬‬

‫‪115‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪4.10‬‬

‫‪Bouncing effect & De-bouncing‬‬

‫يعرف تأثير القفز ‪ Bouncing effect‬بأنها ظاهرة تحدث للمفاتيح ‪ switchs‬الميكانيكيصصة خادصصصة‬ ‫مفاتيح الضغط ‪ Push Buttons‬حيث تتكون هصذه المفاتيصصح عصصادة مصصن شصصريحتين مصصن الصصصفائح‬ ‫المعدنيصة والصتي عنصد الضصغط عليهصا يحصدث بينهصم تلمصس ‪ .contact‬لكصن بسصبب طريق ة دصصناعة‬ ‫هصصذه الصصصفائح فصصإنه عنصصد الضصصغط عليهصصا تقفصصز اللصصواح المعدنيصصة أكصصثر مصصن مصصرة‪ ،‬هصصذا المصصر يجعصصل‬

‫الصفائح تقوم "بعشرات التلمسات" في الثانية الواحدة قبل أن تستقر‪.‬‬

‫تعتصبر ه ذه الظصاهرة مصن المصور المزعجصة لمصصممي النظصم المدمجصة وذلصك لنهصا تجعصل المفاتيصح‬

‫الميكانيكية تنتج إشارات غير مطلوبة قد تؤثر على أداء النظام المدمج ككل‪ .‬من حسصصن الحصصظ‬ ‫أنه هناك العديد من الحلول المتوفرة لهذه الظاهرة وتسمى هذه الحلول ‪debouncing‬‬

‫الحل اﻷول‪ :‬التأخير الزمني‬ ‫هذا الحل يعتبر أبسط طريقة وتسمى ‪ software debouncing‬حيث تعتمد هذه الطريقة علصصى‬

‫التأكد "مرتين" من الضغط على المفتاح مع وضع تأخير زمني بين كل مصصرة‪ .‬الكصصود التصصالي يمثصصل‬

‫تشغيل دايود ضوئي عند الضغط على مفتاح ) والثاني(‬ ‫الكود التقليدي لقراءة المفتاح بدون ‪debouncing‬‬

‫};‪if (PINB == 0b11111110) { PORTA = 0b00000001‬‬ ‫قراءة المفتاح باستخدام ال )‪software debouncing (delay‬‬

‫تأخير زمني‪//‬‬ ‫إعادة التأكد أن المفتاح مازال مضغوط ‪//‬‬

‫)‪if (PINB == 0b11111110‬‬ ‫{‬ ‫;)‪delay_ms(10‬‬ ‫)‪if (PINB == 0b11111110‬‬

‫};‪{ PORTA = 0b00000001‬‬ ‫}‬ ‫هصصذه الطريقصصة لهصصا عيصوب كصصثيرة جصصداا منهصصا أنهصصا ل تحصصل مشصصكلة الذبصذبات الكهربيصصة نفسصصها ولكنهصصا‬ ‫تتأكصصد فقصصط مصصن ضصصغط المفتصصاح لفصصترة كافيصصة حصصتى تنتهصصي تلصصك الذبصصذبات كمصصا أنصصك تضصصطر إلصصى‬ ‫إضافة تأخير زمني للبرنامصصج ممصصا قصد يتسصبب فصي تصصأخير اسصتجابة النظصصام ككصل خادصصة إذا كنصصت‬

‫‪116‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫تقرأ أكثر من مفتاح‪ .‬وفي حالة استخدام نظام تشغيل ‪ RTOS‬ل يمكن استخدام هصذا النصصوع مصصن‬ ‫التأخير الزمني بصورة مباشرة )سيتم شرح التأخير الزمني لنظام ‪ ROTS‬بالتفصصصيل فصصي الفصصصل‬

‫السابع(‪.‬‬

‫الحل الثاني‪ :‬استخدام فلتر )مرشح(‬ ‫هصصصذا الحصصصل يعتمصصصد علصصصى اسصصصتخدام دائصصصرة ‪ filter‬لترشصصصيح الذبصصصذبات الكهربيصصصة الناتجصصصة عصصصن الصصصص‬

‫‪ bouncing effect‬وتسصصصصصمى ‪ Hardware Debouncing‬حيصصصصصث تسصصصصصتخدم هصصصصصذه الصصصصصدائرة فصصصصصي‬ ‫امتصاص الذبذبات الكهربية وتمنع دخولها للمتحكم الدقيق‪.‬‬ ‫أبسصصصط دائصصصرة مرشصصصح هصصصي تودصصصصيل مكثصصصف سصصصيراميكي علصصصى‬ ‫التصصصصوازي مصصصصع المفتصصصصاح ‪ Ceramic - capacitor‬بقيمصصصصة ‪0.1‬‬ ‫ميكروفصصاراد )يكصصون مكتصصوب علصصى المكثصصف الرقصصم ‪ .(104‬مصصع‬ ‫العلصصم أنصصه يمكصصن تودصصصيل هصصذا المكثصصف سصصواء كنصصت تسصصتخدم‬

‫المفتاح مع ‪ Pull up‬أو ‪Pull down resistor‬‬

‫هنصصصاك دوائصصصر أخصصصرى أكصصصثر تعقيصصصداا وقصصصوة فصصي الترشصصصيح مثصصصل‬

‫استخدام مقاومة ‪ 10‬كيلو ‪ +‬دايود ‪ +‬مكثف )بنفصصس القيمصصة(‪ .‬أو باسصصتخدام دوائصصر رقميصصة مثصصل‬ ‫‪ AND gates‬لعمل ‪.digital trigger‬‬

‫على أي حال‪ ،‬استخدام مكثصف واحصد فقصط كصافي لفلصترة الذبصذبات الكهربي ة الغيصر مرغصوب فيهصا‬

‫ول داعي لبناء دوائر أكثر تعقيداا كما أنه أوفر من ناحية للتكلفة‪.‬‬ ‫•‬

‫الممينننزات‪ :‬الفضصصصل مصصصن ناحيصصصة الداء‪ .‬متوافقصصصة مصصصع جميصصصع الممتحككمصصصات الدقيقصصصة ول‬ ‫تتطلب أي تأخير زمني في الكود كمصا أنهصصا لصصن تتسصبب فصصي مشصاكل للصصص ‪ Interrupts‬أو الصصص‬

‫•‬

‫‪117‬‬

‫‪RTOS‬‬ ‫العيوب‪ :‬زيادة التكلفة بسبب استخدام مكونات إضافية مع المفتاح‪.‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.11‬حساب المقاومة المستخدمة قبل اﻷحمال‬

‫ال ك‬ ‫حمل ‪ Load‬هو أي جهاز يتصل بخرج الممتحككم الدقيق مثل الدايود الضوئي‪ ،‬في المثلة السابقة‬ ‫لحظنصصا وجصصود مقاومصصة قبصصل كصصل دايصصود بقيمصصة )‪ 330‬أوم(‪ ،‬لمصصاذا اسصصتخدمنا هصصذه المقاومصصة وبتلصصك‬

‫القيمة تحديداا؟‬

‫هناك سببان لهذا المر‪ .‬الول هو أن الدايود الضوئي )خادصة اللون الحمر( يفضل أن يت م تشصغيله‬

‫بتيار كهربي ما بين ‪ 15‬إلى ‪ 20‬مللي أمبير عند تطبيق فرق جهد ‪ 5‬فولت‪ .‬وبالتعويض في قانون‬ ‫أوم الكهربي )فرق الجهد ‪ 5‬فولت – التيار ‪ 15‬مللي أمبير(‬

‫)‪Voltage(V )=Current (I )× Resistance ( R‬‬ ‫نجد أن المقاومة المناسبة هي ‪ 330‬أوم ‪.‬‬ ‫إذا لم تستخدم هصذه المقاومصة قصد تحصدث العديصد مصن المشصاكل‪ .‬فمثلا إذا تعصرض الصدايود الضصوئي‬

‫الحمر لكثر من ‪ 25‬مللي أمبير لفترة طويلة نسبياا ) ساعة أو أكثر( ف أنه سصيحترق وبالتأكيصد أنصت‬ ‫ل تريد دائرة إلكترونية تحتاج لتغيير دايود ضوئي كل ساعة !‬

‫ثانيصص اا‪ :‬قصصد يصصؤدي تشصصغيل الحمصصال بصصدون مقاومصصة لفصصترات طويلصصة إلصصى تصصدمير أطصصراف )بورتصصات(‬

‫الممتح ككم الصدقيق‪ .‬وذلصك بسصبب محدوديصة التيصار الكهربصي الصذي يمكصن سصحبه مصن كصل طصرف‪ ،‬إذا‬ ‫نظصصصصرت إلصصصصى الصصصصصفحة الخادصصصصصة بالخصصصصصائص الكهربيصصصصة للمتحكصصصصم ‪Electrical Charchtaristics‬‬

‫)دصفحة ‪ 291‬دليل بيانصصات الممتحككصصم ‪ .(ATmega16‬سصصتجد جصصدول الصصص ‪" Absolute values‬القيصصم‬ ‫المطلقة" وهي أقصى قيم كهربية يتحملها الممتحككم الدقيق‪.‬‬

‫‪118‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫لحظ السطر قبل اﻷخير حيث نجد ‪DC current per I/O = 40 mA‬‬ ‫هذا يعني أن أقصى تيار يمكن سحبة من أي ط رف مصن أطصراف الممتحككصم = ‪ 40‬مللصصي أمصبير وإذا‬

‫كان ال ك‬ ‫حمل يسحب أك ثر م ن ذلصك فهصذا سصيؤدي إلصى تل ف الممتحككصم الصدقيق‪ .‬عليصك أن تت ذكر هصذا‬ ‫الرقم جيداا عند تصميم أي دائرة إلكترونية‪.‬‬

‫الفضل أن تسحب الحمال تيار = ‪ %85‬من القيمة القصصوى وذلصك ح تى تضصمن أن يكصون العمصر‬

‫الفتراضي للمتحكم الدقيق أطول ما يكون‪ .‬فمث لا إذا طبقنا هذه القاعدة سصصنجد أن التيصصار المصصن‬

‫هو ‪ 34 = 40 * 0.85‬مللي أمبير‪.‬‬ ‫هذا يعني أن أقل مقاومة يمكن توصيلها على أي طرف من أطراف الممتحككننم )مننن قننانون أوم(‬ ‫تساوي ‪ 147‬أوم‪ ،‬مع ملحظة أننه يمكنن توصنيل أي قيمننة أعلنى ﻷن المقاومنات اﻷكنبر سنتمرر‬ ‫تيار كهربي أقل وهذا آمن تماماا‪.‬‬

‫‪119‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫توصيل أحمال بتيارات كبيرة‬ ‫أغلصصب الممتحككمصصات الدقيقصصة سصصواء القديمصصة أو حصصتى الحديثصصة نسصصبياا مثصصل ‪ ARM‬ل تسصصتطيع أن‬

‫تشصصغل أحمصصال تسصصحب تيصصار أعلصصى مصصصن ‪ 50‬مللصصي أمصصبير )أغلصصب ممتحككمصصات ‪ ARM‬يمكنهصصا إمصصداد‬

‫الحمال بتيار ما بين ‪ 15‬إلى ‪ 25‬مللي أمصصبير(‪ .‬لحصصل هصصذه المشصصكلة يتصصم اسصصتخدام دوائصصر القيصصادة‬ ‫‪ Driver circuits‬هذه الدوائر عبارة عن عنادصر تعمل كمكبر للجهد أو التيار أو كليهما‪.‬‬

‫عادة ما تبنى هذه الدوائر باستخدام الترانزستور سواء ‪ BJT‬مثل ‪ NPN‬أو الصصص ‪ MOSFET‬ويكصصون‬ ‫الفصصصصصارق الساسصصصصصي بينمهصصصصصا هصصصصصو أقصصصصصصى تيصصصصصار يمكصصصصصن أن يتحملصصصصصه الترانزسصصصصصتور‪ .‬حيصصصصصث تتميصصصصصز‬

‫ترانزستورات ‪ MOSFET‬بتحمل تيارات قد تصل إلى ‪ 40‬أمبير علصى عك س الصصص )‪NPN (or PNP‬‬ ‫والتي ل تتحمل أكثر من ‪ 5‬أمبير كأقصى تقدير‪.‬‬ ‫لنأخذ مثال علصى ه ذه الصدوائر‪ :‬لنفصترض أنصك تريصد تشصغيل ‪ 5‬دايصودات ضصوئية ويجصب أن تعمصل‬

‫مع اا في نفصس الصوقت‪ ،‬سصنجد أنصه يتصوفر خيصاران لتشصغل هصذه الصدايودات‪ ،‬الول هصو اسصتخدام ‪5‬‬ ‫أطراف من المتحكم الدقيق وتودصيل كل دايود على طرف مستقل ولكن هذا الخيار يعد إهصصدار‬

‫لطراف المتحكم‪.‬‬ ‫الخيار الثاني هو تودصيل الص ‪ 5‬دايودات كلها على طرف واحد باستخدام دائرة قيادة )وذلك لن‬ ‫الصصدايودات الخمسصصة ستسصصهلك ‪ 75 = 15×5‬مللصصي أمصصبير‪ ،‬وهصصذا أكصصبر بكصصثير ممصصا قصصد يتحملصصه‬ ‫المتحكم على طرف واحد(‪.‬‬

‫دائرة الترانزستور ‪2n2222‬‬

‫ميعد هذا الترانزستور أشهر أفراد عائلة الص ‪ NPN‬وأكثرهصصا تصصوافراا فصصي السصصواق‪ ،‬كمصصا يتميصصز بالسصصعر‬ ‫المنخفض )يمكنك شراء نحو ‪ 10‬قطع منه بدولر واحد( ويسصصتطيع تشصصغيل أحمصصال بتيصصار يصصصل‬ ‫إلصصى نصصصف أمصصبير )‪ 500‬مللصصي(‪ ،‬بصصافتراض أنصصك لصصم تجصصده فصصي السصصوق المحلصصي يمكنصصك شصصراء أحصصد‬

‫البدائل مثل‪:‬‬ ‫•‬

‫‪ – 2n3904‬مماثل للص ‪ 2n2222‬باستثناء أنه يتحمل ‪ 380‬مللي أمبير فقط‬

‫•‬

‫‪ - BC547‬مماثل للص ‪ 2n2222‬باستثناء أنه يتحمل ‪ 100‬مللي أمبير فقط‬

‫‪120‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الدائرة بالعلى تمثل طريقة تودصيل المتحكم الدقيق مع الترانزستور‪ ،‬حيث يتصصم تودصصصل طصصرف‬

‫المتحكم بقاعدة الترانزستور ‪ Base‬مصصن خلل مقاومصصة يجصصب أن تكصون قيمتهصصا مصصا بيصصن ‪ 150‬اوم‬ ‫إلى ‪ 1‬كيلو اوم‪.‬‬

‫يتم تودصيل الدايودات الضوئية على طرف المجمع ‪ collector‬مع وضع مقاومصصة ‪ 300‬اوم قبصصل‬ ‫كصصصل دايصصصود )لحمايصصصة الصصصدايود( ويتصصصم تودصصصصيل طصصصرف المشصصصع ‪ Emitter‬بصصصالطرف الرضصصصي‪ ،،‬نظريصصصاا‬

‫تستطيع هذه الدائرة أن تشصغل حصتى ‪ 30‬دايصصود ضصوئي )مصصن النصوع أحمصر اللصصون( لكصن كمصا أشصصرنا‬

‫مسبقاا يستحسن أن يتم تشغيل أي عنصر إلكتروني بحد أقصى ‪ %85‬من قصصدرته الكاملصصة وهصصذا‬ ‫يعني أن أقصى تيار للحمال المتصلة على ‪ 2n2222‬يجب أن يكون ‪ 400‬مللي أمبير فقط‪.‬‬

‫بعد النتهاء من توصيل هذه الدائرة يمكنك اختبارها عبر نفس المثال اﻷول ‪Blinking led‬‬ ‫ملحظة‪ :‬يتم استخدام مقاومة بين طرف المتحكم وقاعدة الترانزستور لن أغلب‬ ‫الترانزستورات ل تتحمل تيار على طرف القاعدة أكبر من ‪ 10‬مللي أمبير‬

‫‪121‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫تشغيل الم مرحركات‬

‫‪DC‬‬

‫تعد المحركات )المواتير ‪ (Motors‬من اشصهر العنادصصصر اللكتروميكانيكيصة والصصتي عصادة مصصا نجصدها‬ ‫فصصي النظمصصة المدمجصصة الخادصصصة بالروبوتصصات‪ ،‬مصصن أشصصهر هصصذه المحركصصات الصصص ‪) DC motor‬محصصرك‬ ‫التيار المستمر(‪ .‬هذا المحرك من المكونات التي تستهلك الكصصثير مصصن التيصصار الكهربصصي لصصذا ل يمكصصن‬

‫تودصليه مباشرة بالمتحكم الدقيق ويجب أن نستخدم ‪ Driver circuit‬لتشغيله‪.‬‬ ‫أبسط دائرة لتشغيل المحرك هي نفس الدائرة السابقة مع وجود بعض التعديلت البسيطة‬ ‫ملحظة‪ :‬يحتوي برنامج بروتس على محرك ‪ DC‬يسمى )‪ Active (Animated DC‬وهذا هو‬ ‫الموجود في الصورة بالسفل‪.‬‬

‫كما نرى من الصورة بالعلى يتم تودصيل المحرك في نفس مكصصان الصصدايودات الضصصوئية باسصصتثناء‬ ‫وجصصصصود دايصصصصود ‪ 1n4001‬متصصصصصل بطرفصصصصي المحصصصصرك‪ ،‬يسصصصصتخدم هصصصصذا الصصصصدايود فصصصصي الحفصصصصاظ علصصصصى‬ ‫الترانزستور والمتحكم الدقيق من ظاهرة التيار المستحث العكسي‪.‬‬

‫هصصذه الظصصاهرة تحصصدث مصصع جميصصع الحمصصال الصصتي تتكصصون مصصن ملصصف ‪ Coil‬مثصصل المحصصرك أو الممر ك‬ ‫حصصل‬

‫‪ Relay‬وذلك بسبب أن الملفصصات النحاسصصية تسصصتطيع أن تخصصزن بعصصض الطاقصصة بصصداخلها وعنصصد قطصصع‬

‫‪122‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬ ‫الكهربصصاء عنهصصا فإنهصصا تقصوم بتفريصصغ هصذه الطاقصصة المخزنصة علصى هيئصة تيصار عكسصي وقصد يصصؤدي هصذا‬

‫التيار إلى تضصصرر الترانزسصتور والمتحكصم الصدقيق‪ ،‬ويتصم اسصتخدام الصدايود بصصورة معكوسصة كمصا‬ ‫في الصورة السابقة لكي يمنع مرور هذه التيار من المحرك إلى الترانزستور‬ ‫ملحظة‪ :‬في حالة استخدام ترانزستور ‪ NPN‬مثل الص ‪ 2n2222‬يستحسن أن تستخدم مقاومة‬ ‫على طرف المشع )قبل أن يتصل بطرف الص ‪ (GND‬وذلك للحفاظ على الترانزستور من‬

‫السخونة والحتراق وهو ما يعرف باسم الص ‪ ،thermal stability‬حيث أن مرور التيار الخاص‬ ‫بتشغيل المحرك مباشرة إلى الترانزستور ‪ NPN‬بدون وجود هذه المقاومة قد يؤدي إلى‬ ‫ارتفاع درجة حرارة الترانزستور مع الوقت ثم يحترق‪.‬‬

‫بالرغم أن الدائرة السابقة تصلح لتشغيل المحرك إل أنه يفضل استخدام أحد الترانزستورات الصص‬ ‫‪ MOSFET‬بصصصدل الصصصص ‪ NPN‬حيصصصث أنهصصصا تسصصصتطيع تحمصصصل التيصصصار الكهربصصصي العصصصالي مثصصصل الترانزسصصصتور‬ ‫‪) IRZ44N‬الذي يمكنه تحمل حتى ‪ 41‬أمبير( كما هو موضح بالصورة التالية‪:‬‬

‫هصصذا الترانزسصصتور يتميصصز بوجصصود دايصصود الحمايصصة مدمصصج بصصداخله كمصصا هصصو موضصصح بالصصصورة لصصذا ل‬ ‫داعي لضافة الدايود ‪ .1n4001‬يمكنك تجربة هذه الدائرة بنفس الكود الخاص بالمثال الول‪.‬‬

‫‪123‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 4.12‬تشغيل الم مرحرك في كلا الاتجاهين‬

‫جميع التجارب السابقة لتشغيل المحرك ىدائرة القيادة المعتمدة علصصى الترانزسصصتور كصصانت تعمصصل‬

‫علصصصى تشصصصغيل المحصصصرك فصصصي اتجصصصاه واحصصصد فقصصصط‪ ،‬مصصصاذا إذا أردنصصصا تشصصصغيل المحصصصرك فصصصي اتجصصصاهين‬

‫مختلفين؟‬

‫يمكننصصا ذلصصك باسصصتخدام مصصا يعصصرف باسصصم ‪ H-Bridge‬وهصصي قنطصصرة مكونصصة مصصن ‪ 4‬ترانزسصصتور علصصى‬

‫شكل الحرف ‪ H‬ويتصل المحرك بوسط هذه القنطرة مثل الشكل التالي‪:‬‬

‫ملحظننننة‪ :‬الصصصصدوائر الصصصصتي تحتصصصصوي علصصصصى حرفصصصصي ‪ A,B‬تسصصصصمى ‪Default‬‬ ‫‪ Terminal‬وهصصي نقصصاط تودصصصيل تسصصتخدم لتودصصصيل المكونصصات ببعضصصها‬

‫البعصصض بصصصورة سصصهلة بصصدلا مصصن السصصلك المتداخلصصة ويمكنصصك الودصصصول‬ ‫إليها عبر الضغط على قائمة ‪ Terminal‬ثم اختيار ‪.Default‬‬

‫لتودصيل أكثر من نقطة ببعضصها البعصض كصل مصا عليصصك فعلصصه هصو الضصصغط‬ ‫علصصى هصصذه الصصدائرة وتسصصميها بحصصرف معيصصن مثصصل ‪ A,B,C,D‬وسصتقوم هصصذه‬ ‫الدوائر بتودصيل جميع الدوائر المسماه بنفس السم ببعضها البعض‪.‬‬

‫‪124‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫مبدأ عمل قنطرة ‪H‬‬ ‫تعمل الص ‪ H-bridge‬مثل ‪ 4‬مفاتيح‪ ،‬كما هو موضح في الصورة التالية‬

‫يعمل كل مفتاحين مع بعضصصهما البعصصض‪ ،‬فإمصصا أن يتصصم إغلق المفتصصاح ‪ S1‬و ‪ S4‬بحيصصث يمصصر التيصصار‬ ‫الكهربي من الطرف اليسر إلى الطرف اليمن للمحرك )بذلك يدور المحرك مصصع عقصصارب السصصاعة(‪،‬‬

‫أو يتصصم إغلق المفتصصاحين ‪ S2‬و ‪ S3‬بحيصصث يمصصر التيصصار الكهربصصي مصصن الطصصرف اليمصصن إلصصى الطصصرف‬ ‫اليسر وبالتالي يدور المحرك عكس عقارب الساعة‪.‬‬

‫‪125‬‬

‫‪ .4‬أساسيات التحكم ‪GPIO Basics‬‬ ‫… ‪..............................................................................................‬‬

‫الربرنامج‬

‫لتشصغيل ه ذه القنطصرة يتصم اسصتخدام طرفيصن مثصل ‪ PA0‬و ‪ PA1‬حي ث يتصصل كصل طصرف بعصدد ‪2‬‬ ‫من الترانزستورات كما هو موضح في الصورة الولى‪ ،‬ويتم التحكم باتجصصاه دوران المحصصرك عصصن‬

‫طريق تشغيل الطرف ‪ PA0‬وإطفاء ‪ PA1‬أو العكس )لتغير اتجاه دوران المحرك(‪.‬‬

‫‪#define F_CPU 1000000UL‬‬ ‫ rel="nofollow">‪#include ‪#include
‫;‪PORTA = 0b00000001‬‬

‫انتظر لمدة ثانيتين ‪//‬‬

‫;)‪_delay_ms(2000‬‬

‫تشغيل المحرك عكس عقارب الساعة ‪//‬‬

‫;‪PORTA = 0b00000010‬‬

‫انتظر لمدة ثانيتين ‪//‬‬

‫;)‪_delay_ms(2000‬‬

‫إطفاء جميع الترانزستور وإيقاف المحرك ‪//‬‬

‫;‪PORTA = 0b00000000‬‬

‫انتظر لمدة ثانيتين ‪//‬‬

‫;)‪_delay_ms(2000‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬

‫‪126‬‬

‫الفصل الخامس‬ ‫” قل للذي أحصى السنين مفاخرا يا صاح ليس السر ر في السنوات‬ ‫للكنه في المرء كيف يعيشها في يقظة ‪ ،‬أم في عميق سبات ‟‬

‫إيليا أبو ماضي – شاعر عربي‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ .5‬قواعد لغة السي للظنظمة‬ ‫المدمجة‬

‫في هذا الفصل سنتعلم بعض القواعد والصيغ الشهير للغة السي المعيارية والمستخدمة بشكل‬ ‫كصصصبير فصصي تطصصوير النظمصصة المدمجصصة‪ .‬تتميصصز الصصصيغ المعياريصصة بإمكانيصصة تطبيقهصصصا علصصصى مختلصصف‬

‫الممتحككمات الدقيقة طالماا أن المترجم الخاص بها يدعم لغة السي‪.‬‬ ‫✔‬

‫أنواع البيانات في النظمة المدمجة ‪Data-types‬‬

‫✔‬

‫العمليات الحسابية واختصاراتها ‪Arithmatic operations‬‬

‫✔‬

‫العمليات المنطقية واختصاراتها ‪Logic operations‬‬

‫✔‬

‫عمليات الزاحة‬

‫✔‬

‫التلعب بالبتتات‬

‫‪128‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 5.1‬أنواع البيانات في الأنظمة المدمجة‬

‫‪Data-types‬‬

‫فصصصصي عصصصصالم النظمصصصصة المدمجصصصصة هنصصصصاك معيصصصصار مختلصصصصف قليلا لتعريصصصصف البيانصصصصات مثصصصصل المتغيصصصصرات‬

‫والثوابت‪ .‬حيث نجد أن معظم الممتحككمصصات الدقيقصة خادصصصة مصصن فئصصة ‪ Bit-8‬تمتلصصك قصدر محصصدود‬

‫جداا من الذاكرة سواء الص ‪ ROM‬أو الص ‪) RAM‬بعض الممتحككمات قد يمتلك ‪ 128‬بايت فقط مصصن الصصص‬ ‫‪ .(RAM‬مما يتطلب أسلوب فعال لكتابة أكواد تحقق الهدف المطلوب بأقل استهلك للذاكرة‪.‬‬ ‫مثلا فصصي حالصصة كتابصصة برنامصصج بلغصصة السصصي علصصى الحاسصصب اللصصي التقليصصدي والصصذي يمتلصصك معالصصج‬ ‫وذاكصصرة ضصصخمة )تقصصدر بالجيجصصا بصصايت(وكلهمصصا مخصصصص للتعامصصل مصصع البيانصصات ‪ 32‬أو ‪ 64‬بصصت‪،‬‬

‫سصصصصنجد أن معظصصصصم المتغيصصصصرات الرقميصصصة تكصصصصون ‪ int‬أو ‪ double‬أو ‪ float‬أمصصصصا فصصصصي حالصصصصة النظمصصصصة‬

‫المدمجة يعد استخدام هذه النواع "اهدار للذاكرة" لصصذا سصصنتعلم فصصي هصصذا الجصصزء كيفيصصة برمجصصة‬

‫أنواع البيانات المختلفة بصورة ممحسنة خصيصاا لذاكرة الممتحككمات الدقيقة‪.‬‬

‫البيانات الرقمية‬

‫تعتبر الرقام هي أكثر أنواع البيانات استخداماا في عصالم النظمصة المدمجصة فهصي تعصبر عصصن قيصم‬ ‫المتغيرات مثل قراءات الحساسات )حرارة‪ ،‬ضغط‪ ،‬رطوبة‪ ،‬ضوء‪.. ،‬الصصخ( أو قيصصم المخصصارج مثصصل‬

‫قيمة أي ‪ PORT‬أو سرعة ‪ Motor‬أو توقيت زمنصصي ‪ ..‬إلصصخ‪ .‬وتعتصبر الرقصام هصي أكصثر مصا يسصتهلك‬ ‫الذاكرة )خادصة الص ‪ (SRAM‬لذا سيكون لها نصيب كبير من الشرح في هذا الفصل‪.‬‬

‫أنواع البيانات التقليدية‬ ‫هصصذه القائمصصة تمثصصل أشصصهر أنصصواع البيانصصات المسصصتخدمة فصصي تعريصصف المتغيصصرات فصصي لغصصة السصصي مصصع‬

‫حجم الذاكرة الذي تستهلكه كل منها‪ .‬مع العلم أنه يمكنك برمجة جميع النظمة المدمجة بها‪.‬‬

‫أنواع البيانات التي تستخدم في حفظ الرقام والموجبة والسالبة تسمى ‪signed numbers‬‬ ‫أما إذا وضعنا قبلها كلمة ‪ unsigned‬فإنها تصلح للتعامل مع الرقام الموجبة فقط ولكن‬ ‫بضعف مساحة التخزين‬

‫‪129‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫نوع البيانات‬

‫أقصى قيمة يمكن وضعها داخل المتغير استهلك الذاكرة )عدد ‪(Bytes‬‬

‫‪-32,768 → +32,767‬‬

‫)‪2-bytes (16 bit‬‬

‫‪int‬‬

‫‪65,535‬‬

‫)‪2-bytes (16 bit‬‬

‫‪unsigned int‬‬

‫‪1.2E-38 to 3.4E+38‬‬

‫)‪4-bytes (32 bit‬‬

‫‪float‬‬

‫‪2.3E-308 to 1.7E+308‬‬

‫)‪8-bytes (32 bit‬‬

‫‪double‬‬

‫‪-2,147,483,648 → +2,147,483,647‬‬

‫)‪4-bytes (32 bit‬‬

‫‪long‬‬

‫‪4,294,967,295‬‬

‫)‪4-bytes (32 bit‬‬

‫‪unsigned long‬‬

‫‪- 9.223372037×10¹⁸‬‬ ‫‪+ 9.223372037×10¹⁸‬‬

‫)‪8-bytes (64 bit‬‬

‫‪long long‬‬

‫‪1.844674407×10¹⁹‬‬

‫)‪8-bytes (64 bit‬‬

‫‪unsigned long long‬‬

‫ملحظة‪ :‬نوعي البيانات ‪ float‬و ‪ double‬دائماا يكونا من نوع ‪ Signed‬ول يمكن استخدام‬ ‫العلمة ‪ unsigned‬معهما‬

‫كما نلحصظ مصن الجصصدول السصابق أن جميصع أنصصواع البيانصات الشصهيرة تسصتهلك مسصاحة تبصصدأ مصن ‪2‬‬

‫بايت حتى ‪ 8‬بايت وتعتبر ه ذه المسصاحة كصبيرة نسصبياا فصي عصالم النظمصة المدمجصة‪ .‬فمثلا قيمصة‬

‫جل مثل ‪ PORTx‬أو ‪ PINx‬أو ‪ DDRx‬لن تزيد أبداا عن ‪ 8‬بت‪.‬‬ ‫أي ممس ك‬

‫والن لنتخيصصل أننصصا نحتصصاج متغيصصر اسصصمه ‪ ButtonStatus‬مصصن نصصوع ‪ int‬و سيسصصتخدم هصصذا المتغيصصر‬

‫جل ‪ PINB‬من نوع ‪ 8‬بت إذا كصل مصا يتطلبصه هصو‬ ‫في حفظ قراءة أطراف البورت ‪ B‬وبما أن الممس ك‬

‫متغيصصر بسصصعة ‪ 8‬بصصت فقصصط ول داعصصي أبصصداا لسصصتخدام متغيصصر بمسصصاحة ‪ 16‬بصصت‪ .‬لصصذا فجميصصع أنصصواع‬ ‫البيانات السابقة تعتبر اهدار للذاكرة‪.‬‬

‫لحل هذه المشكلة يتم استخدام أنواع البيانات المعيارية ‪ ANSI C - C99‬وهي دصصصورة محسصصنة‬ ‫لنصصواع البيانصصات وتمكننصصا مصصن اختيصصار قيمصصة المتغيصصرات بالدقصصة والطصصول المطلصصوب دون أي اهصصدار‬

‫للذاكرة‪.‬‬ ‫أقصى قيمة‬

‫‪130‬‬

‫‪Unsigned‬‬

‫أقصى قيمة‬

‫‪0 → 255‬‬

‫‪uint8_t‬‬

‫‪-128 → +127‬‬

‫‪int8_t‬‬

‫‪0 → 65,535‬‬

‫‪uint16_t‬‬

‫‪-32,768 → +32,767‬‬

‫‪int16_t‬‬

‫‪0 → 4,294,967,295‬‬

‫‪uint32_t‬‬

‫→ ‪-2,147,483,648‬‬ ‫‪+2,147,483,647‬‬

‫‪int32_t‬‬

‫‪1.844674407×10¹⁹‬‬

‫‪uint64_t‬‬

‫‪- 9.223372037×10¹⁸‬‬ ‫‪+ 9.223372037×10¹⁸‬‬

‫‪int64_t‬‬

‫‪Signed‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫يستهلك كصل متغيصر مصن القائمصة السصابقة مسصاحة = الرقصم المكتصوب بعصد كلمصة ‪ int‬أو ‪ uint‬فمثلا‬

‫‪ int8_t‬تعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع ‪ int‬ويصصصصلح لتخزيصصصن الرقصصصام الموجبنننة والسنننالبة فصصصي‬ ‫مسصصصاحة تخزينيصصصة = ‪ 8‬بصصصت فقصصصط )‪ 1‬بصصصايت(‪ .‬بينمصصصا ‪ uint16_t‬يعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع‬

‫‪ unsigned int‬ويصصصلح لتخزيصصن الرقصصام الموجبصصة فقصصط بمسصصاحة تصصصل إلصصى ‪ 16‬بصصت )‪ 2‬بصصايت(‪.‬‬

‫والن لنأخذ مجموعة من المثلة‪:‬‬ ‫ما هو نوع المتغير المطلوب للقراءة أو الكتابة في أي بورت )مثل ‪(port A, B,C‬؟‬ ‫•‬

‫جل ‪ PINx‬والصصصذي يكصصصون ‪ 8‬بصصصت‬ ‫بمصصصا أن جميصصصع البورتصصصات يتصصصم قراءتهصصصا مصصصن خلل الممسصصص ك‬

‫جل ‪ PORTx‬والصذي يعتصبر ‪ 8‬بصصت أيضصصاا‬ ‫وكذالك يتم كتابة في أي بورت باسصتخدام الممسصص ك‬

‫إذا أفضل نوع بيانصات هصو ‪ uint8_t‬حيصث يمكنصه تخزيصصن الرقصصام مصن ‪ 0b0000000‬إلصى‬ ‫‪0b11111111‬‬ ‫ما هو المتغير المناسب لتخزين عداد رقمي من صفر إلى ‪10,000‬؟‬ ‫•‬

‫بما أن الرقم ل يحتوي على أرقام سالبة وأقصى رقم مطلصوب هصو ‪ 10000‬وهصذا الرقصم‬

‫أكبر من ‪ 255‬لصذا ل يمكصصن اسصصتخدام متغيصصر بمسصصاحة ‪ 8‬بصصت ويجصب أن نسصتخدم متغيصر‬

‫بمساحة ‪ 16‬بت والذي يستطيع التعامل مصع ارقصام تصصل إلصى ‪ .65,535‬إذا أفضصل نصوع‬

‫بيانات هو ‪uint16_t‬‬

‫ما هو المتغير المناسب لتخزين درجة حرارة تتراوح بين سالب ‪ 50‬إلى موجب ‪100‬؟‬ ‫•‬

‫هنصصاك إجصصابتين لهصصذا السصصؤال‪ ،‬الولصصى‪ :‬فصصي حالصصة أننصصا نريصصد تخزيصصن أرقصصام دصصصحيحة فقصصط‬

‫مثل ‪ 20‬أو ‪ 50‬أو أي رقم بدون كسر عشري فسنجد أن افضل نصصوع بيانصصات هصو ‪int8_t‬‬ ‫حيصصث يسصصتطيع هصصذا النصصوع مصصن البيانصصات أن يخصصزن أي قيمصصة تصصتراوح بيصصن ‪ 128 -‬إلصصى ‪+‬‬

‫‪ 127‬ويستهلك ‪ 1‬بايت فقط من مساحة الذاكرة‪.‬‬ ‫•‬

‫الثانيصة‪ :‬فصصي حالصة وجصود كسصر عشصري مثصصل أن ‪ 25.1‬أو ‪ 30.5‬يجصب أن نسصتخدم نصصوع‬

‫البيانات ‪ float‬مع العلم أنه في المقابل سيتم اسصصتهلك مسصصاحة ذاكصصرة = ‪ 4‬بصصايت )‪32‬‬ ‫بت(‪.‬‬

‫السؤال الخير يدفعنا لنقطة هامة جداا وتسصمى الصص ‪ - Variable precision‬دقصة المتغيصر – بعصض‬

‫المتغيرات يجصب أن يتصم تخزينهصا بدقصة عاليصة جصداا‪ .‬والبعصض الخصر ل يتطلصب هصذه الدقصة فمثلا‬

‫إذا مطلب منك أن تصنع ساعة رقمية وبها حساس لعرض درجة حرارة الغرفة‪ ،‬سنجد أن المتغير‬

‫‪131‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫المناسب لتخزين قيم هصصذا الحسصصاس هصو ‪ int8_t‬وذلصصك لن درجصصة الحصصرارة المتوقعصة لي غرفصصة لصصن‬

‫تزيد عن ‪ 45‬أو تقصل عصن ‪ ) 5-‬حصتى أقصصصى بلد العصالم بصرودة تكصون درجصة حصرارة المنصازل معزولصة‬ ‫عصن درجصة الهصواء الخصارجي بفصارق ‪ 10‬درجصة علصصى القصل( كمصا أن الشصخص الصذي سيسصتخدم هصذه‬

‫السصصصاعة الرقميصصصة لصصصن يهتصصصم بعصصصرض درجصصصة الحصصصرارة بدقصصصة ‪ 25.20‬وسصصصيكتفي فقصصصط بمعرفصصصة الرقصصصم‬

‫الصحيح )مثل ‪ 25‬درجة(‪ .‬ولكن إذا طلب منك تصميم مقيصاس حصرارة طصصبي مثصل المسصتخدم فصي‬ ‫المستشصصفيات لقيصصاس درجصصة حصصرارة المرضصصى فيجصصب أن تكصصون درجصصة الحصصرارة محصصددة بدقصصة مثصصل‬

‫‪ 36.25‬لذا يجب أن يتم استخدام متغير من نوع ‪ float‬لتخزين ومعالجة هذه القيم‪.‬‬

‫أمثلة برمجية‬

‫قم بتودصيل ‪ 8‬دايودات ضوئية على أطراف البورت ‪ A‬ثم اكتب برنامج يقوم بإخراج القيم مصصن‬ ‫‪ 0‬إلى ‪ 255‬على البورت مع وضع تأخير زمني بين كل قيمة ‪ 100‬مللي ثانية‪.‬‬

‫‪#define F_CPU 1000000UL‬‬ ‫>‪#include ‪#include
‫متغير بمساحة ‪ 8‬بت لتخزين قيمة العداد ‪//‬‬

‫)‪int main(void‬‬ ‫{‬ ‫;‪uint8_t counter‬‬

‫ضبط كل أطراف البورت لتعمل كخرج ‪//‬‬

‫;‪DDRA = 0b11111111‬‬

‫عداد من ‪ 0‬إلى ‪// 255‬‬

‫)‪for (counter = 0; counter <= 255; counter++‬‬ ‫{‬ ‫;‪PORTA = counter‬‬ ‫;)‪_delay_ms(100‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬

‫‪132‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫صور مختلفة لكتابة المتغيرات الرقمية‬

‫فصصي لغصصة السصصي يمكصصن كتابصصة قيصصم المتغيصصرات الرقميصصة بطصصرق متنوعصصة‪ .‬فمثلا فصصي المثلصصة السصصابقة‬

‫قمنا باستخدام الصيغة الرقمية الثنائية ‪ Binary‬مثل‪:‬‬

‫;‪uint8_t variable = 0b00000011‬‬

‫أيضصصصاا يمكصصصن كتابصصصة المتغيصصصرات بالصصصصيغة العشصصصرية ‪ Decimal‬وهصصصي نفصصصس دصصصصيغة الرقصصصام الصصصتي‬ ‫نسصصصتخدمها فصصصي حياتنصصصا اليوميصصصة فمثلا الرقصصصم ‪ 0b00000011‬يسصصصاوي رقصصصم ‪ Decimal 3‬ويمكصصصن‬

‫كتابة نفس المر السابق بالصورة التالية‪:‬‬

‫;‪uint8_t variable = 3‬‬ ‫ويمكن استخدام الصيغة الستة‪-‬عشرية ‪ .Hexadecimal‬فمثلا لنفترض أننا نريد تعيين المتغير‬

‫‪ variable‬بقيمة ‪ 0b11110000‬والتي تساوي رقم ‪ 120‬بالصيغة العشرية‬

‫‪// Binary‬‬ ‫‪// Decimal‬‬ ‫‪// Hexadecimal‬‬

‫;‪uint8_t variable = 0b11110000‬‬ ‫;‪uint8_t variable = 120‬‬ ‫;‪uint8_t variable = 0xF0‬‬

‫مرفق مع الكتاب ملحق خاص بنظام العداد وتحويل قيم الرقام من وإلى الصيغ الثنائية‬ ‫والعشرية والستة‪-‬عشرية‪.‬‬

‫أيضاا لحظ أن القيم الستة‪-‬عشرية تبدأ بصص ‪ 0x‬بينما الصيغة الثنائية تبدأ بصص ‪ob‬‬

‫مراجع إضافية‬ ‫‪http://www.mjma3.com/programming/basics.html‬‬ ‫فيديو‪ :‬تحويل العداد من النظام العشري إلى الثنائي‬ ‫‪https://www.youtube.com/watch?v=-yrwpEuRjl0‬‬ ‫فيديو‪ :‬تحويل العداد من النظام الثنائي إلى العشري‬ ‫‪https://www.youtube.com/watch?v=lLbc5_JpTWI‬‬ ‫فيديو‪ :‬تحويل العداد من النظام الثنائي إلى الست‪-‬عشري‬ ‫‪https://www.youtube.com/watch?v=B33Iof0bUKg‬‬

‫‪133‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 5.2‬العمليات الحسابية‬

‫‪Arithmetic Operations‬‬

‫تسصصتطيع مترجمصصات لغصصة السصصي المعياريصصة المخصصصصة للمتحكمصصات الدقيقصصة أن تتعامصصل مصصع نفصصس‬

‫أوامصصر العمليصصات الحسصصابية الصصتي يمكصصن تنفيصصذها علصصى الحواسصصيب مثصصل عمليصصات الجمصصع والطصصرح‬

‫والضرب والقسمة‪ .‬لنأخذ بعض المثلة‪:‬‬

‫تعريف ‪ 3‬متغيرات ‪//X, Y, Z‬‬

‫;‪int X, Y, Z‬‬

‫عملية جميع رقمين ووضع الناتج في المتغير ‪// X‬‬

‫;‪X = 5 + 6‬‬

‫عملية طرح رقم من متغير ووضع الناتج في المتغير ‪// Y‬‬

‫;‪Y = 50 – x‬‬

‫عملية ضرب متغيرين ووضع النتيجة في المتغير ‪// Z‬‬

‫;‪Z = X * Y‬‬

‫أيضاا يمكن تنفيذ العمليات الحسابية على قيمة المتغير نفسه‪ .‬فمثلا قيمة المتغير ‪ x‬فصصي المثصصال‬ ‫السابق = ‪ 11‬والن نريد أن نزيد عليها ‪ 4‬لتصبح ‪ .15‬يمكن تنفيذ ذلك بالطريقة التالية‬

‫الن قيمة المتغير تساوي ‪// 15‬‬

‫;‪X = X+4‬‬

‫المصصر السصصابق يعنصصي‪ :‬قصصم بإضصصافة الرقصصم ‪ 4‬إلصصى القيمصصة الموجصصودة بالفعصصل فصصي المتغيصصر ‪ X‬ثصصم قصصم‬ ‫بكتابة النتيجة مرة أخرى داخل المتغير ‪ X‬وبذلك تصصصبح قيمتصصه ‪ .15‬مصع العلصصم أنصه يمكصصن إجصراء‬ ‫نفس الطريقة مع جميع العمليات الحسابية‬

‫الصور المختصرة‬

‫أطرح الرقم ‪ 2‬من المتغير ‪//‬‬

‫;‪X = X – 2‬‬

‫اضرب قيمة المتغير في ‪// 4‬‬

‫;‪X = X * 4‬‬

‫يمكن إجراء العمليات الحسابية على المتغيرات بصصورة مختصصرة‪ .‬فمثلا إذا أردنصا جميصع الرقصم‬

‫‪ 4‬على قيمة المتغير ‪ X‬فيمكن ذلك بأسلوب مختصر عبر إضافة علمة الجمع قبل أشارة =‬

‫اختصار اﻷمر ‪// X = X+4‬‬

‫;‪X += 4‬‬

‫أيضاا يمكن تطبيق نفس الختصار على أي عملية حسابية‬

‫‪134‬‬

‫اختصار اﻷمر ‪// X = X – 4‬‬

‫;‪X -= 4‬‬

‫اختصار اﻷمر ‪// X = X * 4‬‬

‫;‪X *= 4‬‬

‫اختصار اﻷمر ‪// X = X / 2‬‬

‫;‪X /= 2‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 5.3‬العمليات‬

‫المنطقية ‪Logic Operation‬‬

‫الص ‪ Logic operation‬مجموعة من الوامر المنطقيصة مثصل ‪ AND, OR, XOR, Invert, Shift‬هصذه‬

‫الوامر تساعدنا على القيام ببعض التحكم المتقدم سواء على المتغيرات أو إعصصدادات الممتحككصصم‬

‫أو أطراف الممتحككم )الدخل أو الخرج(‪ .‬جميع العمليات المنطقية )تمسى أيضاا الدوال المنطقية‬

‫‪ (Logic Function‬تمثل نفس البوابات المنطقيصصة المسصتخدمة فصصي الصصدوائر اللكترونيصة لكصصن يتصصم‬ ‫تطبيقها بصورة برمجية‪ .‬الجدول التالي يوضح قائمة بهصذه العمليصصات والرمصصوز المسصتخدمة فصي‬

‫لغة السي لتنفيذ كل واحدة منهم‪.‬‬ ‫”‪Logic Function in “ANSI C‬‬

‫‪Logic Function name‬‬

‫|‬

‫‪OR‬‬

‫&‬

‫‪AND‬‬

‫~‬

‫‪NOT‬‬

‫^‬

‫‪XOR‬‬

‫<<‬

‫‪Shift Left‬‬

‫ rel="nofollow">>‬

‫‪Shift Right‬‬

‫أمثلة على ‪XOR‬‬

‫أمثلة على ‪NOT‬‬

‫أمثلة على ‪OR‬‬

‫أمثلة على ‪AND‬‬

‫‪0^0=0‬‬ ‫‪0^1=1‬‬ ‫‪1^0=1‬‬ ‫‪1^1=0‬‬

‫‪~0=1‬‬ ‫‪~1=0‬‬

‫‪0|0=0‬‬

‫‪0&0=0‬‬

‫‪0|1=1‬‬ ‫‪1|0=1‬‬ ‫‪1|1=1‬‬

‫‪0&1=0‬‬ ‫‪1&0=0‬‬ ‫‪1&1=1‬‬

‫لنفهم هذه العمليات بصورة أفضل لنأخذ مجموعة من اﻷمثلة البرمجية‪.‬‬

‫‪135‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫استخدام ‪ - NOT‬ميستخلدم المر ‪ NOT “invert” value‬في عكس جميع البتات داخل أي متغير‬

‫جل فمثلا إذا كان لدينا المتغير ‪ Z‬كالتالي‪:‬‬ ‫أو أي ممس ك‬

‫‪Example 1:‬‬ ‫;‪unit8_t Z = 0b00000000‬‬ ‫;‪Z = ~ Z‬‬ ‫)‪// invert all Z bits (Z = 0b11111111‬‬ ‫تطصصبيق المصصر الخيصصر يعنصصي‪ :‬قصصم بعكصصس جميصصع البتصصات الموجصصودة فصصي المتغيصصر ‪ X‬ثصصم ضصصع القيمصصة‬

‫الجديدة داخل المتغير ‪ X‬وبذلك تصبح القيمة = ‪0b11111111‬‬

‫)‪// invert all Z bits (Z = 0b00001111‬‬

‫‪Example 2:‬‬ ‫;‪unit8_t Z = 0b11110000‬‬ ‫;‪Z = ~ Z‬‬

‫)‪// invert all Z bits (Z = 0b11001100‬‬

‫‪Example 3:‬‬ ‫;‪unit8_t Z = 0b00110011‬‬ ‫;‪Z = ~ Z‬‬

‫اسنتخدام ‪ - OR‬لنف ترض أن لصدينا متغيصر ‪ 8‬بصت ‪ xNumber‬وقيمتصه = ‪) 12‬بالنظصام العشصري(‬

‫أو ‪ 0b00011000‬بالنظام الرقمي كما هو موضح‪:‬‬

‫‪Example 4:‬‬ ‫;‪uint8_t xNumber = 0b00011000‬‬ ‫;‪xNumber = xNumber | 0b00000001‬‬

‫‪// 0b000011000 OR 0b0000001‬‬

‫المصصر السصصابق يعنصصي قصصم بتنفيصصذ العمليصصة المنطقيصصة ‪ OR‬مصصع محتصصوى المتغيصصر ‪ xNumber‬ثصصم ضصصع‬

‫النتيجة داخصصل المتغيصصر ‪ xNumber‬ممصصا سصصيجعل قيمصة المتغيصر تصصصبح ‪ .0b00011001‬وذلصصك لن‬ ‫المر ‪ OR‬يقوم بعمل ‪ OR operation‬على كل بت بين الرقمين كالتالي‪:‬‬ ‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫قيمة ‪ xNumber‬الدصلية‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫الرقم الثاني‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫نتيجة الن ‪OR‬‬

‫‪Example 5:‬‬ ‫;‪xNumber = 0b11111000‬‬ ‫;‪xNumber = xNumber | 0b00000011‬‬ ‫عند تنفيذ المر ‪ OR‬ستكون قيمة المتغير= ‪ 0b11111011‬كما هو موضح في الجدول التالي‪:‬‬

‫‪136‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫قيمة ‪ xNumber‬الدصلية‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫الرقم الثاني‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫نتيجة الن ‪OR‬‬

‫استخدام ‪ – AND‬تعمل عملية الص ‪ AND‬مثصل ضصرب رقميصن‪ .‬وعنصد تطبيقهصا بيصن المتغيصرات يتصم‬

‫عمل ‪ AND‬بين كل بت في المتغير الول وما يقابلها في المتغير الثاني‬

‫‪Example 6:‬‬ ‫‪;xNumber = 0b11111000‬‬ ‫;‪// 0b11111000 AND 0b1000001 xNumber = xNumber & 0b10000001‬‬ ‫النتيجصصة سصصتكون ‪ 0b10000000‬وذلصصك لن نتيجصصة عمصصل ‪ AND‬مصصع أي بصصت تحتصصوي علصصى دصصصفر =‬ ‫دصفر لذا نجد البت الخير فقط هي التي ستظل ‪ 1‬لن ‪1 = 1 & 1‬‬ ‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫قيمة ‪ xNumber‬الدصلية‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫الرقم الثاني‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫نتيجة الن ‪AND‬‬

‫اختصار العمليات المنطقية‬

‫يمكن اختصار العمليات المنطقية مثل العمليات الحسصصابية وذلصك عصبر وضصصع المصصر المنطقصي قبصصل‬

‫علمة = فمثلا يمكن إجراء الص ‪ logic operations‬كالتالي‪:‬‬ ‫;‪// xNumber = xNumber | 0b00000001‬‬ ‫;‪// xNumber = xNumber & 0b00000001‬‬ ‫;‪// xNumber = xNumber ^ 0b00000001‬‬

‫;‪xNumber |= 0b00000001‬‬ ‫;‪xNumber &= 0b00000001‬‬ ‫;‪xNumber ^= 0b00000001‬‬

‫ملحظة‪ :‬يمكن اختصار جميع العمليات المنطقية ماعدا عملية )العكس ‪ (Invert‬والتي تكتب‬ ‫فقط بالصورة التالية‪:‬‬ ‫‪xNumber = ~ xNumber‬‬

‫‪137‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫‪ 5.4‬عمليات اﻹزاحة‬

‫‪Shift operations‬‬

‫جل أو أي‬ ‫تعرف عمليات الزاحة بأنها تحريك البتات إلى اليمين أو اليسصصار داخصصل متغيصصر أو ممسصص ك‬ ‫قيمصصصة رقميصصصة‪ .‬تعصصصد هصصصذه العمليصصصات مصصصن أهصصصم الوامصصصر الصصصتي تسصصصتخدم فصصصي برمجصصصة المعالجصصصات‬

‫والممتحككمات الدقيقة كما سنرى‪.‬‬

‫مثال‪ :‬لنفرض أن لدينا الرقم ‪ 0b00000001‬لنقم بتطبيق عمليات الزاحة لجهة اليسار‪.‬‬ ‫‪0b00000001‬‬

‫الرقم الدصلي‬

‫‪0b00000010‬‬

‫إزاحة بمقدار ‪ 1‬بت جهة اليسار <<‬

‫‪0b00000100‬‬

‫إزاحة بمقدار ‪ 2‬بت جهة اليسار <<‬

‫‪0b00001000‬‬

‫إزاحة بمقدار ‪ 3‬بت جهة اليسار <<‬

‫مثال‪ :‬لنفرض أن لدينا الرقم ‪ 0b00000101‬لنقم بتطبيق نفس العمليات السابقة عليه‪.‬‬ ‫‪0b00000101‬‬

‫الرقم الدصلي‬

‫‪0b00001010‬‬

‫إزاحة بمقدار ‪ 1‬بت جهة اليسار <<‬

‫‪0b00010100‬‬

‫إزاحة بمقدار ‪ 2‬بت جهة اليسار <<‬

‫‪0b00101000‬‬

‫إزاحة بمقدار ‪ 3‬بت جهة اليسار <<‬

‫مثال‪ :‬لنفرض أن لدينا ‪ 0b01100000‬لنقم بتطبيق عمليات الزاحة لجهة اليمين‪.‬‬ ‫‪0b01100000‬‬

‫الرقم الدصلي‬

‫‪0b00110000‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬

‫‪0b00011000‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬

‫‪0b00001100‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬

‫تدعم لغة السي الوامر البرمجية لعمل الزاحة لجهة اليمين أو اليسار وتكتب كالتالي‪:‬‬

‫‪138‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫الزاحة لجهة اليسار‪:‬‬

‫)قيمة الزاحة << الرقم(‬

‫الزاحة لجهة اليمين‪:‬‬

‫)قيمة الزاحة >> الرقم(‬ ‫المثال الول‪ :‬قم بتودصيل ‪ 8‬دايودات ضوئية على البورت ‪ A‬ثم جرب البرنامج التالي‪:‬‬

‫)‪int main(void‬‬ ‫{‬ ‫;‪uint8_t counter‬‬ ‫;‪DDRA = 0xff‬‬ ‫)‪while(1‬‬ ‫{‬ ‫)‪for(counter = 0; counter <= 7; counter++‬‬ ‫{‬ ‫;)‪PORTA = (1 << counter‬‬ ‫;)‪_delay_ms(500‬‬ ‫}‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬ ‫‪139‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫نتيجة تنفيذ الكود ان الصدايودات الضصوئية سصتبدأ بالضصاءة واح دة تلصو الخصرى بدايصة مصن ‪PA0‬‬

‫إلى ‪ PA7‬بالترتيب كما في الصور التالية )الصور مرتبة من اليمين إلى اليسار(‪:‬‬

‫شرح الـكود‬ ‫فصصي البدايصصة تصصم تعريصصف متغيصصر يسصصمى ‪ counter‬حيصصث ستسصصخدم هصصذا المتغيصصر فصصي زيصصادة قيمصصة‬

‫الزاحة بصورة تلقائية‪ .‬أيضاا تم تعريف جميع أطراف البورت ‪ A‬لتعمل كخرج‪.‬‬

‫;‪uint8_t counter‬‬ ‫;‪DDRA = 0xff‬‬

‫داخصصل الصصص ‪ while loop‬اسصصتخدمنا دالصصة التكصصرار ‪ for‬وذلصصك لزيصصادة قيمصة المتغيصصر ‪ counter‬بصصصورة‬ ‫تلقائية من ‪ 0‬إلى ‪.7‬‬

‫)‪for(counter = 0; counter <= 7; counter++‬‬ ‫والن يأتي أمر المحاذاة‪ .‬حيث تم استخدام البورت ‪ A‬لعرض كيف تتحرك البت ‪ 1‬لجهة اليسار‬ ‫مع تأخير زمني نصف ثانية وهذا ما يسبب أن تضيء الدايودات الضوئية بالترتيب واح دة تلصو‬

‫الخرى‪.‬‬

‫;)‪PORTA = (1 << counter‬‬ ‫;)‪_delay_ms(500‬‬ ‫لحظ أن الرقم ‪)1‬المكتوب بالصيغة العشرية( الموجود في العبارة )‪PORTA = (1 << counter‬‬

‫يوازي بالضبط )‪PORTA = (0b00000001 << counter‬‬

‫‪140‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫‪,‬بسبب الدالة ‪ for‬نجد أنه عندما تكون قيمة ‪ counter = 1‬فهذا يجعل المر السابق يساوي‬

‫;)‪PORTA = (0b00000001 << 1‬‬

‫وعندما تكون قيمة ‪ counter = 1‬فهذا يوازي المر‬

‫;)‪PORTA = (0b00000001 << 2‬‬ ‫وعندما تكون قيمة ‪ counter = 3‬فهذا يوازي المر‬

‫;)‪PORTA = (0b00000001 << 3‬‬

‫وهكذا … وتستمر هذه الدورة إلى ما ل نهاية‪.‬‬

‫‪ 5.5‬التحك م على مستوى البت الواحدة‬

‫‪Single Bit‬‬

‫جلت مثل ‪ PINx, PORTx, DDRx‬وذلصك بكتابصصة‬ ‫في الفصل السابق قمنا بالتعامل مع بعض الممس ك‬

‫جلت‪ .‬جميصع المثلصصة السصصابقة اشصتركت فصي أمصصر هصام وهصصو‬ ‫بعض القيم الرقميصة داخصل هصذه الممسصص ك‬

‫جل فصصي نفصصس الصصوقت‪ .‬فمثلا عنصصدما نقصصوم بضصصبط أول ‪3‬‬ ‫كتابصصة جميصصع قيصصم البتصصات داخصصل كصصل ممسصص ك‬

‫أطصصصراف للبصصصورت ‪ A‬لتعمصصصل كخصصصرج فأننصصصا نكتصصصب ‪ DDRA = 0b00000111‬ممنننا يجعنننل اﻷطنننراف‬ ‫الثل ث اﻷولى خرج واﻷطراف الباقية تعمل كدخل‪.‬‬

‫لكصصن مصصاذا إذا أردنصصا تعصصديل طصصرف واحصد )وليكصصن الطصصرف الول فقصصط ‪ (PA0‬وفصصي نفصس الصصوقت ل‬

‫جل ‪DDRA‬؟‬ ‫نريد أن نغير قيمة أو محتوى أي بت أخرى في الممس ك‬

‫يمكننصا ذلصك بسصهولة عصبر دمصج مجموعصة مصن العمليصات المنطقصة وعمليصات الزاحصة‪ .‬حيصث تتصوفر‬

‫جل‪ .‬كمصصا‬ ‫دصيغ برمجية معينصة تمكننصصا مصن وضصع ‪ 1‬أو ‪ 0‬داخصصل بصت محصددة فصي أي متغيصر أو ممسصص ك‬

‫يمكننا أن نعكس بت معينه أو نعزلها عن باقي البتات‪.‬‬

‫كتابة ‪ 1‬داخل أي بت ‪Set Bit‬‬

‫تعصصرف الصصصيغة البرمجيصصة ‪ Set Bit‬أنهصصا وضصصع ‪ 1‬داخصصل قيمصصة أي بصصت‪ .‬بصصالعودة للسصصؤال السصصابق‬

‫لنفترض أننا نريد ضبط الطرف ‪ PA0‬فق ط ليعمصل كخصرج بغصض النظصر عصن بصاقي أطصراف البصورت‬ ‫‪ .A‬يمكن ذلك بسهولة عبر دمج المر ‪ OR‬مع ‪ left shift‬وتكون الصيغة العامة‬

‫;)‪Register |= (1 << bitName‬‬ ‫يتصصم اسصصتبدال كلمصصة ‪ Register‬بالمسصصجل المطلصصوب ويتصصم اسصصتبدال كلمصصة ‪ bitName‬باسصصم البصصت‬ ‫جل ‪ DDRA‬و الطرف ‪ PA0‬نكتب‪:‬‬ ‫المطلوب تغيير قيمتها‪ .‬فمثلا بتطبيق هذه الصيغة على الممس ك‬

‫‪// set PA0 to work as output‬‬

‫‪141‬‬

‫;)‪DDRA |= (1<< PA0‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬ ‫جل ‪PORTA‬‬ ‫أيضاا يمكننا استخدام نفس الصيغة لتشغيل نفس البت من الممس ك‬

‫‪// turn on PA0‬‬

‫;)‪PORTA |= (1<
‫كذلك يمكننا استخدام العملية ‪ OR‬لدمج أكثر من دصيغة من النوع السابق فصي أمصر واحصد‪ ،‬فمثلا‬ ‫لنفترض أننا نريد ضبط الطرف ‪ PA1‬و ‪ PA2‬ليعملن كخرج‪ ،‬يمكننا إما أن نكتب‪:‬‬

‫;)‪DDRA |= (1<
‫أو يمكن اختصار المرين في جملة واحدة فقط كالتالي‪:‬‬

‫كتابة ‪ 0‬داخل أي بت ‪Reset Bit‬‬

‫;)‪DDRA |= (1<
‫عملية الصص ‪ Reset Bit‬هصي عك س عمليصة ‪ Set Bit‬وتعنصي وضصع دصصفر داخصل أي بصت مطلوبصة وتتصم‬ ‫عبر دمج ‪ 3‬أوامر ‪ AND – left shift – invert‬وتكون الصيغة القياسية كالتالي‪:‬‬

‫;)‪Resgister &= ~ (1 << bitName‬‬ ‫مثال‪ :‬لنفترض أننا نريد جعل الطرف ‪ PC3‬يعمل كدخل بغض النظر عن باقي أطراف البورت ‪C‬‬

‫;)‪DDRC &= ~(1<
‫{ )(‪int main‬‬ ‫)‪// set 1 in PA0 (output‬‬

‫;)‪DDRA |= (1<
‫)‪// turn on led (set PA0‬‬

‫;)‪PORTA |= (1<
‫)‪// turn off led (reset PA0‬‬

‫;)‪PORTA &= ~ (1<
‫‪142‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬ ‫… ‪..............................................................................................‬‬

‫عكس بت محددة ‪Toggle Bit‬‬

‫تعصصد الصصصيغة البرمجصصة ‪ Toggle Bit‬مصصن أفضصصل الصصصيغ المسصصتخدمة فصصي البرمجصصة وتعنصصي أنصصه فصصي‬ ‫حالة أن البت المطلوبة = ‪ 1‬قم بعكسها إلصصى ‪ 0‬وإذا كصصانت تسصصاوي ‪ 0‬قصصم بعكسصصها إلصصى ‪ .1‬وتكصصون‬

‫الصيغة القياسية كالتالي‪:‬‬

‫;)‪Resgister ^= (1 << BitName‬‬ ‫باستخدام هذه الصيغة يمكننا اختصار المثال ص ‪ blinking led‬بأمرين فقط )بدلا من ‪ 4‬أوامر(‪.‬‬

‫)‪while (1‬‬ ‫{‬ ‫;)‪PORTA ^= (1<
‫تعد مجموعة الصيغ البرمجيصة السصابقة مصن أهصم الوامصصر الصتي ق د تسصتخدمها فصي برمجصة النظصم‬ ‫المدمجة خادصصة أنهصا مكتوبصصة بلغصة السصصي المعياريصصة ممصصا يجعلهصصا طريقصة "معياريصة" لعمصصل ‪ set‬أو‬

‫‪ reset‬لي بت مهما أختلف الممتحككم الدقيق أو الشركة المنتجة )طالماا أن المترجم الخاص‬

‫بهذا الممتحككم يدعم لغة السي المعيارية(‪.‬‬

‫‪ 5.6‬القراءة من بت واحدة‬

‫‪Read single bit‬‬

‫فصصي الفصصصل السصصابق شصصاهدنا بعصصض المثلصصة عصصن قصصراءة مفتصصاح إلكصصتروني )‪push button(switch‬‬

‫جل ‪ .PINx‬الطريقة السابقة كصصانت تقصصرأ جميصصع بتصصات‬ ‫وذلك عبر قراءة بورت كامل من خلل الممس ك‬

‫البورت ‪ PINx‬وتقارنها برقم مثل‪:‬‬

‫)‪if (PINB == 0b00000001‬‬ ‫};‪{PORTA = 0b00000001‬‬ ‫‪else‬‬ ‫};‪{PORTA = 0b00000000‬‬

‫لكن هناك دصيغة أفضل في حالة الرغبة بقراءة طرف واحد فقط وهي كالتالي‪:‬‬ ‫)‪Reister & (1<
‫))‪if (PINB & (1<
‫};‪{PORTA = 0b00000001‬‬

‫‪143‬‬

‫الفصل السادس‬ ‫”النجاح ليس نتيجة لعدم ارتكاب أي أخطاء‪،‬‬ ‫وللكنه نتيجة لعدم تكرار نفس الخطأ مرتين ‟‬

‫جورج برنارد شو ‪ -‬مؤلف أيرلندي شهير‪.‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة‬ ‫وسرعة التشغيل‬

‫هصصصذا الفصصصصل يشصصصرح العصصصدادات المتقدمصصصة لمتحكمصصصات ‪ AVR‬مثصصصل مفهصصصوم الفيصصصوزات‬ ‫ووظائفهصصصا المختلفصصصة مثصصصل تغيصصصر سصصصرعة التشصصصغيل ‪ Clock Rate‬واسصصصتهلك الطاقصصصة‪،‬‬

‫حمايصصة البرامصصج الموجصصودة علصصى الممتحككصصم مصصن السصصرقة أو التعصصديل وتشصصغيل بعصصض‬ ‫الخصائص المتقدمة الخرى‪.‬‬ ‫✔ الفيوزات ‪ Fuses‬للممتحككم ‪ATmega16‬‬ ‫✔ تغير سرعة )تردد( الممتحككمات‬

‫✔ بتات الغلق والحماية ‪Lockbits‬‬ ‫✔ برمجة الفيوزات‬ ‫✔‬

‫‪145‬‬

‫استهلك الطاقة والعمل على البطاريات‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪6.1‬‬

‫‪Fuses & Lockbits‬‬

‫في جميع الممتح ككمات الدقيقة يجب أن تمتلك طريقة مصا لتتحكصم فصي بعصض العصدادات بصصورة‬

‫دائمة ل تتغير مع انقطاع الكهرباء عن الممتحككصم الصدقيق‪ ،‬فمثل ممتحككمصات الصص ‪ AVR‬تصأتي بصصورة‬

‫افتراضصصصية مصصصن المصصصصنع تعمصصصل بصصصتردد ‪ 1‬ميجصصصاهرتز وقصصصد نحتصصصاج أن تغيصصصر هصصصذه السصصصرعة ليعمصصصل‬

‫الممتحككم دائما بسرعة ‪ 16‬ميجاهرتز‪ ،‬مثل هصذه العصصدادات يجصصب أن تتصصم مصصرة واحصدة ول تتغيصصر‬ ‫في المستقبل‪ ..‬هنا يأتي دور الفيوزات ‪.Fuses‬‬

‫الفيصصصوزات هصصصي وحصصصدات ذاكصصصرة )بتصصصات ‪ (Bits‬يتصصصم برمجتهصصصا بصصصصورة مسصصصتديمة‪ ،‬هصصصذا يعنصصصي أن‬

‫محتواها ل يتغير بإعادة تشغيل الممتحككم أو انقطاع الكهرباء أو حتى برمجة الصذاكرة الرئيسصصية‬ ‫)‪ ،(Flash Memory‬هذه الفيصوزات تحتفصصظ بمجموعصصة خادصصصة مصصن العصصدادات المطلوبصصة وجودهصصا‬ ‫بصورة مستديمة‪.‬‬

‫تنقسم الفيوزات في ممتحككمات الص ‪ AVR‬إلى ‪ 3‬فيوزات رئيسية وص هي‪:‬‬

‫‪ : Low Fuse Byte‬يتكون من ‪ 8‬بتات – كل ‪ 1‬بت تتحكم في خادصية معينة في الص ‪AVR‬‬

‫‪ :HIGH Fuse Byte‬أيضاا ‪ 8‬بت ‪ -‬كل ‪ 1‬بت تتحكم في مجموعة خصائص‬ ‫‪ :Extended Fuse Byte‬في معظم الممتحككمات تكون أقل من ‪ 5‬بتات‬ ‫جميع البتات في الفيوزات الثلثة السابقة لها وضعان من البرمجة‬ ‫•‬ ‫•‬

‫‪ programmed = 0‬الفيوز تم برمجته وتفعيل الخادصية التي يتحكم بها‬

‫‪ unprogrammed = 1‬الفيوز لم ميفعل وتم إلغاء الخادصية التي يتحكم بها‬

‫يتصصصصم تفعيصصصصل أحصصصد الوضصصصصاع بكتابصصصصة ‪ 0‬أو ‪ 1‬فصصصصي هصصصصذا الفيصصصصوز‪ ،‬مصصصصع ملحظصصصة أن دصصصصصفر ل تعنصصصصي‬ ‫‪ unprogrammed‬بصل العكصس – حيصث يمكصن أن الفيصوز يتصم تفعيلصه ‪ programmed‬عنصدما تضصع‬

‫بداخله القيمة ‪ 0‬ويتم إلغاؤه عندما تضع بداخله القيمة ‪.1‬‬

‫تحذير‪ :‬بعض الفيوزات إذا تم برمجتها بصورة خاطئة قد تتسبب في تعطيل الممتحككم‬ ‫أو إلغاء إمكانية برمجته مرة أخرى إل باستخدام مبرمجات خاصة ‪High voltage‬‬ ‫‪ ،programmers‬لذا كن على حذر عند اختيار قيم الفيوزات وتأكد أكثر من مرة من‬ ‫جميع العدادات قبل برمجتها‪.‬‬ ‫‪146‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫يمكنك التعرف علصى تفادصصيل الفيصوزات وكيفصة تفعيلهصا وذلصك عصبر فتصح الصص ‪ Datasheet‬الخادصصة‬

‫بمتحكمصصات الصصص ‪ AVR‬والبحصصث عصصن جصصداول ‪) Fuse LOW Byte , Fuse High Byte‬موجصصودة فصصي‬

‫دصفحة ‪ 260‬للص ‪ Datasheet‬في حالة الممتحككم ‪.(ATmega16‬‬

‫‪Fuse High Byte‬‬

‫يوضح الجدول قيمة كل بصت ف ي ج دول الفيصوزات الصص ‪ High Byte‬مصع القيمصة الفتراضصية لكصل‬

‫فيوز )هذه هي القيم التي تصأتي مبرمجصة مسصبقاا مصن المصصنع(‪ ،‬وكمصا نصرى بعصض الفيصوزات تصأتي‬ ‫مفعلة بينما بعض يكون غير مفعل بصورة افتراضية‪.‬‬ ‫قبل أن نبدأ مع الفيوزات سنحتاج أن نتعرف على مفهوم الن ‪Bootload‬‬ ‫البصصووت‪-‬لصصودر هصصو برنامصصج )اختيصصاري( دصصصغير يتصصم تشصصغيله قبصصل البرنامصصج الرئيسصصي للقيصصام ببعصصض‬

‫الوظائف‪ ،‬فمثلا أشهر بووت‪-‬لودر هو ‪ Arduino bootloader‬هو السر الذي جعل تكلفصصة لوحصصات‬ ‫آردوينصصو منخفضصصة جصصداا‪ .‬يقصصوم هصصذا البصصووت‪-‬لصصودر بوظيفصصة بسصصيطة وهصصي فتصصح منفصصذ السصصيريال‬

‫‪ UART‬ونقصصل البيانصصات )أن وجصصدت( إلصصى ذاكصصرة الممتحككصصم ‪ flash memory‬هصصذا يعنصصي أنصصه يقصصوم‬

‫ببرمجة الممتحككم عبر السصيريال بصصورة ذاتي ة ‪ self programming‬دون الحاجصة لسصتخدام أي‬

‫‪147‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫جهصصصاز ‪ programmer‬وبالتصصصالي يصصصوفر كصصصثيراا فصصصي تكلفصصصة دصصصصناعة اللوحصصصات التطويريصصصة ويعطصصصي‬

‫الممتح ككم إمكانية البرمجة الذاتية عبر منفذ السيريال بدون تكلفة تصصذكر‪ .‬فمثل لوحصصة ‪Arduino‬‬ ‫‪ Nano‬تباع من المواقع الصينية بنحو ‪ 3‬دولر فقط مما يجعلها أرخص لوحة تطصصوير فصصي العصصالم‬

‫وتشمل الممتحككم الدقيق ‪ atmega328‬مع ‪USB to ttl converter‬‬ ‫والن نعود مرة أخرى للفيوزات‪:‬‬

‫جل‬ ‫‪ BOOTRST‬عنصصد تفعيصصل هصصذا الفيصصوز يبصصدأ الممتحككصصم الصصدقيق بتشصصغيل الصصص ‪ bootloader‬الممسصص ك‬

‫فصصي الصصذاكرة أولا وبعصصد النتهصصاء مصصن تنفيصصذه يتصصم النتقصصال إلصصى الصصص ‪ ،main function‬فصصي أغلصصب‬ ‫الحالت ل يتم اسصتخدام ه ذا الفيصوز مصالم تسصتخدم ‪ ،bootloader‬القيمصة الفتراضصية = ‪ 1‬ممصا‬

‫يعني أن الممتحككم سيشغل البرنامج الرئيسي وسيتجاهل البووت‪-‬لودر‪.‬‬

‫)‪ BOOTSZ(0,1‬يتحكم هذا الفيوز في حجم ومكان تسجيل البصووت‪-‬لصودر فصي الصذاكرة ولصديهم‬ ‫جصصدول كامصصل مصصن العصصدادات موجصصودة فصصي دصصصفحة ‪) 257‬مجصصدداا إذا لصصم تكصصن تنصصوي اسصصتخدام‬

‫بووت‪-‬لودر فل تقم بتغير إعدادات هذا الفيوز(‪.‬‬

‫‪ EESAVE‬يتحكم الفيوز في ما سيحدث لذاكرة الص ‪ EEPROM‬عند برمجصة الممتحككصم‪ ،‬عنصدما يتصم‬

‫وضع قيمته = ‪ 1‬سيقوم الممتحككم بمسح الص ‪ EEPROM‬في كل مرة يتم رفع ملف هيكس جديد‬ ‫وعنصصدما تكصصون قيمتصصه = ‪ 0‬فصصإن الممتحككصصم لصصن يقصصوم بمسصصح محتصصوى الصصص ‪ EEPROM‬أبصصداا مهمصصا كصصان‬ ‫عدد مرات البرمجة‪ .‬القيمة الفتراضية = ‪1‬‬

‫‪ CKOPT‬يتحكصصصم فصصصي طاقصصصة المذبصصصذب ‪ clock oscillator‬والمكثفصصصات الداخليصصصة )سصصصيتم شصصصرحه‬ ‫بالتفصيل في الجزء الخاص بالمذبذبات(‪.‬‬ ‫‪ SPIEN‬تفعيصصل خادصصصية البرمجصصة عصصبر منفصصذ الصصص ‪ ،SPI‬هصصذا الفيصصوز فصصائق الهميصصة حيصصث يتحكصصم فصصي‬

‫تفعيصصل برمجصصة الصصصذاكرة‪ .‬وعنصصدما يتصصم وضصصع قيمتصصه = ‪ 1‬يتصصم إلغصصاء إمكانيصصة برمجصصة الممتحككصصم مصصرة‬ ‫أخصصرى وعنصصدها لصصن تسصصتطيع أن ترفصصع عليصصه أي برامصصج جديصصدة‪ ،‬القيمصصة الفتراضصصية = ‪ 0‬وتعنصصي أن‬

‫البرمجة عبر الص ‪ spi‬تعمل‪ .‬بعض الشركات تستخدم هذا الفيوز لتمنع أي شخص من إعادة برمجة‬

‫الممتحككم الدقيق مرة أخرى‪.‬‬

‫ل تقم بتغيير الفيوز ‪ SPIEN‬أبداا طالماا أنك تتدرب على برمجة المعالج وإل لن تتمكن من‬ ‫استخدام الممتحككم مرة أخرى‬

‫‪148‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫‪ JTAGEN, OCDEN‬كل الفيصصصصوزان يسصصصصتخدمان للتحكصصصصم فصصصصي تفعيصصصصل خادصصصصصية التنقيصصصصح عصصصصبر‬

‫بروتوكول الص ‪ Jtag‬العالمي‪.‬‬

‫ما هو الـ ‪Jtag‬‬

‫‪ Jtag‬بروتوكول عالمي ‪ Universal protocol‬يتوفر في معظم الممتحككمات المختلفصصة فصصي العصصالم‬ ‫سواء كانت ‪ PIC, AVR, ARM‬أو حتى المصصفوفات المنطقيصة ‪ FPGA‬ويسصتخدم فصي العديصد مصن‬ ‫الشياء المفيدة أهمها عملية التنقيح ‪ Debugging‬وقراءة محتويات الممتحككم الداخلية‪.‬‬

‫جل ما ويتخذ قرار معين بناء على هذه القيمصصة لكصصن‬ ‫فمثلا قد نقوم بكتابة برنامج يقرأ قيمة ممس ك‬

‫عنصصد تنفيصصذ البرنامصصج نجصصد أن البرنامصصج يتصصصرف بصصصورة خاطئصصة‪ ،‬هصصذا التصصصرف الخصصاطئ يسصصمى‬

‫‪ – bug‬يعمصصل الصصص ‪ Jtag debugger‬علصصى الودصصصول إلصصى محتويصصات المعالصصج وإيقصصافه فصصي لحظصصة مصصا‬

‫جلت أو المصصر إلصصى‬ ‫وقراءة جميع المحتويات مثل قيمة المتغيرات في الذاكرة أو محتصصوى الممسصص ك‬

‫سيتم تنفيذه في الص ‪ .. Program counter‬الخ‪.‬‬

‫كما يمكن استخدام الص ‪ Jtag‬لتشغيل الممتحككصصم بخادصصصية ‪ single instruction execution‬والصتي‬ ‫تعني تنفيذ كل أمر بصورة يدوية‪ ،‬يعني أن الممتحككم لن يقصوم بتنفيصذ الوامصصر البرمجيصة بصصصورة‬ ‫متتالية ولكن سينفذ كل أمر على حدى عندما تأمره أنت بذلك‪.‬‬

‫بهصصصذه المميصصصزات يسصصصاعدك الصصصص ‪ Jtag debugger‬علصصصى تتبصصصع الخطصصصاء وادصصصصلحها والتأكصصصد مصصصن أن‬

‫الممتحككم يعالج البيانات بصورة دصحيحة‪ .‬كما أن بروتوكول الص ‪ jTag‬ميستخلدم أيضصصاا فصصي برمجصصة‬ ‫الممتحككمات المختلفة وحتى الص ‪.FPGA‬‬

‫يمكنك قراءة المزيد عن هذا البروتوكول بصورة مفصلة من الرابط التالي‪:‬‬ ‫‪en.wikipedia.org/wiki/Joint_Test_Action_Grou‬‬ ‫‪www.ATmel.com/webdoc/atmelice/atmelice.using_ocd_physical_jtag.hl‬‬ ‫لحظ أن ‪ ATmega16‬يأتي مفعلا بخيار تشغيل الص ‪ jtag‬وهذا الخيار يلغي إمكانية استخدام‬ ‫معظم أطراف البورت ‪ PORTC‬كمنافذ ‪ IN/OUT‬لذا‪ ،‬إذا كنت تريد استخدام هذا البورت‬ ‫بالكامل يجب عليك أن تلغي تفعيل الص ‪ jtag‬بوضع قيمة ‪JTAGEN =1‬‬

‫‪149‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪LOW Byte Fuse‬‬

‫مجموعة الفيوزات الص )‪ CKSEL(0,1,2.3‬سيتم شرحها بالتفصيل في جزء المذبذبات‬ ‫قبصصصل شصصصرح الفيصصصوزات ‪ BOD‬يجصصصب أن نتعصصصرف علصصصى مفهصصصوم جديصصصد أيضصصصا وهصصصو الصصصص ‪Brown Out‬‬ ‫‪ Detection‬أو ما يعرف اختصاراا بص ‪.BOD‬‬

‫تعمل هذه الخادصية على إيقاف تشغيل الممتحككصم الصصدقيق عنصدما يقصل فصرق الجهصصد المطبصصق عليصه‬

‫عن حد معين‪ .‬وهنذا سنيدفعنا للتس اؤل – لمناذا قند نحتناج أن نوق ف تشنغيل الممتحككنم عنندما‬ ‫يقل فرق الجهد ؟؟‬

‫العديد من الممتحككمات الدقيقة )ليس الص ‪ AVR‬فقط( تتطلب فرق جهد معين ليعمصصل عنصصد سصصرعة‬

‫محددة بصصصورة مسصتقرة‪ .‬فمثل الممتحككصصم ‪ ATmega16‬يمكنصصه العمصصل بسصصرعة ‪ 1‬ميجصصا بفصصرق جهصد‬ ‫‪ 1.8‬فولت ولكن إذا تم تشغيله بسرعة ‪ 16‬ميجاهرتز يجب أن يكون فرق الجهد الذي يعمصصل بصصه‬

‫= خمسصصة فصصولت علصصى القصصل وحصصتى ‪ 5.5‬فصصولت علصصى الكصصثر‪ .‬وإذا انخفصصض الجهصصد عصصن الخصصامس‬ ‫فولت سيحدث اضطراب للمذبذب ولن يقوم بتوليد نبضات زمنية دصحيحة‪.‬‬ ‫بالتصصالي فصصان أي أمصصر ‪ delay‬أو أي أمصصر معتمصصد علصصى عامصصل زمنصصي سصصيتم تنفيصصذه بصصصورة خاطئصصة‪.‬‬

‫أيضاا انخفاض الجهد عنصد تشصغيل الممتحككصصم علصى سصرعات عاليصصة قصد يصصصحبه أخطصصاء فصي قصراءة‬

‫الصصذاكرة والصصص ‪ EEPROM‬وقصصد يتسصصبب فصصي أخطصصاء أخصصرى عشصصوائية‪ .‬لصصذا يتصصم اسصصتخدام الصصص ‪BOD‬‬ ‫ليقصصاف تشصصغيل الممتح ككصصم إذا كصصان فصصارق الجهصصد المطبصصق عليصصه أقصصل مصصن المطلصصوب ويتصصم إعصصادة‬

‫تشغيله تلقائياا عندما يعود فارق الجهد للمستوى المناسب ليعمل الممتحككم بكفاءة‪.‬‬

‫‪150‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫الحقيقة أنه ل داعي لتشغيل الص ‪ BOD‬إل إذا كنت ستشغل الممتحككم بسرعة أكبر من ‪4‬‬

‫ميجاهرتز لن معظم ممتحككمات الص ‪ AVR‬يمكنها العمل بصورة طبيعية حتى فرق جهد ‪1.8‬‬ ‫فولت على سرعات من ‪ 1‬إلى ‪ 4‬ميجا‪.‬‬ ‫‪ BODEN‬يقصصصوم هصصصذا الفيصصصوز بتفعيصصصل خادصصصصية الصصصص ‪ BOD‬ويصصصأتي بقيمصصصة ‪) 1‬غيصصصر مفعصصصل( بصصصصورة‬

‫افتراضية‬

‫‪ BODLEVEl‬يتحكصم الفيصوز فصصي فصارق الجهصصد الصصذي سصيتم إيقصصاف الممتحككصصم عصصن التشصغيل عنصصدما‬

‫يصل إليه‪ ،‬فإذا كانت قيمصة الفيصصوز = ‪ 1‬هصذا يعنصي أن الممتحككصم سصيتم إيقصاف تشصغيله عنصد فصصرق‬

‫جهد أقصل مصصن ‪ 2.7‬فصولت أمصصا إذا كصانت قيمصصة الفيصوز = ‪ 0‬هصذا يعنصي أن الممتحككصم سصيتوقف عنصد‬

‫فصصرق جهصصد أقصصل مصصن ‪ 4‬فصصولت )مصصع ملحظصصة أن هصصذه العصصدادات تصصصبح فعالصصة إذا كصصانت قيمصصة الصصص‬ ‫‪ BODEN‬مفعلة أي أنها تساوي دصفر(‪.‬‬ ‫)‪ SUT(0,1‬تتحكصصصم هصصصذه الفيصصصوزات فصصصي الزمصصصن الصصصذي سيسصصصتغرقه الممتحككصصصم مصصصن بدايصصصة تودصصصصيل‬

‫جل بصصداخله أو الصصوقت المسصصتغرق لعمصصل ‪.Reset‬‬ ‫الكهربصصاء حصصتى البصصدء فصصي تنفيصصذ البرنامصصج الممسصص ك‬

‫يمكنك ضبط هذا الفيصوز بمجموعصة مصصن القيصم المختلفصة )الجصدول يوضصح زمصن تصأخير التشصغيل‬

‫عنصصصد اسصصصتخدام المذبصصصذب الصصصداخلي مصصصع ملحظصصصة أن هصصصذه العصصصدادات تختلصصصف عنصصصد اسصصصتخدام‬

‫كريستالة خارجية أو مذبذب من نوع أخر(‪.‬‬

‫كما هو موضصح ف ي الجصدول‪ ،‬نجصد أن تغييصر العصدادات سصيجعل الممتحككصم يتصأخر إمصا ‪ 0‬أو ‪ 4‬أو‬

‫‪ 65‬مللصصي ثانيصصة عنصصد بدايصصة التشصصغيل )يعنصصي أنصصه سيسصصتغرق ‪ 64‬مللصصي ثانيصصة مصصن بصصدء تودصصصيل‬ ‫الكهرباء إلى أن يبدأ تنفيذ البرنامج(‪.‬‬

‫لماذا نحتاج أن نجعل الممتحككم يتأخر فترة ما قبل أن يبدأ تنفيذ البرنامج؟‬ ‫‪151‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫هناك سببين لهذا المر‪.‬‬ ‫•‬

‫اﻷول‪ :‬بعصض الصدوائر والعنادصصر اللكترونيصة الصتي قصد تتصصل بصالمتحكم الصدقيق تحتصاج‬ ‫القليل من الوقت بعد تودصيل الكهرباء حتى تكصصون جصصاهزة للعمصصل بصصصورة مسصصتقرة لصصذا‬

‫يستحسصصن أن يتصصأخر الممتحككصصم الصصدقيق قليلا قبصصل أن يبصصدأ العمصصل أو التصصصال مصصع هصصذه‬ ‫المكونات‪.‬‬ ‫•‬

‫الثنناني‪ :‬معظصصم دوائصصر المذبصصذبات ‪ Oscillator‬الصصتي تولصصد الصصص ‪ CPU Clock‬تحتصصاج لصصوقت‬

‫كبير نسبياا حتى تستقر النبضات المتولصدة منهصا )مثصل دوائصر الصصص ‪ RC oscillator‬وبعصصض‬

‫الص ‪ (ceramic oscillator‬لذا يجب علصى الممتحككصم أن يتصأخر قليلا حصتى تسصتقر ذبصذبات‬ ‫الساعة الداخلية‪.‬‬ ‫يستحسن أن تجعل التأخير الزمني = ‪ 65‬مللي ثانية لضمان أفضل أداء للممتحككم وهذا يعني‬ ‫أن تجعل قيمة الص ‪ SUT0 – SUT1‬كلهما = ‪1‬‬

‫‪152‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪LockBits 6.2‬‬ ‫مثصصل الفيصصوزات تتحكصصم الصصص ‪ lockbits‬فصصي مجموعصصة مصصن الخصصصائص الثابتصصة الصصتي ل تتغيصصر إذا تصصم‬ ‫برمجتها‪ ،‬هصذه الخصصائص ه ي " إمكانيصة الودصصول وحمايصة الصذاكرة"‪ .‬حيصث يمكنصك اسصتخدام الصص‬

‫‪ lockbits‬فصصي حمايصصة البيانصصات علصصى ذاكصصرة الممتحككصصم الرئيسصصية ‪ flash‬مصصن النسصصخ أو القصصراءة كمصصا‬ ‫يمكنك حماية بعض أجصزاء الصذاكرة ‪ eeprom‬مصن الكتابصة عليهصا ومنصع أي برنامصج أو شصخص مصن‬

‫الودصول إلى محتواها‪.‬‬

‫أيضاا تستخدم الص ‪ lockbits‬في تخصصيص جصزء ثصابت مصن الصذاكرة ل يقبصل التعصديل بعصد برمجتصه‬

‫مثصصل مصصا يحصصدث مصصع الصصص ‪) bootloader‬أشصصهر مثصصال للبوتلصصودر هصصو ‪ (arduino bootloader‬وهصصو‬ ‫البرنامج المسؤول عن استقبال ملف الص ‪ hex‬من السيريال بدل من الص ‪.SPI‬‬ ‫كمصصا نصصرى فصصي الجصصدول التصصالي اعصصدادت الصصص ‪ lockbit‬الصصتي يمكنهصصا أن تغلصصق إمصصا القصصراءة والكتابصصة أو‬ ‫القراءة فقط من جميع أنواع الذاكرة ‪ Flash & EEPROM‬وذلك عصبر التحكصم فصي قيصم الصص ‪ LB1‬و‬ ‫‪LB2‬‬

‫•‬

‫عندما تكون ‪ LB1 = 1‬و ‪ LB2 =1‬ل يتصم تفعيصل الصص ‪ lockbit‬ويسنمح بنالقراء والكتاب ة‬ ‫من وإلى الذاكرة‬

‫•‬

‫عنصصصدما تكصصصون ‪ LB1 = 0‬و ‪ LB2 =1‬يتصصصم تفعيصصصل الحمايصصصة ويمننننع أي محاولنننة )كتابنننة(‬

‫•‬

‫عنصصدما تكصصون ‪ LB1 = 0‬و ‪ LB2 =1‬يتصصم تفعيصصل الحمايصصة ويمنننع أي محاولننة )كتابننة أو‬

‫بيانات على كل من الص ‪ Flash‬والص ‪EEPROM‬‬

‫قراءة( البيانات على كل من الص ‪ Flash‬والص ‪EEPROM‬‬

‫‪153‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ 6.3‬المذبذبات والـ‬

‫‪Clock Source‬‬

‫عندما نشتري أجهزة الحاسوب الخادصة نحاول‬ ‫دائما شراء الجهاز السرع وهنا نجد الشركات‬

‫المصنعة دائماا تتباهي بأن منتجاتها هي الفضل‬ ‫لنها تعمل بأعلى سرعة معالجة )تقاس‬

‫بالجيجاهرتز – مليار هرتز(‪ .‬ومثل أجهزتنا‬

‫الشخصية نجد أن سرعة الممتحككمات الدقيقة هي‬

‫شكل نبضات الساعة عبر الزمن‬

‫أيضاا تحدد عبر التردد الذي تعمل عليه أو كما تسمى )مصدر الساعة ‪.(clock source‬‬

‫حيصصث يتصصم تنفيصصذ الوامصصر بسصصرعة = ‪)÷1‬الصصتردد( الصصذي يعمصصل بصصه الممتحككصصم‪ ،‬علصصى سصصبيل المثصصال‪.‬‬

‫جميع شرائح الص ‪ AVR‬تقوم بتنفيذ أمر واحد كل ‪ 1‬نبضة من الص ‪.clock source‬‬ ‫•‬

‫إذا كان التردد = ‪ 1‬ميجاهرتز )السنرعة الفتراض ية لمعظنم ممتحككمنات النن ‪ (AVR‬هصذا‬

‫يعنصصصي أن الممتحككصصصم يمكصصصن تنفيصصصذ ‪ 1‬مليصصصون أمصصصر بلغصصصة السصصصمبيلي فصصصي الثانيصصصة الواحصصصدة‬ ‫ويستغرق المر ‪ 1‬ميكروثانية‬ ‫•‬

‫إذا كان الصتردد = ‪ 1‬ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ ‪ 1‬مليصون أمصصر بلغصصة‬ ‫السمبيلي في الثانية الواحدة ويستغرق المر ‪ 1‬ميكروثانية‬

‫•‬

‫إذا كان الصتردد = ‪ 2‬ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ ‪ 2‬مليصون أمصصر بلغصصة‬ ‫السمبيلي في الثانية الواحدة ويستغرق المر نصف ميكروثانية أو )‪ 500‬نانوثانية(‪.‬‬

‫•‬

‫إذا كان الصتردد = ‪ 4‬ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ ‪ 4‬مليصون أمصصر بلغصصة‬ ‫السمبيلي في الثانية الواحدة ويستغرق المر ‪ 250‬نانوثانية ‪nano second‬‬

‫•‬

‫إذا كان الصتردد = ‪ 8‬ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ ‪ 8‬مليصون أمصصر بلغصصة‬ ‫السمبيلي في الثانية الواحدة ويستغرق المر ‪ 125‬نانو ثانية‬ ‫النانو ثانية )‪ = Nano Second (nS‬جزء من مليار جزء من الثانية‬ ‫الميكرو ثانية )‪ = Micro Second (uS‬جزء من مليون جزء من الثانية‪.‬‬

‫تصصدعم ممتحككمصصات الصصص ‪ AVR‬العديصصد مصصن تقنيصصات توليصصد الذبصصذبات اللزمصصة لتشصصغيل الممتحككصصم أو كمصصا‬

‫تمسى ‪ Clock Source‬تختلف هذه التقنيات في مدى دقتها ونسبة الخطأ والتكلفة الماليصصة‪ ،‬فصصي‬ ‫هذه الجزء سنستعرض ‪ 4‬طرق مختلفة مع إيضاح مميزات وعيوب كل طريقة‪.‬‬

‫‪154‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪Internal Calibrated RC oscillator‬‬ ‫كلمة ‪ RC oscillator‬تعني "المذبذب الداخلي المصنوع بمقاومة ومكثف" وتعتصصبر هصذه الطريقصصة‬ ‫هصصصي أرخصصصص أسصصصلوب للحصصصصول علصصصى الصصصص ‪ Clock source‬حيصصصث تحتصصصوي شصصصرائح الصصصص ‪ AVR‬ومنهصصصا‬

‫‪ ATmega16‬على مذبذب ‪ RC‬داخلي يمكنه العمل بسرعات من ‪ 1‬إلى ‪ 8‬ميجاهرتز )يتم ضصصبطها‬

‫بالفيوزات كما سنرى لحقاا(‪ .‬ول تتطلب هذه الطريقة تودصيل أي مكونات إضافية وبالتالي يتم‬ ‫تصغير حجم المشروع وتقليل التكلفة‬

‫العيوب‪ :‬نسبة الخطأ في التردد والتوقيت ‪ - %3‬هذه النسبة قد ل تؤثر في معظصصم التطبيقصصات‪،‬‬ ‫لكنها خطيرة جداا في التطبيقات التي تحتاج توقيت دقيصصق أو تسصصتخدم دوال ‪ delay_ms‬علصصى‬ ‫فترات بعيدة‪ .‬على سبيل المثال‪ :‬إذا كان مشصصروعك عبصصارة عصصن تشصصغيل ‪ load‬كصصل ثانيصصة واحصصدة‬ ‫فلن تشعر بهذا الخطأ لن التوقيت الحقيقي = ‪ 1‬ثانية )‪ (-\+‬نسبة الخطأ =‬

‫)‪ (0.03 = 1 * 0.03‬وهو ما يساوي ‪ 1.03‬ثانية أو ‪ 1‬ثانية طرح ‪ 0.97 = 0.03‬ثانية‪.‬‬ ‫لكصصن تخيصصل أن مشصصروعك يقصوم بتشصصغيل الصصص ‪ load‬كصل ‪ 1‬سصصاعة = ‪ 3600‬ثانيصصة‪ ،‬عنصصدها سصتجد أن‬ ‫الوقت الحقيقي يصصبح ‪ (3600 * 0.03) -\+ 3600‬وهصو مصا يسصاوي ‪ 3708‬ثانيصة )هصذا يعنصي‬ ‫أنصصصه هنصصصاك )تصصصأخير أو تقصصصديم( ‪ 108‬ثانيصصصة إضصصصافية والصصصذي يعتصصصبر رقصصصم كصصصارثي وبعيصصصد تمامصصصاا عصصصن‬

‫التوقيت المطلوب(‪.‬‬

‫متى نستخدمها؟ إذا كان مشروعك لن يتواجد به أي تأخير زمنصصي يزيصصد عصصن بضصصعة ثصصواني فقصصط‬

‫)أقل من ‪ 10‬ثواني( وتريد أن تصغر تكلفة المشروع‪.‬‬

‫‪External RC Circuit‬‬ ‫هصصذه الطريقصصة مماثلصصة للسصصابقة ولكصصن الختلف الوحيصصد أن دائصصرة الصصص ‪ RC‬تكصصون موجصصودة خصصارج‬

‫شصصريحة الصصص ‪ AVR‬وتصصوفر تصصرددات أكصصبر مصصن ‪ 8‬ميجصصا حيصصث يمكنصصك ضصصبط الصصتردد عصصبر التحكصصم فصصي‬ ‫قيمة المقاومة والمكثف عبر القانون التالي‪:‬‬

‫‪1‬‬ ‫)‪( R∗C‬‬

‫=) ‪F( frequency‬‬

‫حيصصث تمثصصل ‪ R‬قيمصصة المقاومصصة بصصالوم‪ ،‬و ‪ C‬قيمصصة المكثصصف بالفصصاراد ويتصصم تودصصصيل الصصدائرة علصصى‬

‫الطرف ‪ XTAL1‬بالطريقة التالية ) ‪ NC‬يعني غير متصل بشيء(‬

‫‪155‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫المميننزات‪ :‬يمكنصصك الحصصصول علصصى تصصرددات أكصصبر مصصن الصصص ‪ internal oscillator‬بتكلفصصة قليلصصة كمصصا‬ ‫يمكنك تغير التردد في أي وقت عبر وضع مقاومة متغيرة بدلا من المقاومة الثابتة‪.‬‬

‫العيننوب‪ :‬مثصصل النصصوع السصصابق‪ ،‬غالبصصاا ل يمكنصصك تحديصصد قيمصصة المكثصصف ول المقاومصصة بدقصصة كصصبيرة‬ ‫حيصصث تحتصصوي هصصذه العنادصصصر علصصى نسصصبة خطصصأ ‪ %5‬وبالتصصالي الصصتردد الحقيقصصي الناتصصج عنهصصا يكصصون‬

‫مضاف إليه نسبة خطأ ‪%5‬‬

‫فصصي حالصصة أنصصك تريصصد اسصصتخدام هصصذه الطريقصصة يجصصب النتبصصاه إلصصى قيمصصة المكثصصف حيصصث يجصصب أن‬

‫تكون ‪ 22‬بيكوفاراد أو أكثر ويجب أن يكون من النوع السيراميكي )منعصصدم القطبيصصة( ‪ceramic‬‬ ‫‪capacitor‬‬ ‫معلومة إضافية‪ :‬بعض ممتحككمات ‪ AVR‬تحتوي على مكثف داخلي بقيمة ‪ 36‬بيكوفاراد‬ ‫وبالتالي لن تحتاج سوى أن تودصل مقاومة فحسب‪.‬‬

‫‪156‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪External Crystal “Quartz” Oscillator‬‬ ‫تعتصصصبر هصصصذه الطريقصصصة هصصصي الكصصصثر شصصصيوعاا والمفضصصصلة لصصصدى جميصصصع الشصصصركات ومصصصصممي النظمصصصة‬ ‫المدمجصصة‪ ،‬حيصصث يتصصم اسصصتخدام الكريسصصتالة ذات الطرفيصصن لتوليصصد الصصتردد المطلصصوب بدقصصة عاليصصة‬

‫جداا وبأقل نسبة خطأ ممكنه حيث تبلغ نسبة الخطأ في الكريسصصتالة حصصوالي ‪ 10‬هرتصصز مصصن أدصصصل‬ ‫‪ 1‬مليصون وهصو مصا يسصصاوي ‪ 0.00001‬واحصد مصن كصصل مئصصة آلصف وهصذا يعنصصي أنهصصا أكصثر بدقصصة بنحصو‬ ‫‪ 1000‬مرة من الص ‪.RC oscillator‬‬

‫المميننزات‪ :‬الدقصصة العاليصصة جصصداا وثبصصات الصصتردد مهمصصا تغيصصرت درجصصات الحصصرارة وبالتصصالي فهصصي تصصوفر‬ ‫أداء ممتاز طوال فترة التشغيل‬

‫العيوب‪ :‬التكلفة حيث تحتاج هذه الكريستالت إلى مكثفات إضافية عصصدد ‪ 2‬مكثصصف بسصعة ‪22‬‬ ‫بيكوفصصاراد ممصصا يزيصصد التكلفصصة لتصصصل إلصصى ‪ 1‬دولر تقريبصصاا )تكلفصصة الكريسصصتالة بمفردهصصا = نصصصف‬

‫دولر(‪.‬‬

‫أشهر هذه الكريستالت هي ‪ 16‬ميجا والص ‪ 12‬ميجصصا والصصص ‪ 8‬ميجصصا والصصص ‪ 24‬ميجصا‪ ،‬فصصي هصذا الكتصصاب‬

‫سنستخدم الص ‪ 16‬ميجا في بعض التجارب )وهو أقصى تصردد يمكصصن لشصصريحة الصصص ‪ ATmega16‬أن‬ ‫تعمل به مع العلم أن المتحكم ‪ ATTiny‬يمكنه العمل بسرعة تصل إلى ‪ 20‬ميجاهرتز(‪.‬‬ ‫يتم تودصيل الكريستالة والمكثفات بالصورة التالية‪:‬‬

‫‪157‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫معلومصصة إضصصافية‪ :‬الكريسصصتالة هصصي عنصصصر إلكصصتروني مصصصنوع مصصن مصصادة بلوريصصة اسصصمها "الكصصوارتز‬

‫‪ "Quartz‬وعندما يتم تودصيلها بالكهرباء فإنها تعمل كأنها دائرة رنين مكونة مصصن مكثصصف وملصصف‬ ‫ومقاومصصصة ‪ R-L-C circuit‬تنتصصصج ‪ Sin wave‬ولكصصصن عنصصصدما تتصصصصل بصصصدائرة ‪pierce oscillator‬‬

‫داخصصصل الممتحككصصصم الصصصدقيق يتصصصم تحويصصصل الذبصصصذبات المتولصصصدة علصصصى هيئصصصة ‪ sin wave‬إلصصصى ‪pulse‬‬ ‫باستخدام عاكس ‪ inverter‬يمكنك معرفة المزيد عن الص ‪ pierce oscillator‬من الرابط التالي‪:‬‬ ‫‪http://www.abracon.com/Support/facn_abracon_jul2011.pdf‬‬ ‫ويمكنك قراءة دصفحة الكريستالت على ويكيبيديا لتتعرف أكثر عليها‪.‬‬ ‫‪en.wikipedia.org/wiki/Crystal_oscillator‬‬

‫التركيب الداخلي الذي تمثله الكريستالة عندما‬ ‫تتصل بدائرة كهربية‬

‫تركيب دائرة المذبذب )الكريستالة ‪+‬‬ ‫المكثفات ‪ +‬العاكس(‬

‫‪158‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪External Resonators‬‬ ‫هصصذا النصصوع مصصن المذبصصذبات يشصصبه لحصصد كصصبير الكريسصصتالة وفصصي الحقيقصصة هصصو يصصوازي "كريسصصتالة ‪+‬‬ ‫المكثفات الضافية" في قطعة إلكترونية واحدة ويتوفر في السواق بترددات مختلفة بدأ مصصن‬

‫‪ 1‬ميجاهرتز إلى ‪ 24‬ميجاهرتز‬

‫المميزات‪ :‬السعر المنخفض )أرخ ص مصن الكريسصتالة( كمصا أنصه يحتصوي علصى المكثفصات المطلوبصة‬ ‫بداخله وحجمه الصغير وتوافر معظم الترددات المطلوبة‬

‫العينننوب‪ :‬يتملصصصك نسصصصبة خطصصصأ ‪) %0.5‬نصصصصف بالمئصصصة(‪ ،‬وهصصصي تعتصصصبر نسصصصبة أفضصصصل بكصصصثير مصصصن الصصصص‬ ‫‪ internal RC oscillator‬ولكنها ل تقارن بدقة الكريستالة الكوارتز‪.‬‬

‫‪External Pure Pulse (TTL) Oscillator‬‬ ‫المذبذبات الكصثر دقصة علصى الطلق حيصث تبلصغ نسصبة الخطصأ ‪ 5‬هرتصز‬ ‫لكصصل ‪ 1‬مليصصون هرتصصز وهصصو مصصا يسصصاوي ‪ 0.000005‬والصصذي يعنصصي أنهصصا‬ ‫تمتلك دقة توازي ‪ 20‬ضعف دقة الكريستالت الكوارتز‪.‬‬

‫تتصصصصوفر هصصصصذه المذبصصصصذبات بأشصصصصكال عديصصصصدة أغلبهصصصصا تكصصصصون مربعصصصصة أو‬

‫مسصصتطيله الشصصكل وتمتلصصك ‪ 4‬أطصصراف ‪ VCC – CLK – GND‬والطصصرف الرابصصع غيصصر مسصصتخدم‪ .‬يتصصم‬

‫تودصيل الطرف ‪ CLK‬بالطرف ‪ XTAL1‬ف ي شصريحة الممتحككصم ‪ AVR‬وتودصصيل الطصرف ‪ VCC‬بنف س‬ ‫مصدر الجهد الخاص بالص ‪) AVR‬سواء كان ‪ 5‬فولت أو ‪ 3.3‬فولت(‪.‬‬

‫‪159‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫العيوب‪ :‬السعر المرتفع‪ ،‬حيث يبلع سصصعر هصصذا النصصوع مصصن المذبصذبات نحصصو ‪ 3‬دولر أو أكصصثر )يصصزداد‬

‫السعر بزيادة التردد المطلوب( وفي بعض الحيان يكون سعرها أكبر من سعر الممتحككم الصصدقيق‬

‫نفسه‪ .‬الصور التالية توضح تودصيل الص ‪ AVR‬مع المذبذب الخارجي ‪TTL oscillator‬‬

‫الصور التالية توضح أشكال وأحجام مختلفة للمذبذب‬

‫‪160‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ 6.4‬قيم الفيوزات لضبط السرعة‬

‫القيم التالية هي المستخدمة في التحكم بسرعة شريحة ‪ – ATmega16‬جميع القيصصم تصصم أخصصذها‬

‫من ملف الص ‪ DataSheet‬الرسمي للممتحككم )والمرفق مع الكتاب( بداية من الصصصفحة رقصصم ‪ 24‬مصصع‬ ‫ملحظة أن هذه الفيصوزات تعمصصل علصى كصصل مصصن ‪ ATmega16/ ATmega32‬لنهصم مصصن نفصس الفئصة‬ ‫من الممتحككمات )وقد تختلف هذه الفيوزات في فئات أخرى من شرائح الصصص ‪ - .(AVR‬جميصع القيصم‬ ‫مخصصة للفيوزات ‪ Clock Select‬أو كما تعرف اختصاراا بي ‪CKSEL‬‬

‫فيوزات ضبط السرعة مع المذبذب الداخلي ‪Internal RC‬‬ ‫قصصم بضصصبط الفيصصوزات بصصالقيم التاليصصة لختيصصار السصصرعة المطلوبصصة‪ ،‬مصصع ملحظصصة أن القيمصصة هصصي ‪,,‬‬ ‫‪CKSEL1, CKSEL0‬‬

‫‪CKSEL2,‬‬

‫‪ CKSEL‬الموازية له‪.‬‬

‫‪ CKSEL3,‬بنفصس الصترتيب حي ث يعصبر كصل ‪ 1‬بصت عصصن قيم ة الصصص‬

‫‪Clock Frequency‬‬

‫)‪CKSEL(3,2,1,0‬‬

‫‪1 Mhz‬‬

‫‪0001‬‬

‫‪2 Mhz‬‬

‫‪0010‬‬

‫‪4 Mhz‬‬

‫‪0011‬‬

‫‪8 Mhz‬‬

‫‪0100‬‬

‫فيوزات ضبط السرعة مع دائرة ‪External RC‬‬ ‫‪Clock Frequency‬‬

‫‪161‬‬

‫)‪CKSEL(3,2,1,0‬‬

‫التردد أقل من ‪ 0.9‬ميجاهرتز‬

‫‪0101‬‬

‫التردد المتوقع أكبر من ‪ 0.9‬وأقل من ‪ 3‬ميجاهرتز‬

‫‪0110‬‬

‫التردد المتوقع أكبر من ‪ 3‬وأقل من ‪ 8‬ميجاهرتز‬

‫‪0111‬‬

‫التردد المتوقع أكبر من ‪ 8‬وأقل من ‪ 12‬ميجاهرتز‬

‫‪1000‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫فيوزات ضبط السرعة مع ‪External Crystal or Ceramic‬‬

‫هصصذه العصصدادات يمكصصن اسصصتخدامها مصصع كصصل مصصن الصصص ‪ Crystal oscillator‬والصصص ‪ceramic resonator‬‬ ‫مع ملحظة أنه فصي حالصة اسصتخدام الكريسصتالة يجصب أن يتصم وضصع مكثفصات إضصافية معهصا كمصا‬

‫ذكرنا سابقاا ول يتم وضع هذه المكثفات مع الص ‪.ceramic resonator‬‬

‫أيضصصاا لحصصظ أن العصصدادات يتصصم وضصصعها للفيصصوزات ‪ CKSEL‬مصصن ‪ 1‬إلصصى ‪ 3‬فقصصط ول يتصصم برمجصصة الصصص‬ ‫‪ CKSEL0‬معهم في هذا الوضع‪ .‬ويتم برمجة الفيوز ‪ CKOPT‬في حالة استخدام كريستالة أكبر‬ ‫من ‪ 8‬ميجاهرتز‪.‬‬ ‫سعة المكثفات‬

‫‪Clock Frequency‬‬

‫)‪CKSEL(3,2,1‬‬ ‫”‪“0 is not used‬‬

‫‪ ceramic‬هذا الوضع ميستخلدم مع‬

‫‪101‬‬

‫‪resonator‬‬ ‫وفي حالة أن التردد المطلوب ما بين ‪0.4‬‬

‫‪CKOPT = 1‬‬

‫المقترحة‬ ‫ل يتم استخدام مكثفات‬

‫إلى ‪ 0.9‬ميجاهرتز‬ ‫السعة المقترحة بين‬

‫التردد المتوقع أكبر من ‪ 0.9‬وأقل من ‪3‬‬

‫‪12 → 22 picofarad‬‬

‫ميجاهرتز‬

‫السعة المقترحة بين‬

‫التردد المتوقع أكبر من ‪ 3‬وأقل من ‪8‬‬

‫‪12 → 22 picofarad‬‬

‫ميجاهرتز‬

‫السعة المقترحة بين‬

‫التردد المتوقع أكبر من ‪ 8‬ميجا وحتى ‪16‬‬

‫‪12 → 22 picofarad‬‬

‫‪162‬‬

‫ميجاهرتز‬

‫‪110‬‬ ‫‪CKOPT = 1‬‬ ‫‪111‬‬ ‫‪CKOPT = 1‬‬ ‫‪111‬‬ ‫‪CKOPT = 0‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫ما هي أهمية الفيوز ‪CKOPT‬؟‬ ‫هذا الفيوز يتحكصم فصي بعصصض المصصور المهمصة‪ ،‬منهصصا تشصصغيل المذبصذب بالطاقصصة القصصصوى أو الطاقصصة‬ ‫المنخفضة )وضع توفير الطاقة عندما يكون ‪ (CKOPT = 1 “unprogrammed”fuse‬هذا الوضع‬ ‫يسصصصصصاهم فصصصصي تخفيصصصصض الطاقصصصصة الصصصصتي يسصصصصصتهلكها الممتحككصصصصصم الصصصصصدقيق لكنصصصصه ل يصصصصصصلح لتشصصصصصغيل‬

‫الكريستالت الكبر من ‪ 8‬ميجاهرتز لنه كلما زاد تصصردد الكريسصتالة كصانت النبضصات الناتجصة منهصا‬ ‫أضعف من ناحية فرق الجهد وبالتالي قد ل تصلح لتشغيل المعالج‪.‬‬

‫للتغلصصب علصصى هصصذه المشصصكلة يتصصم تفعيصصل الصصص ‪ CKOPT‬والصصذي سصصيقوم بتشصصغيل المذبصصذب بالطاقصصة‬

‫القصوى أو كما يسصصمى ‪ Full rail-to-rail swing‬ممصصا يجعصصل المعالصصج يحصصصل علصصى أفضصصل نبضصصات‬ ‫ممكنصصصه تكفصصصي لتشصصصغيله فصصصي السصصصرعات العاليصصصة وتكفصصصي أيضصصصاا لخصصصراج نبضصصصات دقيقصصصة لتشصصصغيل‬

‫المكونات الخارجية‪.‬‬

‫من المفيد جداا تفعيل هذا الفيوز في الدوائر الصتي سصصتتعرض إلصى ‪ noise‬أو ستوضصصع فصي مكصصان‬

‫معرض لشعاع كهرومغناطيسي كبير نسبياا حيث يسصصاعد وضصصع ‪ Full rail-to-rail‬علصصى تحسصصين‬

‫أداء الممتحككم في البيئات ذات الص ‪ noise‬الكبيرة‪.‬‬

‫الوظيفصصصة الثانيصصصة لصصصه هصصصي تفعيصصصل المكثصصصف الصصصداخلي "سصصصعة ‪ 36‬بيكوفصصصاراد" لتشصصصغيل دائصصصرة الصصصص‬ ‫‪ external RC circuit‬بالمقاومة فقط دون مكثف إضافي‪.‬‬

‫فيوزات ضبط السرعة مع المذبذب الخارجي ‪Pulse Oscillator‬‬ ‫عنصصصد اسصصصتخدام أي مصصصصدر خصصصارجي لنبضصصصات السصصصاعة ‪ pulses‬مثصصصل الصصصص ‪ TTL oscillator‬أو حصصصتى‬

‫شريحة ‪ IC 555‬يتم وضع كل قيم ‪CKSEL(3,2,1,0) = 0000‬‬

‫‪163‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫ملخص إعدادات الفيوزات للتحك م بالسرعة‬ ‫•‬

‫إذا أردت تشغيل الممتحككم الدقيق بأقل استهلك ممكن للطاقصصة قصصم بتفعيصصل الصصتردد علصصى‬ ‫‪ 1‬ميجاهرتز فقط عبر وضع ‪.CKSEL(3,2,1,0) = 0001‬‬

‫•‬

‫إذا أردت تشصصغيل الممتحككصصم بأقصصصى سصصرعة )‪ 8‬ميجصصاهرتز( دون اسصصتخدام أي مكونصصات‬ ‫إضافية قم بوضع القيم ‪.CKSEL(3,2,1,0) = 0100‬‬

‫•‬

‫إذا كنت تنوي أن تستخدم أي كريستالة خارجيصصة فالفضصصل أن تشصصغل الصصص ‪Full rail-to-‬‬

‫‪ rail‬عبر تفعيل الفيوز ‪ CKOPT‬بوضع القيمصصة ‪ 0‬بصصداخله واختيصصار ‪CKSEL(3,2,1) = 111‬‬

‫– هذا الوضع سيعمل بصورة ممتازة مع جميع الكريستالت‪.‬‬

‫ملاحظات هامة بخصوص تعديل السرعة‬ ‫يجب النتباه عند تغيصصر سصصرعة الممتحككصم الصدقيق حيصث أن سصصرعة رفصصع البرنامصصج )ملصف الهيكصس(‬ ‫يجب أن تكون أقل من ‪ 1/8‬من تردد الص ‪ Clock‬المستخدم‪.‬‬ ‫علصصي سصصبيل المثصصال إذا كصصانت سصصرعة الممتحككصصم = ‪ 1‬ميجصصاهرتز إذا يجصصب أن تكصصون سصصرعة رفصصع‬ ‫البرنامج على الممتحككم أقل من ‪ 128‬كيلوهرتز وإل قد تجد خطصصأ مصصن برنامصصج ‪ AVRdude‬مفصصاده‬ ‫أن البرنامج ل يستطيع أن يتوادصل مع الممتحككم الدقيق‪.‬‬ ‫على أي حال إذا قرأت هذا الخطأ فكل ما عليك فعله هو تقليل سرعة الرفع عصصن طريصصق تودصصصيل‬ ‫طرفصصصصصصي الصصصصصصص ‪ jumper‬الموجصصصصصصودة بصصصصصصدائرة الممبرمجصصصصصصة ‪) USBasp‬سصصصصصصتجد كلمصصصصصصة ‪ slow‬مكتوبصصصصصصة‬ ‫بجانبها( وإذا كنت تستخدم مبرمجة أخرى ل تحتوى هذا الوضع فيمكنك أن تختار سرعة الرفع‬ ‫من برنامج ‪) AVRdudess‬اجعل قيمتها = ‪ 500‬هرتز فقط(‪.‬‬ ‫عنصصد اسصصتخدام الدالصصة _)‪ delay_us(time‬يجصصب أن يعمصصل المذبصصذب بكريسصصتالة خارجيصصة بصصتردد ‪8‬‬ ‫ميجاهرتز على القل حتى تعمل الدالة بتوقيت دصحيح )إذا تم استخدام المذبصصذب الصصداخلي أو‬

‫كريستالة بتردد أقل فيحدث خطأ في الدالة ‪ delay_us‬ولن يتم التأخير بالوقت المطلوب(‬

‫‪164‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ 6.5‬الطاقة وسرعة تشغيل الممتحككامات‬

‫فصصصي العديصصصد مصصصن التطبيقصصصات يجصصصب أن يتصصصم تصصصصميم النظصصصام المدمصصصج بحيصصصث يعمصصصل علصصصى مصصصصدر‬

‫منخفصصض جصصداا للطاقصصة مثصصل بطاريننة أو لوحننة شمسننية دصصصغيرة‪ ،‬مصصن أجصصل هصصذه التطبيقصصات يتصصم‬ ‫ضبط الممتحككم للعمل على الترددات المنخفضة‪.‬‬ ‫معظصصم الممتحككمصصات الدقيقصصة )وبالتحديصصد المعالجصصات الدقيقصة الموجصصود بصصداخلها( تسننتهلك طاقنة‬ ‫أكننثر كلمننا كننانت تعمننل بننتردد أكننبر وبالتصصالي نجصصد أن تخفيصصض الصصتردد يقلصصل بدرجصصة كصصبيرة جصصداا‬ ‫استهلك التيار الكهربي كما هو ملحوظ في الرسم البياني التالي‪:‬‬

‫معدلت استهلك الطاقة لعائلة ‪ ATTiny‬وبعض أفراد عائلة ‪atmega‬‬ ‫كمصصصصا نصصصصرى علصصصصى المحصصصصور الرئيسصصصصي )اسصصصصتهلك التيصصصصار بصصصصالمللي أمصصصصبير( والمحصصصصور الفقصصصصي الصصصصتردد‬

‫)بالميجاهرتز( وكل خط مرسوم يمثل فرق الجهصصد الصصذي يعمصصل عنصصده الممتحككصصم الصصدقيق‪ .‬مصصن هصصذا‬ ‫الرسم نستنتج العديد من المور‪.‬‬ ‫•‬

‫عند فرق جهد ‪ 1.8‬ميجا يمكن للممتحككم أن يعمل بصتردد مصن ‪ 1‬ميجصا إلصى ‪ 4‬ميجصا بحصد‬ ‫أقصى وباستهلك تيار من الثاني حتى ‪ 1.8‬مللي أمبير فقط‪.‬‬

‫‪165‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫•‬

‫عنصصد فصصرق جهصصد ‪ 2.7‬فصصولت يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى ‪ 10‬ميجصصاهرتز‬

‫•‬

‫عند فصصرق جهصد ‪ 3.6‬يمكصصن للممتحككصصم أن يعمصصل بصتردد يصصصل إلصصى ‪ 14.5‬ميجصصاهرتز تقريبصصاا‬

‫•‬

‫عند فرق جهد ‪ 4‬فولت يمكن للممتحككصصم أن يعمصصل حصتى ‪ 17‬ميجصصاهرتز باسصصتهلك تيصصار ‪7‬‬

‫•‬

‫عنصصد فصصرق جهصصد مصصن الخصصامس إلصصى ‪ 5.5‬يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى ‪20‬‬

‫واستهلك تيار حوالي ‪ 3‬مللي أمبير‪.‬‬

‫وباستهلك تيار يصل إلى ‪ 5.7‬مللي أمبير‪.‬‬

‫مللي أمبير‪.‬‬

‫ميجاهرتز‪.‬‬

‫ملحظة‪ :‬الحد القصى لتردد الص ‪ ATmega16/ATmega32‬هو ‪ 16‬ميجاهرتز فقط‪ ،‬بينما‬ ‫الممتحككمات الحدث منها مثل ‪ ATmega328‬أو عائلة ‪ ATTiny‬يمكنها أن تصل إلى ‪20‬‬ ‫ميجاهرتز‬ ‫بعض ممتحككمات الص ‪ AVR‬تدعم العمل بتردد ‪ 125‬كليوهرتز أو أقل‪ ،‬هصذا المعصدل يجعصل اسصتهلك‬ ‫التيار الكهربي منخفض جداا لدرجة أنه يصل إلى ‪ 100‬ميكرو أمبير )‪ 100‬جزء من المليون من‬ ‫المبير وهو ما يساوي ‪ 0.1‬مللي أمبير(‪.‬‬ ‫تختلف هذه المقصاييس قليلا بتغيصصر درجصة الحصرارة الصتي يعمصل عنصدها المعالصصج وتوجصد رسصومات‬ ‫بيانيصة مفصصصلة تشصصرح معصدلت اسصصتهلك الطاقصصة بالتفصصيل عنصصد درجصات الحصرارة المختلفصة بصدءاا‬

‫من دصفحة ‪ 299‬في الص ‪ Datasheet‬المرفقة )مع ملحظة أن بعض معدلت استهلك الطاقصصة قصصد‬ ‫تختلف قليلا مع ممتحككمات الص ‪ AVR‬الخرى(‪.‬‬

‫كيف تحسب عمر البطار ية‬

‫عند اسصتخدام البطاريصصات سصيكون مصصن المفيصد جصداا أن تحسصصب وقصت التشصغيل حصتى تنفصذ طاقصة‬ ‫البطاريصصة وقصصد يحصصدد هصصذا الصصوقت الصصتردد المطلصصوب لتشصصغيل الممتحككصصم‪ .‬وقبصصل أن نبصصدأ الحسصصابات‬

‫علينا أن نتعرف على بعض المور‪.‬‬

‫‪166‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫استهلك الطاقة المذكور مسبقاا هو للممتحككم الدقيق نفسه وليس لي حمل ‪ load‬متصل به‬ ‫ويمكن تخفيض هذا الستهلك قليلا بإيقاف تشغيل الص ‪ADC‬‬

‫اسصصصتهلك الطاقصصصة الكلصصصي ‪ = Total load‬فصصصرق الجهصصصد * )اسصصصتهلك التيصصصار للممتحككصصصم ‪ +‬الحمصصصال‬ ‫المتصلة به( ‪ +‬الطاقة الضائعة من الص ‪ voltage regulator‬إن وجد‪.‬‬

‫قانون حساب وقت البطارية‬ ‫) ‪0.8×Battery Capacity (mAH‬‬ ‫) ‪Total Load Current (mA‬‬

‫=‪Battery WorkingTime‬‬

‫جميع البطاريات يكون لها سعة تقاس بالمللي أمبير\سصصاعة فمثل بطاريصة الهصصاتف المحمصصول نجصد‬

‫مكتوب عليها ‪ 3.7‬فولت ‪) mAH 3000‬مللي أمبير\ساعة( أو تكتب ‪) A/hour 1‬لن كل ‪1000‬‬ ‫مللصي أمصصبير = ‪ 1‬أمصصبير(‪ .‬وهصذا يعنصصي أنصصه فصصي حالصة تشصصغيل هصذه البطاريصصة علصصى أحمصال تسصتهلك‬ ‫‪ 3000‬مللي أمبير فإن البطارية ستظل تعمل ‪ 1‬ساعة فقط‪.‬‬

‫مثال‪ :‬إذا كان الممتحككم الدقيق يعمل بفرق جهد ‪ 3.7‬فصولت و بصتردد ‪ 16‬ميجصاهرتز )يسصتهلك ‪7‬‬ ‫مللي أمبير( ومتصل به دايود ضوئي يستهلك ‪ 7‬مللي أمصصبير كمصصا أن منظصصم الجهصصد يسصصتهلك تيصصار‬

‫إضافي ‪ 6‬مللي أمبير‪ .‬احسب زمن التشغيل على بطارية سعتها ‪ 1000‬مللي أمبير بصصافتراض أن‬ ‫جميع الحمال تعمل بصورة مستمرة دون أن تنطفئ‪.‬‬

‫الحل‬

‫أولا‪ :‬نحسب استهلك التيار الكلي = ‪ 7‬مللي )للممتحككم( ‪ 7 +‬مللصي )للصدايود( ‪ 6 +‬مللصي لمنظصم‬ ‫الجهد = ‪ 20‬مللي أمبير إجمالي استهلك طاقة‪.‬‬

‫ثانياا‪ :‬بالتعويض بالقيم في القانون السابق نجد أن ساعات التشغيل = ‪ 40‬ساعة‬ ‫‪Working Time = 0.8 * (1000/20) = 40 hours‬‬ ‫معلومة إضافية‪ :‬لماذا نضرب الرقم ‪ 0.8‬في القانون السابق بالرغم من أنه يفترض أن نقسم‬ ‫سعة البطارية على الستهلك مباشرة؟ السبب هو تواجد استهلك ضائع من الطاقة يحدث‬

‫من البطارية نفسها بسبب المقاومة الداخلية ‪ Battery Internal Resistor‬كما أن السلك‬ ‫والتودصيلت في الدائرة الكهربية أيضاا تساهم في ضياع بعض الطاقة خادصة إذا كان هناك‬ ‫أسلك من معدن اللومنيوم‬

‫‪167‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ 6.6‬كيف تربرمج الفيوزات‬

‫برمجة الفيوزات عملية سهلة للغاية عبر برنامج ‪ AVRdudess‬كل ما عليك فعله هو اختيار نوع‬

‫الممتحككم الدقيق وأداة البرمجة ‪programmer‬‬

‫ثصصصم الضصصصغط علصصصى زر ‪ Bit selector‬مصصصن مربصصصع ‪ Fuses & lockbits‬لتظهصصصر لوحصصصة اختيصصصار قيصصصم‬ ‫الفيوزات )لحظ أن ‪ ATmega16‬ل يمتلك ‪:(Extended Fuses‬‬

‫اختر تفعيل )أو إلغاء تفعيل( الفيوزات المرغوبة كما تريد ثم اضغط ‪ Ok‬لتجد أن قيمة الصصص ‪Low‬‬ ‫‪ Byte Fuse‬والص ‪ HIGH Byte Fuse‬أدصبحت جاهزة للبرمجة كما في الصورة التالية‬

‫‪168‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫الن يمكنصصصصك الضصصصصغط علصصصصى زر ‪ Write‬الموجصصصصود فصصصصي العلصصصصى )بجصصصصانب الفيصصصصوزات( وسصصصصيقوم الصصصصص‬ ‫‪ programmer‬بحرق قيم الفيوزات المطلوبة‪.‬‬

‫يصصصوفر برنامصصصج ‪ AVRdudess‬خيصصصار ‪ Set fuses‬والصصصذي يعنصصصي أن البرنامصصصج سصصصيقوم بإعصصصادة كتابصصصة‬

‫الفيوزات في كل مرة يقوم فيهصا برفصع ملصف هيك س جدي د علصى الممتحككصم الصدقيق‪ .‬منن اﻷفضنل‬ ‫عدم استخدام هذا الخيار والكتفاء ببرمجة الفيوزات عبر زر ‪ Write‬فحسب‪.‬‬ ‫أيضا الزر ‪ Read‬بجانب ‪ Write‬والذي عند الضغط عليه سيقوم الص ‪ Programmer‬بقصراءة قيمصة‬

‫الفيوزات على الشريحة المتصله به‪.‬‬ ‫أيضاا ستجد كلمة ‪ Fuse Setting‬وهي عبارة عن رابط لموقع خاص يعمل كآلة حاسبة للفيوزات‬ ‫لكصصل أنصصواع شصصرائح الصصص ‪ AVR‬كصصل مصصا عليصصك هصصو الصصدخول إليصصه وتحديصصد الخصصصائص الصصتي تريصصدها‬ ‫وسيخبرك الموقع بأي الفيوزات ينبغي لك أن تفعلها وأي منها ل يجب أن تفعلها‪.‬‬

‫‪169‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬

‫‪ 6.7‬كيف تعالج الفيوزات الممربرمجة بصورة خاطئة؟‬

‫كمصا ذكصرت سصابقاا العصدادات الخاطئصة للفيصوزات قصد تتسصبب فصي عصدم إمكانيصة برمجصة الممتحككصم‬ ‫مصصرة أخصصرى وبصصذلك قصصد تخسصصر الممتحككصصم‪ ،‬ومصصع ذلصصك هنصصاك خصصبر جيصصد وهصصو أنصصه يتصصوفر نصصوعين مصصن‬

‫الحلول لهذا المر‪.‬‬ ‫•‬

‫اﻷول‪ :‬هو شراء و استخدام الص ‪ High Voltage programmers‬غالية الثمن مثل ‪AVR‬‬

‫•‬

‫الثنناني‪ :‬بنصصاء دائصصرة ‪ AVR Fuse Doctor‬وهصصي مصصن الصصدوائر الرائعصصة الصصتي تسصصتخدم فصصي‬

‫‪ Dragon‬حيث يمتلك القدرة على التنقيح والبرمجة عالية الجهد لتصليح الفيوزات‪.‬‬

‫معالجصصة الفيصصوزات بتكلفصصة منخفضصصة جصصداا والصصتي جربتهصصا بنفسصصي وكصصانت رائعصصة كمصصا أنصصه‬

‫يمكنك دصناعتها بنفسك بنحو ‪ 5‬دولر فحسب‪.‬‬ ‫جميع التصميمات لهذه الدائرة يمكنك أن تجدها على الموقع التالي‪:‬‬ ‫‪http://mdiy.pl/atmega-fusebit-doctor-hvpp/?lang=en‬‬

‫‪170‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬ ‫… ‪..............................................................................................‬‬ ‫تتوفر تصميمات مشابه أيضاا لنفس الدائرة لكن باستخدام ممتحككمات أخرى بدل مصصن ‪atmega8‬‬ ‫مثل ‪ATTiny Fuse doctor‬‬ ‫‪http://www.instructables.com/id/AVR-Attiny-fusebit-doctor-HVSP‬‬

‫‪171‬‬

‫الفصل السابع‬ ‫” إن أهم يومين يمران على الإنسان هما يوم ولادته‬ ‫واليوم الذي يدرك فيه لماذا ولد ‟‬

‫مارك تواين – كاتب أمريكي‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬

‫سصصصنتعرف فصصصي هصصصذا الفصصصصل علصصصى كيفيصصصة تشصصصغيل المقاطعصصصات الخارجيصصصة ‪External Interrupts‬‬ ‫وفائصصصدة هصصصذه الخادصصصصية الرائعصصصة الصصصتي تتيصصصح دصصصصناعة تطبيقصصصات ذات اسصصصتجابة عاليصصصة السصصصرعة‬

‫للحداث الخارجية‪.‬‬ ‫✔‬

‫مقدمة عن مفهوم المقاطعة‬

‫✔‬

‫المثال الول‪ :‬تشغيل المقاطعة ‪INT0‬‬

‫✔‬

‫أنواع الشارات الرقمية ‪Logic, Falling 7 Raising Edges‬‬

‫✔‬

‫‪173‬‬

‫المثال الثاني‪ :‬تشغيل ‪ INT0‬مع ‪INT1‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 7.1‬مقدمة عن الممقاطعة‬

‫‪The interrupt‬‬

‫فصصي الكصصثير مصصن النظمصصة المدمجصصة نجصصد بعصصض الوظصصائف الصصتي تتطلصصب اسصصتجابة فائقصصة السصصرعة‬

‫لحصصدث معيصصن‪ .‬لصصذا تمصصت مراعصصاة هصصذا المصصر فصصي معظصصم المعالجصصات والممتحككمصصات الدقيقصصة )حصصتى‬

‫القديمة منهصا( حيصث تصصم إضصصافة تقنيصة الممقاطعصصة ‪ interrupt‬وهصي عبصصارة عصصن طصرف دخصل ‪input‬‬ ‫‪ pin‬أو حدث برمجي يتسبب في جعصل المعالصج يتوقنف عنن منا يفعلنه الن ويسنتجيب للحند ث‬

‫الممسبب للمقاطعة ويعالجه بسرعة ثم يعود مرة أخرى لما كان يفعله‪.‬‬

‫مث ا‬ ‫ل نجد أن النظام المدمج داخل وحدة تحكم السيارة يعمل على إدارة الوقصصود وعصصرض سصصرعة‬ ‫الحركة ومع ذلك في حالة حدوث ادصصصطدام بجسصصم مصا نجصد أن النظصصام يسصتجيب بسصصرعة عاليصة‬

‫) بصصالرغم أنصصه كصصان مشصصغول بمعالجصصة الوقصصود والسصصرعة(‪ .‬تحصصدث هصصذه السصصتجابة فائقصصة السصصرعة‬ ‫بسصصصبب أن الحساسصصصات المسصصصؤولة عصصصن الدصصصصطدام يتصصصم تودصصصصيلها علصصصى أطصصصراف دخصصصل الممقاطعصصصة‬

‫وتسمى هذه الطراف ‪.External interrupts‬‬ ‫الحقيقصصة أنصصه هنصصاك أنصصواع كصصثير للمقاطعصصة )بعضصصها داخلصصي وبعضصصها خصصارجي( سصصنتحدث فصصي هصصذا‬ ‫الفصل عن النوع الخارجي فقط ‪ External interrupt‬وسيتم شرح بعصصض النصصواع الخصصرى علصصى‬

‫مصصدار الفصصصول التاليصصة مثصصل مقاطعصصة الصصص ‪) ADC‬فصصي الفصصصل التصصالي( ومقاطعصصة المؤقتصصات ‪Timer‬‬

‫‪.interrupt‬‬

‫كيف تعمل الممقاطعة الخارجية‬

‫في جميع المعالجات والممتحككمات الدقيقة يتم تصميم الكود المسؤول عصصن معالجصصة المقاطعصصات‬

‫بصورة مستقلة تماماا عن البرنامج الرئيسي ‪ .main program‬فنجصصد دائمصصاا أن برنامصصج الممقاطعصصة‬

‫ويسصصمى ‪) Interrupt service routing‬ميختصننر بكلمننة ‪ (ISR‬يكتصصب فصصي جصصزء بعيصصد عصصن دالصصة‬

‫‪ ()main‬فمثلا يمكنك أن تكتب برنامج ‪ main‬ليقوم بعمل محدد إلى البصصد ثصصم تكتصصب برنامصصج ال‬ ‫‪ ISR‬ليقوم بوظيفة محددة وسريعة عند تشغيل حساس أو زر معين‪.‬‬

‫يمتلصصك الممتحككصصم الصصدقيق مصن فئصصة ‪ ATmega16/ATmega32‬عصدد ‪ 3‬أطصصراف للمقاطعصصة الخارجيصة‬ ‫يمكن تودصيلها بأي حساس أو مفتاح رقمي وهذه الطراف هي‪.‬‬ ‫)‪INT0 (pin 2 on port D‬‬ ‫)‪INT1 (pin 3 on port D‬‬ ‫)‪INT2 (pin 2 on port B‬‬

‫‪174‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫أيضاا يمكن اعتبار الطرف ‪RESET‬أحد أطراف الص ‪.External interrupt‬‬ ‫ملحظة‪ :‬الص ‪ RESET‬في عالم الممتحككمات الدقيقة يختلف قليلا عن الحاسب اللي‪ .‬فمثلا نجد‬ ‫في الحاسب اللي )أو الهاتف الجوال( الزر ‪ RESET‬أو ‪ Restart‬والذي يعني إيقاف تشغيل‬

‫الطاقة عن الحاسب ثم إعادة تشغيله‪ .‬أما في الممتحككمات الدقيقة الزر ‪ RESET‬هو مقاطعة‬ ‫خارجية تأمر المعالج أن يترك ما يفعله الن وينتقل إلى أول أمر في البرنامج المخزن‬

‫جلت ووحدات الذاكرة )وهذا يحاكي إعادة تشغيل الممتحككم‬ ‫بداخله مع تصفير جميع الممس ك‬ ‫الدقيق( ومع ذلك تظل الكهرباء متصله بالمتحكم ول يتم فصلها‪ .‬والسر وراء تصميم الص‬

‫‪ RESET‬بهذه الطريقة هو أن إعادة فصل وتودصيل الكهرباء بالمتحكم قد يستغرق ‪ 60‬مللي‬ ‫ثانية وهذا رقم كبير نسبياا في التطبيقات التي تحتاج استجابة سريعة بينما الممقاطعة يتم‬ ‫تشغيلها في أقل من ‪ 1‬ميكروثانية )يعني أسرع بنحو ‪ 60,000‬ضعف من فصل الكهرباء‬ ‫وإعادة تودصيلها(‪.‬‬

‫سنتعرف بالتفصيل على هذا اﻷمر في الفصل الخاص بإدارة الطاقة والفيوزات‪.‬‬ ‫عند إدخال إشارة رقمية علصصى هصذه الطصصراف تحصدث الممقاطعصة‪ .‬وعنصصدها يصترك الممتحككصصم الصدقيق‬

‫البرنامج الرئيسي الذي ينفذه وينتقل إلى برنامج الص ‪ ISR‬ليقوم بمعالجة الممقاطعصصة‪ .‬الكصصود التصصالي‬

‫يمثل التركيب البسيط للص ‪ ISR‬مع ال ‪.main program‬‬

‫‪175‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫)(‪int main‬‬ ‫{‬ ‫‪…........‬‬ ‫}‬

‫)‪ISR(interrupt_type‬‬ ‫{‬ ‫‪…........‬‬ ‫}‬

‫خطوات تفعيل الممقاطعة الخارجية‬ ‫يتم تفعيل الممقاطعة الخارجية بمجموعة من العدادات كالتالي‪:‬‬ ‫‪ .1‬ضبط الطراف التي ستستخدم للمقاطعة مثل ‪ INT0‬أو ‪ INT1‬لتعمل كدخل ‪input‬‬

‫‪ .2‬ضصصبط نصصوع الشصصارة الكهربيصصة الصصتي ستسصصبب الممقاطعصصة علصصى حسصصب نصصوع الحسصصاس أو‬ ‫المفتاح الذي سيولد إشارة الممقاطعة‪) .‬انظر للشرح بالسفل(‪.‬‬

‫‪ .3‬يتم تفعيل قبول استقبال الممقاطعة على الطرف المطلوب مثل ‪INT0‬‬ ‫‪ .4‬تفعيل قبول استقبال الممقاطعة بشكل عام‬ ‫‪ .5‬كتابة البرنامج الخاص بالممقاطعة ‪ISR‬‬

‫‪ 7.2‬المثال الأول ‪ :‬تشغيل الممقاطعة‬

‫‪INT0‬‬

‫الصصصدائرة التاليصصصة عبصصصارة عصصصن ‪ 2‬دايصصصود ضصصصوئي ‪ +‬مفتصصصاح الصصصدايود المتصصصصل بصصصالطرف ‪ PA0‬سصصصنقوم‬ ‫بتشغيله بصصورة طبيعيصة ليقصوم بعمصل ‪ Blink‬كصل مئصة مللصي ثانيصة‪ .‬أمصصا الصدايود المتصصصل بصصالطرف‬

‫‪ PC0‬سيتم تشغيله أو إطفاؤه فقط عند حدوث مقاطعة على الطرف ‪.INT0‬‬

‫‪176‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫الـكود‬

‫‪#define F_CPU 1000000UL‬‬ ‫>‪#include ‪#include ‪#include
‫;)‪DDRA |= (1 << PA0‬‬ ‫;)‪DDRB |= (1 << PB0‬‬ ‫ضبط الطرف الخاص بالممقاطعة وتشغيل مقاومة الرفع ‪//‬‬

‫;)‪DDRD &= ~(1 << PD2‬‬

‫البرنامج الرئيسي‬

‫;)‪PORTD |= (1 << PD2‬‬ ‫ضبط نوع إشارة الممقاطعة وتفعيل ‪// INT0‬‬

‫;)‪MCUCR |= (1 << ISC01‬‬ ‫;)‪GICR |= (1 << INT0‬‬ ‫تفعيل قبول الممقاطعة العامة ‪//‬‬

‫;)(‪sei‬‬ ‫)‪while(1‬‬ ‫{‬ ‫;)‪PORTA ^= (1 << PA0‬‬ ‫;)‪_delay_ms(100‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬ ‫‪177‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫برنامج المقاطعة‬

‫)‪ISR(INT0_vect‬‬ ‫{‬ ‫;)‪PORTB ^= (1 << PB0‬‬ ‫}‬

‫شرح الـكود‬ ‫في بداية الكود قمنا باستيراد المكتبة المسؤولة عن المقاطعات وذلك عن طريق المر‬

‫ rel="nofollow">‪#include
‫في الدالة ‪ main‬الرئيسية بضبط الطراف التي سيتصل بها الدايودات الضصصوئية وهصصي الطرفيصصن‬ ‫‪ PA0‬و ‪ PB0‬وذلك عن طريق المرين‪:‬‬ ‫;)‪DDRA |= (1 << PA0‬‬ ‫;)‪DDRB |= (1 << PB0‬‬ ‫الخطوة التالية كانت ضبط الطصرف ‪ PD2‬ليعمصل كصدخل وذلصك حصتى يتمكصن مصن اسصتقبال إشصارة‬

‫ال ممقاطعة من المفتاح المتصل به‪ .‬كما قمنصا بتشصغيل مقاومصة الرفصع الداخليصة ‪internal pull up‬‬ ‫وذلصصك حصصتى نسصصتخدم المفتصصاح دون الحاجصصة لتودصصصيل أي مقاومصصة إضصصافية وتصصم ذلصصك عصصن طريصصق‬

‫المرين‪:‬‬ ‫;)‪DDRD &= ~(1 << PD2‬‬ ‫;)‪PORTD |= (1 << PD2‬‬ ‫ثم تلى ذلك ضبط نوع الممقاطعة الخارجية ونوع الشارة الكهربية التي تسبب الممقاطعة‪ .‬وقبصصل‬ ‫أن نبصصدأ فصصي شصصرح الوامصصر الخادصصصة بهصصذا المصصر علينصصا أن نتعصصرف علصصى بعصصض الشصصياء المتعلقصصة‬

‫بالشارات الكهربية الرقمية‪.‬‬

‫الإشارات الرقمية‬

‫تنقسم الشارات الكهربية الرقمية إلى نوعين وهما ‪ logic level‬و ‪falling or rising Edge‬‬ ‫النصصوع الول وهصصو المعصصروف لصصدى الجميصصع ويسصصمى ‪ HIGH‬أو ‪ LOW‬أو ويعصصبر عصصن القيصصم الرقميصصة‬

‫التقليدية ‪ .0 & 1‬وتكون كل إشارة سصواء ‪ 0‬أو ‪ 1‬لهصصا زمصصن محصدد يقصاس علصصى حسصب الصصص ‪clock‬‬ ‫المستخدمة لتشغيل الممتحككم الدقيق‪.‬‬

‫‪178‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫فمثلا لصصو كصصان الممتحككصصم يعمصصل ب ‪) clock = 1 Mhz‬مليصصون هرتصصز( بصصان زمصصن النبضصصة الواحصصد = ‪1‬‬ ‫ميكروثانية ويكون هذا الزمن هصو نفصصس الزمصصن المطلصصوب لعمصصل اشصصارة كهربيصصة بقيمصصة ‪ 1‬أو دصصصفر‪.‬‬ ‫الصصصور التاليصصة توضصصح شصصكل إشصصارة رقميصصة مقسصصمة إلصصى وحايصصد وأدصصصفار )حيصصث يمثصصل كصصل مربصصع‬

‫رمادي اللون زمن إشارة واحدة(‪.‬‬

‫النصصوع الثصصاني مصصن الشصصارات الرقميصصة يسصصمى "الحصصواف ‪ ”Edges‬والصصتي تنقسصصم إلصصى نصصوعين وهمصصا‬

‫الحافصصصة الصصصصاعدة ‪ Rising Edge‬والحافصصصة الهابطصصصة ‪ .Falling Edge‬هصصصذا النصصصوع مصصصن الشصصصارات‬

‫الكهربية يتميز بأنه فائق السرعة ول يلتزم بزمن محدد وغالباا ما يحدث في زمصصن يقصصاس بالنصصانو‬

‫ثانية )جزء من مليار من الثانية(‪.‬‬

‫وتعتبر الحواف الصاعدة هي تحول الشارة الكهربية من ‪ LOW level‬إلى ‪ HIGH level‬في زمن‬

‫دصغير جداا بينما الحواف الهابطة هي تحول الشارة الكهربية من ‪ HIGH level‬إلى ‪.LOW level‬‬

‫الصور السابقة تثير تساؤل هام وهو‪ :‬أل يعني ذلك أن جميع الشارات الرقمية تحتوي علننى‬

‫‪ falling‬و ‪ rising edges‬؟‬

‫الجابة هي نعم‪ .‬والحقيقة أن أي إشارة رقمية تحتوي على حصصواف عصصددها يسصصاوي ضصصعف عصصدد‬ ‫الدصفار والوحايد والصورة التالية توضح الحافة الهابط والصاعدة مع إشارة ‪ LOW‬ثم ‪HIGH‬‬

‫‪179‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫‪1:Rising‬‬ ‫‪2:Falling‬‬ ‫‪3:High‬‬ ‫‪4:Low‬‬ ‫الطصصراف التقليديصصة الصصتي تعمصصل كصصدخل للمتحكصصم الصصدقيق ل تسصصتطيع أن تستشصصعر هصصذه الحصصواف‬

‫سصصواء كصصانت الصصصاعدة أو الهابطصصة وذلصصك لنهصصا تتصصم فصصي زمصصن دصصصغير جصصداا‪ .‬وهنصصا تظهصصر مشصصكلة‬

‫خطيرة‪ .‬حيث نجد أن بعض الحساسات يكون الخرج الكهربي الخاص بها سريع جداا لدرجة أن‬

‫الشصصارات الكهربيصصة الناتجصصة منصصه تكصصون فصصي زمصصن يقصصاس بالنصصانو ثانيصصة )مثصصل الحصصواف الصصصاعدة‬

‫والهابطة( وتمسى هذه الشارات السريعة بالص ‪ Electric Impulse‬أو ‪.Electric Edges‬‬ ‫لحصصل هصصذه المشصصكلة قصصام مصصصممو الممتحككمصصات الدقيقصصة بصصصناعة دائصصرة إلكترونيصصة خادصصصة تتصصصل‬ ‫بصصأطراف الصصصمقاطعات وتسصصمى بالصصص ‪) edge detector‬مكتشصصف الحصصواف(‪ .‬وتكصصون هصصذه الصصدوائر‬

‫مسصؤولة عصصن الحسصاس بالشصارات الكهربيصة فائقصة السصرعة وإبلغ الممتحككصم بصأنه هنصاك مقاطعصة‬

‫مطلوبة فوراا‪.‬‬

‫تمتلصصك ممتحككمصصات ‪ AVR‬هصصذه الصصدوائر الخادصصصة علصصى جميصصع أطصصراف المقاطعصصات وبصصذلك يمكننصصا أن‬

‫نجعصصل ال ممقاطعصصة تعمصصل علصصى جميصصع المفاتيصصح أو الحساسصصات فائقصصة السصصرعة‪ .‬حيصصث يمكصصن ضصصبط‬

‫الممقاطعة أن تعمل إما بإشارة تقليدية ‪ 0 & 1‬أو عن طريق إشارة سريعة ‪.Edge‬‬

‫جل ‪ MCUCR‬والصذي يحتصوي علصى مجموعصصة مصصن البتصصات مسصصؤولة عصصن‬ ‫يتحكم في هذا المر الممسص ك‬ ‫تحديصصد نصصوع إشصصارة الممقاطعصصة وتسصصمى ‪) ISCxx‬يتصصم اسصصتبدال ‪ xx‬برقمصصي ‪ 0‬و ‪ 1‬كمصصا سصصنرى فصصي‬

‫جل فصصي الصصصفحة رقصصم ‪ 68‬مصصن دليصصل البيانصصات‬ ‫الشصصرح التصصالي(‪ .‬يمكنصصك الودصصصول لشصصرح هصصذا الممسصص ك‬

‫للمتحكم ‪.ATmega16‬‬

‫‪180‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫•‬ ‫•‬

‫تتحكم البت ‪ ISC00‬و ‪ ISC01‬في إعدادات الشارة الخادصة بطرف الممقاطعة ‪INT0‬‬ ‫تتحكم البت ‪ ISC10‬و ‪ ISC11‬في إعدادات الشارة الخادصة بطرف الممقاطعة ‪INT1‬‬

‫عنصصد تغيصصر قيصصم هصصذه البتصصات يمكننصصا تحديصصد نصصوع إشصصارة الممقاطعصصة المطلوبصصة وذلصصك تبعصصاا للجصصدول‬ ‫التالي )يمكنك أن تجده في الصفحة رقم ‪ 68‬من دليل بيانات ‪(ATmega16‬‬

‫•‬

‫الخيار اﻷول‪ :‬هو ترك قيمة ‪ ISC00‬و ‪ ISC01‬بصفر وهذا سيجعل الممقاطعة تعمصل عنصصد‬

‫إدخصصال إشصصارة مصصن نصصوع ‪ LOW‬علصصى الطصصرف ‪) INT0‬معنصصى ذلصصك أنصصه طالمصصا الطصصرف ‪INT0‬‬

‫يدخل إليه إشارة ‪ HIGH‬فلن تعمل الممقاطعة(‪.‬‬ ‫•‬

‫الخينننار الثننناني‪ :‬جعصصصل قيمصصصة ‪ ISC00‬تسصصصاوي ‪ 1‬بينمصصصا قيمصصصة ‪ ISC01‬تسصصصاوي دصصصصفر وهصصصذا‬

‫سصصيجعل الممقاطعصصة تعمصصل عنصصد حصصدوث أي تغييصصر منطقصصي ‪ logic change‬علصصى الطصصرف‬

‫‪ INT0‬ومعنصصى ذلصصك أنصصه إذا أدخلصت إشصصارة ‪ HIGH‬شصصرط أن تكصصون الشصصارة السصصابقة ‪LOW‬‬

‫أو العكس ستعمل الممقاطعة‪.‬‬ ‫•‬

‫الخيار الثالث‪ :‬جعل قيمة ‪ ISC00‬تساوي ‪ 0‬بينما قيمة ‪ ISC01‬تساوي ‪ 1‬وهذا سصصيجعل‬ ‫دائصصصصرة الصصصصص ‪ edge detector‬تعمصصصصل علصصصصى التقصصصصاط أي إشصصصصارة كهربيصصصصة هابطصصصصة وتشصصصصغيل‬

‫الممقاطعة‪.‬‬ ‫•‬

‫الخيار الرابع‪ :‬جعل قيمة ‪ ISC00‬وذلك ‪ ISC01‬تساوي ‪ 1‬وهصصذا سصصيجعل دائصصرة الصصص ‪edge‬‬ ‫‪ detector‬تعمل على التقاط أي إشارة كهربية دصاعدة وتشغيل الممقاطعة‪.‬‬

‫والن نعود إلى الكود مرة أخرى سنجد نجد المر‬

‫;)‪MCUCR |= (1 << ISC01‬‬ ‫والصصذي وضصصع الرقصصم ‪ 1‬داخصصل البصصت ‪ ISC01‬وبمصصا أن البصصت ‪ ISC00‬تسصصاوي دصصصفر بصصصورة افتراضصصية‬ ‫‪181‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫فصصصإن هصصصذا المصصصر سصصصيجعل ال ممقاطعصصصة تعمصصصل عنصصصد الحافصصصة الهابطصصصة‪ .‬ولقصصصد اخصصصترت هصصصذا النصصصوع مصصصن‬

‫الشارات لن المفتاح المتصل بالطرف ‪ INT0‬يعمل مع المقاومة الداخلية لهذا الطرف ممصا يعنصي‬ ‫أنه عند الضغط على المفتاح سيتحول الطرف ‪ INT0‬من الحالة ‪ HIGH‬إلى الحالة ‪ LOW‬وهصصو مصصا‬

‫يوازي الحافة الهابطة‪ .‬أيضاا كان يمكن أن نصصترك كل ‪ ISC00‬و ‪ ISC01‬بقيمصصة دصصصفر وهصصذا سصصيجعل‬

‫الممقاطعة تعمل عند الضغط على المفتاح لفترة زمنية قصيرة )‪ 1‬ميكروثانية على القل(‪.‬‬

‫بعصد النتهصاء مصن ضصبط نصوع إشصارة الممقاطعصة علينصا أن نخصبر الممتحككصم الصدقيق بأننصا نريصد تفعيصل‬

‫استقبال إشصارات الممقاطعصة علصى الطصرف ‪ INT0‬ويتصم ذلصك عصصن طريصق التلعصب بالبتصات الخادصصة‬

‫جل في الصفحة ‪ 69‬بدليل البيانات ‪.(ATmega16‬‬ ‫بالمسجل ‪ ) GICR‬يمكنك الودصول لهذا الممس ك‬

‫جل ‪ 3‬بتات هامصصة جصداا وهصي ‪ INT0‬و ‪ INT1‬و ‪ INT2‬كصل بصت مصصن الثلثصة تتحكصم‬ ‫يمتلك هذا الممس ك‬

‫في تفعيل استقبال الممقاطعة على أحد الطراف فمثلا فعندما نضع القيمة ‪ 1‬داخل البصصت ‪INT0‬‬

‫فهذا يعني أن الممتحككم سيبدأ استقبال إشارات الممقاطعة على الطرف ‪ INT0‬وهكذا ‪..‬‬ ‫لذا استخدمنا المر التالي لخبار الممتحككم أن يبدأ تفعيل الممقاطعة ‪INT0‬‬

‫;)‪GICR |= (1 << INT0‬‬ ‫والن يأتي المر‬

‫;)(‪sei‬‬ ‫هصصذا المصصر مسصصؤول عصصن تفعيصصل اسصصتقبال طلبصصات الممقاطعصصة بشصصكل عصصام للمتحكصصم الصصدقيق وبنندون‬ ‫كتابته فلنن تعمنل أي مقاطعنة مهمنا ك انت وذلصك حصتى وإن كنصت قصد كتبصت جميصع أوامصر ضصبط‬ ‫الممقاطعة‪ .‬ويعتبر استخدام هذا المر مع المر ‪ cli‬أحد الوسائل فصصي التحكصصم فصصي سصصير البرامصصج‬ ‫الهامة التي ل يمكن مقاطعتها‪.‬‬ ‫وأخيراا نأتي لنهاية الدالة الرئيسية ‪ main‬حيث سصصنقوم بجعصصل الممتحككصصم يشصصغل ويطفصصئ الصصدايود‬ ‫الضوئي المتصل على الطرف ‪ PA0‬كل ‪ 100‬مللي ثانية إلى البد‪.‬‬

‫‪182‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫)‪while(1‬‬ ‫{‬ ‫;)‪PORTA ^= (1 << PA0‬‬ ‫;)‪_delay_ms(100‬‬ ‫}‬ ‫بعصصد النتهصصاء مصصن الدالصصة الرئيسصصية يصصأتي دور دالننة معالجننة الممقاطعننة ‪ ISR‬حيصصث نجصصد أن هصصذه‬

‫الدالة مكتوبة بالسلوب التالي‪:‬‬

‫)‪ISR(INT0_vect‬‬ ‫{‬ ‫;)‪PORTB ^= (1 << PB0‬‬ ‫}‬ ‫جميصصصع دوال الممقاطعصصصة المختلفصصصة يتصصصم كتابتهصصصا عصصصن طريصصصق التعريصصصف )‪ISR(interrupt_vector‬‬ ‫ويتصصصصم اسصصصصتبدال كلمصصصصة ‪ interrupt_vector‬بنصصصصوع الممقاطعصصصصة المطلوبصصصصة وبالنسصصصصبة للصصصصص ‪External‬‬ ‫‪ interrupts‬هناك ‪ 3‬أنواع ‪:‬‬ ‫‪INT0_vect‬‬ ‫‪INT1_vect‬‬ ‫‪INT2_vect‬‬ ‫فإذا أردنا أن نكتب البرنامج الخاص بالممقاطعة ‪ INT0‬فإننا نكتب‬ ‫)‪ISR(INT0_vect‬‬ ‫{‬

‫وإذا أردنا أن نكتب البرنامج الخاص بالممقاطعة ‪ INT1‬فإننا نكتب‬ ‫)‪ISR(INT1_vect‬‬ ‫{‬

‫مع وضع الوامر المطلوبة من الممقاطعة داخل القوسين }{‪ .‬وفصصي المثصصال السصصابق اسصصتخدام أمصصر‬ ‫يقوم بعكس حالة الطرف ‪ PB0‬وهذا ما سيجعل الدايود الضوئي يضيء أو ينطفئ عند كل مرة‬

‫يتم فيها تفعيل الممقاطعة ‪.INT0‬‬

‫;)‪PORTB ^= (1 << PB0‬‬

‫‪183‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 7.3‬المثال الثاني ‪ :‬تشغيل الممقاطعة ‪ INT0‬مع‬

‫‪INT1‬‬

‫فصصصي هصصصذا المثصصصال سصصصنقوم بتفعيصصصل كل المقصصصاطعتين ‪ INT0‬و ‪ INT1‬وسصصصنقوم ببنصصصاء دائصصصرة مشصصصابهة‬

‫للمثال السابق باختلف وجود ‪ 2‬مفتاح لتفعيل ‪ INT0‬و ‪ INT1‬ووجود دايود ضوئي إضافي كمصصا‬

‫في الصورة التالية‪:‬‬

‫الـكود‬ ‫‪#define F_CPU 1000000UL‬‬ ‫ rel="nofollow">‪#include ‪#include ‪#include
‫البرنامج الرئيسي‬

‫)‪int main(void‬‬ ‫{‬ ‫ضبط أطراف التودصيل بالدايودات الضوئية‪//‬‬

‫;)‪DDRA |= (1 << PA0‬‬ ‫;)‪DDRB |= (1 << PB0) | (1 << PB1‬‬

‫ضبط الطرف الخاص بالممقاطعة وتشغيل مقاومة الرفع ‪// INT0 & INT1‬‬

‫;))‪DDRD &= ~((1 << PD2)|(1 << PD3‬‬ ‫;)‪PORTD |= (1 << PD2)|(1 << PD3‬‬

‫‪184‬‬

‫‪ .7‬الممدقاطعة ‪Interrupt‬‬ ‫… ‪..............................................................................................‬‬ ‫تفعيل ال ممقاطعة عند استقبال إشارة من نوع الحافة الهابطة لكل المقاطعتين ‪// INT0 & INT1‬‬

‫;)‪MCUCR |= (1 << ISC01) | (1 << ISC11‬‬ ‫;)‪|= (1 << INT0) | (1 << INT1‬‬

‫‪GICR‬‬

‫)‪while(1‬‬ ‫{‬ ‫;)‪PORTA ^= (1 << PA0‬‬ ‫;)‪_delay_ms(100‬‬ ‫}‬ ‫;‪return 0‬‬

‫دوال المقاطعة‬

‫}‬ ‫دالة الممقاطعة الولى ‪//‬‬ ‫)‪ISR(INT0_vect‬‬ ‫{‬ ‫;)‪PORTB ^= (1 << PB0‬‬ ‫}‬ ‫دالة الممقاطعة الثانية ‪//‬‬

‫)‪ISR(INT1_vect‬‬ ‫{‬ ‫;)‪PORTB ^= (1 << PB1‬‬

‫شرح الـكود‬

‫}‬

‫هصصذا المثصصال يعتصصبر مطصصابق للمثصصال السصصابق فصصي نفصصس الفكصصرة مصصع اختلف تشصصغيل كل المقصصاطعتين‬

‫‪ INT0‬و ‪ INT1‬بحيصصصث تكصصصون كصصصل مقاطعصصصة مسصصصؤولة عصصصن تشصصصغيل وإطفصصصاء الصصصدايودات الضصصصوئية‬ ‫المتصلة على الطراف ‪ PB0‬و ‪.PB1‬‬

‫وكما هو ملحظ سنجد في نهاية البرنامج دالتين ‪ ISR‬الولى مسصصؤولة عصصن أوامصصر معالجصصة ‪INT0‬‬ ‫و الثانية مسؤولة عن أوامر معالجة ‪INT1‬‬

‫‪185‬‬

‫الفصل الثامن‬ ‫”الرجل الذي يستخدم مهاراته وخياله البناء لمعرفة أقصى ما يمكن أن‬

‫يقدمه مقابل دولار واحد بدلا ا من التفكير في أقل ما يمكن أي يقدمه‬ ‫مقابل نفس الدولار‪ ،‬حتما ا سينجح‟‬

‫هنري فورد – مؤسس شركة فورد للسيارات‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .8‬التصال التسلسلي بروتوكول‬ ‫‪UART‬‬

‫في هذا الفصل سنتعرف على أحد أشهر طرق إرسال البيانات بصورة تسلسلية بين الممتحككمات‬ ‫الدقيقصصة والعصصالم الخصصارجي وذلصصك عصصبر بروتوكصصول ‪ UART‬والصصذي يعتصصبر أشصصهر بروتوكصصول معيصصاري‬

‫لتبادل البيانات‪.‬‬ ‫✔‬

‫مقدمة عن التصال التسلسلي‬

‫✔‬

‫التصال التسلسلي الغير متزامن‬

‫✔‬

‫تهيئة الص ‪ UART‬لمتحكمات ‪AVR‬‬

‫✔‬

‫المثال الول‪ :‬تهيئة ‪ AVR‬للعمل كمرسل عبر ‪UART‬‬

‫✔‬

‫المثال الثاني‪ :‬تهيئة ‪ AVR‬للعمل كمستقبل عبر ‪UART‬‬

‫✔‬

‫المثال الثالث‪ :‬الرسال و الستقبال في وقت واحد‬

‫✔‬

‫إرسال السلسل النصية ‪Strings‬‬

‫✔‬

‫‪187‬‬

‫دوال إضافية‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 8.1‬مقدمة عن الاتصال التسلسلي‬

‫عندما يتوادصل الممتحككم مع العالم الخارجي‪ ،‬فإن إرسصصال واسصصتقبال البيانصصات يكصصون بشصصكل حصصزم‬ ‫مكونصصة مصصن ‪ 8‬بصصت) ‪ 1‬بصصايت (‪ .‬بالنسصصبة لبعصصض الجهصصزة مثصصل الطابعصصات القديمصصة داخصصل كابصصل الصصص‬ ‫‪ Parallel port‬يتم إرسال البيانات من ناقل البيانات ‪ 8‬بت ) ‪ ( bit data bus-8‬من الكمبيوتر‬

‫إلى ناقل البيانات ‪ 8‬بت في الطابعة‪.‬‬ ‫يعيصصب هصصذا السصصلوب فصصي نقصصل البيانصصات وجصصوب أن تكصصون المسصصافة بيصصن الجهصصازين قصصصيرة‪ .‬لن‬

‫السلك تشوه شكل الشارات الكهربيصصة مصع طصول المسصافة‪ ،‬كمصصا أن السصصلك المسصتخدمة لنقصل ‪8‬‬

‫بت في نفس الوقت يكون سعرها مرتفع‪.‬‬ ‫أيضصصصصصص اا تحصصصصصصدث مجموعصصصصصصة مصصصصصصن الظصصصصصصواهر كهربيصصصصصصة تسصصصصصصمى "المكثفصصصصصصات الطفيليصصصصصصة ‪Parasitic‬‬ ‫‪ ”Capacitance‬و "الملفصصصصصات الطفيليصصصصصة ‪ ”Parasitic inductance‬هصصصصصذه الظصصصصصواهر تحصصصصصدث‬ ‫للودصصصلت النحاسصصية المتقاربصصة مصصن بعضصصها البعصصض‪ .‬وتتسصصبب فصصي تشصصويه كصصبير لشصصكل الشصصارة‪.‬‬

‫الصورة التالية توضح شكل إشارة كهربية على دصورة "نبضة ‪ ”pluse‬بعد التشويه‪.‬‬

‫شكل الشارة بعد التشويه الناتج من‬

‫شكل الشارة الدصلية‬

‫المكثفات والملفات الطفيلية‬ ‫لحل هذه المشكلة يتم استخدام التصال التسلسصلي ‪ Serial communication‬لنقصل البيانصات‬ ‫بيصصن النظمصصة الصصتي تفصصصل بينهصصا مسصصافات كصصبيرة‪ ،‬وفصصي وقتنصصا الحاضصصر ومصصع تطصصور التكنولوجيصصا‬

‫أدصبح التصال التسلسلي أسرع من ذي قبل‪ ،‬فتم تعميمه واستخدامه حاليا فصي جميصصع الجهصزة‬

‫تقريباا بدءاا من الحساسات في النظمة المدمجة إلى الحواسصصيب الشخصصصية وشصصبكات الحاسصصب‬ ‫اللي‪.‬‬

‫‪188‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫مبدأ عمل الاتصال التسلسلي ‪UART‬‬

‫تمتلك الممتحككمصات الدقيقصصة مجموعصصة مصصن الوسصصائل الصتي تمكنصصك مصصن تودصصيل البيانصات مصصن وإلصصى‬

‫الممتحككم باسلوب تسلسلي ومنها ‪ UART – SPI – i2c‬في هذا الفصل سنتحدث عن الص ‪.UART‬‬

‫تستخدم تقنية التصال التسلسلي طرف )سلك( واحد فقط لنقصصل البيانصصات مصصن جهصصاز لخصصر بصدلا‬

‫مصصصن ‪ 8‬أسصصصلك كمصصصا فصصصي حالصصصة التصصصصال المتصصصوازي ‪ Parallel‬ولكصصصي يتصصصم إرسصصصال البيانصصصات بشصصصكل‬ ‫تسلسلي يتم أولا تحويل البيانات مصصن ‪ 8‬بصصت ‪ Parallel‬إلصصى ‪ 8‬بتصصات متسلسصصلة وذلصصك باسصصتخدام‬

‫شريحة إلكترونيصصة )متواجصدة داخصصل الممتحككصصم الصصدقيق( تسصصمى ‪Parallel-in-Serial-out shift‬‬

‫جل إزاحصصصصة يكصصصصون دخلصصصصه ‪ 8‬بتصصصصات ‪ parallel‬وخرجصصصصه ‪ 8‬بتصصصصات‬ ‫‪ register‬وهصصصصو عبصصصصارة عصصصصن ممسصصصص ك‬

‫متسلسصصلة‪ .‬وعلصصى الجصصانب الخصصر‪ ،‬يجصصب أن يمتلصصك الممسصصتقبل شصصريحة أخصصرى تقصصوم بعكصصس هصصذه‬ ‫مم‬ ‫العملية وتسمى ‪ ،Serial-in-Parallel-out shift register‬لتحويل البيانات مرة أخصصلرى إلصصى ‪8‬‬ ‫بت متوازية‪.‬‬

‫ملحظة‪ :‬كلمة بروتوكول ‪ Protocol‬تعني طريقة تنظيم إرسال واستقبال البيانات مثل سرعة‬ ‫البيانات وطريقة ترتيبها وترقيم البيانات المرسلة وكذلك الطراف المستخدمة لهذا الرسال‬

‫أنواع الإرسال التسلسلي‬

‫والستقبال‬

‫يمكن نقل البيانات تسلسلياا ببروتوكول ‪ UART‬بطريقتين‪ ،‬لكل منهما مميزات وعيوب وهما‪:‬‬ ‫•‬

‫التصال التسلسلي المتزامن‪.‬‬

‫•‬

‫التصال التسلسلي الغير متزامن‪.‬‬

‫‪189‬‬

‫‪Synchronous‬‬ ‫‪Asynchronous‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫ميسصصتخلدم التصصصال المصصتزامن لنقصصل كميصصة مصصن البيانصصات دفعصصة واحصصدة ) ‪ ،( Block of data‬بينمصصا‬ ‫ميستخلدم التصال الغير متزامن لنقل بايت واحد في كل مرة‪.‬‬

‫ويمكصصن برمجصصة الممتحككصصم للعمصصل بإحصصدى الطريقصصتين‪ ،‬ولكصصن البرنامصصج سصصيكون طصصويل‪ .‬لصصذلك تصصم‬

‫دصناعة دوائر متكاملة يتم دمجها داخصصل الممتحككصصم مخصصصصة للتصصصال التسلسصصلي‪ ،‬وأدصصصبح يرمصصز‬

‫إليهصصصا ب ‪ UART‬أي ‪ .Universal Asynchronous Receiver Transmitter‬أو ‪ USART‬أي‬ ‫‪Transmitter‬‬

‫‪Receiver‬‬

‫‪Synchronous-Asynchronous‬‬

‫ممتحككمات ‪ AVR‬علي ‪ USART‬داخلي‪.‬‬

‫‪.Universal‬و تحتصصصصصصصصصوي‬

‫هناك نوعان للرسال التسلسلي‪:‬‬

‫‪ :Simplex .1‬عنصصصصدما يكصصصصون هنصصصصاك إرسصصصصال فقصصصصط أو اسصصصصتقبال فقصصصصط‪ .‬مثصصصصل‪ :‬الطابعصصصصة‪،‬‬ ‫فالكمبيوتر هو الوحيد الذي يرسل البيانات‪.‬‬

‫‪ :Duplex .2‬عندما يكون هناك قابلية للرسال والستقبال‪ ،‬وينقسم إلى نوعين‪:‬‬

‫‪ :Half-duplex .3‬وذلك عندما تكون هناك القابلية للرسال والستقبال ولكن ليس فصصي‬ ‫آن واحصصصد‪ ،‬مثصصصل‪ :‬جهصصصاز اللسصصصلكي‪ ،‬عنصصصدما تريصصصد التحصصصدث تضصصصغط علصصصى الصصصزر وتبصصصدأ فصصصي‬

‫التحصصدث‪ ،‬والجهصصاز الخصصر يمكنصصه فقصصط السصصتماع‪ ،‬وعنصصد إزالصصة يصصدك مصصن علصصى الصصزر يمكصصن‬ ‫للجهاز الخر إرسال الصوت وأنت يمكنك الستماع‪.‬‬

‫‪ :Full-duplex .4‬عندما تكون هنصاك القابليصة لللرسصال والسصتقبال فصي آن واح د‪ ،‬مثصل‪:‬‬ ‫الهاتف المحمول‪ ،‬فبإمكانك التحدث والستماع لمن تخاطبه بنفس الوقت‪.‬‬

‫‪190‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 8.2‬التسلسلي الغير متزامن‬

‫‪Asynchronous‬‬

‫تسصصتقبل البيانصصات بجهصصة المسصصتقبل علصصي هيئصصة ‪ 0‬و ‪ .1‬ول يمكصصن معرفصصة ماهيصصة هصصذه البيانصصات إل‬ ‫عنصصدما يتفصصق المرسصصل والمسصصتقبل علصصى مجموعصصة مصصن القواعصصد والضصصوابط " بروتوكصصول" حصصول‬

‫كيفية إرسال البيانات‪ ،‬وكم عدد البتات في كل مرة‪ ،‬ومتى يبدأ الرسال ومتى ينتهي‪.‬‬

‫بتات بداية ونهاية الإرسال ‪:‬‬

‫مم‬ ‫يتم إرسال البايت الواحد بين بت للبداية أخلرى للنهاية‪ ،‬وهذا يدعى بصال " إط ار " ‪ .Frame‬بصت‬

‫البداية ‪ frst bit‬تكون عبارة عن نبضصة واحصدة وتكصون دائمصا ‪ ،LOW‬بينمصا بصت النهايصة يمكصن أن‬ ‫تكون نبضة واحدة أو ‪ 2‬بت وتكون دائما ‪.HIGH‬‬

‫الصورة التالية تمثل مثال على إرسال كصصود ‪ ASCII‬للحصصرف ‪ A‬حيصصث يتصصم إرسصصال ‪ 10‬بتصصات لكصصل‬ ‫مم‬ ‫‪ 1‬بايت‪ 8 .‬بت للبيانات )حرف ‪ A‬نفسه( وبت للبداية أخلرى للنهاية‪.‬‬

‫‪Courtesy of: AVR microcontroller and embedded systems using assembly‬‬ ‫‪and C by M.Ali Mazidi‬‬ ‫مم‬ ‫فصصصي بعصصصض النظمصصصة تضصصصاف بصصصت أخصصصلرى وتسصصصمى ‪ ،Parity bit‬وتسصصصتخدم لمعرفصصصة إذا مصصصا كصصصانت‬

‫البيانات المستلمة دصحيحة أم بها خطأ‪.‬‬

‫معدل إرسال البيانات ‪Baud rate:‬‬

‫يقصاس معصدل إرسصال البيانصات فصي التصصصال التسلسصلي ب ‪ bps‬أي ‪ .bits per second‬بصت ف ي‬ ‫الثانية‪ .‬وتعتمد سرعة إرسال البيانصات علصى النظصام المسصتخدم‪ ،‬فقصد كصانت أجهصزة ‪ IBM‬القديمصة‬

‫ترسصصل البيانصصات بسصصرعات تصصتراوح بيصصن ‪ 100‬إلصصى ‪ .bps 9600‬ومصصع التطصصور اسصصتطاعت أجهصصزة‬ ‫المودم إرسال البيانات بسرعة تصل إلى ‪. 56kbps‬‬

‫‪191‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫في الوقت الحالي تدعم معظم الممتحككمات الدقيقة )بمصا ف ي ذلصك ‪ (AVR‬سصرعة أنظمصة الرسصال‬

‫التسلسلية من نوع ‪ Asynchronous‬بحد أقصى ‪ 115200‬بت في الثانية )نحو ‪ 100‬كيلصوبت‬ ‫في الثانية(‪.‬‬

‫أطراف الإرسال والاستقبال في الممتحكك م ‪ATmega16/32‬‬

‫الطصصصصرف الصصصصتي تحمصصصصل الرمصصصصز ‪ RXD‬تسننننتخدم للسننننتقبال‪ :‬ويتصصصصم تودصصصصصيلها بصصصصالطرف الخادصصصصصة‬

‫بالرسال في الممتحككم الخر‪.‬‬

‫الطرف التي تحمل الرمز ‪ TXD‬تستخدم للرسال‪ :‬ويتم تودصيلها بصالطرف الخادصصة بالسصتقبال‬

‫في الممتحككم الخر‪.‬‬

‫‪192‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 8.3‬تهيئة الـ ‪ UART‬الداخلي لمتحكامات‬

‫‪AVR‬‬

‫يتم تهيئة ال ‪ UART‬للعمل عن طريق ضبط العصدادات الخادصصة ب‪ :‬معصدل نقصل البيانصات – عصدد‬ ‫بتات الرسال – عدد بتات النهاية‪ ...‬وغيره من العصدادات والصتي يتصم ضصبطها عصن طريصق تغييصر‬

‫جلت التي تتحكم في ال ‪.UART‬‬ ‫قيم الممس ك‬

‫يتحكم في ال ‪ UART 5‬مسجلت وهي‪:‬‬ ‫‪-1‬‬

‫‪.UBRR [H: L]: USART Baud Rate Register‬‬

‫‪-2‬‬

‫‪.UCSRA: USART Control and Status Register A‬‬

‫‪-3‬‬

‫‪.UCSRB: USART Control and Status Register B‬‬

‫‪-4‬‬

‫‪.UCSRC: USART Control and Status Register C‬‬

‫‪-5‬‬

‫‪.UDR: USART I/O Data Register‬‬

‫جلات‬ ‫شرح الممس ك‬ ‫]‪UBRR [H: L‬‬

‫وهصصو عبصصارة عصصن مسصصجلين ‪8‬بصصت ‪ UBRRL‬ويحمصصل ال ‪ 8‬بصصت ‪1‬بصصت القيمصصة الصصصغرى مصصن قيمصصة ال‬ ‫‪ ،baud rate‬والمسجل الخر هو ‪ UBRRH‬ويحتوى على القيمة العظمى من ال ‪.baud rate‬‬

‫يتم وضع قيمة ال ‪ baud rate‬في البتات من ‪ 0‬إلى ‪.11‬‬

‫جلت سيكون الشرح متعلق بالبتات التي سنستخدامها فقط‪.‬‬ ‫ملحظة‪ :‬بالنسبة لبعض الممس ك‬

‫‪UCSRA‬‬

‫•‬

‫‪193‬‬

‫البننت رقنم ‪ RXC :7‬هصذه البصت تصصصبح ‪ 1‬عنصصد اكتمصصال اسصتقبال البصصايت‪ ،‬وتظصل ‪ 0‬أثنصاء‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫الستقبال‪.‬‬ ‫•‬ ‫•‬

‫البت رقم ‪ TXC :6‬هذه البت تصبح ‪ 1‬عند تمام الرسال‪ ،‬وتظل ‪ 0‬أثناء الرسال‪.‬‬

‫البت رقم ‪ UDRE :5‬تكون قيمتها ‪ 0‬أثنصصاء انشصصغال الممتحككصصم وتصصصبح ‪ 1‬عنصصدما يكصصون‬ ‫مم‬ ‫جاهزاا لرسال بيانات أخلرى‪.‬‬

‫‪UCSRB‬‬

‫•‬

‫البننت رقننم ‪ RXCIE :7‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬ ‫‪ Interrupt‬الخادصة باستقبال البيانات‪.‬‬

‫•‬

‫البننت رقننم ‪TXCIE :6‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬ ‫‪ Interrupt‬الخادصة بإرسال البيانات‪.‬‬

‫•‬

‫البننت رقننم ‪UDRIE :5‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬

‫•‬

‫البت رقم ‪RXEN :4‬عند جعل قيمة هذه البت تساوي ‪ 1‬يتم تفعيل إمكانيصصة اسصصتقبال‬

‫‪ Interrupt‬الخادصة بجاهزية الممتحككم لرسال أو إستقبال البيانات‪.‬‬

‫البيانات‪.‬‬ ‫•‬

‫البت رقم ‪TXEN :3‬عنصد جعصل قيمصة هصذه البصت تسصاوي ‪ 1‬يتصم تفعيصل إمكانيصة إرسصال‬

‫البيانات‪.‬‬ ‫•‬

‫البت رقم ‪ UCSZ2 :2‬برجاء مراجعة الجدول في الصفحة التالية‬

‫‪UCSRC‬‬

‫جل على ‪ 2‬بت لهما أهميصة قصصصوى وهمصصا البصصت رقصصم ‪ UCSZ1 :2‬وكصذلك البصصت‬ ‫يحتوي هذا الممس ك‬ ‫رقم ‪ UCSZ0 :1‬حيث يستخدمان في تحديد عدد بتات الرسال في حزمة البيانات الواحدة‪.‬‬

‫الجدول التالي يوضح كيفية ضصصبط حجصصم الحزمصصة الواحصصدة مصصن البيانصصات وذلصصك بتغيصصر قيصصم هصذه‬

‫البتات‪.‬‬

‫‪194‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬

‫سنستخدم في المثلة التالية نظام الرسال بحجم ‪ 8‬بت )‪ 1‬بايت(‪ .‬وهذا النظام يعتصصبر قياسصصي‬

‫في معظم الممتحككمات الدقيقة والجهزة اللكترونية المختلفة‪.‬‬

‫‪ 8.4‬المثال الأول ‪ :‬تهيئة الـ ‪ UART‬للعمل كمرسل‬

‫نسترجع ما شرحناه سابقاا عصصن بروتوكصصول التصصصال التسلسصصلي‪ ،‬وكمصصا أشصصرنا فصصإن هنصصاك مصصا يسصصمى‬ ‫بمعدل إرسال البيانات والذي يجب أن يتم تحديده للمتحكم‪ ،‬وأيضاا يجصصب تحديصصد عصصدد البتصصات‬ ‫الصصصتي سنرسصصصلها فصصي المصصصرة الواحصصدة‪ ،‬فصصالمتحكم قصصادر علصصى إرسصصال ‪ 5،7،8‬أو ‪ 9‬بتصصات فصصي المصصرة‬ ‫الواحدة‪ ،‬هذا بخلف نبضة البداية ونبضة النهاية‪ .‬ولكن اتفقنا على اتباع النظمة القياسية في‬

‫تحديد عدد ‪ 8‬بتات للرسال‪ ،‬وهذا ما يجب تحديده للمتحكم‪.‬‬

‫نبدأ أول بتحديد معدل نقل البيانات ‪ baud rate‬ويتم تخزين القيمة فصصي المسصصجلين ‪UBRRH‬‬ ‫و ‪ .UBRRL‬لنأخصذ علصى سصبيل المثصال معصصدل إرسصال بيانصصات يسصاوي ‪.bps 9600‬بمراجعصة دليصصل‬ ‫البيانصات للمتحكصم يتضصح أن تحديصد القيمصة الصتي يجصب تخزينهصا بالمسصجلين ]‪ UBRR[H:L‬يتصم‬

‫عن طريق العلقة‪:‬‬

‫‪195‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫•‬

‫‪ Fosc‬هو تردد المذبذب الدخلي أو الص " ‪ " Crystal‬وسصصنفترض أننصصا نشصصغل الممتحككصصم‬

‫•‬

‫‪ BAUD‬هي قيمة معدل إرسال البيانات والتي حددناها سلفاا ب ‪.bps 9600‬‬

‫بتردد ‪ 16‬ميجا هرتز‪.‬‬

‫ملحظة‪ :‬في هذا المثال سيتم تشغيل الممتحككم بسرعة ‪ 16‬ميجا وذلك عبر تودصيل كريستالة‬ ‫خارجية ‪ 16‬ميجا ‪ +‬مكثفات ‪ 22‬بيكوفاراد‪ ،‬يمكنك مراجعة فصل الطاقة وسرعة التشغيل‬

‫لتتعرف أكثر على خواص هذا النوع من المذبذبات وطريقة عمله‪ .‬ول تنسى أن تضبط برنامج‬ ‫بروتس على محاكاة الممتحككم بسرعة تشغيل ‪ 16‬ميجا وذلك عبر الضغط على رمز شريحة‬ ‫‪ ATmega16‬مرتين ثم تغير الكريستالة وقيمتها‬

‫بصصالتعويض عصصن هصصذه القيصصم فصصي المعادلصصة السصصابقة تكصصون قيمصصة ‪ UBRR‬تسصصاوي ‪ 103.16667‬أي‬

‫بصصالتقريب تسصصاوي ‪ .103‬ويتصصم وضصصع هصصذه القيمصصة كمصصا هصصو موضصصح فصصي الكصصود التصصالي )هصصذا الكصصود‬

‫يجعل الممتحككم يرسل قيمة الحرف ‪ A‬بصيغة ‪ ASCII‬كل ثانية(‪.‬‬

‫‪#define F_CPU 16000000‬‬ ‫ rel="nofollow">‪#include ‪#include
‫)‪int main(void‬‬ ‫{‬ ‫;‪uint16_t UBRR_Value = 103‬‬ ‫;‪UBRRL = (uint8_t) UBRR_Value‬‬ ‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬ ‫;)‪UCSRB = (1<
‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫;) ) )‪while( ! (UCSRA & (1<
202

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫جل ‪ .DDRC‬والسصصطر الصصذي يليصصه يقصصوم بتفعيصصل مقاومصصة الرفصصع‬ ‫في البتات المناظرة لهما فصي الممسصص ك‬

‫الداخلية لكل منهما‪.‬‬

‫ثم نأتي للجملة الشرطية ))‪if(bit_is_clear(PINC،0‬‬

‫هذا السطر يقوم باختبار ما إذا تم الضغط على الزر المتصل ب ‪ PC0‬أم ل‪ ،‬فإذا تم الضغط علصصى‬

‫الزر سيقوم الممتحككم بإرسال الحرف " ‪." N‬وكذلك المر بالنسبة للزر المتصل ب ‪ PC3‬ولكصصن مصصع‬ ‫فارق أنه يقوم بإرسال الحرف " ‪." F‬‬

‫أما الكود الخاص بالمتحكم المسئول عصن اسصتقبال الحصرف وإضصاءة أو إطفصاء الصدايود الضصوئي‬

‫فهو كالتالي‪:‬‬

‫‪#define F_CPU 16000000‬‬ ‫>‪#include ‪#include > 8‬‬ ‫;)‪UCSRB = (1<
‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬ ‫… ‪..............................................................................................‬‬ ‫)'‪if(Received == 'F‬‬ ‫;)‪PORTC &= ~(1<
‫شرح الـكود‬

‫في هذا البرنامصصج قمنصا بإنشصاء متغيصر مصصن نصوع ‪ Character‬ويصدعى ‪ Received‬وقمنصا بتخزيصصن‬ ‫مصصا يتصصم اسصصتقباله فصصي هصصذا المتغيصصر‪ ،‬ثصصم يقصصوم الممتحككصصم باختبصصار محتصصوى هصصذا المتغيصصر بجملصصتين‬

‫شصصرطيتين‪ ،‬فصصإذا كصصان محتصصواه مسصصاوياا للحصصرف " ‪ " N‬قصصام بإضصصاءة الصصدايود الضصصوئي المتصصصل ب‬ ‫‪ ،PC0‬وإذا كان محتواه مساوياا للحرف " ‪ " F‬قام بإطفاء الدايود الضوئي‪.‬‬

‫‪ 8.7‬إرسال مجموعة بيانات مثل السلاسل النصية‬

‫قصصد يتبصصادر إلصصى ذهنصصك‪ ،‬مصصاذا أفعصصل إذا أردت إرسصصال كلمصصة أو جملصصة؟ مصصاذا أفعصصل إذا أردت إرسصصال‬

‫قيمة متغير؟ وماذا أفعل لكي استطيع استقبال كلمة أو جملة؟ لنفترض أننا نحاول إرسال كلمة‬

‫" ‪ " UART‬سنجد أنه هناك طريقتين لذلك‪.‬‬

‫الطريقة اﻷولى‪ :‬إرسال حروف متتالية‬ ‫إرسال حرف ‪// U‬‬ ‫إرسال حرف ‪// A‬‬ ‫إرسال حرف ‪// R‬‬ ‫إرسال حرف ‪// T‬‬ ‫وسيتم إرسالها‪.‬‬

‫‪204‬‬

‫;)))‪while(!(UCSRA & (1<
209

‫الفصل التاسع‬ ‫” أن تتعثر فهذا يعني أنك تسير في الطر يق‪ ،‬فلم أسمع‬

‫بأحد يتعثر وهو لا يتحرك ‟‬

‫تشارلز كيترينج ‪ -‬مهندس ومخخترع أمريكي‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬

‫في هذا الفصصصل سصصنتعرف علصصى كيفيصصة قصصراءة الجهصصود الكهربيصصة المتغيصصرة ‪ Analog‬وتحويلهصصا إلصصى‬ ‫قيصصم رقميصصة وذلصصك باسصصتخدام المحصصول التنصصاظري‪-‬الرقمصصي المدمصصج داخصصل ممتحككمصصات ‪.AVR‬حيصصث‬ ‫يمكصصن اسصصتغلل هصصذا المحصصول فصي قصصراءة الحساسصصات التناظريصصة أو أي عنصصصر إلكصتروني لصصه خصرج‬

‫كهربي متغير‪.‬‬ ‫✔‬

‫مقدمة عن المحول التناظري – الرقمي ‪ADC‬‬

‫✔‬

‫طريقة عمل الص ‪ADC‬‬

‫✔‬

‫تركيب الص ‪ ADC‬داخل الممتحككم ‪ATmega16‬‬

‫✔‬

‫مثال‪ :‬قراءة جهد متغير باستخدام مقاومة متغيرة‬

‫✔‬

‫‪211‬‬

‫الحسابات الرياضية الخادصة بالص ‪ADC‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 9.1‬مقدمة عن المرحول التناظري‪-‬الرقمي‬

‫‪ADC‬‬

‫الشارات الكهربية في العالم الخارجي ليست مقتصرة فقط على الشصارات الرقميصة ‪ Digital‬بصل‬

‫على العكس العديد من الجهزة و الحساسات اللكترونية تصصصدر اشصصارت تماثليصصة ‪ Analog‬فمثلا‬ ‫نجصصد أن معظصصم الحساسصصات المتصصوفرة فصصي السصصواق يمكنهصصا تحويصصل كميصصة فيزيائصصة معينصصة مثصصل‬

‫)درجة الحرارة – الرطوبصة – ضصصغط – تركيصصز مصصادة كيميائيصة ‪..‬الصصخ( إلصى فصصرق جهصد كهربصصي يتغيصر‬ ‫بتغير هذه القيم الفيزيائية‪.‬‬

‫بصورة طبيعية ل تستطيع الحواسيب أو الممتحككمات الدقيقة أن تفهم الشارات التماثليصصة فكصصل‬ ‫ما تفهمه هذه الحواسيب هي الشارات الرقميصصة مثصصل ‪ 1‬و ‪ 0‬أو ‪ HIGH‬و ‪ .LOW‬لصصذا قصصام مصصصممو‬

‫اللكترونيصصات بصصصناعة شصصريحة خادصصصة تسصصمى بصصالمحول التنصصاظري الرقمصصي ‪Analog to Digital‬‬

‫‪ Converter‬وتختصصصر بكلمصصة ‪ ADC‬هصصذه الشصصريحة يمكصصن شصصرائها بصصصورة مسصصتقلة وتودصصصيلها مصصع‬

‫الممتحككم الدقيق‪.‬‬

‫لحسن حظنا نجد أن مصممي ممتحككمات ‪ AVR‬قامو بدمصصج هصذه الشصصريحة بصصورة جصاهزة للعمصل‬

‫علصصى معظصصم ممتحككمصصات عائلصصة ‪ mega AVR‬وبعصصض ممتحككمصصات عائلصصة ‪ .ATTiny‬وسصصيناقش هصصذا‬ ‫الفصل طريقة تشغيل الص ‪ ADC‬المدمج بعائلت ‪.AVR‬‬

‫كيف يعمل الم مرحول التناظري الرقمي‬

‫تحتوي معظم الممتحككمات الدقيقة )من مختلصصف الشصصركات( ومنهصصا ‪AVR‬‬ ‫علصصى ‪ ADC‬مصصن نصصوع ‪ successive approximation adc‬هصصذا المحصصول‬ ‫يعمصصل بطريقصصة مشصصابهه "للميننزان القننديم"‪ .‬تخيصصل معصصي أن لصصديك أحصصد‬

‫هصصصذه المصصصوازين القديمصصصة ذات الكفصصصتين‪ .‬ولنفصصصترض أنصصصك أردت أن تعصصصرف‬

‫وزن ثمرة بطيخ‪ .‬فما الذي ستفعله؟‬

‫في البداية ستضع ثمرة البطيخ في أحد كفوف الميزان‪ ،‬ثم تدريجياا تبصدأ باضصافة وزن معصروف‬

‫مسصصبقاا فصصي الكفصصة الخصصرى فمثلا قصصد تضصصع مربصصع كيلصصو جصصرام )‪ 250‬جصصرام( ثصصم تنظصصر إلصصى الميصصزان‬ ‫وتقننارن ارتفنناع الكفننتين‪ ،‬إذا لصصم تجصصد أن الكفصصتين قصصد تسصصاوياا ستضصصيف مربصصع كيلصصو جصصرام أخصصرى‬

‫وهكذا ‪ ..‬يتم التوقف عن وضع المزيد من الوزن عندما تقترب كفتي الميزان من بعضها‪.‬‬

‫‪212‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫بعصصد أن تتسصصاوى الكفتصصان الخطصصوة التاليصصة هصصي معرفصصة عنندد اﻷوزان الصصتي تصصم وضصصعها فصصي كفصصة‬

‫القياس )مثلا قد نجد أنصه هنصاك ‪ 3‬قطصع وزن مصن نصوع مربصع كيلصو جصرام( ومنهصا يمكننصا أن نحسصب‬ ‫وزن الثمرة والذي يساوي ‪ × 3‬مربع كيلوجرام = ‪ 750‬جرام‪.‬‬ ‫الخطصصوات السصصابقة تمثصصل نفصصس طريقصصة عمصصل الصصص‬ ‫‪ . ADC‬حيصصصصصث نجصصصصصد أن الصصصصصص ‪ ADC‬يحتصصصصصوي علصصصصصى‬ ‫مجموعة مكونات تعمل مثل الميزان‪.‬‬

‫المملكوون الول يسمى دائرة التقطيصع )أخصذ العينصصة(‬ ‫وتسصصصمى ‪ .sample & hold (S/H) circuit‬هصصصذه‬

‫الصصصدائرة تأخصصصذ عينصصصة مصصصن فصصصرق الجهصصصد المطلصصصوب‬

‫تحصصويله للصصصورة الرقميصصة وتصصدخلها للجصصزء التصصالي‬ ‫من الص ‪.ADC‬‬

‫المملكوون الثاني يسمى بص ‪ analog comparator‬وهصو شصصريحة إلكترونيصصة تماثننل المينزان بالضننبط‬ ‫وتمتلك طرفان للمقارنة‪ .‬حيث تقوم بالمقارنة بيصصن فصصرق جهصد مطبصق علصصى طرفهصصا الول )والصصذي‬

‫يتم الحصول عليه من دائرة الص ‪ (sampling‬وفرق جهد مطبق على طرفها الثاني‪.‬‬

‫المملكوون الثالث هو عصصداد رقمصصي تزايصصدي ‪ +‬محصصول رقمصصي ‪ -‬تمصصاثلي ‪ .DAC‬هصصذان المكونصصان يعملن‬ ‫مثصصل الصصوزن المعصصروف مسصصبقاا‪ .‬حيصصث نجصصد أن كل المكصصونين يقومصصان بتوليصصد جهصصد دصصصغير وارسصصالة‬

‫إلصصى الطصصرف الثصصاني لشصصريحة الصصص ‪ .comparator‬وإذا لصصم يتسصصاوي كل الجهصصدين يقصصوم العصصداد والصصص‬

‫‪ DAC‬بزيادة الجهد مرة أخرى وهكذا‪ ..‬وتظل هذه العملية إلى أن تقوم شريحة الص ‪comparator‬‬ ‫بالتبليغ أن الجهد المطبق من العداد والص ‪ DAC‬قد تساوى أو تفوق على الجهد المطبق مصصن عينصصة‬

‫القياس‪.‬‬

‫عندما يحدث هصذا التبليصصغ يتوقصف العصداد والصصص ‪ DAC‬عصن العمصصل ويتصصم تسصصجيل الرقصم الصصذي توقصصف‬

‫عنده‪ .‬ويتم حفظ هذا الرقم في ممسجلت خادصة تسمى ‪ ADCL‬و ‪ ADCH‬ومن خلل هذا الرقصصم‬ ‫يمكننا معرفة قيمة الجهد الذي تم ادخالة للص ‪.ADC‬‬

‫‪213‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 9.2‬تركيب الـ ‪ ADC‬داخل الممتحكك م‬

‫‪ATmega16‬‬

‫الصورة التالية تمثل تركيب الص ‪ ADC‬للمتحكم ‪) ATmega16‬دصفحة ‪ 205‬دليل البيانات(‪.‬‬

‫يتميز الص ‪ ADC‬الموجود داخل ‪ ATmega16‬بعده امكانيات مفيدة‪.‬‬ ‫أولا‪ :‬يمكصصن تشصصغيل هصصذا الصصص ‪ ADC‬فصصي وضصصعين‪ .‬وهمصصا ‪ bit 8‬و ‪ bit 10‬الختلف الساسصصي بيصصن‬

‫الوضعين هصو "حساس ية القيصاس" للجهصد التن اظري وأقصل قيم ة جهصد يمكصن قياسصها‪ .‬سصيتم تنصاول‬ ‫الدقة ‪ 8‬بت فقط في هذا الفصل‪.‬‬

‫‪214‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫ثانياا‪ :‬يتصل دخل الص ‪ ADC‬بشريحة ‪ analog multiplixer‬والتي تتصصصل اطرافهصصا بجميصصع أطصصراف‬

‫البورت ‪ .A‬هذه الشريحة تعمل كبوابة تودصيل حيث يمكن ضبطها لتودصيل أي طرف في البورت‬

‫‪ A‬ليعمصصصل كصصصدخل للصصصص ‪ ADC‬وهصصصذا يجعصصصل الممتحككصصصم ‪ ATmega16‬يمتلصصصك ‪ 7‬أطصصصراف كاملصصصة يمكصصصن‬ ‫استعمالها كدخل تماثلي ويسمى كصل طصرف “قنصصاة دخصل” ‪ .input channel‬مصصع مراعصصاة أنصه يمكصن‬ ‫تشغيل طرف واحد فقط في نفس الوقت )كما سنرى في الشرح لحقاا(‪.‬‬

‫أيضاا يحتوي الص ‪ ADC‬على شريحة ‪ op-amp‬تعمل كمكبر جهصصد )يمكصن تشصغيله بصصصورة اختياريصصة(‬ ‫ودائصصرة مقارنصصة ‪ comparator‬تعمصصل علصصى الطصصراف الثلثصصة الولصصى ‪) .PA0, PA1, PA2‬لصصن يتنصصاول‬ ‫الكتاب شرح هذا الجزء ويمكنك الرجوع لدليل البيانات بدئاا من الصفحة ‪.(205‬‬

‫جلات‬ ‫الممس ك‬ ‫جلت سنستخدم ‪ 3‬منهم لتشغيل وضع الص ‪ 8‬بت‪.‬‬ ‫يحتوي الص ‪ ADC‬على مجموعة من الممس ك‬

‫جل مسؤول عن اختيار الطرف الذي سيتم تودصيله بالص ‪ ADC‬لقياس الجهصصد‬ ‫‪ :ADMUX‬هذا الممس ك‬ ‫كما يحتوي علصى مجموعصصة مصصن البتصات الهامصصة لضصصبط الصصص ‪) analog Refrence‬انظصصر لشصصرح المثصصال‬

‫الول(‪.‬‬

‫جل المسؤول عن تشغيل وايقاف الص ‪ ADC‬وكذلك التحكم في سرعة تشغيله‪.‬‬ ‫‪ :ADCSRA‬الممس ك‬

‫جلت المستخدمة في حفظ قيم القياس‪.‬‬ ‫‪ :ADCL & ADCH‬الممس ك‬

‫خطوات تشغيل الـ ‪ADC‬‬

‫لقراءة الجهد التناظري يجب أن نقوم بمجموعة من الخطوات لتفعيل الصصص ‪ ADC‬وضصصبطه بصصصورة‬

‫دصحيحة‪ .‬هذه الخطوات هي كالتالي‪:‬‬

‫‪ .1‬تفعيصصصل الصصصص ‪) ADC‬الوضصصصع الفتراضصصصي للصصصص ‪ ADC‬أنصصصه غيصصصر فعصصصال لصصصذا سصصصنقوم بتفعيلصصصه مصصصن‬ ‫المسجل ‪.(ADCSRA‬‬

‫‪ .2‬ضبط الص ‪ Clock‬والتي تتحكم في سرعة تشغيل العصصداد الصصداخلي للصصص ‪ ADC‬والصصذي بصصدورة‬ ‫يتحكم في سرعة قراءة الجهد‪.‬‬

‫‪ .3‬اختيصصصصار الصصصصص ‪ channel‬المطلوبصصصصة )طصصصصرف القيصصصصاس( وذلصصصصك مصصصصن خلل ضصصصصبط الصصصصص ‪analog‬‬ ‫‪multiplixer‬‬ ‫‪ .4‬بدء عملية القياس والتحويل ثم قراءة قيمة الجهد‪.‬‬

‫‪215‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 9.3‬المثال اﻷول ‪ :‬قراءة جهد متغير باستخدم مقاومة متغيرة‬

‫فصصي هصصذا المثصصال سنسصصتخدم المقاومصصة المتغيصصر ‪ potentimeter‬كمصصصدر متغيصصر للجهصصد‪ .‬تتواجصصد‬

‫هصصذه المقاومصصة فصصي برنامصصج بروتصصس باسصصم ‪ POT-HG‬أو ‪ Active potentiometer‬ويتصصم تودصصصيل‬

‫الطرف العلوي لها بالص ‪ vcc‬والطرف السفلي بالص ‪ gnd‬أمصصا الطصصرف الوسصصط فسصصيكون مصصصدر الجهصصد‬ ‫المتغير‪.‬‬

‫في هذا المثال سنقوم بتودصيل طرف الجهصد المتغيصصر بصصالطرف ‪ .PA1‬كمصصا سنسصخدم ‪ 8‬دايصصودات‬

‫ضوئية لعرض قراءة الص ‪ ADC‬على البورت ‪ C‬كما هو موضح في الصورة التالية‪:‬‬

‫الـكود‬ ‫‪#define F_CPU 1000000UL‬‬ ‫>‪#include
‫;‪volatile uint8_t adcValue‬‬ ‫)‪int main(void‬‬ ‫{‬ ‫ضبط إعدادات البورتات ‪//‬‬

‫;‪DDRA = 0x00‬‬ ‫;‪DDRC = 0xff‬‬

‫‪216‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫تشغيل ال ‪// adc‬‬

‫;)‪ADCSRA |= (1 << ADEN‬‬ ‫اختيار معامل القسمة للص ‪// clock‬‬

‫;)‪ADCSRA |= (1 << ADPS0) | (1 << ADPS1‬‬ ‫تفعيل وضع الص ‪ 8‬بت ‪//‬‬

‫;)‪ADMUX |= (1 << ADLAR‬‬ ‫اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه ‪//‬‬

‫;)‪ADMUX |= (1 << MUX0‬‬ ‫)‪while(1‬‬ ‫{‬ ‫ابدء عملية التحويل ‪//‬‬

‫;)‪ADCSRA |= (1 << ADSC‬‬ ‫انتظر حتى يتم النتهاء من تحويل الجهد ‪//‬‬

‫;))‪while(ADCSRA & (1<
‫;‪adcValue = ADCH‬‬

‫قم بعرض القيمة على البورت ‪// C‬‬

‫;‪PORTC = adcValue‬‬ ‫}‬ ‫;‪return 0‬‬

‫شرح الـكود‬ ‫في بداية البرنامج قمنا بعمل متغير ‪ 8‬بت من نوع ‪ uint8_t‬باسم ‪ .adcValue‬سيستخدم هذا‬ ‫المتغير في حفظ القيمةالرقمية الناتجة من تحويل الجهد في الص ‪ .ADC‬لكن هناك كلمة غريبة‬

‫ظهرت لول مرة بجانب المتغير وهي ‪ volatile‬فما هي؟‬

‫‪217‬‬

‫}‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫قبل أن نتعرف على هذه الكلمة‪ .‬عليك أن تتعرف على أحد الخواص الهامة للمترجمات وتصصدعى‬

‫‪ .Code optimaization‬كمصصا تتصصذكر مصصن الفصصصول السصصابقة إن جميصصع المترجمصصات مهمتمهصصا هصصي‬

‫تحويصصل اللغصصات عاليصصة المسصصتوى )مثصصل السصصي( إلصصى لغصصة التجميصصع ‪ Assembly‬والحقيقصصة أن المصصر‬

‫الواحصد مصصن لغصصة السصصي قصصد يتحصصول إلصصى ‪ 1‬أو ‪ 3‬أو حصتى ‪ 10‬أوامصصر مصصن لغصصة التجميصصع‪ .‬المترجمصصات‬ ‫الذكية تستيطع اختصار عدد أوامر لغة التجميع وذلك لزيادة سرعة الكود )أوامر أقصصل = سصرعة‬

‫أكبر(‪.‬‬

‫هنصصا يصصأتي دور الصصص ‪ .code optimaization‬وهصصي خادصصصية مدمجصصة فصصي معظصصم المترجمصصات سصصواء‬

‫المجانيصصة مثصصل ‪ gcc‬أو المدفوعصصة مثصصل ‪ .IAR workbench‬وتهصصدف إلصصى اختصصصار أكصصبر قصصدر ممكصصن‬ ‫من اوامر السمبلي‪ .‬والن نعود للبرنامج السابق‪.‬‬

‫جل الصصذي يحفصصظ‬ ‫جل ‪) ADCH‬وهو الممسصص ك‬ ‫سنجد أن المتغير ‪ adcValue‬ميستخلدم لنسخ قيمة الممس ك‬

‫فيه القيمة الرقمية لعملية التحويصصل(‪ .‬ثصصم نجصد أن المتغيصصر سيسصتخدم فصصي نقصل هصذه القميصة إلصصى‬

‫البورت ‪ C‬في مجموعة الوامر التالية‪:‬‬

‫ضع قيمة التحويل داخل المتغير ‪// adcValue‬‬

‫;‪adcValue = ADCH‬‬

‫قم بعرض القيمة على البورت ‪// C‬‬

‫;‪PORTC = adcValue‬‬ ‫فصصصصي الحالصصصصة الطبيعيصصصصة إذا لصصصصم نكتصصصصب كلمصصصصة ‪ volatile‬سصصصصنجد أن المصصصصترجم قصصصصرر حصصصصذف المتغيصصصصر‬ ‫‪ adcValue‬لنه بل فائدة‪ .‬وذلك لنه من الممكن أن نستبدل كل المريين السابقين بأمر واحد‬

‫فقط وهو وضع قيمة ‪ ADCH‬مباشرة داخل ‪ PORTC‬دون الحاجة لنسخها لمتغير ‪.adcValue‬‬

‫;‪PORTC = ADCH‬‬ ‫بالتأكيصصد يعصصد اختصصصار عصصدد الوامصصر أمصصر مفيصد جصداا وسصصيجعل الكصصود يعمصصل أسصصرع‪ .‬لكننن فنني هننذه‬ ‫الحالة قد يكون كارثي‪ .‬ﻷننا قد نحتاج هذا المتغيننر فنني اجننراء عمليننات حسننابية أخننرى )كمصصا‬

‫سصصصنرى فصصصي المثصصصال القصصصادم(‪ .‬وإذا قصصصام المصصصترجم بحذفصصة سيتسصصصبب ذلصصصك المصصصر فصصي أخطصصصاء غيصصصر‬

‫معروفصصة‪ .‬وهنصصا يصصأتي دور كلمصصة ‪ .volatile‬والصصتي تخصصبر المصصترجم أن يصصترك المتغيصصر ‪ adcValue‬ول‬

‫يقوم بحذفة‪.‬‬

‫ملحظة‪ :‬اعتبرها قاعدة عامة‪ ،‬إذا كان هناك أي متغير أنت متأكد من تغير قيمته أثناء عمل‬ ‫الممتحككم الدقيق ول تريد للمترجم أن يحذفة فيجب أن تكتب كلمة ‪ volatile‬قبل المتغير‬ ‫اثناء تعريفه‪.‬‬

‫‪218‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫بعد النتهاء من تعريف المتغير‪ .‬نأتي للدالة الرئيسيه ‪ main‬حيث بصدئناا بضصصبط البورتصات ليعمصصل‬

‫البورت ‪ A‬كدخل ويعمل البورت ‪ C‬كخرج )لتودصيل الدايودات الضوئية الثمانية(‪.‬‬

‫;‪DDRA = 0x00‬‬ ‫;‪DDRC = 0xff‬‬ ‫ثم تبدأ مرحلة ضبط الص ‪ ADC‬عصصبر سلسصلة مصن الوامصر‪ .‬فصصي البدايصة يجصب أن نشصغل الصصص ‪ ADC‬لن‬

‫الوضصصع الفتراضصصي للصصص ‪ ADC‬داخصصل جميصصع ممتحككمصصات ‪ AVR‬أنصصه غيصصر ممفعصصل لتصصوفير الطاقصصة‪ .‬ويتصصم‬

‫ذلصصصك عصصصبر تغييصصصر قيمصصصة البصصصت ‪ ADEN‬وهصصصي اختصصصصار ‪ .ADC enable‬تتواجصصصد هصصصذه البصصصت داخصصصل‬ ‫‪ADCSRA‬‬

‫;)‪ADCSRA |= (1 << ADEN‬‬

‫المرحلة الثانية هي ضبط الص ‪ clock‬الخادصة بالص ‪ .ADC‬فكما تعرفنا فصصي بدايصصة الفصصصل‪ .‬يحتصصوي الصصص‬ ‫‪ ADC‬على عداد تزايدي ميسصصتخلدم لزيصصادة جهصد المقارنصصة )الشصصبيه بصصالوزن المعيصصاري فصي الميصصزان(‪.‬‬ ‫ويحتاج هذا العداد الرقمي لص ‪ Clock‬لتشغيله‪.‬‬

‫المشكلة لوحيدة لهصذا العصداد ه و أنصه يجنب أن يعمننل ببطينء مقارنصة بسصرعة الممتحككصم‪ .‬فمثلا ل‬

‫يمكن أن ندخل الص ‪ clock‬الرئيسية للمتحكصم مباشصرة إلصى العصداد )لنهصصا تك ون ‪ 1‬ميجصا أو أعلصى(‪.‬‬ ‫لصصصذا نسصصصتخدم شصصصريحة تسصصصمى بالصصصص ‪ Prescaler Register‬وهصصصي شصصصريحة تقصصصوم بقسصصصمة الصصصص ‪clock‬‬ ‫الرئيسصصي علصصى رقصصم محصصدد )مصصن مضصصاعفات الرقصصم ‪ (2‬مثصصل ‪– 64 – 32 – 16 – 8 – 4 – 2‬‬

‫‪.128‬يسصصمى هصصذا الرقصصم بممعامصصل القسصصمة ‪ Division Factor‬ويتصصم تحديصصد هصصذا الرقصصم مصصن البصصت‬

‫جل ‪ ADCSRA‬من خلل الجدول التالي‬ ‫‪ ADPS0‬و ‪ ADPS1‬و ‪ ADPS2‬الموجدتان داخل الممس ك‬

‫‪219‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫بالتأكيد سيظهر سؤال هام‪ .‬على أي أساس نختار معامل القسمة وما هو تأثيره؟‬

‫في البداية هناك قاعدة عامة لجميع الص ‪ ADC‬الموجودة داخل عائلة ‪ atmega‬وهصصي أن الصصص ‪Clock‬‬

‫الخادصصة بالصص ‪ ADC‬يجصب أن ل تزيصد عصن ‪ 128‬كيلصوهرتز )ويمكصن أن تكصون أقصل مصن ذلصك(‪ .‬فمثلا‬

‫إذا كانت الص ‪ clock‬الرئيسية = ‪ 1‬ميجاهرتز إذا يجب أن نختار معامل قسمة = ‪ 8‬أو أكثر وذلصصك‬ ‫لن حادصل قسمة مليون \ ‪ 125 = 8‬ألف هرتز وهو رقم أقل ‪ 128‬كيلو‪.‬‬ ‫لنأخذ مثال آخنر‪ .‬لنفنترض أن سنرعة الننن ‪ clock‬الرئيسنية كنانت ‪ 4‬ميجناهرتز‪ .‬فمننا هنو معامننل‬ ‫القسمة المناسب؟‬

‫سنجد أن المعامل المناسب هو ‪) 32‬أو أكثر( وذلك لن حادصل قسمة ‪ 4‬مليون\‪ 125 = 32‬ألف‬ ‫هرتز‪ .‬أو يمكن استخدام معامل قسمة ‪ 64‬أو ‪ 126‬فكلهمصصا سصصيجعل الصصص ‪ ADC clock‬أقصصل بكصثير‬

‫من ‪ 128‬كيلوهرتز‪.‬‬

‫إذاا ما الختلف بين أن اختار ‪ 32‬أو ‪ 64‬أو ‪ 128‬إذا كانت كل هذه الممعاكملت مناسبة؟‬ ‫الختلف الساسصصي هصصو سننرعة تحويننل الجهنند إلننى قيمننة رقميننة‪ .‬فكلمصصا زادت سصصرعة الصصص ‪ADC‬‬ ‫‪ clock‬كلما استطاع أن يحول الجهد إلى قيمة رقمية في زمن أقل‪.‬‬ ‫لنعصصد مصصرة أخصصرى لللمثصصال السصصابق حيصصث كصصانت سصصرعة الممتحككصصم الرئيسصصية ‪ 1‬ميجصصا لصصذا إسصصتخدمنا‬ ‫معامل قسمة = ‪ 8‬وذلك عبر وضع قيمة ‪ 1‬داخل كل من البت ‪ ADPS0‬و ‪ADPS1‬‬

‫;)‪ADCSRA |= (1 << ADPS0) | (1 << ADPS1‬‬ ‫الخطوة التالية هي اختيار وضع تشصصغيل الصصص ‪ 8) ADC‬أو ‪ 10‬بصصت(‪ .‬فصي حالصصة الصصص ‪ 8‬بصصت يتصصم وضصصع‬

‫جل ‪ .ADMUX‬الوضصع الفتراضصي لهصذه البصت =‬ ‫الرقم ‪ 1‬داخل البت ‪ ADLAR‬الموجصود فصي الممسصص ك‬ ‫دصفر )أي أي الص ‪ ADC‬يعمل في وضع ‪ 10‬بت(‪.‬‬

‫تفعيل وضع الص ‪ 8‬بت ‪//‬‬

‫;)‪ADMUX |= (1 << ADLAR‬‬

‫جل‬ ‫عنصصدما يعمصصل الصصص ‪ ADC‬فصصي وضصصع الصصص ‪ 8‬بصصت فصصإن قيمصصة تحويصصل الجهصصد يتصصم تسصصجيلها فصصي الممسصص ك‬

‫‪ ADCH‬وعندما يعمل في وضع الص ‪ 10‬بت فأن قيمة التحويل يتم تسصصجيلها فصي مسصصجيلن )لنهصصصا‬

‫‪220‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫جل واحصصد لحفصصظ قيمتهصصا( وهمصصا ‪ ADCL‬و ‪ ADCH‬ويسصصمى هصصذا الوضصصع بالصصص‬ ‫‪ 10‬بصصت ول يكفصصي ممسصص ك‬ ‫‪ left adjusted‬حيث توضع أول ‪ 8‬بتات من النتيجة في ‪ ADCL‬ويوضع أخر ‪ 2‬بت في ‪ADCH‬‬

‫وأخيصصراا نقصصوم بضصصبط الطصصرف الصصذي سصصيكون ‪) Input channel‬الطصصرف الصصذي سصصنقيس مصصن خللصصه‬

‫الجهد الكهربصي المتغيصر(‪ .‬فصي المثصال السصابق اسصتخدمنا الطصرف ‪ PA1‬لصذا وجصب أن يتصم وضصع ‪1‬‬

‫داخل البت ‪MUX0‬‬

‫اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه ‪//‬‬

‫;)‪ADMUX |= (1 << MUX0‬‬

‫حيث تتحكم هذه البت مصصع البتصصات )‪ MUX(1,2,3,4‬فصي اختيصصار قنصصاة الصصدخل كمصصا هصو موضصصح فصصي‬ ‫الجدول التالي‪.‬‬

‫ملحظة‪ :‬الطرف ‪ ADC0‬يتصل بالطرف ‪ PA0‬والطرف ‪ ADC1‬يتصل بالطرف ‪ PA1‬وهكذا إلى‬ ‫نهاية البورت ‪A‬‬

‫بعد النتهاء من ضبط الص ‪ ADC‬يمكننا الن أن نبدء عملية التحويل وقراءة الجهصصد‪ .‬وسصصيتم ذلصصك‬ ‫عصصبر اعطصصاء الصصص ‪ ADC‬المصصر ببصصدء عمليصصة التحويصصل وذلصصك عصصبر وضصصع ‪ 1‬داخصصل البصصت ‪ ADSC‬وهصصي‬ ‫اختصار لكلمة ‪ADC start conversion‬‬

‫ابدء عملية التحويل ‪//‬‬

‫;)‪ADCSRA |= (1 << ADSC‬‬ ‫هنصصا سصصيبدأ الصصص ‪ ADC‬بقصصراءة الجهصصد وتحصصويله إلصصى قيمصصة رقميصصة‪ .‬ولكصصن كمصصا نعصصرف مسصصبقاا الصصص ‪ADC‬‬

‫يعتبر بطيء جداا مقارنة بالمتحكم الدقيق لذا ل يمكننا أن نحصل على النتيجة فوراا ويجب أن‬

‫‪221‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫ننتظر حتى ينتهي الص ‪ ADC‬من عملية التحويل‪ .‬ويتم ذلك عبر المر‬ ‫انتظر حتى يتم النتهاء من تحويل الجهد ‪//‬‬

‫;))‪while(ADCSRA & (1<
‫‪ ADSC‬قيمتها ‪ 0‬وبذلك تتوقف الص ‪.while‬‬

‫جل ‪ ADCH‬حيصصث نسصصتطيع امصصا أن نسصصتخدمها‬ ‫وأخيصصراا يمكننصصا قصصراءة القيمصصة الرقميصصة مصصن الممسصص ك‬

‫مباشصرة أو ننسصصخها إلصصى أحصد المتغيصرات )فصي المثصصال السصصابق اسصتخدمنا البصصورت ‪ C‬ليعصصرض هصذه‬

‫القيمة وكذلك المتغير ‪ adcValue‬لنسخ هذه القيمة(‪.‬‬

‫ضع قيمة التحويل داخل المتغير ‪// adcValue‬‬

‫;‪adcValue = ADCH‬‬

‫قم بعرض القيمة على البورت ‪// C‬‬

‫;‪PORTC = adcValue‬‬ ‫قصصم بترجمصصة الكصصود السصصابق ثصصم ابصصدأ محاكصصاة المشصصروع علصصى برنامصصج بروتصصس‪ .‬يمكنصصك أن تحصصرك‬ ‫المقاومة المتغيرة لعلى ولسفل لتشاهد ان الدايودات الثمانية تعصرض أرقصصام مصصن ‪00000000‬‬

‫إلى ‪ 11111111‬كما هو موضح في الصورة التالية‪.‬‬

‫‪222‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 9.4‬حسابات الـ‬

‫‪ADC‬‬

‫في المثال السابق استطعنا أن نحول الجهد التنصصاظري المتغيصصر إلصصى أرقصام بيصصن ‪ 00000000‬إلصى‬

‫‪) 11111111‬ما بين ‪ 0‬إلى ‪ 255‬بالصيغة العشرية(‪ .‬لكن هذه الرقام ل تمثل قيمة فرق الجهصد‬

‫بصورة مباشرة لذا سنتعرف على في هذا الجزء على بعض المعادلت البسيطة التي ستساعدنا‬

‫على حساب فرق الجهد وكذلك حساب قيم الحساسات التماثلية‪.‬‬

‫تحو يل القيمة الرقمية إلى فرق جهد‬

‫المعادلة التالية تقوم بتحويل القيمة الرقمية إلى فارق جهد‪.‬‬

‫‪DigitalValue∗Vref‬‬ ‫‪2n‬‬

‫=‪Voltage‬‬

‫•‬

‫‪ :Digital Value‬القيمة الرقمية الموجودة في ‪) ADCH‬بالصيغة العشرية(‬

‫•‬

‫‪ :Vref‬الجهد المرجعي للص ‪) ADC‬أنظر للشرح بالسفل(‬

‫•‬

‫‪ :n‬وضع دقة التشغيل )‪ 8‬بت أو ‪ 10‬بت(‬

‫الص ‪ Vref‬هو الجهد المرجعي الذي يعتمد عليه الص ‪ ADC‬لحساب الجهد المتغير‪ .‬هذا الجهد يسصصاهم‬ ‫فصصي تحديصصد حساسصصية قيصصاس الصصص ‪) ADC‬كمصصا سصصنرى فصصي الجصصزء التصصالي( ويتصصم تحديصصدة مصصن خلل‬

‫البتصصات ‪ REFS0‬و ‪ .RFS1‬فصصي المثصصال السصصابق تركنصصا هصصذه البتصصات علصصى الوضصصع الفصصتراض )دصصصفر(‬ ‫والذي يعني أن الجهد المرجعي ‪.Vref = Vcc = 5 volt‬‬

‫جل ‪ADMUX‬‬ ‫الصورة التالية توضح طريقة تغير الص ‪ Vref‬بالتغير قيمة ‪ RFS0 , RFS1‬في الممس ك‬

‫‪223‬‬

‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬ ‫… ‪..............................................................................................‬‬ ‫لنفترض أن القيمة الرقمية الصصتي حصصصلنا عليهصصا = ‪ 128‬وكصصان الصصص ‪ ADC‬يعمصصل علصصى الوضصصع ‪ 8‬بصصت‪.‬‬ ‫إذا بالتعويض في المعادلة السابقة نجد أن قيمة الجهد الذي تم قياسه يساوي‬

‫‪128∗5 128∗5‬‬ ‫=‬ ‫‪=2.5 volts‬‬ ‫‪256‬‬ ‫‪28‬‬

‫مثصصال أخصصر‪ :‬لنفصصترض أن القيمصصة الرقميصصة الصصتي حصصصلنا عليهصصا = ‪ .56‬إذا بصصالتعويض فصصي المعادلصصة‬

‫السابقة نجد أن قيمة فرق الجهد هي‬

‫حساسية القياس‬

‫‪56∗5 56∗5‬‬ ‫=‬ ‫‪=1.09 volts‬‬ ‫‪8‬‬ ‫‪256‬‬ ‫‪2‬‬

‫تعصصصرف حساسصصصية القيصصصاس بأنهصصصا أقصصصل جهصصصد يمكصصصن للصصصص ‪ ADC‬أن يقيسصصصه ويتعصصصرف عليصصصه بصصصصورة‬ ‫دصحيحة‪ .‬وتعتمد حساسية القياس للص ‪ ADC‬على عاملين وهما وضصصع التشصصغيل )‪ 8‬أو ‪ 10‬بصصت( و‬

‫الجهد المرجعصي ‪ .Vref‬كل العصاملين يصؤثران بشصكل كصبير جصداا فصي دقصة القيصاس‪ .‬المعادلصة التالي ة‬ ‫تمثل حساسية القياس‪.‬‬

‫‪Vref‬‬ ‫‪2n‬‬

‫=‪sensitivity‬‬

‫مجصدداا تمثصل ‪ n‬وضصع القيصاس )‪ 8‬أو ‪ 10‬بصت(‪ .‬فمثلا لصو أن ‪ vref = vcc = 5 volt‬ويعمصل الصصص ‪adc‬‬ ‫بدقة ‪ 8‬بت فهذا يعني أن حساسية القياس تساوي‬

‫‪5‬‬ ‫‪5‬‬ ‫=‬ ‫‪=0.019 volt‬‬ ‫‪8‬‬ ‫‪2 256‬‬

‫مما يعني أن أقل جهد يمكن قياسه هو ‪ 0.019‬فولت )نحو ‪ 20‬مللي فولت(‪.‬‬ ‫يتحكم الص ‪ Vref‬في أقصى جهد يمكن قياسه فمثل لو كان ‪ Vref = 3‬فولت إذا أقصى جهد‬ ‫يمكن للص ‪ ADC‬أن يقيسه هو ‪ 3‬فولت‬

‫‪224‬‬

‫الفصل العاشر‬ ‫” أحدهم يجلس في الظل اليوم‪ ،‬لأن شخصا آخر قام‬ ‫بزرع شجرة في ذاك المكان منذ زمن بعيد ‟‬

‫وارين بافيت ‪ -‬رجل أعمال ومستثمر أمريكي‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪ .10‬المعالج التمهيدي وصناعة‬ ‫المكتبات البرمجية‬

‫في هذا الفصل سنتحدث عن أكواد ‪ C preprocessor‬حيث سنتعرف علصى الفصارق بيصن الوامصصر‬ ‫التنفيذية والوامر التوجيهية وأهميتها بصورة مفصصصلة مثصصل المصصر ‪ include#‬وكصذلك ‪define‬‬

‫وكذلك سصصنتعرف علصصى كيفيصصة دصصناعة المكتبصصات البرمجيصة ‪ .libraries‬مصع شصرح مثصال لعمصصل ‪uart‬‬ ‫‪ driver‬على دصورة مكتبة‪.‬‬ ‫✔‬

‫الوامر التنفيذية والوامر التوجيهية‬

‫✔‬

‫بعض استخدامات الص ‪C – Preprocessor‬‬

‫✔‬

‫قواعد دصياغة الوامر التوجيهية‬

‫✔‬

‫طرق كتابة ‪Function-like macros‬‬

‫✔‬

‫تصميم المكتبات البرمجية‬

‫✔‬

‫مثال‪ :‬تصميم مكتبة ‪UART driver‬‬

‫‪226‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪ 10.1‬الأوامر التنفيذية والأوامر التوجيهية‬

‫اﻷوامننر التنفيذيننة هصصي أي أمصصر مباشصصر فصصي لغصصة السصصي مثصصل ‪ if – while – for‬وجميصصع الوامصصر‬ ‫الرياضصصية أو المنطقيصصة ‪ ،AND – OR – NOT – XOR‬كصصل هصصذه الوامصصر تسصصتخدم "لتنفيصصذ" أمصصر‬

‫مطلوب‪ .‬على العكس اﻷوامر التوجيهية ‪) Directive‬تسمى أيضاا أوامر إرشادية( هي أوامصصر ل‬ ‫تصصدخل مباشصصرة فصصي تركيصصب الكصصود ولكصصن تسصصتخدم فصصي إرشصصاد المصصترجم ‪ compiler‬لداء بعصصض‬

‫المور‪.‬‬

‫المصترجم ‪ GCC‬يعصصرف مسصصبقاا جميصع أوامصر لغصصة السصصي المعياريصة لكنصصه ل يعصصرف الدالصصة ‪delay_ms‬‬

‫والتي ل تتواجد إل في المكتبة البرمجية ‪ delay.h‬لذا نستخدم المر التوجيهي‬

‫ rel="nofollow">‪#include <delay.h‬‬ ‫وذلصصك لنرشصصد المصصترجم للمكصصان الصصذي يحتصصوي علصصى دوال التصصأخير الزمنصصي الصصتي سصصنحتاجها فصصي‬ ‫البرامصصصج وذلصصصك حصصصتى يسصصصتطيع المصصصترجم أن يصصصصل إلصصصى هصصصذه الصصصدوال بصصصصورة دصصصصحيحة ويقصصصوم‬

‫بتحويلها إلى دصيغة الهيكس‪.‬‬

‫بعض استخدامات‬

‫‪C - preprocessor‬‬

‫الوامر التوجيهية ليست مقتصرة فقط على المر ‪ include‬وإنما هناك العديد من الوامر منها‪:‬‬ ‫‪‬‬

‫‪ – include‬أمر لتضمين ملف أو مكتبة معينة‪.‬‬

‫‪‬‬

‫‪ – define‬أمر لتعريف دللت لكلمات كأن نعرف أنه كلما وردت كلمة ‪ Pi‬في الكود فهصصو‬ ‫يعنصصصي ‪ 3.14‬وكصصصذلك لعطصصصاء معصصصررف)رمصصصز( لكتلصصصة أسصصصطر برمجيصصصة مصصصع إمكانيصصصة وجصصصود‬ ‫وسطاء ‪ arguments‬وهذا ما يسمى ‪.function-like macros‬‬

‫‪‬‬

‫‪ – pragma‬أمر لتحديد بعض الوامر للمترجم ‪compiler‬‬

‫‪‬‬

‫الترجمنننة الشنننرطية ‪ – conditional compilation‬مجموعصصصة أوامصصصر تسصصصتخدم فصصصي‬ ‫الترجمصصة حسصصب شصصروط معينصصة‪ ،‬مثصصال‪ :‬نخصصبر المصصترجم أنصصه لصصو كنصصت فصصي نظصصام تشصصغيل‬ ‫ويندوز قم بتضمين المكتبة الفلنية أما لو كنت في نظام تشغيل لينكس فقم بتضمين‬ ‫مكتبة أخرى‪.‬‬

‫‪227‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪ 10.2‬قواعد الأوامر‬

‫التوجيهية ‪C - preprocessor syntax‬‬

‫أي سطر برمجي يبدأ برمز المربع ‪ hash #‬فإن ما يليه هو أمر سيوجه إلى ال ‪. preprocessor‬‬

‫‪#include‬‬ ‫يعتبر المر أكثر الستخدامات شصيوعاا مصصن أوامصصر الصصص ‪ C - preprocessor‬وهصو أمصصر تصصوجيهي مصصن‬ ‫أجل تضمين مكتبة )وهي عبارة عن مجموعة تعريفات( أو حتى ملفات مصدرية أخرى‪.‬‬ ‫مثال‪:‬‬ ‫بفرض الكود المصدري للملف ‪ main.c‬هو التالي‪:‬‬

‫>‪#include < والثاني بين إشصصارتين “” ‪،‬حيصصث أن السصصتخدام‬ ‫الول يكون عندما نريد أن يتم البحث عن الملف المحدد ضمن المسارات المتاحة في إعصصدادات‬

‫المصصصترجم‪ .‬والسصصصتخدام الثصصصاني يكصصصون عنصصصدما نريصصصد البحصصصث عصصصن الملصصصف المحصصصدد ضصصصمن المجلصصصد‬ ‫المصدري نفسه‪.‬‬

‫‪228‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫أيضصصصاا نلحصصصظ وجصصصود بعصصصض الوامصصصر الغربيصصصة مثصصصل ‪ PORT_on‬و المصصصر ‪ .PORT_of‬الحقيقصصصة أن‬ ‫تفسير هذه الوامر يقع في الملف ‪ device_conf‬والذي يحتوي على الكود التالي‪:‬‬

‫>‪#include
‫‪ include‬ليصبح البرنامج السابق كالتالي‪:‬‬ ‫)للتبسيط لن نذكر نتائج تضمين مكتبة ‪ avr/delay.h‬أو مكتبة ‪:( avr/io.h‬‬

‫نتيجة تنفيذ اﻷمر‬ ‫‪include‬‬

‫‪#define PORT_on PORTD=0xFF‬‬ ‫‪#define PORT_off PORTD=0x00‬‬ ‫‪#define set_port_output DDRD=0xFF‬‬

‫)‪int main(void‬‬ ‫{‬ ‫;‪set_port_output‬‬ ‫)‪while(1‬‬ ‫{‬ ‫;‪PORT_on‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORT_off‬‬ ‫;)‪_delay_ms(1000‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬

‫‪#define‬‬ ‫ميستخلدم هذا المر التوجيهي ‪ directive‬لتعريف كلمات كرموز )كلمات مفتاحية( ترد في الكود‬

‫ليتم استبدالها بالقيمة المحددة )أرقام أو حروف أو أسطر برمجية أخرى( مصصع أننصصا سصصنرى لحقصصاا‬

‫أن ال ‪ preprocessor‬ل يستطيع التمييز بينها‪.‬‬ ‫ففي الكود السابق سيقوم ال ‪ preprocessor‬بالبحث عن أماكن ورود ‪ PORT_on‬و ‪PORT_off‬‬

‫‪229‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫و ‪ set_port_output‬ويقصصصوم باسصصصتبدالها بمصصصا هصصصو مصصصذكور فصصصي تعريفهصصصا‪ .‬أي أن الكصصصود سيصصصصبح‬ ‫كالتالي )بعد أن ينتهي المعالج من معالجة المر ‪:(define‬‬

‫‪#define PORT_on PORTD=0xFF‬‬ ‫‪#define PORT_off PORTD=0x00‬‬ ‫‪#define set_port_output DDRD=0xFF‬‬

‫)‪int main(void‬‬ ‫{‬ ‫;‪set_port_output‬‬ ‫)‪while(1‬‬ ‫{‬

‫نتيجة تنفيذ اﻷمر‬ ‫‪define‬‬

‫;‪PORTD=0xFF‬‬ ‫;)‪_delay_ms(1000‬‬ ‫;‪PORTD=0x00‬‬ ‫;)‪_delay_ms(1000‬‬

‫}‬ ‫;‪return 0‬‬ ‫}‬ ‫ملحظة مهمة‪ :‬إن ما يرد بعد المر التصوجيهي ل يتصم معصالجته أو تنقيصح أخطصائه‪ ،‬مثلا لصو قمنصا‬ ‫بالتعديل التالي وهو إضافة تعليق‬ ‫‪//set portD off‬‬

‫‪#define PORT_on PORTD=0xFF‬‬ ‫‪#define PORT_off PORTD=0x00‬‬ ‫‪#define set_port_output DDRD=0xFF‬‬

‫سيصبح الكود الرئيسي بعد الص ‪ Preprocessor‬كالتالي‪:‬‬

‫)‪while(1‬‬ ‫{‬

‫خطأ‬

‫; ‪//set portD off‬‬

‫;‪PORTD=0xFF‬‬ ‫;)‪_delay_ms(1000‬‬ ‫‪PORTD=0x00‬‬ ‫;)‪_delay_ms(1000‬‬

‫}‬ ‫نلحظ أن الكود أدصبح يحتصوي علصى خطصأ حي ث أدصصصبحت الفادصصلة المنقوط ة بع د التعليصق‪ ،‬فصال‬

‫‪ preprocessor‬ليصصس مصصن مهمتصصه فهصصم مصصا بعصصد الوامصصر التوجيهيصصة وإنمصصا فقصصط اسصصتبدال الرمصصوز‬ ‫بقيمتها‪.‬‬

‫‪230‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪10.3‬‬

‫‪function-like macros‬‬

‫يمكننا من خلل ال ‪ C preprocessor‬إنجاز ما يشبه الدوال ولذلك تسمى ‪ function-like‬مع‬ ‫اختلف جوهري بين الدوال و ‪ ،function-like macros‬شصكل الشصلبه الوحي د هصو إمكانيصة إنجصاز‬ ‫‪ macros‬يمكنصصه أن يسصصتقبل بعصصض المتغيصصرات‪ ،‬أمصصا مصصن الناحيصصة التنفيذيصصة فليصصس هنصصاك أي وجصصه‬

‫شبه‪:‬‬ ‫•‬

‫‪ – function‬كتلصصة مصصن الكصصود الصصبرمجي يمكصصن أن نسصصتدعيها بصصأي مكصصان مصصن البرنامصصج‬ ‫الساسصي لتقصصوم بالتنفيصذ واسصصتخدام المتغيصصرات فصي حصصال وجودهصا مصع إمكانيصة إرجصاع‬

‫قيمة بعد التنفيذ‪.‬‬ ‫•‬

‫‪ – Function-like macros‬مجموعصصة مصصن السصصطر البرمجيصصة المختصصصرة برمصصز‪ ،‬و عنصصد‬ ‫إيصصراد هصصذا الرمصصز فصصي الكصصود فهصصو بمثابصصة إيصصراد هصصذه السصصطر البرمجيصصة كمصصا هصصي‪ ،‬بخلف‬

‫مبدأ الدوال المعتمد على الستدعاء مع وجود الكود دون تكرار‪.‬‬

‫لبصصصد مصصصن التنصصصويه إلصصصى الجصصصانب السصصصلبي لسصصصتخدام ال ‪ C preprocessor‬وهصصصو حجصصصم البرنامصصصج‬ ‫النهائي‪ ،‬إذا أن اسصصتخدام ال ‪ C preprocessor‬لنجصصاز مصصا يشصصبه الصصدوال ‪function-like macros‬‬ ‫يصصؤدي إلصصى تضصصاعف حجصصم البرنامصصج‪ ،‬وذلصصك لن اسصصتخدام ال ‪ C preprocessor‬ل يتعصصدى فصصي‬

‫النهاية عن اختصار أسطر برمجية بكلمات مفتاحية‪.‬‬

‫‪ 10.4‬قواعد كتابة الماكرو‬

‫‪macros syntax‬‬

‫لصناعة ‪ macro‬يمكنه استقبال متغيرات يجب أن نتبصع اسصم المصايكرو )الرمصصز( بصأقواس تحصوي‬

‫أسصصصماء المتغيصصصرات مباشصصصرة ‪ ،‬دون تحديصصصد نوعهصصصا كمصصصا فصصصي الصصصدوال‪ ،‬إذ ل يهصصصم ال ‪function-like‬‬

‫‪ macros‬نوع المتغيرات التي يتم تمريرها إليها‪.‬‬

‫المجموعة التالية من الكواد تمثل أشهر الص ‪ macros‬التي يتم استخدامها عصصادة لتسصصهيل برمجصصة‬

‫الممتحككمصصات واختصصصار الكصصثير مصصن الصصوقت‪ .‬مصصع العلصصم أن هصصذه الصصص ‪ macros‬يمكصصن اسصصتخدامها مصصع‬

‫أنواع مختلفة من الممتحككمات الدقيقة عبر أي مترجم يدعم لغة السي المعياريصصة فيمكنصصك مثلا‬ ‫أن تستخدمها في برمجة ممتحككمات ‪.ARM cortex‬‬

‫))‪#define BIT_SET(ADDRESS,BIT) (ADDRESS |= (1<
‫‪231‬‬

‫ المعالج التمهيدي وصناعة المكتبات البرمجية‬.10 .............................................................................................. … ‫ كمثال‬function-like macros ‫لنأخذ أحد ال‬

#define BIT_SET(ADDRESS,BIT) (ADDRESS |= (1<
:‫نستخدمه داخل البرنامج الرئيسي كالتالي‬

:‫جل مطلوب كالتالي‬ ‫ داخل أي بت من أي ممس ك‬1 ‫وهذا مكافئ تماماا للمر الذي يقوم بوضع‬

PORTB |= (1<<5);

:‫جل كالتالي‬ ‫ داخل أي بت من أي ممس ك‬0 ‫ فهو مكافئ للمر الذي يضع‬BIT_CLEAR ‫أما الماكرو‬

PORTB &= ~(1<<5);

‫ مراجع إضافية‬10.5

(‫ العربية )المصدر الدصلي للجزء المشروح بالعلى‬C – preprocessor ‫سلسلة مقالت الص‬ http://www.atadiat.com/c-preprocessor-part1 http://www.atadiat.com/c-preprocessor-part-2 http://www.atadiat.com/c-preprocessor-part-3 ‫مراجع أجنبية إضافية‬ http://www.mybitbox.com/2012/12/robust-c-code-part-3-wrapping-c/ http://www.mybitbox.com/2012/12/robust-c-code-part-2-advanced-cpreprecessor/ http://www.mybitbox.com/2012/11/robust-c-code-part-1-c-preprocessor/ http://www.cprogramming.com/tutorial/cpreprocessor.html http://www2.hh.se/staff/vero/embeddedProgramming/lectures/printL2.pdf http://www.phaedsys.com/principals/bytecraft/bytecraftdata/bcfirststeps.pdf http://en.wikipedia.org/wiki/C_preprocessor

232

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪ 10.6‬تصميم المكتبات الربرمجية في لغة السي‬

‫المكتبات البرمجية تعد من أفضل أساليب "تجزئة الكود" فهي تسمح للمبرمجين بصناعة نماذج‬

‫من الكواد البرمجيصصة الصتي يمكصن إعصادة اسصصتخدامها بسصهولة فصي أكصثر م ن تطصبيق‪ .‬مثلا لنفصترض‬

‫أنصصك تريصصد تشصصغيل شاشصصة أو محصصرك أو حسصصاس خصصاص مصصع الممتحككصصم الصصدقيق‪ ،‬يمكنصصك أن تكتصصب‬

‫الكواد الخادصصصة بتشصغيله )أو كمصا تسصمى ‪ (driver code‬داخصل البرنامصج الرئيسصصي وينتهصي المصر‬

‫عند هذا الحد‪ .‬لكن عندما تريد أن تسصتخدم نفصس الحسصصاس فصي مشصصروع آخصر سصيتوجب عليصصك‬

‫أن تعيد كتابة هذا الكود مرة أخرى‪.‬‬

‫المكتبات البرمجية توفر الوقت والمجهود لعادة كتابة هذه الوامر فكصصل مصصا عليصك فعلصصه هصو أن‬

‫تصصصصمم الصصصص ‪ driver code‬مصصصرة واحصصصدة وتضصصصعها فصصصي ‪ library‬ثصصصم تسصصصتخدم هصصصذه المكتبصصصة فصصصي أي‬ ‫مشروع ترغب به‪.‬‬

‫ملحظة‪ :‬تسمى المكتبات التي تشغل أي جزء داخل الممتحككم الدقيق مثل ‪ADC , UART, i2C,‬‬ ‫‪ GPIO‬أو أي مكون إلكتروني خارجي ‪.Software driver‬‬

‫أيضصصاا تسصصاعد المكتبصصات علصصى تسصصهيل العمصصل الجمصصاعي بيصصن الفصصراد‪ .‬فمصصن الصصصعب علصصى مجموعصصة‬

‫مكونه من ‪ 10‬مبرمجين مثلا أن يكتبوا كل الكواد داخل ملف واحد فقط‪ .‬وبصصدل مصصن ذلصصك يتصصم‬

‫تقسيم الكواد الكبيرة إلى مجموعة مصصن الصصص ‪) Modules‬الوحصصدات( والصصتي عصصادة تكصصون مجموعصصة‬ ‫من المكتبات البرمجية ويتصولى كصل شصخص مصن فريصصق التطصصوير العمصل علصصى أحصد هصذه الوحصدات‬

‫بالتوازي مع باقي الفريق‪.‬‬

‫تركيب المكتبات في لغة السي‬ ‫تتكون المكتبات في لغة السي عادة من بناء نصوعين مصصن الملفصات‪ ،‬الول يسصمى ‪ Header file‬أو‬

‫كمصصا يحصصب البعصصض أن يسصصميه ‪) Definition file‬ملصصف التعريفصصات( ويكصصون علصصى هيئصصة المتصصداد‬

‫‪ file.h‬والثصصصصاني هصصصصو الملصصصصف التطصصصصبيقي ‪ Implementation file‬والصصصصذي يحتصصصصوي علصصصصى الوامصصصصر‬ ‫الحقيقية للمكتبة ويكون من نوع ملفات السي ‪file.c‬‬

‫مثلا لنفصصصترض أننصصصا نريصصصد تصصصصميم مكتبصصصة لتشصصصغيل التصصصصال التسلسصصصلي ‪ UART‬وذلصصصك لتسصصصهيل‬ ‫استخدام ‪ UART‬دون الحاجة لعادة كتابة جميع الدوال في كل برنامج‪.‬‬

‫‪233‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫‪ 10.7‬خطوات صناعة المكتبة‬

‫تمر أي مكتبة برمجية بمجموعة مصن الخطصوات حصتى نضصمن أن نحصصصل علصى كصود فعصال ويعمصصل‬ ‫بصصورة جيصدة‪ .‬ويستحسصن أن تتبصع هصذه الخطصوات ف ي أي مصن المكتبصات الصتي س تقوم بكتابتهصا‬

‫مستقبلا‪.‬‬

‫الخطوة الأولى ‪ :‬فهم الـكود والتجربة الأولية‬

‫فصصي البدايصصة عليصصك أن تفهصصم العنصصصر أو الجهصصاز الصصذي تريصصد أن تكتصصب لصصه هصذا الصصص ‪ driver‬وذلصصك عصصبر‬

‫اختبار بعض المثلة في البرنامج الساسي أولا ثم تحويل هذه المثلة لمكتبة‪ .‬بما أننصا سصنكتب‬ ‫‪ UART driver‬فهصصصذه الخطصصصوة قصصصد تمصصصت بالفعصصصل فصصصي الفصصصصل الخصصصاص بالصصصص ‪ UART‬حيصصصث يمكنصصصك‬ ‫الرجوع إليه مرة أخرى لمراجعة الوامر والدوال التي سنستخدمها في الخطوات التالية‪.‬‬

‫الخطوة الثانية ‪ :‬تكوين ملف الهيدر ‪uart.h‬‬

‫بعصصد القيصصام بجميصصع التجصصارب الصصتي تختصصبر الكصصواد الصصتي سصصنحتاجها سصصنقوم بعمصصل ملصصف الهيصصدر‬

‫‪ Header file‬والذي يتكون من مجموعصة مصصن أوامصر الصصص ‪ C – preprocessor‬مضصاف إليهصا جميصع‬ ‫أسصصماء الثصصوابت والمتغيصصرات وكصصذلك الصصص ‪) function prototypes‬أسصصماء الصصدوال(‪ .‬الكصصود التصصالي‬ ‫يمثصصل الهيكصصل الساسصصي لي ملصصف هيصصدر )سصصواء للغصصة السصصي أو السصصي‪ .(++‬ويمكنصصك عمصصل هصصذا‬

‫الملف باستخدام أي محرر نصوص مثل ‪++notepad‬‬

‫__‪#ifndef __LIBRARYNAME_H‬‬ ‫__‪#define __LIBRARYNAME_H‬‬ ‫هنا تكتب جميع التعريفات للدوال والمتغيرات المختلفة‬ ‫‪#endif‬‬ ‫يتم استبدال ‪ LIBRARYNAME‬باسم المكتبة المطلوب مصصع مراعصصاة أن تكصصون جميصصع الحصصرف مصصن‬

‫نوع ‪) upper-case‬حروف كابيتال( فمثلا لو كان اسم المكتبة ‪ uart‬سنكتب داخصصل ملصصف الهيصصدر‬

‫الصيغة التالية )أيضاا ل تنسى كتابة _‪ __H‬بعد اسم المكتبة(‪:‬‬

‫‪234‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫__‪#ifndef __UART_H‬‬ ‫__‪#define __UART_H‬‬ ‫‪…......‬‬ ‫‪#endif‬‬ ‫لنأخذ مثال آخر‪ .‬لنفترض أن اسم المكتبة هو ‪ uartDriver‬فسيكون شكل ملف الهيدر كالتالي‪:‬‬ ‫__‪#ifndef __UARTDRIVER_H‬‬ ‫__‪#define __UARTDRIVER_H‬‬ ‫‪…......‬‬ ‫‪#endif‬‬ ‫الن يمكننصصصا أن نكتصصصب جميصصصع التعريفصصصات المطلوبصصصة والصصصتي تشصصصمل أسصصصماء المتغيصصصرات والثصصصوابت‬ ‫وكصصذلك أسصصماء الصصدوال الصصتي سنسصصتخدمها وأي ‪ C – preprocessor‬قصصد نحتاجهصصا لتشصصغيل أوامصصر‬

‫المكتبصصة‪ .‬إذا كنصصت تتصصذكر مصصن الفصصصل الخصصاص بالصصص ‪ UART‬سصصنجد أنهصصا هنصصاك مجموعصصة متغيصصرات‬ ‫ودوال أسماؤها كالتالي‪:‬‬

‫المتغيرات‬

‫المتغير المسئول عن تحديد سرعة السيريال ‪//‬‬

‫‪uint16_t UBRR_Value‬‬ ‫الدوال‬

‫تشغيل وضبط ‪// UART‬‬

‫)(‪void UART_init‬‬

‫إرسال حرف ‪//‬‬

‫)‪void UART_send_char(char data‬‬

‫استقبال حرف ‪//‬‬

‫)(‪char UART_receive_char‬‬

‫إرسال كلمة أو جملة نصية ‪void UART_send_string(char *data) //‬‬ ‫الن كصصل مصصا عليصصك فعلصصه هصصو إضصصافة كصصل التعريفصصات السصصابقة إلصصى ملصصف الهيصصدر مصصع إضصصافة علمصصة‬ ‫الفادصلة المنقوطة );( بعد كل تعريف )سواء كان متغير أو دالة(‪ .‬ليصبح شكل ملف الهيدر‪:‬‬

‫__‪#ifndef __UARTDRIVER_H‬‬ ‫__‪#define __UARTDRIVER_H‬‬ ‫;‪uint16_t UBRR_Value‬‬ ‫;)‪void UART_init(uint16_t baud_rate‬‬ ‫;)‪void UART_send_char(char data‬‬ ‫;)(‪char UART_receive_char‬‬ ‫;)‪void UART_send_string(char *data‬‬ ‫‪#endif‬‬

‫‪235‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫تتبقصصصى خطصصصوة أخيصصصرة للنتهصصصاء مصصصن الملصصصف وهصصصي إضصصصافة المكتبصصصات الصصصتي قصصصد تحتاجهصصصا الصصصدوال‬

‫السابقة‪ .‬إذا كنت تذكر الدالة ‪ ()UART_init‬كصصانت تسصصتخدم المكتبصصة البرمجيصصة ‪ math.h‬لحسصصاب‬ ‫الرقم المسؤول عن تحديصصد سصصرعة الصصص ‪ UART‬وكصصذلك تسصصتخدم المكتبصصة ‪ avr/io.h‬فصصي ضصصبط قيصصم‬

‫جلت لصذا سنضصصيف كل المكتبصتين إلصى ملصف الهيصدر‪ .‬أيضصصاا نحتصاج أن نكتصصب تعريصف سصرعة‬ ‫الممسصص ك‬ ‫الممتحككم لننا سنحتاج ‪ F_CPU‬داخل الدالة ‪UART_init‬‬

‫كما يستحسن أن نضيف بعض التعليقات في بداية المكتبة لتوضح تاريخ دصناعة هذه المكتبصصة‬

‫والوظائف التي تحققها‪ .‬الشكل النهائي يمثل الصورة النهائية من ملف الهيدر‪.‬‬

‫*‪/‬‬

‫‪UART driver v.0.1‬‬ ‫‪Date: 9-2015‬‬ ‫‪This library designed to make a simple and re useable UART driver for both‬‬

‫‪ATmega16 and ATmega32‬‬ ‫‪*/‬‬ ‫__‪#ifndef __UARTDRIVER_H‬‬ ‫__‪#define __UARTDRIVER_H‬‬ ‫‪#define F_CPU 16000000UL‬‬ ‫ rel="nofollow">‪#include ‪#include <math.h‬‬ ‫‪// Variable to store the calculations needed to set speed‬‬

‫;‪uint16_t UBRR_Value‬‬

‫;)‪void UART_init(uint16_t baud_rate‬‬ ‫‪// Initiate the UART‬‬ ‫;)‪void UART_send_char(char data‬‬ ‫‪// Send singe character‬‬ ‫;)(‪char UART_receive_char‬‬ ‫‪// Receive single character‬‬ ‫‪void UART_send_string(char *data); // Send array of characters‬‬ ‫‪#endif‬‬ ‫ملحظة‪ :‬الملف ‪ uart.h‬و ‪ uart.c‬مرفقان مع الكتاب لتسهيل نسخ النصوص أو تعديلها‬

‫الخطوة الثالثة ‪ :‬تكوين ملف التطبيق ‪uart.c‬‬

‫الخطصصوة الخيصصرة هصصي كتابصصة الوامصصر الحقيقيصصة لجميصصع الصصدوال داخصصل ملصصف جديصصد بنفصصس اسصصم‬

‫المكتبصصة ولكصصن بامتصصداد ‪ c.‬مثصصل أن نكتصصب ‪ uart.c‬مصصع ملحظصصة أنصصه ل يتصصم تعريصصف أي متغيصصرات‬ ‫جديدة داخل هذا الملف )لننا قد كتبنا تعريفات المتغيرات في ملف الهيدر(‪.‬‬

‫‪236‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫كما يجب أن يحتوي ملف التطبيق علصصى أمصصر التضصصمين ‪ include‬وذلصصك لضصصافة ملصصف الهيصدر إلصصى‬ ‫ملف التطبيق كما هو موضح في الكود التالي )والذي يمثل محتوى الملف ‪.(uart.c‬‬

‫”‪#include “uart.h‬‬ ‫)‪void UART_init(uint16_t baud_rate‬‬ ‫{‬ ‫;)‪uint16_t UBRR_Value = lrint ( (F_CPU / (16L * baud_rate) ) -1‬‬ ‫;‪UBRRL = (uint8_t) UBRR_Value‬‬ ‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬ ‫;)‪UCSRB = (1<
‫‪ 10.8‬تجربة المكتبة في برنامج‬

‫)‪void UART_send_string(char *data‬‬ ‫{‬ ‫)‪while(*data > 0‬‬ ‫;)‪UART_send_char(*data++‬‬ ‫;)'‪UART_send_char('\0‬‬ ‫}‬

‫‪ATmel studio‬‬

‫والن بعصصد أن انتهينصصا مصصن كتابصصة الصصص ‪ UART driver‬لنقصصم باختبصصاره‪ .‬فصصي البدايصصة سصصنقوم بإضصصافة‬ ‫ملفات المكتبة إلى مشروع جديد داخل برنامج ‪ ATmel studio‬ويمكنك ذلك بطريقتين‪ ،‬الولى‬

‫أن تنسصصخ ملصصف ‪ uart.c‬و ‪ uart.h‬إلصصى نفصصس مجلصصد المشصصروع ‪ C:/documents/atmel‬أو أن تقصصوم‬ ‫بذلك بسهولة من متصفح ملفات المشروع من داخل البرنامج نفسه‪.‬‬

‫‪237‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫في البداية توجه إلى ‪ Solution Explorer‬من الجانب اليمن من البرنامج‬

‫ثم اضغط بالزر اليمن وأختر ‪ Add‬ثم ‪Existing item‬‬

‫‪238‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫والن اختر الملفين ‪ uart.c‬و ‪uart.h‬‬

‫بعد إضافة الملفات ستلحظ ظهورها في قائمة الص ‪Solution Explorer‬‬

‫والن لنكتصصب برنامصصج بسصصيط لرسصصال حصصرف ‪ H‬باسصصتخدام الصصص ‪ .uart driver‬فصصي البدايصصة سصصنقوم‬ ‫بعمل ‪ include‬للملف ‪ uart.h‬داخل البرنامج الساسي )لحظ أنه ل داعي لعصصادة كتابصصة ‪define‬‬ ‫‪ F_CPU‬ول داعي لضافة المكتبة ‪ avr/io.h‬لن كلهما مضاف بالفعل داخل الملف ‪.uart.h‬‬

‫‪239‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫”‪#include “uart.h‬‬ ‫>‪#include
‫لحظ أن أمر تضمين المكتبة ‪ uart.h‬يكون مكتوب بين علمتي “” وذلك لن ملف المكتبة‬ ‫يكون موجود داخل نفس مجلد المشروع بينما المكتبات الخرى مثل ‪ delay.h‬تكتب بين‬ ‫علمتي >< لنها تكون موجودة داخل مجلد المكتبات العام التابع للص ‪.toolchain‬‬

‫الصور التالية تمثل شكل الملف ‪ uart.h‬و ‪ uart.c‬داخل برنامج ‪.ATmel Studio‬‬

‫‪240‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬

‫الملف ‪uart.c‬‬

‫‪241‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬ ‫… ‪..............................................................................................‬‬ ‫بعد النتهاء من كتابة الكصود قصم بصصترجمته واسصتخلص ملصف الهيكصس ثصصم قصصم بمحاكصصاة البرنامصصج‬

‫بنفس الدائرة المذكورة فصصي المثصصال الول فصصي الفصصصل الخصصاص بالصصص ‪.UART‬والصصصورة التاليصصة تمثصصل‬ ‫نتيجة المحاكاة‪.‬‬

‫‪242‬‬

‫الفصل الحادي عشر‬

‫” المسافة بين أن تكون شخصا عاديا ا وبين أن تكون‬ ‫عبقر يا هي مدى النجاح الذي تحققه ‟‬

‫بروس فيرشتاين ‪ -‬مؤلف وكاتب أمريكي‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬

‫يشرح هذا الفصل استخدام أنظمصصة تشصصغيل الصصوقت الحقيقصصي ‪Real Time OS‬‬

‫لتشصصغيل المهصصام المتعصصددة ‪ Multitasking‬وأنظمصصة السصصتجابة السصصريعة‪ .‬حيصصث‬

‫سيتم تنصصاول نظصام ‪ FreeRTOS‬فصصي هصذا الفصصصل باعتبصاره أفضصل نظصام ‪RTOS‬‬

‫مجاني )ومفتوح المصدر(‪.‬‬

‫✔ مقدمة عن مفهوم الص ‪RTOS‬‬ ‫✔ كيف يتم تنفيذ أكثر من مهمة‬

‫✔ كيف تعمل نواة النظام ‪FreeRTOS Kernel‬‬

‫✔ تشغيل ‪ FreeRTOS‬على أي ممتحككم ‪System Porting to any AVR‬‬ ‫✔ إعدادات النظام‬

‫✔ مثال‪ :‬تشغيل ‪ 3‬مهمات مختلفة‬ ‫✔ شرح طرق إدارة المهام‬

‫‪244‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.1‬مقدمة عن أنظمة الوقت الحقيقي‬

‫‪Real Time Systems‬‬

‫تعصصرف أنظمصصة الصصوقت الحقيقصصي بأنهصصا أنظمصصة الحوسصصبة أو النظمصصة المدمجصصة‬

‫الصتي تس تخدم فصي أداء مجموعصة مصن المهمصات تتطلصب كصل مهمصة اسصتجابة‬ ‫زمنية وسرعة تنفيذ محددة‪ ،‬وتنقسم هذه النظمة إلى ‪ 3‬أنواع‪:‬‬

‫‪ Soft Real Time Systems‬وهي النظمة التي تسمح ببعض التأخير المحصصدود فصي التنفيصذ أو‬ ‫السصصصتجابة للمهمصصات المطلصصوب تنفيصصذها‪ .‬أمثلصصة علصصى ذلصصك‪ ،‬الهواتصصف النقالصصة‪ ،‬مشصصغلت اللعصصصاب‪،‬‬

‫أجهزة عرض الفيديو‪ .‬كل ما سبق أنظمة يمكن التغاضصصي عصصن حصدوث تصأخير زمنصصي بسصيط أثنصصاء‬

‫تشصصصغيلها‪ .‬فمثلا لصصصن تحصصصدث مشصصصكلة إذا تصصصأخرت شاشصصصة الهصصصاتف النقصصصال بضصصصعة مللصصصي ثانيصصصة فصصصي‬ ‫الستجابة لوامر المستخدم‪.‬‬

‫‪ Hard Real Time Systems‬وهصصي النظمصصة الصصتي دائمنناا مننا يجننب أن تنجننح فصصي تنفيصصذ جميصصع‬ ‫المهمات الخادصة بها في الزمن المطلوب وبدون أي تاخير في الستجابة مهما كان‪ .‬وحدوث أي‬ ‫تصصأخير يعنصصي فشصصل النظصصام ككصصل وقصصد يصصؤدي إلصصى كارثصصة‪ .‬مصصن المثلصصة علصصى هصصذه النظمصصة وحصصدات‬

‫التحكم في المفاعلت النووية‪ ،‬الصواريخ‪ ،‬الطائرات الحربية‪ ،‬بعض الجهزة الطبية مثل أجهصصزة‬ ‫تنظيم ضربات القلب‪.‬‬ ‫‪ Firm Real Time Systems‬تعتصصبر مماثلصصة للصصص ‪ Hard Real Time systems‬مصصن ناحيصصة سصصرعة‬ ‫الستجابة والتنفيذ لكن الختلف هو أنه في حالة الفشل بضع مرات للستجابة المطلوبة فلصصن‬

‫يؤدي ذلك إل ى فشصل النظصام ككصل‪ .‬ومثصال علصى ذلصك جهصاز الراوتصر اللسصلكي ‪Wireless Router‬‬

‫)الذي يبث النترنت بصورة لسلكية للهواتف أو الجهزة المحمولة( يحتوي على شصريحة تعمصصل‬ ‫على إستقبال وإرسال حزم البيانات ‪ Data packets‬باستجابة عاليصصة ومثاليصصة لكصصن إذا حصصدث أن‬ ‫فقصصدت بعصصض الحصصزم أو لصصم يسصصتطع الراوتصصر التعامصصل معهصصا فصصإن ذلننك ل يعننني فشننل للنظننام ككننل‬

‫فهذا يعتبر خطأ مقبول طالماا أنه ليس متكرر بكثرة‪.‬‬

‫‪245‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.2‬طرق تصميم الـ‬

‫‪Real Time Embedded systems‬‬

‫هناك العديد من الطرق لتصميم نظم مدمجة عالية الستجابة بعضها يتسم بالبسصصاطة والبعصصض‬

‫الخر ممصمم ليعالج الوظائف المعقدة والمتداخلة‪ .‬من هذه الطرق هناك نوعين أساسين‪:‬‬

‫الطريقة اﻷولى‪ :‬كتابصة الوظصائف الصتي ل تحتصاج اسصتجابة سصريعة داخصل الدالصة الرئيسصية ‪Main‬‬ ‫‪ function‬بينما المهمات التي تتطلب استجابة لحصدث خصارجي معيصن أو تحصصدث بصصورة دوريصة‬

‫يتم وضعها داخل دوال مقاطعات ‪.interrupts‬‬

‫"‪#include "library1‬‬ ‫"‪#include "library2‬‬ ‫)(‪int main‬‬ ‫{‬ ‫‪some_data‬‬ ‫)‪while(1‬‬ ‫{‬ ‫هنا تكتب المهمات ذات الهمية التقليدية ‪//‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬ ‫)‪ISR(type_of_ISR‬‬ ‫{‬ ‫كود معالجة سريع لحد المهمات عند حدوث مقاطعة ‪//‬‬ ‫}‬

‫)‪ISR(type_of_ISR‬‬ ‫{‬ ‫كود معالجة سريع لحد المهمات عند حدوث مقاطعة ‪//‬‬ ‫}‬

‫يعيب هذه الطريقة أنها ل تصلح إل لعدد محدود جداا من المهمات كما أن كتابة الكود‬ ‫البرمجي ﻷكثر من مهمة داخل الدالة الرئيسية يجعل الكود معقد‪.‬‬

‫‪246‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫الطريقة الثانية‪ :‬استخدام أنظمصة تشصغيل الصوقت الحقيقصي ‪Real Time Operating Systems‬‬

‫والصصتي تختصصصر بكلمصصة ‪ ،RTOS‬هصصذه النظمصصة مشصصابه فصصي نظريصصة عملهصصا بنظصصام التشصصغيل التقليصصدي‬ ‫الذي تستخدمة الن على الحاسب اللي مثل ‪ Windows‬أو ‪.Linux‬‬ ‫تهدف أنظمة التشغيل إلى توفير مجموعة من الخدمات أهمها "تعدد المهام ‪"Multi-tasking‬‬

‫بفضصصل هصصذه النظمصصة تسصصتطيع أن تتصصصفح الصصويب وفصصي نفصصس الصصوقت سصصماع ملصصف دصصصوتي وقصصد‬

‫تستخدم برنامج معالجة النصوص بجانب كل ما سبق‪.‬‬

‫بالنسصصبة لصصك أنصصت تسصصتطيع أن تقصصوم بكصصل هصصذه الشصصياء فصصي نفصصس الصصوقت لكصصن الحقيقصصة أن هصصذه‬

‫المهام تتصم بالتتبصاع‪ ،‬أمصا سصرعة تنفي ذها فيرجصع الفضصل فصي ذلصك إلصى مهصارة نظصام التشصغيل فصي‬ ‫معالجة كل هذه المهام بسرعة واستجابة عالية‪.‬‬

‫كيف تعمل أنظمة التشغيل بشكل عام؟‬

‫يعمل نظام التشغيل بصورة مشابهة للطباخ المحترف‪ ،‬عادة يطلب من الطباخ أن يعد أكصصثر مصصن‬ ‫وجبصصه فصصي نفصصس الصصوقت وقصصد تختلصصف هصصذه الوجبصصات أو تتشصصابه لكصصن فصصي النهايصصة يتصصوجب عليصصه‬

‫إعدادها جميعاا في وقت محدد‪.‬‬

‫‪247‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫عادة ما يلجأ الطباخ لحيلة ذكيصة لتنظيصصم الصصوقت فهصصو ل يقصصوم بإنهصصاء كصل جصزء مصصن الصوجبه علصى‬

‫حصصصدة ثصصصم البصصصدأ فصصصي جصصصزء أخصصصر ولكنصصصه بصصصدلا مصصصن ذلصصصك يقصصصوم بعمليصصصة التبصصصديل بيصصصن المهصصصام ‪Task‬‬ ‫‪.switching‬‬ ‫ل إذا كصصان المطلصصوب هصصو إعصصداد طبصصق المعكرونصصة مصصع اللحصصم المشصصوي فصصأن الطبصصاخ سصصيبدأ أولا‬ ‫فمث ا‬ ‫بغلي الماء ويتركه على النار )المهمة اﻷولى( ثم قد يضع اللحم على الشوايه )المهمننة الثانيننة(‬

‫ثم يبدأ في تجهيصصز الطمصصاطم مصصن أجصل الصلصصصة)المهمنة الثالثننة(‪ ،‬عنصدما يستشصعر أن المصصاء بصدء‬

‫يغلي بدرجة حرارة مناسبة سيترك الصلصة ثم يعود إلى الماء ليضيف إليه المعكرونصصة ويتركهصصا‬

‫حتى تنضج‪ ،‬ثم يعود مرة أخرى للطماطم و في ذلصك الصوقت فصإنه سصيحاول كصل فصترة زمني ة أن‬

‫يطمئن على درجة نضوج اللحم وتستمر هذه العملية حتى تنتهي كل مكونات الوجبة …‬ ‫نظام التشغيل يعمل بصورة مشابهه‪ ،‬في البداية يقوم بتجهيز قائمة بالمهمات الصصتي يجصصب عليصصه‬

‫أن ينجزها ثم يبصدأ بصإدارة المهصصام مثصل الطبصاخ المحصترف‪ ،‬ويق وم بصذلك بعصدة طصرق منهصصا مثلا أن‬

‫يعطي كل مهمصصة فصترة معالجصصة زمنيصصة قصصيرة تسصمى ‪) time slice‬شصريحة زمنيصة( وعنصد انتهصصاء‬ ‫الشريحة الزمنية يقوم بالتبديل بين المهمات‪ .‬ويعرف هصذا السصصلوب لجدولصصة المهصصام بالصصص ‪Round‬‬ ‫‪Robin scheduling‬‬ ‫أيضصصاا قصد يقصصوم نظصصام التشصصغيل بمعالجصصة المهمصصات علصصى حسصب أولويصصة إنهائهصصا فمثلا قصصد يبصصدأ فصي‬ ‫معالجة أهم مهمة متوفرة لفترة طويلة حتى تصله رسالة أو طلب مقاطعة بوجود مهمصصة أخصصرى‬

‫أعلى أهمية و تحتاج لمعالجة فوريصة فيصترك المهمصة الولصى ويصذهب للثانيصة مؤقتصاا ح تى ينهيهصا‬

‫ثصم يعصود للولصى‪ .‬وعنصدما ينتهصي مصن المهمصة الولصى بالكامصل يتركهصا ويصذهب إلصى المهمصة الثصالثه‬

‫وهكذا … ويعرف هذا السلوب في التبديل بين المهمات بالص ‪.Priotiry based scheduling‬‬ ‫وقبل أن نكمل هناك بعض المسميات النجليزية الواجب معرفتها‪:‬‬

‫يسصصمى الجصصزء الصصذي يصصدير عمليصصه التبيصصدل بيصصن المهمصصات بالصصص ‪) RTOS scheduler‬مجصصدول نظصصام‬ ‫التشغيل( وهو جزء من نواة النظام والتي تسمى ‪ RTOS kernel‬كما تسمى عمليصة التب ديل بيصن‬

‫المهمات )بغض النظر عن أسلوب جدولة التبديل( بإسم ‪Context switching‬‬

‫وتسمى المهمة التي يتم معالجتها الن بالص ‪ Running task‬بينما المهمة الصصتي تنتظصصر دورهصصا فصصي‬

‫المعالجة ‪ .Waiting task‬الصورة التالية طريق عمل الص ‪ RTOS‬بأسلوب مبسط‬

‫‪248‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.3‬كيف تعمل النواة‬

‫‪RTOS Kernel‬‬

‫المعالجصصصصات الموجصصصصودة داخصصصصل الممتحككمصصصصات الدقيقصصصصة تسصصصصتطيع أن تنفصصصصذ مجموعصصصصة مصصصصن الوامصصصصر‬

‫المتتالية ول تعرف تحديداا إذا كانت هصذه الوامصصر جصزء مصصن نظصصام التشصصغيل أو أنهصصا مهمصصة معينصصة‬ ‫وهصصذا يصصؤدي إلصصى سصصؤال هصصام‪ ،‬كيننف يفهننم المعالننج أنننه يجننب أن يننترك المهمننة الحاليننة ويننذهب‬

‫لتنفيذ مهمة أخرى؟‬ ‫هنا تأتي وظيفة نصصواة النظصصام ‪ . Kernel‬هصصذه النصصواة تعمصصل داخصصل دالصصة مقاطعصة زمنيصة ‪Interrupt‬‬ ‫‪ service routin‬ويتصصم تكصصرار تشصصغيلها مصصن مئصصات إلصصى آلف المصصرات فصصي الثانيصصة الواحصصدة )يسصصمى‬

‫عدد مرات تشغيل النواة بالص ‪ .(System tick‬في كل مرة يتصصم تشصصغيل النصصواة يبصصدأ جصزء مصصن هصصذه‬ ‫النواة يسمى "برنامج الجدولة ‪ ”Scheduler‬بمراجعة قائمة المهام الموجودة ويحصصدد مصصا الصصذي‬ ‫سيتم معالجته الن‪.‬‬

‫قصصد يختصصار برنامصصج الجدولصصة أن يكمصصل المهمصصة الحاليصصة أو ينتقصصل إلصصى مهمصصة أخصصرى علصصى حسصصب‬

‫خوارزميصصة التحويصصل )الصصص ‪ Round-Robin‬أو ‪ (Priority-based‬وبعصصد أن يقصصرر المهمصصة ييقصصوم بنقصصل‬ ‫جلت‬ ‫البيانصصصات الخادصصصصة بمعالجصصصة هصصصذه المهمصصصة إلصصصى المعالصصصج وتتضصصصمن البيانصصصات محتصصصوى الممسصصص ك‬

‫جلت العامة والخادصة(‪.‬‬ ‫المختلفة )كل من الممس ك‬

‫‪249‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.4‬مقدمة عن نظام‬

‫‪FreeRTOS‬‬

‫تتوفر العديد من أنظمة تشغيل الوقت الفعلي المجانية والتي تختلف فيما بينها بمصصا تقدمصصة مصصن‬

‫إمكانيات ووظائف إضافية‪ ،‬مصصن هصذه النظمصة نجصصد ‪ FreeRTOS‬والصصذي يعصصد أشصصهر أنظمصة الصصوقت‬ ‫الحقيقي مفتوحة المصدر المتوفرة للستخدام المجاني سواء بصورة تعليمية أو تجارية‪.‬‬

‫يصصصصدعم هصصصصذا النظصصصصام مختلصصصصف الممتحككمصصصصات الدقيقصصصصة فيمكنصصصصك‬

‫تشغيله على ‪PIC – ARM – AVR – 8051 – PowerPC – x86‬‬ ‫والعديد من المعماريات الخرى‪.‬‬ ‫كمصصصصا يوجصصصصد منصصصصه نسصصصصخة مخصصصصصصة للنظمصصصصة ذات‬ ‫الموثوقيصصصصصصصة العاليصصصصصصصة )مثصصصصصصصل الجهصصصصصصصزة الطبيصصصصصصصة أو‬

‫التطبيقصصصصات العسصصصصكرية( ويسصصصصمى ‪ SAFE-RTOS‬مصصصصع‬ ‫العلم أن هذه النسخة مدفوعة وليست مجانية‪.‬‬

‫يمتلك هذا النظام العديد من المميزات الرائعة منها‪:‬‬ ‫•‬

‫حجصصم دصصصغير يسصصتهلك أقصصل مصصن ‪ 4‬إلصصى ‪ 9‬كيلصصو بصصايت مصصن ذاكصصرة الصصصص ‪ ROM‬ممصصا يجعلصصه‬

‫مناسصصب لمعظصصم الممتحككمصصات الدقيقصصة )تصصذكر أن ‪ ATmega16‬يمتلصصك ‪ 16‬كيلوبصصايت مصصن‬ ‫الذاكرة بينما يمتلك ‪ ATmega32‬نحو ‪ 32‬كيلوبايت(‪.‬‬ ‫•‬

‫تصصوفير مجموعصصة مصصن المكتبصصات البرمجيصة الجصصاهزة للتعامصل مصصع أنظمصصة الملفصصات ‪ FAT‬والصصص‬

‫‪ storage media‬مثل بطاقات الذاكرة‬ ‫•‬

‫مدمج معه مكتبات خادصة لتسهيل معالجة البيانات القادمة من وإلى شبكات الحاسصصب‬

‫اللصصصي عصصصبر بروتوكصصصول ‪ TCP/IP‬أو ‪ UDP‬ممصصصا يجعلصصصه نظصصصام مناسصصصب لتطبيقصصصات إنصصصترنت‬

‫الشياء ‪ IoT‬والتحكم عن بعد‬

‫‪250‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.5‬الهيكل الربرمجي‬

‫للـ ‪RTOS‬‬

‫بصورة افتراضية تكتب جميع أوامر برامج النظم المدمجة في الدالة الرئيسصصية علصصى عكصس أنظمصصة‬

‫الص ‪ RTOS‬حيث نجد أن كل مهمة ‪ task‬تماثل دالة رئيسية مستقله وتكون مهمة الص ‪Main Function‬‬ ‫هي تعريف عدد وخصائص المهمات فقط‪.‬‬

‫الهيكل التالي شكل التقليدي للبرامج المكتوبة باستخدام ‪ RTOS‬حيصث تصصم إنشصصاء ‪ 3‬مهصام مختلفصصة‬

‫وتمتلك كل مهمة مجموعة الوامر الخادصة بها‪.‬‬

‫”‪#include “RTOS.h‬‬

‫إنشاء المهمة اﻷولى ‪//‬‬ ‫إنشاء المهمة الثانية ‪//‬‬ ‫إنشاء المهمة الثالثة ‪//‬‬

‫)(‪int main‬‬ ‫{‬ ‫;)‪createTask( task1, task1_parameters‬‬ ‫;)‪createTask( task2, task2_parameters‬‬ ‫;)‪createTask( task3, task3_parameters‬‬

‫إبدء إدارة المهمات بإستخدام ‪// RTOS‬‬

‫;)(‪startRTOS_scheduler‬‬

‫ل تفعل أي شيء أخر داخل الدالة الرئيسية إلى ما ل نهاية ‪//‬‬

‫; )‪while(1‬‬ ‫;‪return 0‬‬

‫}‬

‫{ ) (‪void task1‬‬ ‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة اﻷولى ‪//‬‬

‫{ )‪while(1‬‬ ‫}‬

‫}‬

‫{ ) (‪void task2‬‬ ‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثانية ‪//‬‬

‫{ )‪while(1‬‬ ‫}‬

‫}‬

‫{ ) (‪void task3‬‬ ‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثالثة ‪//‬‬

‫{ )‪while(1‬‬ ‫}‬

‫‪251‬‬

‫}‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.6‬تشغيل ‪ FreeRTOS‬على جميع ممتحككامات‬

‫‪AVR‬‬

‫عند تحميل نظام ‪ FreeRTOS‬من الموقع الرسمي سنجد أنصه مهيصأ للعمصل علصى الممتحككصم الصدقيق‬ ‫‪ atmega323‬فقصط‪.‬لصذا سصنقوم بعمصل مصصا يسصصمى " تصندير النظنام" ‪) system porting‬البعصض‬ ‫يسميها تهيئة النظام(‪ ،‬والتي تعني ضبط النظام ليعمل مع مختلصصف الممتحككمصصات الصصدقيق الخصصرى‬

‫من عائلة ‪ .AVR‬وسنأخذ الممتحككمات ‪ atmega 16/ 32 /328/ 644/1284‬مثال على ذلك‪.‬‬

‫في البداية قم بتحميل أحدث إدصدار متوفر من نظام ‪) FreeRTOS‬وقت كتابة هذا الفصصصل كصصان‬ ‫الدصدار رقم ‪ (8.2.1‬من الموقع الرسمي ‪http://www.freertos.org‬‬

‫اضغط على ‪ Download‬من الجانب اليسر للموقع للنتقال لصفحة التحميل ثم اختر "تحميل‬ ‫الدصدار الخير من موقع ‪ ”sourceforge.com‬كما في الصورة التالية‬

‫عنصصد النتهصصاء مصصن التحميصصل قصصم بفصك ضصغط الملصف لتجصد المجلصد الرئيسصي باسصم ‪ FreeRTOS‬وبصصه‬ ‫جميع المجلد والملفات الخادصة بنظام التشغيل لمختلف الممتحككمات الدقيقة‬

‫‪252‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫تنقسم الملفات إلى مجلدين أساسين وهما ‪ source‬و ‪ .Demo‬الول يحتوي على جميع الملفات‬ ‫المصدرية لنظام التشغيل التشغيل نفسه بينما الخر يحتوي على أمثلة لختبار نظام التشغيل‪.‬‬ ‫ملحظة‪ :‬الملفات تشمل نسخة من النظام ‪ +‬أمثلة لجميع الممتحككمات من جميع العائلت التي‬ ‫يدعمها نظام ‪ FreeRTOS‬بما في ذلك ممتحككمات ‪ PIC, AVR, ARM cortex‬ما يهمنا من هذه‬ ‫الملفات ما هو متعلق بالص ‪ AVR‬فقط باعتباره موضوع الكتاب‪.‬‬

‫أيضاا يدعم نظام ‪ FreeRTOS‬العديد من المترجمات المختلفة مثل ‪ GCC – IAR – Keil‬ولكننا‬ ‫سنستخدم ‪ GCC‬فقط باعتباره المترجم المرفق مع الص ‪ toolchain‬المجانية‪.‬‬ ‫تعتمد عملية تصدير النظام على التلعب بإعدادات ‪ FreeRTOS‬من خلل ‪ 3‬ملفات رئيسية‪:‬‬

‫‪port.c‬‬ ‫‪FreeRTOSConfig.h‬‬ ‫‪makefile‬‬ ‫‪main.c‬‬ ‫تتواجد هذه الملفات في المسارات التالية‪:‬‬

‫‪FreeRTOS/Source/portable/GCC/ATMega323/port.c‬‬ ‫‪FreeRTOS/Demo/AVR_ATMega323_WinAVR/FreeRTOSConfig.h‬‬ ‫‪FreeRTOS/Demo/AVR_ATMega323_WinAVR/makefile‬‬

‫ا ‪ :‬تعديل ‪port.c‬‬ ‫أول ا‬

‫سصصصصمي هصصصصذا الملصصصصف ‪ port.c‬باعتبصصصصاره الملصصصصف الساسصصصصي فصصصصي عمليصصصصة الصصصصص ‪ porting‬حيصصصصث يتحكصصصصم‬ ‫بالخصائص الساسية لعملية الص ‪) context switching‬التبديل بين المهمات ‪ .(tasks‬ويتم ضبط‬ ‫إعدادات المؤقت والمقاطعات الدورية من داخل الملف‪.‬‬

‫يعتمد نظام ‪ FreeRTOS‬علصى المصؤقت رقصم ‪ 1‬فصي جميصع عصائلت ‪ AVR‬وبالتحديصد يقصوم بالتنقصل‬

‫بين المهمات عندما يحدث مقاطعة نتيجة تطابق عداد المؤقت ‪ 1‬والمسصصجل ‪ OCRA1x‬وهصصو مصصا‬

‫يعرف باسم ‪.timer 1 COMPARE A match interrupt‬‬

‫في البداية توجه إلى الملف المتواجد داخل المسار التالي‬

‫‪FreeRTOS/Source/portable/GCC/ATMega323/port.c‬‬ ‫افتح الملف بأي محرر نصوص متوفر لديك وتوجه إلى السطر الذي يحتوى العبارة التالية‬ ‫) ‪#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10‬‬

‫‪253‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫أول مصصا يجصصب ضصصبطة هصصو قيمصصة الصصص ‪ mask‬الصصذي سصصيفعل خادصصصية المقاطعصصة ‪timer 1 compare‬‬ ‫جل ‪ TIMSK‬فصي ممتحككمصصات ‪ AVR‬القديمصة‬ ‫‪ match A‬ويتم حساب هصذا الصصص ‪ mask‬بصصالنظر إلصصى الممسصص ك‬

‫جل علصى البصصت المطلصوب تفعيلهصا‬ ‫نسبياا أو ‪ TIMSK0‬في الممتحككمات الحصدث‪ ،‬يحتصوي هصذا الممسصص ك‬ ‫‪ OCIE1A‬والمسؤولة عن تفعيل المقاطعة ‪Timer1 Compare A Match interrupt‬‬

‫القيمة ‪ 0x10‬تمثل قيمة الص ‪ mask‬الممتحككم في تفعيل المقاطعة ويتم حساب هذه القيمة‬ ‫كالتالي‪:‬‬ ‫•‬

‫توجه إلى ملف البيانات الخادصة بالمتحكم الذي ستضع عليه نظام التشغيل )على‬

‫سبيل المثال الممتحككم ‪ – ATmega32‬دصفحة دليل البيانات رقم ‪ .(82‬سنجد أن البت‬ ‫‪ OCIE1A‬هي البت رقم ‪4‬‬

‫•‬

‫الن سنقوم بحساب الص ‪ mask‬وذلك عن طرق وضع الرقم ‪ 1‬مكان هذه البت وباقي‬

‫البتات =‪ 0‬وهو ما يعني الرقم ‪ 00010000‬بالصيغة الثنائية وهو ما يساوي ‪0x10‬‬ ‫بصيغة الهيكس‪) .‬هذه القيمة هي الفتراضية بالفعل(‬ ‫فصصي حالصصة الممتحككصصم ‪ atmega168‬أو ‪) atmega328‬ومعظننم الممتحككمننات الحديثننة( سصصنجد أن‬

‫مكصصصان البصصصت ‪ OCIE1A‬مختلصصصف‪ .‬فمثل افصصصي حالصصصة الممتحككصصصم ‪ atmega328‬سصصصنجد الوضصصصع التصصصالي‬

‫)دصفحة ‪ 135‬من دليل البيانات للممتحككم ‪.(atmega328‬‬

‫‪254‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫في حالة الممتحككم ‪ atmega644‬أو الممتحككم ‪ atmega1284‬دصفحة ‪ 134‬من دليل البيانات‬

‫إذا قمنا بوضع الرقم ‪ 1‬مكان هذه البت وباقي البتات = دصفر سنجد أن قيمة الص ‪ mask‬تساوي‬ ‫‪ 00000010‬وهو ما يساوي ‪ 0x02‬بصيغة الهيكس‪ .‬إذا يجب استبدال القيمة ‪ 0x10‬بالقيمة‬

‫‪ 0x02‬كالتالي‪:‬‬

‫جل ‪TIMSK‬‬ ‫لحظ أن الممتحككمات الحديثة نسبياا من عائلة ‪ AVR – 8bit‬ل تمتلك الممس ك‬ ‫وإنما يكون باسم ‪ TIMSK0‬أو ‪ TIMSK1‬كما في حالة ‪ atmega328‬و ‪atmega1284‬‬

‫جلت في نفس الملف وبالتحديد‬ ‫بعد تعديل قيمة الص ‪ mask‬سنقوم بتعديل بعض أسماء الممس ك‬

‫في الدالة ) ‪ prvSetupTimerInterrupt( void‬والتي ستجدها في أخر الملف ‪ port.c‬كما‬ ‫في الصورة التالية‪:‬‬

‫‪255‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫جل المسنننؤول عنننن المقاطعنننة يسنننمى ‪ TIMSK‬فلنننن تغينننر أي شنننيء بهنننا )مثنننل‬ ‫إذا كنننان الممسننن ك‬

‫الممتحككنننم ‪ (ATmega32/16‬أمصصصا إذا كنصصصت ستسصصصتخدم أي ممتحككصصصم حصصصديث مثصصصل ‪ atmega328‬أو‬ ‫‪ atmega1284‬يجصصصصب أن تسصصصصتبدل ‪ TIMSK‬بالسصصصصم المناسصصصصب مثصصصصل ‪ TIMSK0‬أو ‪) TIMSK1‬علصصصصى‬ ‫حسب ما هو مذكور في دليل البيانات كما شاهدنا في الخطوة السابقة(‪.‬‬ ‫مثال‪ :‬تعديل الدالة لتتناسب مع الممتحككم ‪atmega1284/644/328/168/....etc‬‬

‫الجصصصزء الخيصصصر مصصصن تعصصصديل ملصصصف ‪ port.c‬هصصصو إعصصصادة تسصصصمية الصصصص ‪ ISR‬الخادصصصصة بمقاطعصصصة ‪Timer1‬‬ ‫‪ Compare A Match‬وهصصصذا الجصصصزء يجصصصب تغييصصصره لمعظصصصم ممتحككمصصصات ‪) AVR‬سصصصواء القديمصصصة أو‬

‫الحديثة(‪ .‬هذا الجزء ستجده في نهاية ملف ‪ port.c‬كما في الصورة التالية‪.‬‬

‫‪256‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫قم بتغير كل الدوال باسم ‪SIG_OUTPUT_COMPARE1A‬‬

‫إلى السم‬

‫‪TIMER1_COMPA_vect‬‬

‫ليصبح الملف كالتالي‪:‬‬

‫بذلك نكون قد انتهينا من تعديل الملف ‪port.c‬‬

‫‪257‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫ثانيا ‪ :‬تعديل ‪FreeRTOSConfig.h‬‬ ‫يتحكصصصم هصصصذا الملصصصف فصصصي إعصصصدادات نظصصصام التشصصصغيل عنصصصدما يبصصصدأ العمصصصل علصصصى الممتحككصصصم الصصصدقيق‪،‬‬ ‫وبالتحديصد هصو المسصؤول عصن التلعصب بخصصائص الصصص ‪ kernel‬وبعصض خصصائص تنظيصم الصصص ‪.tasks‬‬ ‫يمكنصصك اسصصتخدام الملصصف كمصصا هصصو بالوضصصع الفتراضصصي لكصصن سصصتحتاج أن تغيصصر بعصصض العصصدادات‬

‫الهامصصة لتناسصصب الممتحككصصم الصصدقيق المسصصتخدم‪ .‬وبعصصض العصصدادات الخصصرى والصصتي سصصتجعل نظصصام‬ ‫التشصصغيل أكصصثر كفصصاءة فصصي إدارة المهمصصات )‪ tasks (threads‬خادصصصة مصصع الممتحككمصصات ذات الصصذاكرة‬

‫الصغيرة‪.‬‬ ‫يتواجد الملف في نفس مجلد ‪ Demo‬بجانب الملف ‪ main.c‬وبالتحديد في المسار التالي‬

‫‪FreeRTOS/Demo/AVR_ATMega323_WinAVR/FreeRTOSConfig.h‬‬

‫العدادات الواجب ضبطها‬ ‫‪#define configCPU_CLOCK_HZ‬‬ ‫) ‪( ( unsigned long ) 8000000‬‬ ‫يتحكصصم هصذا الخيصصار فصصي ضصصبط التصصوقيت داخصصل نظصصام التشصصغيل‪ ،‬يجصصب أن تغيصصر قيمتصصه إلصصى نفصس‬

‫التردد الذي يعمل به المعالج )القيمة الفتراضية هي ‪ 8‬ميجاهرتز(‪.‬‬

‫‪#define configTICK_RATE_HZ‬‬ ‫) ‪( ( TickType_t ) 1000‬‬ ‫ا‬ ‫عدد المرات التي تعمل بها الص ‪ kernel‬وذلك التبديل بين المهمصصات المختلفصصة‪ .‬فمثل بصصافتراض أن‬

‫لديك ‪ 10‬مهمات فهذا يعني أن الص ‪ Kernel‬سصتقوم بالتبصديل بينهصم ‪ 1000‬مصرة وهصو مصا يعنصي أن‬ ‫كل مهمة سيتم زيارتها ‪ 100‬مرة في الثانية في الواحد‪.‬‬ ‫زيصصادة هصذا الرقصم سصتؤدي إلصى نقصص الصوقت المخصصصص للمعالجصصة لكصصل مهمصة فصي مقابصصل تحسصين‬ ‫الستجابة للمهمات ككل‪ ،‬ولكن هناك عيصب واحصد وهصصو أن الصصص ‪ kernel‬سصصيزداد معصدل اسصصتهلكها‬

‫للصصوقت والمصصوارد بزيصصادة هصصذا الرقصصم‪ .‬فمثل إذا كصصان معصصدل الصصص ‪ tick = 3000 Hz‬فهصصذا يعنصصي أن الصصص‬

‫‪ kernel‬سصصصتعمل ‪ 3000‬مصصصرة فصصصي الثانيصصصة وفصصصي كصصصل مصصصرة قصصصد تختصصصار أحصصصد المهمصصصات لتشصصصغيلها أو‬

‫التبديل مع مهمة أخرى ‪.context switch‬‬

‫مصصن المفيصد زيصصادة هصذا الرقصصم فصي حالصصة أن المهمصصات تحتصصاج لسصتجابة سصريعة لكصن يستحسصن أن‬

‫يكون الممتحككم يعمل بسصصرعة ‪ 16‬أو ‪ 20‬ميجصصاهرتز علصصى القصصل‪ .‬مصع العلصصم أنصه بزيصصادة هصذا الرقصم‬

‫‪258‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫سصصصيتم اسصصصتهلك المزيصصصد مصصصن الطاقصصصة‪ .‬لصصصذا إن كصصصان مشصصصروعك يجصصصب تصصصصميمه باسصصصتهلك طاقصصصة‬

‫منخفض فيستحسن تقليل الرقم إلى ‪) 500‬سصيخفض سصرعة السصصتجابة للمهمصصات( وإذا كنصصت ل‬ ‫تهتصصصصم بزيصصصصادة اسصصصصتهلك الطاقصصصصة فيمكنصصصصك أن تضصصصصع القيمصصصصة بيصصصصن ‪ 1000‬و ‪ 3000‬وفصصصصي حالصصصصة‬

‫الممتحككمات من عائلة ‪ AVR Xmega‬أو ‪ AVR – 32 bit‬يمكن زيادة الرقم إلى ‪.5000‬‬

‫‪#define configMAX_PRIORITIES‬‬ ‫)‪(4‬‬ ‫هذا الخيار يتحكصم بأقصصى عصدد مصن الولويصصات المسصصموح بهصا فصي نظصصام التشصغيل‪ .‬يتصصم تحديصده‬

‫بنصصاء علصصى عصصدد المهمصصات المتوقصصع تشصصغيلها علصصى النظصصام ومصصدى أهميصصة كصصل منهصصا‪ .‬إذا كصصانت معظصصم‬ ‫المهمات لها نفس الولوية فيمكنك أن تضع الرقم ب ‪ 2‬فقط‪.‬‬

‫‪#define configMINIMAL_STACK_SIZE‬‬ ‫) ‪( ( unsigned short ) 85‬‬ ‫الرقم المسؤول عصن تحديصصد أقصصل حجصصم للصصص ‪ stack‬لكصصل مهمصصة تعمصصل‪ ،‬يجصب أن يتناسصصب الرقصم مصصع‬ ‫حجصصم الصصذاكرة العشصصوائية ‪ SRAM‬للممتحككصصم الصصدقيق‪ .‬فمثلا إذا كصصانت ال ‪ SRAM‬تسصصاوى ‪ 1‬كيلصصو‬

‫فمن الفضل أن يصبح الرقصصم ‪ 50‬فقصط أمصصا إذا كصصانت الصذاكرة ‪ 2‬كيلصو فيمكنصك أن تصتركه كمصا هصو‬ ‫أما إذا كانت الذاكرة ‪ 4‬كيلو أو أكثر فمن الممكن زيادتها إلى ‪.150‬‬ ‫أيضصصصاا يجصصصب زيصصصادة هصصصذا الرقصصصم إذا كصصصانت المهمصصصات الصصصتي سصصصيتم تشصصصغيلها سصصصتتعامل مصصصع دوال أو‬ ‫عمليات حسابية كبيرة )أو أي عملية تحتاج أن تستخدم الص ‪ Stack‬لجرائها(‪ .‬ولحظ أن معظم‬

‫العمليصصات الحسصصابية المركبصصة مثصصل )‪ x = y+5/z*(x+1‬تسصصتخدم الصصص ‪ stack‬لصصذا يجصصب أن تضصصع هصصذه‬

‫العوامصصصل بالحسصصصبان عنصصصد اختيصصصار هصصصذا الرقصصصم‪ .‬أيضصصصاا يتصصصم اسصصصتخدام الصصصص ‪ stack‬فصصصي حفصصصظ قيصصصم‬

‫جلت التي تتعامل معها المهمة‪.‬‬ ‫الممس ك‬

‫يجب النتباه إلى أمر هام وهو أن حجم الص ‪ stack‬لكل مهمة يقاس بالص ‪ word‬وليس بالص ‪ byte‬لذا‬

‫عندما نقول أن حجم الص ‪ stack = 150‬فهذا يعني أن الحجم الحقيقي في الذاكرة‬

‫‪stack size= 150 word = 150 * (4 byte “1 Word”) = 600 byte‬‬

‫) ) ‪( (size_t ) ( 1500‬‬

‫‪#define configTOTAL_HEAP_SIZE‬‬

‫الص ‪ Heap‬هي تقنيصة ‪ data-type‬تسصصتخدم أنظمصصة ‪ RTOS‬لتخصصيص ذاكصصرة مرنصصة )قابلصصة للزيصصادة(‬ ‫لكل مهمة تعمل في نظصام التشصصغيل‪ .‬يتصم اسصصتخدام هصذه التقنيصصة فصي حفصظ جميصصع المتغيصرات أو‬

‫الثوابت المستخدمة في كل مهمة‪.‬‬

‫‪259‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫يتصصم تحديصصد هصصذا الرقصصم بصصصورة أساسصصية علصصى حسصصب حجصصم الصصذاكرة العشصصوائية الكليصصة للممتحككصصم‬

‫الصصصدقيق ويجصصب النتبصصاه أن الرقصصصم ‪ 1500‬يسصصصاوي قيمصصة الصصذاكرة بالبصصصايت ‪ byte‬وهصصذا يعنصصصي أن‬

‫ذاكرة الص ‪ heap‬هنا تساوى الخامس كيلو بايت تقريباا‪.‬‬

‫يمكن تحديد هذا الرقم بما هو إجمالي الذاكرة العشوائية للممتحككصم الصدقيق مصع مراعصصاة أن نظصام‬ ‫‪ freeRTOS‬يحتصصاج نحصصو ‪ 300‬إلصصى ‪ 400‬بصصايت لتشصصغيل الصصص ‪ kernel‬بينمصصا يمكصصن تخصصصيص بصصاقي‬

‫الذاكرة للمهمات المختلفة‪.‬‬

‫المثلة التالية هي لقيم الص ‪ heap‬للمتحكمات المختلفة‬ ‫•‬ ‫•‬

‫الممتحككم ‪ ATmega16‬يمتلك ‪SRAM = 1 Kbyte‬‬ ‫مساحة الص ‪ heap‬يفضل أن تكون ‪ 0.8‬كيلوبايت )‪.(800‬‬

‫•‬

‫الممتحككمات ‪ ATmega32/328‬تمتلك ‪SRAM = 2 Kbyte‬‬

‫•‬

‫مساحة الص ‪ heap‬يفضل أن تكون واحد ونصف كيلوبايت )‪(1500‬‬

‫•‬

‫الممتحككم ‪ atmega644‬يمتلك ‪SRAM = 4 Kbyte‬‬

‫•‬

‫مساحة الص ‪ heap‬يفضل أن تكون ‪ 3.5‬كيلوبايت )‪(3584‬‬

‫•‬

‫الممتحككم ‪ atmega1284‬يمتلك ‪SRAM = 16 Kbyte‬‬

‫•‬

‫مساحة الص ‪ heap‬يفضل أن تكون ‪ 15.5‬كيلوبايت )‪(15360‬‬ ‫بذلك نكون قد انتهينا من أهم العدادات للنظام‬

‫يمكنك أن تتعلم حول باقي العدادات من المرجع المفصل لملف ‪ FreeRTOSCOnfig.h‬على‬ ‫الرابط التالي ‪http://www.freertos.org/a0019.html‬‬

‫ثالثاا ‪ :‬تعديل ‪) serial.c‬اختياري – غير مطلوب(‬ ‫يصصصوفر نظصصصام ‪ FreeRTOS‬ملصصصف ‪ serial.c‬وهصصصو ‪ driver‬لتشصصصغيل الصصصص ‪ UART‬داخصصصل نظصصصام التشصصصغيل‬ ‫ويعتصبر متوافصق مصع معظصم ممتحككمصات ‪ AVR 8 bit‬لكصن يحتصاج بعصض التعصديلت البسصيطة وه ي‬

‫‪260‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫جلت الداخليصصة المسصصتخدمة فصصي الملصصف )أيضصصاا بسصصبب اختلف الممتحككمصصات‬ ‫تغييصصر أسصصماء الممسصص ك‬ ‫جلت مثل ‪ UCSRB‬أدصبح ‪ UCSR0B‬أو ‪.(UCSR1B‬‬ ‫الحديثة عن القديمة في تسمية الممس ك‬

‫التعديلت المقترحة )على حسب الممتحككم المستخدم( – يجب مراجعة دليل البيانات الجزء‬

‫جلت‬ ‫الخاص بالص ‪ USART‬لمعرفة أسماء الممس ك‬

‫جلت‬ ‫مثصال‪ :‬تعصديل الصص ‪ driver‬ليتوافصق مصع الممتحككصم ‪) atmega328‬يجصب اسصتبدال جميصع الممسص ك‬ ‫بالسماء الصحيحة لها(‪.‬‬

‫‪UCSRB -> UCSR0B‬‬ ‫‪UCSRC -> UCSR0C‬‬ ‫‪UBRRL -> UBRR0L‬‬ ‫‪UBRRH -> UBRR0H‬‬ ‫‪UDR -> UDR0‬‬ ‫ملحظة‪ :‬لن يتم استخدام هذا الملف في جميع المثلة الموجودة في الكتاب والتعديلت‬ ‫المذكورة بالعلى اختيارية في حالة أنك تريد استخدام الص ‪ UART‬في مشاريعك الخادصة‬

‫رابعاا ‪ :‬تعديل ‪makefile‬‬

‫التعصصصصديلت فصصصصي هصصصصذا الملصصصصف مرتبطصصصصة بمسصصصصتخدمي نظصصصصام ‪ Linux‬أو أي شصصصصخص ميسصصصصتخلدم الصصصصص‬ ‫‪ toolchain‬مباشصصرة دون اسصصتخدام بيئصصة برمجصصة متكاملصصة مثصصل )‪ ،IDE (ATmel studio‬يمكنصصك‬

‫قراءة الملحق الخاص بعملية ‪ compiling using makefile‬لتتعرف أكثر على هذه التقنية‪.‬‬

‫يوجد الملف ‪ makefile‬في نفس مجلد ‪ Demo‬ويحتوي على بيانات الممتحككم والمبرمجة الصصتي‬ ‫سيتم استخدامها‪ ،‬حيث يجب ضبط هذه العدادات لتتوافق مع الممتحككم المستخدم‪.‬‬

‫تغيير الممتحككم‬ ‫فصصي بدايصصة الملصصف سصصتجد السصصطر الصصبرمجي ‪ MCU = atmega323‬قصصم بتغييصصره لسصصم الممتحككصصم‬ ‫المطلوب مثل ‪ ATmega16‬أو ‪ ATmega32‬أو ‪ atmega1284‬كما في الصورة التالية‬

‫‪261‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫تعديل المكتبات الممضافة‬ ‫فصصي الجصصزء الخادصصصة بالصصص ‪ compiling‬سصصنجد أن ملصصف ‪ makefile‬الفتراضصصي يتضصصمن العديصصد مصصن‬ ‫المجلصصدات الصصتي تحتصصوي جميصصع المكتبصصات المطلوبصصة لتشصصغيل نظصصام ‪ ،FreeRTOS‬يمكنصصك إضصصافة‬

‫مكتباتك الخادصة أو مسح المكتبات التي ل تحتاجها من هذا الجزء‪.‬‬

‫فصصصي المثلصصصة المصصصذكورة فصصصي الكتصصصاب ل داعصصصي لضصصصافة كصصصل هصصصذه المكتبصصصات لصصصذا سصصصنقوم بمسصصصحها‬

‫واستبدالها بالقائمة التالية فقط‬

‫المكتبات الممضافة بعد التعديل‬

‫‪262‬‬

‫‪SRC‬‬ ‫\=‬ ‫\ ‪main.c‬‬ ‫\ ‪$(SOURCE_DIR)/tasks.c‬‬ ‫\ ‪$(SOURCE_DIR)/queue.c‬‬ ‫\ ‪$(SOURCE_DIR)/list.c‬‬ ‫\ ‪$(SOURCE_DIR)/croutine.c‬‬ ‫\ ‪$(SOURCE_DIR)/timers.c‬‬ ‫\ ‪$(SOURCE_DIR)/portable/MemMang/heap_1.c‬‬ ‫‪$(PORT_DIR)/port.c‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫تعديل الممبرمجة‬ ‫هنا سنقوم باختيار الممبرمجة المستخدمة في حرق ملف الهيكس‪ ،‬ابحث عن العبارة التالية‬ ‫‪AVRDUDE_PROGRAMMER = stk500‬‬ ‫شخصصصصصياا أسصصصصتخدم ‪ usbasp‬لصصصصذا سصصصصأقوم باسصصصصتبدال ‪ stk500‬بكلمصصصصة ‪) usbasp‬اسصصصصتبدلها باسصصصصم‬

‫الممبرمجة التي لديك إذا كانت مختلفة عن ‪ (usbasp‬كما في الصورة التالية‬

‫ملحظة‪ :‬في حالة أنك ستستخدم ‪ usbasp‬يجب أن تمسح الخيار‬ ‫)‪-P $(AVRDUDE_PORT‬‬ ‫أمصصا فصصي حالصصة اسصصتخدام أي مبرمجصصة أخصصرى تمتلصصك بصصورت علصصى نظصصام وينصصدوز أو لينكصصس مثصصل‬ ‫‪ usbTiny ISP‬أو ‪ AVRISP mkII‬فيجصصصصصصب أن تحصصصصصصدد رقصصصصصصم البصصصصصصورت فصصصصصصي الخيصصصصصصار المسصصصصصصمى‬ ‫‪AVRDUDE_PORT‬‬

‫‪263‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫‪ 11.7‬المثال اﻷول ‪:‬‬

‫‪Blinking 3 leds with 3 tasks‬‬

‫يأتي نظام ‪ FreeRTOS‬بمثال برمجي جاهز لختبصار تعصصدد المهصصام لكنصصه معقصد قليلا لصذا أفضصصل أن‬

‫نبصصدأ مصصع مثصصال أبسصصط و أكصصثر وضصصوحاا وهصصو عبصصارة عصصن تشصصغيل ‪ 3‬ليصصدات مختلفصصة كصصل منهصصا تعمصصل‬ ‫بتوقيت مختلف عن الخصرى‪ .‬اللي دات متصصلة بصالترتيب علصى ‪ PB0, PB1, PB2‬كمصا هصو موضصح‬

‫فصصي الصصصورة التاليصصة )المثصصال تصصم باسصصتخدام ‪ ATmega16‬ويمكصصن اسصصتخدام ‪ ATmega32‬بنفصصس‬

‫التودصيلت أيضاا(‪.‬‬

‫مخطط الدائرة‬

‫قصصم بفتصصح الملصصف ‪ main.c‬فصصي مجلصصد ‪ Demo‬وامسصصح الكصصواد البرمجيصصة الموجصصودة بصصه واسصصتبدلها‬

‫بالكواد التالية‬

‫ملحظة‪ :‬الكواد مرفقة في الملف ‪FreeRTOS Examples/blinking_3_leds.c‬‬

‫أيضاا يمكنك استبدال الملف مباشرة بالملف ‪ blinking_3_leds.c‬مع تغير اسمه إلى‬ ‫‪ main.c‬ليصبح هو الملف الرئيسي الذي سيتم ترجمته‬

‫‪264‬‬

RTOS ‫ أظنظمة الوقت الحدقيدقي‬.11 .............................................................................................. …

‫الـكود‬

#define F_CPU 8000000UL #include #include /* FreeRTOS files. */ #include "FreeRTOS.h" #include "task.h" #include "croutine.h" /* Define all the tasks */ static void ledBlinkingtask1(void* pvParameters); static void ledBlinkingtask2(void* pvParameters); static void ledBlinkingtask3(void* pvParameters); int main(void) { /* Call FreeRTOS APIs to create tasks, all tasks has the same priority "1" with the same stack size*/ xTaskCreate( ledBlinkingtask1, ( signed char * ) "LED1", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( ledBlinkingtask2, ( signed char * ) "LED2", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( ledBlinkingtask3, ( signed char * ) "LED3", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); // Start the RTOS kernel vTaskStartScheduler(); /* Do nothing here and just run infinte loop */ while(1){}; return 0; }

265

RTOS ‫ أظنظمة الوقت الحدقيدقي‬.11 .............................................................................................. … static void ledBlinkingtask1(void* pvParameters){ /* Define all variables related to ledBlinkingtask1*/ const uint8_t blinkDelay = 50 ; /* make PB0 work as output*/ DDRB |= (1<
//toggle PB0

vTaskDelay(blinkDelay); //wait some time } } static void ledBlinkingtask2(void* pvParameters){ /* Define all variables related to ledBlinkingtask2*/ const uint8_t blinkDelay = 150; /* make PB1 work as output*/ DDRB |= (1<
//toggle PB0

vTaskDelay(blinkDelay); //wait some time } }

266

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬ ‫{)‪static void ledBlinkingtask3(void* pvParameters‬‬ ‫‪/* Define all variables related to ledBlinkingtask3*/‬‬ ‫;‪const uint16_t blinkDelay = 600‬‬ ‫‪/* make PB2 work as output*/‬‬ ‫;)‪DDRB |= (1<
‫;)‪PORTB ^= (1<
‫‪vTaskDelay(blinkDelay); //wait some time‬‬ ‫}‬ ‫}‬ ‫دصورة للملف ‪ main.c‬بعد تعديل الكواد‬

‫بعصصد النتهصصاء مصصن جميصصع التعصصديلت احفصصظ الملصصف ثصصم قصصم بفتصصح سصصطر الوامصصر فصصي نفصصس المجلصصد‬ ‫واكتصصصب المصصصر ‪ make‬لتبصصصدأ عمليصصصة الترجمصصصة‪ ،‬إذا تمصصصت بنجصصصاح سصصصتظهر نتائصصصج مشصصصابهه للصصصصورة‬

‫التالية‪:‬‬

‫‪267‬‬

‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬ ‫… ‪..............................................................................................‬‬

‫الن يمكنك استخدام ملف الهيكس الناتج من عملية الترجمة سواء فصصي تجربصصة الصصص ‪simulation‬‬

‫على برنامج بروتس أو تجربة الملف مباشرة على الممتحككم الدقيق ‪.ATmega16‬‬

‫في حالة استخدام ممتحككم أخر مثل ‪ ATmega32‬أو ‪ atmega328‬ل تنسى أن تغير العدادات‬ ‫الخادصة بالملف ‪ – makefile‬كما هو مذكور في الخطوات في بداية الفصل‬ ‫ملحظة‪ :‬بالرغم من إمكانية تصميم النظمة الص ‪ Hard Real time‬أو ‪Firm Real time‬‬

‫بإستخدام الممتحككمات الدقيقة مع ‪ RTOS‬إل أنه عادة ما يتم استخدام تقنية الص ‪ FPGA‬أو الص‬ ‫‪ ASIC‬لتصميم هذه النظمة حيث تتمتع هذه التقنيات بالقدرة على معالجة العديد من‬

‫المهمات المختلفة والستجابة الفائقة لها جميعاا في نفس الوقت‪ .‬بينما الممتحككمات الدقيقة ل‬ ‫تستطيع أن تشغل أكثر من مهمة في نفس اللحظة حتى وإن كان باستطاعتها التبديل بين‬

‫المهمات بإستخدام الص ‪ RTOS‬وهذا لن أغلب الممتحككمات الدقيقة تمتلك نواة معالجة واحدة‬ ‫‪Single CPU core‬‬

‫‪268‬‬

‫الملحقات‬

‫” االتعليم أقوى سلاح يمكنك استخدامه لتغيير العالم ‟‬

‫نيلسون مانديلا‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬

‫✔‬

‫تنصيب واستخدام برنامج ‪ CodeBlocks‬كبديل للص ‪ATmel Studio‬‬

‫✔‬

‫ترجمة الملفات باستخدام ‪MakeFile‬‬

‫✔‬

‫رفع ملف الص ‪ Hex‬على المتحكم الدقيق‬

‫✔‬

‫كيف تستخدم لوحة آردوينو لتعلم برمجة الص ‪AVR‬‬

‫‪270‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫مملحق ‪ :‬تنصيب برنامج ‪ CodeBlocks‬على نظام ويندوز‬

‫يعتصصبر برنامصصج ‪ CodeBlocks‬مصصن أفضصصل بيئصصات البرمجصصة المخصصصصة للمشصصاريع الصصتي تكتصصب بلغصصة‬ ‫السصصصي أو السصصصي ‪ ++‬كمصصصا أنصصصه مجصصصاني ومتصصصوفر لجميصصصع أنظمصصصة التشصصصغيل )وينصصصدوز – لينكصصصس –‬

‫مصصاك(‪،‬ويعتصصبر بصصديل أخصصف وأسصصرع بكصصثير مصصن ‪ ATmel Studio‬ومناسصصب لكصصل مصصن يريصصد أن يكتصصب‬ ‫برامج بلغة السي عامة سواء للمتحكمات الدقيقة أو للحواسيب‪.‬‬ ‫يعتمصصصد البرنامصصصج بصصصصورة أساسصصصية علصصصى المصصصترجم الشصصصهير ‪ GCC‬والصصصذي سنسصصصتخدم الدصصصصدارة‬ ‫المشتقة منه وهصي ‪ avr-gcc‬كمصا سصنرى فصي الخطصوات القادمصة‪ .‬فصي البدايصة قصم بتحميصل ملفصات‬

‫التنصصصيب الخادصصصة بالبرنامصصج عصصبر التصصوجه إلصصى موقصصع ‪ CodeBlocks‬الرسصصمي مصصن خلل الرابصصط‬

‫التالي‪:‬‬ ‫‪http://www.codeblocks.org/downloads‬‬

‫اضصصغط علصصى زر تحميصصل ملفصصات التشصصغيل لتظهصصر لصصك دصصصفحة تحتصصوي ‪ 3‬خيصصارات للتحميصصل‪ ،‬قصصم‬ ‫بتنزيصصصل الخيصصصار الصصصذي يحمصصصل اسصصصم ‪ codeblocks-13.12mingw-setup‬والصصصذي يعنصصصي أن برنامصصصج‬

‫‪ CodeBlocks‬مضصصاف إليصصه جميصصع ملفصصات المصصترجم ‪) gcc-compiler‬قصصد يختلصصف الرقصصم ‪12-13‬‬

‫الموجود في اسم البرنامج إذا تم إدصدار نسخة جديدة(‪.‬‬

‫‪271‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫بعد النتهاء من التحميل ابدأ بتنصيب الملف وتأكد من وضع علمة "دصح" على جميع خيارات‬

‫التنصيب الخادصة بالبرنامج )هذه الخيارات تعني تنصيب جميع ملحقات برنامج ‪CodeBlocks‬‬ ‫كما في الصور التالية‪:‬‬

‫‪272‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫تنصيب برنامج ‪WinAVR‬‬

‫بعصصد النتهصصاء مصصن تنصصصيب برنامصصج ‪ CodeBlocks‬سصصنقوم بتنزيصصل الصصص ‪ WinAVR Toolchain‬الصصتي‬ ‫تحتصصوي علصصى المصصترجم مفتصصوح المصصصدر ‪ AVR-GCC‬بالضصصافة إلصصى جميصصع المكتبصصات البرمجيصصة ‪+‬‬

‫برنامج ‪avrdude‬‬

‫‪http://sourceforge.net/projects/winavr/fles‬‬ ‫اضغط على رابط التحميل الموجود بأعلى الصفحة كما في الصورة التالية‪:‬‬

‫بعد النتهاء من التحميل قم بتنصيب البرنامج كما في الخطوات السصابقة‪ .‬والن سصنقوم بتنصزل‬

‫برنامج الواجهة الرسصصومية ‪) AVRDUDESS‬إذا لصصم تكصصن قمصصت بتحميلهصصا مسصصبقاا( تصصذكر أن برنامصصج‬ ‫يعمل ‪ avrdude‬ل يعمل إل من خلل سطر الوامر فقط لذا سنحتاج ‪. AVRDUDESS‬‬ ‫‪http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude/‬‬ ‫ملحظة‪ :‬تتوفر العديد من البرامج الخرى التي تعمل كواجهة رسومية غير ‪AVRdudess‬‬

‫مثل‪ avrdude-gui :‬أو ‪ BitBurnner‬أو ‪ AVR8 Burn-O-Mat‬أيضاا هناك العديد من البرامج‬ ‫الخرى غير ‪ avrdude‬متوفرة لنظام ويندوز لكني فضلت ‪ avrdude‬لنه يأتي مع الص‬ ‫‪ toolchain‬ويعمل على جميع أنظمة التشغيل‬

‫‪273‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫الن يمكنك البدء في كتابة البرامج لمتحكمات الص ‪ ، AVR‬لنأخذ الص ‪ Blinking Led‬كمثال‬

‫قم بتشغيل برنامج ‪ CodeBlocks‬واختر ‪ New Project‬ومن الصفحة التي سصصتظهر اخصصتر ‪AVR‬‬

‫‪ project‬كما في الصور التالية‪:‬‬

‫قصصم بكتابصصة اسصصم المشصصروع ‪ ATmega16_blinking_led‬واخصصتر المكصصان الصصذي تريصصد أن تحفصصظ بصصه‬ ‫ملفات المشروع كما في الصورة التالية‪.‬‬

‫‪274‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫في الصفحة التالية قم بالتأشصير علصى خيصصار ‪ Create Release‬فقصط وألصغ التأشصصير علصصى ‪Create‬‬ ‫‪“Debug” configuration‬‬ ‫سصصصتظهر دصصصصفحة جديصصصدة خادصصصصة بإعصصصدادات الممتحككصصصم الصصصدقيق‪ ،‬مصصصن القائمصصصة العلويصصصة اخصصصتر نصصصوع‬

‫الممتحككصصم ‪ ATmega16‬ثصصم قصصم بتغيصصر سصصرعة تشصصغيل المعالصصج إلصصى الصصتردد المطلصصوب مثصصل ‪ 8‬ميجصصا‬ ‫هرتز بدل من ‪ 16‬ميجا وذلك عبر كتابة الرقم ‪8000000‬‬

‫الن أدصصصصصبح كصصصصل شصصصصيء جصصصصاهز لنكتصصصصب أول‬ ‫برنامصصصصصصصصصصصصج‪،‬حيصصصصصصصصصصصصث سصصصصصصصصصصصصنجد أن برنامصصصصصصصصصصصصج‬

‫‪ CodeBlocks‬قام بعمل ملفيصصن الول يسصصمى‬ ‫‪ main.c‬و الثاني هو ‪ – fuses.c‬سنتعامل مصصع‬ ‫الملف الول فقصصط وهصو الملصصف الصصذي سصصنكتب‬

‫فيه البرامج الخادصة بالتحكم‪ ،‬أمصصا الفيصصوزات‬ ‫فيمكنصصك أن تقصصوم باعصصدادها مباشصصرة كمصصا هصصو‬

‫مذكور في فصل الفيوزات‪.‬‬ ‫للبصصدء قصصم بالضصصغط مرتيصصن علصصى ملصصف ‪ main.c‬مصصن القائمصصة الجانبيصصة للبرنامصصج لتظهصصر الصصصفحة‬

‫‪275‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫الخادصة بكتابة الكود البرمجي وبعد النتهاء من كتابة الكود اضغط على زر ‪ Build‬من الشريط‬

‫العلوي للبرنامج )الزر الذي يمتلك رمز الترس( كما في الصورة التالية‪:‬‬

‫ستظهر في القائمة السفلية للبرنامج عبارة تدل على نجاح عملية التجميع ‪ Compilation‬بصصدون‬

‫أخطاء ‪ . errors‬الن يصبح لدينا ملف الصصص ‪ hex‬الصصذي يمكننصصا اسصصتخدامه إمصصا لبرمجصصة الممتحككصصم أو‬ ‫يمكننا استخدامه مع برنامج المحاكاة بروتس ‪ Protues‬لعمل محاكاة للممتحككم ‪ATmega16‬‬

‫‪276‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫مملحق ‪ :‬ترجمة الملفات باستخدام‬

‫‪makefile‬‬

‫متعد هذه الطريقة هي أسرع اسلوب لترجمة الملفات المكتوبصة بلغصة السصي وتحويلهصصا إلصى الصصيغ‬

‫التنفيذية مثل ملفات ‪) hex‬أو حتى ترجمة البرامج التقليدية الخادصة بالحاسب اللي(‪.‬‬ ‫تعتمصصصد هصصصذه الطريقصصصة علصصصى اسصصصتخدام المصصصترجم ‪ avr-gcc‬مباشصصصرة دون الحاجصصصة لوجصصصود أي بيئصصصة‬ ‫تطصصصوير مثصصصل ‪ Atmel studio‬أو ‪ .Codeblocks‬كمصصصا تمتصصصاز بأنهصصصا معيارينننة ودصصصصالحة للعمصصصل علصصصى‬ ‫جميصصع نظصصم التشصصغيل ‪ windows, linux, mac‬وبسصصبب عصصدم الحاجصصة لوجصصود ‪ IDE‬نجصصد أن هصصذه‬ ‫الطريقصصة هصصي الخصصف علصصى الطلق لصصذا ل تسصصتعجب إذا وجصصدت أن معظصصم المشصصاريع الموجصصودة‬

‫على النترنت تستخدم هذه الطريقة في الترجمة‪.‬‬

‫شخصصصي اا أسصصتخدم هصصذ السصصلوب فصصي جميصصع المشصصاريع الصصتي أعمصصل عليهصصا حيصصث اسصصتخدم محصصرر‬

‫النصصصصوص ‪ ++NotePad‬أو ‪ sublime‬لكتابصصصة الملفصصصات بلغصصصة السصصصي ثصصصم أحولهصصصا إلصصصى ملفصصصات ‪hex‬‬ ‫باستخدام الص ‪) makefile‬سواء على ويندوز أو لينكس(‪.‬‬

‫التجربة الأولى‬ ‫فصصي البدايصصة تأكصصد مصصن وجصصود الصصص ‪ toolchain‬علصصى جهصصازك )علصصى نظصصام وينصصدوز تسصصمى ‪WinAVR‬‬

‫‪ (toolchain‬ويمكن تحميلها من الرابط التالي‬

‫‪http://sourceforge.net/projects/winavr/files‬‬ ‫لختبار تنصيب الص ‪ toolchain‬بصورة دصحيحة‪ ،‬قم بفتح سطر اﻷوامر واكتب المر ‪make‬‬

‫• سطر الوامر على نظام ويندوز يسمى ‪ command prompt‬ويتم تشغيله بكتابصصة‬ ‫بالمر ‪ cmd‬من قائمة ‪start‬‬

‫• سطر الوامر على نظام لينكس يسمى ‪) terminal‬الطرفية(‬ ‫إذا كانت الص ‪ toolchain‬منصبة بصورة دصحيحة يفترض أن تظهر الرسالة التالية‬

‫‪make: *** No targets specified and no makefile found. Stop.‬‬

‫‪277‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫والن لنقصصم بتجربصصة الملصصف الول وهصصو المثصصال ‪ ،blinking led‬قصصم بفتصصح المجلصصد المسصصمى ‪compile‬‬ ‫‪ with make file‬لتجد بداخله ملفين وهما‬

‫‪main.c‬‬ ‫‪makefile‬‬ ‫الملف ‪ main.c‬يحتوي على المثال الول في الكتاب ‪ blinking led‬أما الملف ‪ makefile‬فيحتصصوي‬ ‫علصصصى جميصصصع العصصصدادات الخادصصصصة بتحويصصصل الملصصصف ‪ main.c‬إلصصصى ملصصصف الهيكصصصس‪ .‬قصصصم بفتصصصح الملصصصف‬

‫باستخدام أي محرر نصوص مثل ‪++notepad‬‬

‫يمتلك هذا الملف الكثير من العدادات وأهمها هي المجموعة التالية‪:‬‬

‫‪278‬‬

‫‪MCU=ATmega16‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫هنا يتم وضصع اسصصم الممتحككصم الصدقيق المسصتخدم والصذي سصيتم تولي د ملصف الهيكصس خصيصصاا لصه‬

‫)مع ملحظة أن ملفات الهيكس تختلف من ممتحككم لخر(‪.‬‬

‫‪PROGRAMMER_MCU=m16‬‬ ‫هذا الخيار يحصدد اسصم الممتحككصم الصذي سصيرفع عليصه ملصف الهيكصس باسصتخدام برنامصصج ‪avrdude‬‬

‫ويجب تسميته بالحرف ‪ m‬ثم رقم الممتحككم فمثل‬

‫‪ATmega16 = m16‬‬ ‫‪ATmega32 = m32‬‬ ‫‪atmega328p = m328p‬‬

‫•‬ ‫•‬ ‫•‬

‫‪PROJECTNAME=blinkingled‬‬ ‫هذا هو اسم المشروع وسيكون اسم ملف الهيكس الذي سيتم توليده‬

‫‪PRJSRC=main.c‬‬ ‫اكتب هنا اسم الملف الذي يحتوي على الكود البرمجي المراد تحويله إلى ملف هيكس‪.‬‬ ‫احفصصظ الملصصف ثصم تصصوجه إلصصى سصصطر الوامصصر وحصصول مسصصار المجلصصد الحصصالي إلصصى نفصصس مكصصان الملفيصصن‬

‫‪ main.c‬و ‪ makefile‬فمثلا‪ -‬المسار الذي استخدمه هو‬

‫‪C:\Users\Abdallah\Documents\Blinking Led Example‬‬

‫قصصصم بكتابصصصة المصصصر ‪ ”cd “path‬واسصصصتبدل كلمصصصة ‪ path‬بالمسصصصار ثصصصم اضصصصغط ‪ Enter‬لتجصصصد أن سصصصطر‬ ‫الوامر انتقل إلى المجلد المطلوب كما في الصورة التالية‬

‫‪279‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫والن اكتصصب المصصر ‪ make hex‬لتجصصد أن المصصترجم بصصدأ عمليصصة تحويصصل الملصصف ‪ main.c‬إلصصى الملصصف‬ ‫‪ blinkingled.hex‬كما في الصورة التالية‬

‫شكل المجلد بعد أن تم توليد الملف ‪blinkingled.hex‬‬

‫مسح الملفات من خلال ‪make‬‬ ‫بافتراض أنصك تريصصد مسصح جميصع الملفصصات الصصتي نتجصت مصن عمليصصة الترجمصة فيمكنصك ذلصك بسصهولة‬ ‫باستخدام المر ‪make clean‬‬ ‫ملحظة‪:‬ملف ‪ makefile‬المرفق مع الكتاب هو نسخة مبسطة من هذا النوع من الملفات وقد‬ ‫تجد في مشاريع أخرى نفس الملف ولكن بإعدادات أكثر كما سنرى في الفصل الخاص بص ‪Real‬‬ ‫‪Time Operating system‬‬ ‫يستحسن أن تعتاد وتتقن ترجمة الملفات بهذه الطريقة لنها تعتبر الطريقة المعتمدة في‬ ‫مجتمعات المطورين وستجد الكثير من المشاريع على النترنت تستخدم هذه الطريقة‪.‬‬

‫‪280‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫مملحق ‪ :‬رفع ملف الـ ‪ Hex‬على الممتحكك م الدقيق‬ ‫كيف توصل المربرمجة بالمتحك م‬

‫تمتلصصصك أغلصصب مبرمجصصات الصصصص ‪ AVR‬إمصصا ‪ 6‬أو ‪ 10‬أطصصراف)تسصصصمى هصصذه الطصصرف ‪(ISP connector‬‬ ‫وتكون مرتبه كما هو موضح بالصورة التالية‬

‫مثال على ذلك المبرمجة ‪USBasp‬‬

‫لبرمجة الممتحككم الدقيق كل ما عليك فعلصصه هصصو‬ ‫تودصيل كل طرف في المبرمجة بما يوازية في‬

‫الممتحككصصم الصصدقيق وهصصذا يشصصمل الطصصراف ‪MOSI‬‬ ‫)‪– MISO – SCK – RST(RESET‬‬ ‫والطصرف ‪ 5V‬فصي المبرمجصة يتصصل بالصصص ‪ VCC‬مصع‬

‫‪ AVCC‬وكصصصصذلك يتصصصصم تودصصصصصيل كصصصصل اطصصصصراف الصصصصص‬ ‫‪ GND‬ببعضها )الممتحككم والمبرمجة(‪.‬‬

‫‪281‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫بعد النتهصاء مصن تودصصيل دائصرة الممتحككصم علصى لوحصة التجصارب ‪ Breadboard‬سصنقوم برفصع ملصف‬

‫الهيكصصس باسصصتخدام برنامصصج ‪ avrdude‬وذلصصك مصصن خلل الواجهصصة الرسصصومية ‪ .AVRdudess‬فصصي‬ ‫البداية قم بفتح البرنامج ‪AVRdudess‬‬

‫اختر نوع الممبرمجة المتوفرة لديك مثل ‪ USBasp‬كما هو موضح في الصورة التالية‪:‬‬

‫بعصصد اختيصصار الممبرمجصصة قصصم باختيصصار نصصوع الممتحككصصم الصصدقيق )مصصن القائمصصة الموجصصود علصصى الجصصانب‬

‫اليمصصن مصصن البرنامصصج( وفصصي حالصصة أن الممتحككصصم يعمصصل بصصدائرة المذبصصذب الصصداخلي بسصصرعة ‪ 1‬ميجننا‬

‫يجب أن تغير سرعة رفع البرنامج لتصبح ‪ 93‬كيلوبايت في الثانية أما إذا كان الممتحككم يعمصصل‬

‫‪282‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫باستخدام دائرة مذبذب خارجي مثل الكريستالة ‪ 16‬ميجا فيمكنك أن تترك خيار سصصرعة الرفصصع‬ ‫يساوي الخامس ميجا كما هو موضح في الصورة التالية‪.‬‬

‫ملحظة‪ :‬يستطيع برنامج ‪ AVRdudess‬أن يتعرف على الممتحككم بصورة تلقائية وذلك عبر‬ ‫الضغط على زر ‪ Detect‬الموجود على جانب الشاشة اليسر‪.‬‬ ‫والن اختر ملف الهيكس الذي يحتوي على البرنامج المطلوب رفعة إلى الممتحككم الدقيق‬

‫وأخيراا قم بالضغط على زر ‪ Program‬الموجود بأسفل شاشة البرنامج‬

‫‪283‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫استخدام برنامج ‪ avrdude‬بدون واجهة رسومية‬ ‫بالرغم من وجود العديد من الواجهصات الرسصومية لبرنامصج ‪ avrdude‬إل أنصه بالسصصاس يعمصل مصصن‬ ‫خلل سطر الوامر )سواء ‪ cmd‬على ويندوز أو الص ‪ shell‬على نظام لينكس(‪.‬‬ ‫قصصد يبصصدو اسصصتخدام ‪ avrdude‬مزعجصصاا أو مخيفصصاا لمصصن ل ميسصصتخلدم نظصصام لينكصصس و ليصصس علصصى‬ ‫احتكاك بسطر الوامر إل أنه سنكتشف سوية مدى سهولة استخدامه‪.‬‬

‫‪284‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫أهم الخيارات المتاحة‬

‫اسنننم المبرمجنننة ‪ :‬بكتابصصصة ‪ -c‬كخيصصصار فصصصي سصصصطر المصصصر ‪ avrdude‬لتحديصصصد نصصصوع المبرمجصصصة مثلا ‪:‬‬ ‫‪ ..– arduino – avrisp – usbasp‬إلخ‪.‬‬ ‫الممتحككم المنراد برمجت ه ‪ :‬بكتابصة ‪ -p‬كخيصار فصي سصطر المصر ‪ avrdude‬لتحديصد اسصصم الممتحككصم‪.‬‬ ‫سننرعة التصننال ‪ :‬بكتابصصة ‪ -b‬كخيصصار فصصي سصصطر المصصر ‪ ،‬و هصصذا الخيصصار مهصصم لتأكيصصد كصصون سصصرعة‬

‫السصصتقبال فصصي الكصصود المنفصصذ علصصى ممتحككصصم ” الممبرمجصصة” يسصصاوي سصصرعة ‪ avrdude‬لنصصه اختلف‬ ‫السرعتين سيؤدي إلى أخطاء في التزامن‪.‬‬

‫المنفذ التسلسلي ‪ :‬بكتابة ‪ -P‬كخيار في سطر المر ‪ .‬اسم المنفذ يتخلف من نظام تشغيل لخصر‬

‫فغالباا ما يكون من نمط ‪ dev/ttyACM‬بالنسبة للينكس و ‪ COM‬بالنسبة للويندوز ‪.‬‬

‫اﻷمننر التنفيننذي ‪ :‬بكتابصصة ‪ -U‬كخيصصار فصصي سصصطر المصصر ‪ ،‬و مصصن ثصصم تحديصصد المصصر بالصصصياغة التاليصصة ‪:‬‬ ‫‪ memtype:op:filename:format‬و يقصصصصد بصصصص ‪ format‬نصصصوع الملصصصف المسصصصتخدم حيصصصث يمكصصصن‬

‫اسصصتخدام الملفصصات مصصن نصصوع ‪ hex‬أو ‪.bin‬أمصصا ‪ filename‬فيتصصم اسصصتبدالها بأسصصم الملصصف‪ ،‬وكلمصصة ‪op‬‬

‫تعني ‪ operation‬وهي العملية المطلوب تنفيذها مثل ‪) read‬اقرأ الذاكرة( أو ‪) write‬أكتب فصصي‬ ‫الصصذاكرة( أو ‪ verify‬والصصتي تعنصصي التأكصصد مصصن أن محتصصوى الصصذاكرة يطصصابق ملصصف الهيكصصس الصصذي يتصصم‬ ‫تحديد أسمه في نفس المر‪.‬‬

‫خيارات مختلفة ‪ :‬من الظلم إختصار خيارات ‪ avrdude‬بهذه السطر القليلة و لكل خيصصار حالصصة‬ ‫استخدام خادصة و هي مشروحة بوضوح في كصتيب البرنامصصج و يمكصصن الطلع عليهصا مصن خلل‬

‫كتابة ‪ man avrdude‬على سطر الوامر في لينكس ‪.‬‬ ‫المقال السابق عن استخدام برنامج ‪ avrdude‬من سطر الوامر منقول من موقع عتاديات‬ ‫تحت رخصة المشاع البداعي ‪CC-BY-SA-NC‬‬

‫‪285‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫مملحق ‪ :‬كيف تستخدم لوحات آردوينو لتعلم برمجة‬

‫‪AVR‬‬

‫تعصصد لوحصصات آردوينصصو ‪ Arduino‬مصصن أرخصصص اللوحصصات التطويريصصة فصصي العصصالم حيصصث تبصصدأ أسصصعارها‬ ‫من ‪ 5‬دولر فحسب مثل لوحة ‪ .Arduino nano‬ومصا يميصز ه ذه اللوحصات أنهصا تعمصل بمتحكمصات‬ ‫‪ AVR‬وبالتحديد عائلة ‪) Atmega‬هناك لوحات آردوينو تعمل بعائلة ‪ ATTiny‬أيضاا(‪.‬‬

‫الحقيقة أن برنامج ‪ Arduino IDE‬ماهو إل المترجم الشهير ‪ AVR-GCC‬الذي نستخدمه في هذا‬ ‫الكتصصاب‪+‬الواجهصصة الرسصصومية الخادصصصة ببرنامصصج ‪ Processing‬ومضصصاف إليصصه العديصصد مصصن المكتبصصات‬

‫البرمجية من مشروع ‪ + Wiring‬بعض التعديلت البسيطة على برنامج ‪ .avrdude‬وهذا يجعل‬ ‫برنامج آردوينو متوافق تماماا مع البرامج المكتوبة بلغة الص ‪.ANSI – C‬‬

‫هناك أمر واحد يجب النتباه له عند التعامل مع لوحات آردوينو وهو "ترقيم اﻷطراف"‪ ،‬حيصث‬

‫نجصصد أن مصصصممي لوحصصات آردوينصصو لصصديهم أسصصلوب مختلصصف لصصترقيم أطصصراف ممتحككمصصات ‪Atmega‬‬

‫الموجصصودة علصصى اللوحصصات ول يتصصم اسصصتخدام أسصصماء البورتصصات مثصصل ‪ port A, port B‬وإنمصصا يتصصم‬ ‫استخدام ترقيم بسيط مثل ‪0,1,2,3‬‬

‫على أي حال هذا المر ل يمثل مشكلة فكل ما عليك معرفته هو أسماء الطراف عنصد برمجتهصا‪.‬‬ ‫لنأخذ لوحة آردوينو ‪ Uno‬كمثال )باعتبارها أشهر لوحات آردوينو(‪ .‬الصورة التالية تمثصصل ترقيصصم‬

‫أطراف الممتحككم ‪ ATmega328‬بكل من السلوب الدصلي )مثل ما هو مذكور فصصي دليصل البيانصصات‬ ‫‪ +‬ترقيم آردوينو(‪.‬‬

‫‪286‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬

‫كمصا نصرى فصي الصصورة السصابقة نجصد أن الصترقيم المكتصوب فصي المربعصات البرتقاليصة والحمصراء ه و‬

‫ترقم آردوينو بينما الترقيم المكتوب بالحروف الزرقاء هو الترقيم الدصلي للطراف ويعصصبر عصصن‬ ‫اسم البورت مثل ‪ D0‬تعني ‪.port D pin 0‬‬ ‫والن لنقم بكتابة برنامج ‪ Blinking Led‬على طريقة الن ‪ANSI – C‬‬ ‫ملحظة‪ :‬تحتوي معظم لوحات آردوينو على دايود ضوئي متصل بالطرف رقم ‪ 13‬وهو في‬ ‫الحقيقة الطرف ‪) PB5‬البورت ‪ – B‬الطرف الخامس(‪.‬‬

‫قصصم بفتصصح برنامصصج ‪ Arduino IDE‬وأكتصصب برنامصصج الصصص ‪ Blinking led‬كمصصا هصصو مشصصروح فصصي المثصصال‬ ‫الول فصصي الفصصصل الثصصالث مصصن الكتصصاب‪ .‬مصصع تغييصصر بسصصيطة وهصصو تعريصصف سصصرعة المعالصصج برقصصم ‪16‬‬

‫ميجا‬

‫‪#define F_CPU 16000000UL‬‬ ‫بعصصد النتهصصاء مصصن كتصصاب البرنامصصج قصصم بالضصصغط علصصى زر ‪ Upload‬لتجصصد أن برنامصصج ‪ Arduino‬قصصام‬ ‫‪287‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫بترجمة الملف وتحويله إلى ‪ Hex file‬كما هو موضح بالصورة التالية‬

‫إذا لصصم تكصصن تفضصصل اسصصتخدام برنامصصج آردوينصصو فصصي كتابصصة الكصصود فيمكنصصك أن تسصصتخدم برنامصصج‬ ‫‪ Atmel Studio‬مصصصصصع إضصصصصصافة الصصصصصدعم المباشصصصصصر للوحصصصصصات آردوينصصصصصو بسصصصصصهولة مصصصصصن خلل إضصصصصصافة‬

‫‪ visualmicro‬والتي تجعل برنامج ‪ Atmel studio‬يتعامل مع لوحات آردوينو مباشرة‬

‫‪http://www.visualmicro.com/page/Arduino-for-Atmel-Studio.aspx‬‬

‫‪288‬‬

‫‪ .12‬المملحدقات اﻹاضافية‬ ‫… ‪..............................................................................................‬‬ ‫أيضصصصاا يمكنصصصك اسصصصتخدام ملفصصصات ‪ makefile‬فصصي ترجمصصة الكصصصواد البرمجيصصصة وتحويلهصصصا إلصصصى ملصصصف‬

‫هيكصس )راجصع ملحصصق شصرح ‪ (makefile‬ثصم اسصتخدام برنامصصج ‪ ARVdudess‬لرفعهصا علصى لوحصات‬

‫آردوينو‬

‫أيضاا بامكانك استخدام لوحات آردوينو كمبرمجصصة ‪ Programmer‬لي ممتحككصصم ‪ AVR‬وذلصصك عصصبر‬ ‫برنامج ‪ArduinoISP + AVRdudess‬‬

‫ملحظة‪ :‬بامكانك أيضاا كتابة برامج بلغة السمبلي داخل برنامج‬

‫‪ Arduino IDE‬و التجربة التالية تشرح برنامج ‪ Blinking Led‬بلغة السمبلي‬ ‫‪https://ucexperiment.wordpress.com/2013/05/31/arduino-blink-using-gcc-inline‬‬‫‪/assembly‬‬

‫‪289‬‬

‫قائمة المراجع‬ .............................................................................................. …

‫قائمة المراجع‬

‫مراجع تعليمية عربية‬

(‫ وليد عيسى )أساسيات اللكترونيات من الصفر‬.‫دورة اللكترونيات العملية د‬ https://www.youtube.com/playlist?list=PLww54WQ2wa5rOJ7FcXxi-CMNgmpybv7ei --------------------------------------------------Bascom ‫ بإستخدام لغة‬AVR ‫دورة المهندس وليد بليد في شرح برمجة ممتحككمات‬ https://www.youtube.com/playlist? list=PLww54WQ2wa5qWSTU7MYqjN0jHNaWuoXUk --------------------------------------------------‫ وتحتوي على العديد من الدورات العربية عن النظم المدمجة ويتضصصمن‬ENG Unity ‫قناة شركة‬ Digital Circuits ‫ والتصميم الرقمي‬Altium ‫ و برنامج‬AVR ‫ذلك‬ https://www.youtube.com/user/ENGUnity/playlists --------------------------------------------------‫قناة عربية تحتوي على دورات فيديو مبسطة عن النظم المدمجة وتتضمن‬ C for Embedded System Micrcontroller Architectre https://www.youtube.com/channel/UCbZ7PLd5LAnje1hpyoiRW0A/playlists --------------------------------------------------CodeVision ‫ بإستخدام برنامج‬AVR ‫دورة تعلم برمجة‬ http://www.qariya.info/vb/showthread.php?t=81782 --------------------------------------------------‫موقع "عتادايات" يحتوي على مجموعة من المقالت المبسطة‬ http://www.atadiat.com/%D8%A7%D9%84%D9%82%D8%B3%D9%85%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D9%8A/

290

‫قائمة المراجع‬ .............................................................................................. …

‫مراجع تعليمية إنجليز ية‬

(‫ العملق )يعد من أفضل المراجع في العالم للنظم المدمجة‬AVR ‫مرجع‬ AVR Microcontroller and Embedded Systems: Using Assembly and C (Pearson Custom Electronics Technology) - Muhammad Ali Mazidi http://www.amazon.com/AVR-Microcontroller-Embedded-SystemsElectronics/dp/0138003319 --------------------------------------------------‫من أفضل المراجع التي تعلمك "كيفية تحويل متطلبات العميل إلى أفضل تصميم برنامج علصصى‬

"‫النظم المدمجة‬

An Embedded Software Primer http://www.amazon.com/Embedded-Software-Primer-David-Simon/dp/020161569X --------------------------------------------------‫ وتعتصصبر مصصن أفضصصل الصصدورات المبسصصطة‬،‫ درس مفصصصل‬55 ‫ فصصي‬AVR ‫ لتعلصصم‬NewBieHack ‫دورة‬ ‫والممتعة‬ https://www.youtube.com/playlist?list=PLE72E4CFE73BD1DE1 --------------------------------------------------FreeRTOS ‫المرجع الرسمي لنظام‬ Using the FreeRTOS Real Time Kernel - Standard Edition http://www.amazon.com/Using-FreeRTOS-Real-Time-Kernel/dp/1446169146/ ---------------------------------------------------

291

More Documents from "Alei El Din Ali"

Simply_avr.pdf
February 2021 0
January 2021 2
Answerkey-crypto.pdf
February 2021 0
Penawaran Bator.pdf
February 2021 1
February 2021 2
Lamaran.docx
January 2021 0