‫سلسلة ” تعلم ببساطة “‬

‫تهدف سلسلة كتب” تعلم ببساطة “ إلى توفير علوم اﻹلكترونيات الحديثة باللغة العربية‬
‫بصسسورة مجانيسسة ومفتوحسسة المصسسدر مسسع الحفاظ علسسى المبدأ السسساسي “البسسساطة” في شرح‬
‫المعلومات‪ ،‬جميع الكتب موجهة للعامة من هواة اﻹلكترونيات و طلبة الكليات الهندسة‪.‬‬

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

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

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

‫تجاري اا بأي دصورة مباشرة أو غير مباشرة‪ ،‬كما يجوز طباعة الكتاب وتوزيعة بشكل عام شرط أن يباع بسعر‬
‫التكلفة دون أي ربح‪.‬‬
‫المشاركةل بالمثل‪SA-‬ل إذا تم اشتقاق أي عمل من هذا الكتاب بصورة إلكترونية أو مادية مثل عمل‬
‫كتاب آخر أو محااضرة تعليمية ) أو حتى كورس متكامل( أو فيديو فيجب أن يتم بصورة مجانية و بنفس‬
‫الرخصة ) المشاع البداعي‪ :‬النسبة‪ ،‬المشاركة بالمثل‪ ،‬الغير تجارية(‪ .‬يمكنك التعرف أكثر على رخصة‬
‫المشاع البداعي من الموقع الرسمي ‪creativecommons.org‬‬
‫جميع كتب سلسلة "تعلم ببساطة" منشورة بنفس الرخصة‬
‫يمكنك تحميل السلسلة من الموقع ‪http://simplyarduino.com/?page_id=889‬‬
‫للتوادصل مع المؤلف‬
‫‪abdallah.ali.abdallah.elmasry@gmail.com‬‬
‫الغلف ممصمم بواسطة نور الدين – سوريا‬
‫‪http://fb.com/NourHamda.Portfolio‬‬
‫‪nouraldean.sy@gmail.com‬‬
‫عبدالله علي عبدالله‬
‫‪ 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 <avr/io.h>
#include <avr/delay.h>
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 <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬
‫{ )‪int main(void‬‬
‫;‪DDRA = 0b00000001‬‬
‫{ )‪while(1‬‬

‫البرنامج الرئيسي‬

‫;‪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‬ثصصم يكتصصب اسصصم المكتبصصة داخصصل‬

‫قوسين >‪<....‬‬

‫•‬

‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫المكتبة الول ‪ io.h‬هي المكتبة المسؤولة عن الص ‪ GPIO‬والتحكم بها وكصصذلك تسصصمية كصصل‬
‫مخرج باسم خاص به مثل ‪ PORTA‬أو ‪ PB0‬أو ‪ … PC1‬الصصخ )كمصصا سصصنرى بالتفصصصيل فصصي‬

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

‫المكتبة الثانية ‪ 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 <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪DDRA = 0b00000001‬‬

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

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

‫)‪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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬
‫)‪int main(void‬‬
‫{‬

‫تفعيل أول ‪ 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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪DDRA = 0b11111111‬‬
‫;‪DDRB = 0b11111111‬‬
‫)‪while(1‬‬
‫{‬

‫شغل جميع أطراف ‪// 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 <avr/io.h>
#include <util/delay.h>
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 <avr/io.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪DDRA =0b00000001‬‬
‫)‪while(1‬‬
‫{‬
‫)‪if (PINB == 0b00000001‬‬
‫};‪{PORTA = 0b00000001‬‬
‫‪else‬‬
‫};‪{PORTA = 0b00000000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬
‫قم بترجمة الكود ثصم اسصتخدم ملصف الهيكصس لمحاكصاة المشصروع‪ ،‬حيصث سصتجد أنصه عنصد الضصغط‬
‫على المفتاح سنجد الدايود الضوئي يبدأ بالضاءة ‪ Buttn press‬وعند ترك المفتصصاح ‪BUTTON‬‬
‫‪ release‬ينطفئ الدايود الضوئي‪.‬‬

‫شرح الـكود‬

‫بصصصصورة افتراضصصصية تعمصصل جميصصصع أطصصراف الممتحككمصصصات الدقيقصصة كصصصدخل ‪) 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‬‬
‫>‪#include <avr/io.h‬‬

‫تفعيل خرج لتشغيل الثل ث دايودات ضوئية ‪//‬‬

‫)‪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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪DDRA = 0b11111111‬‬
‫)‪while(1‬‬
‫{‬
‫تشغيل المحرك مع عقارب الساعة ‪//‬‬

‫;‪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 <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬

‫متغير بمساحة ‪ 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‬‬

‫>>‬

‫‪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<<PA0‬‬

‫كذلك يمكننا استخدام العملية ‪ OR‬لدمج أكثر من دصيغة من النوع السابق فصي أمصر واحصد‪ ،‬فمثلا‬
‫لنفترض أننا نريد ضبط الطرف ‪ PA1‬و ‪ PA2‬ليعملن كخرج‪ ،‬يمكننا إما أن نكتب‪:‬‬

‫;)‪DDRA |= (1<<PA1‬‬
‫;)‪DDRA |= (1<<PA2‬‬

‫أو يمكن اختصار المرين في جملة واحدة فقط كالتالي‪:‬‬

‫كتابة ‪ 0‬داخل أي بت ‪Reset Bit‬‬

‫;)‪DDRA |= (1<<PA1) | (1<<PA2‬‬

‫عملية الصص ‪ Reset Bit‬هصي عك س عمليصة ‪ Set Bit‬وتعنصي وضصع دصصفر داخصل أي بصت مطلوبصة وتتصم‬
‫عبر دمج ‪ 3‬أوامر ‪ AND – left shift – invert‬وتكون الصيغة القياسية كالتالي‪:‬‬

‫;)‪Resgister &= ~ (1 << bitName‬‬
‫مثال‪ :‬لنفترض أننا نريد جعل الطرف ‪ PC3‬يعمل كدخل بغض النظر عن باقي أطراف البورت ‪C‬‬

‫;)‪DDRC &= ~(1<<PC3‬‬
‫أيضصصاا يمكصصن اسصصتخدام نفصصس الصصصيغة فصصي إلغصصاء تشصصغيل أي طصصرف‪ ،‬فمثلا إذا أردنصصا تشصصغيل دايصصود‬
‫ضوئي على البت ‪ PA0‬لمدة ثانية واطفاءة لمدة ثانية فيمكننا أن نكتب‪:‬‬

‫{ )(‪int main‬‬
‫)‪// set 1 in PA0 (output‬‬

‫;)‪DDRA |= (1<<PA0‬‬
‫)‪while (1‬‬
‫{‬

‫)‪// turn on led (set PA0‬‬

‫;)‪PORTA |= (1<<PA0‬‬
‫;)‪delay_ms(1000‬‬

‫)‪// turn off led (reset PA0‬‬

‫;)‪PORTA &= ~ (1<<PA0‬‬
‫;)‪delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫‪142‬‬

‫‪ .5‬قواعد لغة السي للظنظمة المدمجة‬
‫… ‪..............................................................................................‬‬

‫عكس بت محددة ‪Toggle Bit‬‬

‫تعصصد الصصصيغة البرمجصصة ‪ Toggle Bit‬مصصن أفضصصل الصصصيغ المسصصتخدمة فصصي البرمجصصة وتعنصصي أنصصه فصصي‬
‫حالة أن البت المطلوبة = ‪ 1‬قم بعكسها إلصصى ‪ 0‬وإذا كصصانت تسصصاوي ‪ 0‬قصصم بعكسصصها إلصصى ‪ .1‬وتكصصون‬

‫الصيغة القياسية كالتالي‪:‬‬

‫;)‪Resgister ^= (1 << BitName‬‬
‫باستخدام هذه الصيغة يمكننا اختصار المثال ص ‪ blinking led‬بأمرين فقط )بدلا من ‪ 4‬أوامر(‪.‬‬

‫)‪while (1‬‬
‫{‬
‫;)‪PORTA ^= (1<<PA0‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬

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

‫‪ reset‬لي بت مهما أختلف الممتحككم الدقيق أو الشركة المنتجة )طالماا أن المترجم الخاص‬

‫بهذا الممتحككم يدعم لغة السي المعيارية(‪.‬‬

‫‪ 5.6‬القراءة من بت واحدة‬

‫‪Read single bit‬‬

‫فصصي الفصصصل السصصابق شصصاهدنا بعصصض المثلصصة عصصن قصصراءة مفتصصاح إلكصصتروني )‪push button(switch‬‬

‫جل ‪ .PINx‬الطريقة السابقة كصصانت تقصصرأ جميصصع بتصصات‬
‫وذلك عبر قراءة بورت كامل من خلل الممس ك‬

‫البورت ‪ PINx‬وتقارنها برقم مثل‪:‬‬

‫)‪if (PINB == 0b00000001‬‬
‫};‪{PORTA = 0b00000001‬‬
‫‪else‬‬
‫};‪{PORTA = 0b00000000‬‬

‫لكن هناك دصيغة أفضل في حالة الرغبة بقراءة طرف واحد فقط وهي كالتالي‪:‬‬
‫)‪Reister & (1<<bitName‬‬
‫يمكن تطبيق نفس الصيغة على الكود السابق ليصبح كالتالي‪:‬‬
‫تعني لو أن قيمة الطرف الول تساوي ‪//1‬‬

‫))‪if (PINB & (1<<PA0‬‬

‫};‪{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 <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫>‪#include <avr/interrupt.h‬‬
‫)‪int main(void‬‬
‫{‬
‫ضبط أطراف التودصيل بالدايودات الضوئية‪//‬‬

‫;)‪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‬‬
‫}‬

‫شرح الـكود‬
‫في بداية الكود قمنا باستيراد المكتبة المسؤولة عن المقاطعات وذلك عن طريق المر‬

‫>‪#include <avr/interrupt.h‬‬
‫هذه المكتبصة تحتصوي علصى بعصض الوامصر الهامصة والصتي سنسصتخدمها فصي الكصود‪ .‬بع د ذلصك بصدئنا‬

‫في الدالة ‪ 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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫>‪#include <avr/interrupt.h‬‬

‫البرنامج الرئيسي‬

‫)‪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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬

‫)‪int main(void‬‬
‫{‬
‫;‪uint16_t UBRR_Value = 103‬‬
‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫)‪while(1‬‬
‫{‬
‫‪196‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫;) ) )‪while( ! (UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'A‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫شرح الـكود‬

‫بدايصصاة قمنصصا بتعريصصف متغيصر ‪ 16‬بصت اسصصمه ‪ UBRR_Value‬لتخزيصصن القيمصة المطلصصوب كتابتهصصا فصصي‬

‫جل ‪ UBRRL‬ولكصن‬
‫المسصصجلين ]‪ . UBRR[H:L‬ثصم أمرنصا الممتحككصم بتخزيصصن هصذه القيمصة فصي الممسص ك‬
‫جل ‪ 8‬بصصت فقصصط‪ .‬حيصصث سصصيتم تخزيصصن أول ‪ 8‬بصصت فقصصط مصصن القيمصصة‪ .‬ثصصم قمنصصا بتخزيصصن‬
‫هصصذا الممسصص ك‬
‫جل ‪ UBRRH‬عن طريق المر‬
‫باقي البتات في الممس ك‬

‫;)‪UBRRH = (unsigned char) (UBRR_Value >> 8‬‬
‫جل‪.‬‬
‫وهذا المر يقوم بعمل إزاحة لليمين بمقدار ‪ 8‬بت‪ .‬ويخزن باقي البتات في هذا الممس ك‬

‫محتوى المتغير ‪:UBRR_Value‬‬
‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪0‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫ما تم تخزينه بالمسجل ‪:UBRRL‬‬
‫‪1‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫‪0‬‬

‫‪1‬‬

‫‪1‬‬

‫‪0‬‬

‫ما تم تخزينه بالمسجل ‪ UBRRH‬بعد عمل إزاحة لليمين بمقدار ‪ 8‬بت‪:‬‬
‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫‪0‬‬

‫إلى هنا انتهينا من تحديد قيمة ال ‪ .baud rate‬نأتي الن لتفعيل إمكانية الرسال والستقبال‬

‫عن طريق المر التالي‪:‬‬

‫;)‪UCSRB = (1 << RXEN) | (1 << TXEN‬‬
‫بعد هذا المر يتبقى شيئ واحد وهو تحديد عدد البتات المرسلة في المرة الواحدة‪.‬‬
‫; )‪UCSRC |= (3 << UCSZ0‬‬

‫وهذا المر يقوم بتعيين عددهم الى ‪ 8‬بتات‪.‬وهو مساوي للمر‬

‫;) )‪UCSRC |= ( (1 << UCSZ2) | (1 << UCSZ0‬‬
‫‪197‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫والذي يقوم بوضع القيمة ‪ 1‬في كل من ‪. UCSZ0 & UCSZ2‬ولكصن للتسصهيل اسصتخدمت المصر‬

‫بصورته الولى‪.‬‬

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

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

‫الممتحككم جاهزاا لرسال البيانات لذلك استعنا بالمر التالي‪:‬‬

‫;)))‪While (! (UCSRA & (1 << UDRE‬‬
‫ومعنصصاه أن ينتظصصر الممتحككصصم دون فعصصل أي شصصيئ طالمصصا البصصت‬

‫جل ‪ UCSRA‬ل تسصصاوي ‪ .1‬كمصصا ذكرنصصا سصصابقاا‬
‫رقصصم ‪ 5‬فصصي الممسصص ك‬

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

‫الصصصصورة التاليصصصة توضصصصح دائصصصرة محاكصصصاة الكصصصود علصصصى برنامصصصج‬

‫بروتصصس‪ .‬مصصع العلصصم أنصصه يمكصصن محاكصصاة الصصص ‪ serial port‬وذلصصك‬

‫باستخدام الداة ‪virtual terminal‬‬

‫وها هو ذا الحرف ‪ A‬يتم إرساله كل ثانية عند تشغيل المحاكاة‪:‬‬

‫‪198‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬

‫‪ 8.5‬المثال الثاني ‪ :‬تهيئة ال ‪ UART‬للعمل كمستقبل‬

‫استقبال البيانات عن طريق ال ‪ UART‬يتصم بنفصس الكصود مصع عمصل تغييصرات بس يطة فصي الصدائرة‬
‫واضافة سطر جديد‪).‬لحظ أنه في الصدائرة الجديصدة يتصم تودص يل الطصرف ‪TXD‬فصي ال ‪virtual‬‬

‫‪ terminal‬بالطرف ‪ RXD‬في الممتحككم الدقيق(‪.‬‬

‫‪#define F_CPU 16000000‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪uint16_t UBRR_Value = 103‬‬
‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫)‪while(1‬‬
‫{‬
‫;)))‪while (! (UCSRA & (1 << RXC‬‬
‫;‪PORTC = UDR‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫‪199‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫الختلف الوحيد في الكود نجده في المر التالي‪:‬‬

‫‪While (! (UCSRA & (1 << RXC))); // Waiting for Receiving buffer to be empty.‬‬
‫وهصصذا معنصصاه النتظصصار حصصتى يصصصبح الممتحككصصم جصصاهزاا للسصصتقبال‪ .‬والمصصر الصصذي يليصصه يقصصوم بعصصرض‬
‫قيمة ما تمت طباعته في نافذة ‪ Virtual terminal‬على ‪.PORTC‬‬

‫شكل التجربة أثناء استقبال الحرف ‪ a‬وكذلك إخراج قيمته ) ‪ (0b01100001‬على ‪.PORTC‬‬

‫ملحظة‪ :‬أثناء كتابة أي حرف على نافذة ‪ Virtual terminal‬ل يتم طباعته على الشاشة ولكن‬
‫يتصصم إرسصصاله‪ ،‬وإذا أردت أن يتصصم طبصصاعته للتحقصصق ممصصا تضصصغط عليصصه‪ ،‬فكصصل مصصا عليكصصم فعلصصه هصصو‬

‫الضغط بالزر اليمن للماوس على النافذة واختيار ‪.Echo Typed Characters‬‬

‫‪200‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬

‫‪ 8.6‬المثال الثالث ‪ :‬الإرسال والاستقبال في وقت واحد‬

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

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

‫لحصصصظ تودصصصصيل الطصصصرف ‪ TXD‬فصصصي الممتحككصصصم بالجصصصانب اليسصصصر إلصصصى الطصصصرف ‪ RXD‬فصصصي الممتحككصصصم‬

‫الموجود بالجانب اليمن‪.‬‬

‫أيضصصصصاا سنسصصصصتخدم زريصصصصن‪ ،‬الول ومكتصصصصوب بجصصصصانبه ‪ ON‬سصصصصيقوم بإرسصصصصال الحصصصصرف " ‪ ،" N‬وعنصصصصد‬
‫اسصصتقبال هصصذا الحصصرف مصصن قبصصل الممتحككصصم الثصصاني سصصيقوم بإضصصاءة الصصدايود الضصصوئي‪ .‬أمصصا الثصصاني‬

‫ومكتوب بجانبه ‪ OFF‬فسيقوم بإرسصال الحصصرف " ‪ ،" F‬وعنصد اسصتقباله مصن قبصصل الممتحككصصم الثصصاني‬
‫سيقوم بإطفاء الدايود الضوئي‪.‬‬

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

‫من الزرين‪.‬‬

‫‪#define F_CPU 16000000‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬

‫ضبط الطراف لتعمل كدخل ‪//‬‬
‫تفعيل مقاومة الرفع‪//‬‬

‫)‪int main(void‬‬
‫{‬
‫;))‪DDRC &= ~((1<<PC0) | (1<<PC3‬‬
‫;)‪PORTC |= (1<<PC0) | (1<<PC3‬‬
‫;‪uint16_t UBRR_Value = 103‬‬

‫‪201‬‬

UART ‫ التصال التسلسلي بروتوكول‬.8
.............................................................................................. …
UBRRL = (uint8_t) UBRR_Value;
UBRRH = (uint8_t) (UBRR_Value >> 8);
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC |= (3<<UCSZ0);
while(1)
{
if(bit_is_clear(PINC,0))
{
while(!(UCSRA & (1<<UDRE)));
UDR = 'N';
_delay_ms(300);
}
if(bit_is_clear(PINC,3))
{
while(!(UCSRA & (1<<UDRE)));
UDR = 'F';
_delay_ms(300);
}
}
return 0;
}
0 ‫ مصصن خلل إدخصصال القيمصصة‬.‫ كمصداخل رقميصصة‬PC3 ‫ و‬PC0 ‫السصصطر الول يقصصوم بتحديصصد الطصصراف‬

202

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫جل ‪ .DDRC‬والسصصطر الصصذي يليصصه يقصصوم بتفعيصصل مقاومصصة الرفصصع‬
‫في البتات المناظرة لهما فصي الممسصص ك‬

‫الداخلية لكل منهما‪.‬‬

‫ثم نأتي للجملة الشرطية ))‪if(bit_is_clear(PINC،0‬‬

‫هذا السطر يقوم باختبار ما إذا تم الضغط على الزر المتصل ب ‪ PC0‬أم ل‪ ،‬فإذا تم الضغط علصصى‬

‫الزر سيقوم الممتحككم بإرسال الحرف " ‪." N‬وكذلك المر بالنسبة للزر المتصل ب ‪ PC3‬ولكصصن مصصع‬
‫فارق أنه يقوم بإرسال الحرف " ‪." F‬‬

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

‫فهو كالتالي‪:‬‬

‫‪#define F_CPU 16000000‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;)‪DDRC |= (1<<PC0‬‬
‫;‪uint16_t UBRR_Value = 103‬‬
‫;‪char Received‬‬
‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫)‪while(1‬‬
‫{‬
‫;)))‪while (! (UCSRA & (1 << RXC‬‬
‫;‪Received = UDR‬‬
‫)'‪if(Received == 'N‬‬
‫;)‪PORTC |= (1<<PC0‬‬
‫‪203‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫)'‪if(Received == 'F‬‬
‫;)‪PORTC &= ~(1<<PC0‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫شرح الـكود‬

‫في هذا البرنامصصج قمنصا بإنشصاء متغيصر مصصن نصوع ‪ Character‬ويصدعى ‪ Received‬وقمنصا بتخزيصصن‬
‫مصصا يتصصم اسصصتقباله فصصي هصصذا المتغيصصر‪ ،‬ثصصم يقصصوم الممتحككصصم باختبصصار محتصصوى هصصذا المتغيصصر بجملصصتين‬

‫شصصرطيتين‪ ،‬فصصإذا كصصان محتصصواه مسصصاوياا للحصصرف " ‪ " N‬قصصام بإضصصاءة الصصدايود الضصصوئي المتصصصل ب‬
‫‪ ،PC0‬وإذا كان محتواه مساوياا للحرف " ‪ " F‬قام بإطفاء الدايود الضوئي‪.‬‬

‫‪ 8.7‬إرسال مجموعة بيانات مثل السلاسل النصية‬

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

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

‫" ‪ " UART‬سنجد أنه هناك طريقتين لذلك‪.‬‬

‫الطريقة اﻷولى‪ :‬إرسال حروف متتالية‬
‫إرسال حرف ‪// U‬‬
‫إرسال حرف ‪// A‬‬
‫إرسال حرف ‪// R‬‬
‫إرسال حرف ‪// T‬‬
‫وسيتم إرسالها‪.‬‬

‫‪204‬‬

‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'U‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'A‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'R‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'T‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬

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

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

‫الطريقة الثانية‪ :‬استخدام المؤشرات‬

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

‫;"‪char *word = "UART‬‬
‫)‪while(*word > 0‬‬
‫{‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;‪UDR = *word++‬‬

‫شرح الـكود‬

‫}‬

‫في هصذا الكصود اسصتخدمنا مؤشصصر يشصصير إلصى بدايصصة الكلمصة‪ .‬ومصن أساسصيات علصصم الكمصصبيوتر أن أي‬
‫‪ String‬يحتصصصوى آخصصصره علصصصى الرقصصصم ‪ 0‬ويصصصدعى " ‪ " null character‬لصصصذلك اسصصصتخدمنا الحلقصصصة‬

‫التكراريصصة )‪ while(*word > 0‬أي طالمصصا أنصصه يشصصير إلصصى شصصيء أكصصبر مصصن ال ‪ 0‬ستسصصتمر الحلقصصة‬
‫بالتكرار‪.‬‬

‫المر ‪ UDR = *word++‬يقوم بإرسال الحرف الذي يشير إليه المؤشر حالياا‪ ،‬ثم يقصصوم بزيصصادة‬

‫‪205‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫المؤشصصر ليشصصير الحصصرف التصصالي‪.‬حصصتى يصصصل إلصصى نهايصصة الكلمصصة فيشصصير إلصصى الرقصصم ‪ 0‬الصصذي يتواجصصد‬

‫بنهاية أي ‪ ،String‬فل يتحقق شرط الحلقة التكرارية وينتهي تنفيذها‪.‬‬

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

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

‫)(‪void UART_init‬‬
‫{‬
‫;‪uint16_t UBRR_Value = 103‬‬

‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫}‬
‫نكتب الدالة السابقة قبصصل دالصصة ‪ .main‬وبصداخل دالصة ال ‪ main‬نقصوم باسصتدعائها لتنفيصذ الوامصصر‬
‫التي بداخلها عن طريق المر التالي‪:‬‬

‫;)(‪UART_init‬‬
‫كما هو موضح في الكود التالي )إعادة كتابة المثال الول ولكن بصورة أفضل(‪:‬‬
‫‪#define F_CPU 16000000‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫)(‪void UART_init‬‬
‫{‬
‫;‪uint16_t UBRR_Value = 103‬‬
‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫‪206‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫}‬
‫)‪int main(void‬‬
‫{‬
‫; )(‪UART_init‬‬
‫)‪while(1‬‬
‫{‬
‫;) ) )‪while( ! (UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'A‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬
‫والن اسصصترجع مصصا ذكرنصصاه فصصي شصصرح بروتوكصصول ال ‪ UART‬عصصن معصصدل نقصصل البيانصصات‪ ،‬وأن هصصذه‬

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

‫تذكر أنه يمكن تحديد هذه السرعة من العلقة السابق ذكرها‪،‬‬

‫جل ‪:UBRR‬‬
‫إذاا يمكننا كتابة المعادلة التالية ليجاد القيمة المراد تخزينها داخل الممس ك‬

‫;)‪uint16_t UBRR_Value = lrint ( (F_CPU / (16L * baud_rate) ) -1‬‬

‫حيث‪:‬‬

‫‪ :F_CPU‬تردد المذبذب الذي يعمل عليه الممتحككم‪.‬‬
‫‪ :Baud_rate‬متغير ندخل به قيمة سرعة إرسال البيانات مثل‪.9600 :‬‬

‫‪ :Lrint‬هي دالة تقوم بتقريب الناتج إلى أقرب رقم دصحيح‪ ،‬ولستدعاؤها لبد من تضمنيها‬
‫باستخدام ‪ include‬ثم اسم الملف ‪ math.h‬في بداية البرنامج‪.‬‬

‫‪207‬‬

‫‪ .8‬التصال التسلسلي بروتوكول ‪UART‬‬
‫… ‪..............................................................................................‬‬
‫فيصبح شكل الدالة كالتالي‪:‬‬

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

‫‪#define F_CPU 16000000‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <util/delay.h‬‬
‫>‪#include <math.h‬‬

‫)(‪void UART_init‬‬
‫{‬
‫;)‪uint16_t UBRR_Value = lrint ( (F_CPU / (16L * baud_rate) ) -1‬‬
‫;‪UBRRL = (uint8_t) UBRR_Value‬‬
‫;)‪UBRRH = (uint8_t) (UBRR_Value >> 8‬‬
‫;)‪UCSRB = (1<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫}‬
‫ويتم استدعائها بداخل ال ‪ main‬بالشكل التالي‪:‬‬

‫)‪int main(void‬‬
‫{‬
‫; )‪UART_init(9600‬‬
‫‪…......‬‬
‫‪…......‬‬

‫‪ 8.8‬دوال إضافية‬

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

‫جملة‪.‬‬
‫‪‬‬

‫الدالة الخاصة بإرسال حرف‬

‫)‪void UART_send_char(char data‬‬
‫{‬
‫;) ) )‪while( ! (UCSRA & (1<<UDRE‬‬
‫;‪UDR = data‬‬
‫}‬
‫‪208‬‬

UART ‫ التصال التسلسلي بروتوكول‬.8
.............................................................................................. …
‫الدالة الخاصة باستقبال حرف‬

‫ سلسلة حروف‬String ‫الدالة الخاصة بإرسال‬

char UART_receive_char()
{
while (! (UCSRA & (1 << RXC) ) );
return UDR;
}

.(‫)لحظ أن هذه الدالة تعتمد على دالة إرسال حرف واحد‬

void UART_send_string(char *data)
{
while(*data > 0)
UART_send_char(*data++);
UART_send_char('\0');
}

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 <avr/io.h‬‬
‫متغير لحفظ قيمة الص ‪//adc‬‬

‫;‪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<<ADSC‬‬
‫ضع قيمة التحويل داخل المتغير ‪// adcValue‬‬

‫;‪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‬‬
‫عنصصد بصصدء عمليصصة التحويصصل تظصصل البصصت ‪ ADSC‬قيمتهصصا = ‪ 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‬لذا نستخدم المر التوجيهي‬

‫>‪#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 <avr/delay.h‬‬
‫"‪#include "device_conf.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;‪set_port_output‬‬
‫)‪while(1‬‬
‫{‬
‫;‪PORT_on‬‬
‫;)‪_delay_ms(1000‬‬
‫;‪PORT_off‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬
‫نلحظ أن التضمين الول كان بين قوسين >< والثاني بين إشصصارتين “” ‪،‬حيصصث أن السصصتخدام‬
‫الول يكون عندما نريد أن يتم البحث عن الملف المحدد ضمن المسارات المتاحة في إعصصدادات‬

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

‫‪228‬‬

‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬
‫… ‪..............................................................................................‬‬
‫أيضصصصاا نلحصصصظ وجصصصود بعصصصض الوامصصصر الغربيصصصة مثصصصل ‪ PORT_on‬و المصصصر ‪ .PORT_of‬الحقيقصصصة أن‬
‫تفسير هذه الوامر يقع في الملف ‪ device_conf‬والذي يحتوي على الكود التالي‪:‬‬

‫>‪#include <avr/io.h‬‬
‫‪#define PORT_on PORTD=0xFF‬‬
‫‪#define PORT_off PORTD=0x00‬‬
‫‪#define set_port_output DDRD=0xFF‬‬
‫عنصصد القيصصام بعمليصصة الصصصترجمة ‪ Compiling‬مصصا سصصيحدث أن المعالصصج التمهيصصدي للغصصة السصصي سصصيبدأ‬
‫معالجة الكود قبصل عملي ة الترجمصة الحقيقصة )تحويصل الملصف إل ى هيك س( وسصيتم معالجصة المصر‬

‫‪ 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<<BIT‬‬
‫))‪#define BIT_CLEAR(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT‬‬
‫))‪#define BIT_CHECK(ADDRESS,BIT) (ADDRESS & (1<<BIT‬‬
‫))‪#define BIT_FLIP(ADDRESS,BIT) (ADDRESS ^= (1<<BIT‬‬

‫‪231‬‬

‫ المعالج التمهيدي وصناعة المكتبات البرمجية‬.10
.............................................................................................. …
‫ كمثال‬function-like macros ‫لنأخذ أحد ال‬

#define BIT_SET(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
‫ حيصصث يمكننصصا أن‬ADDRESS, BIT ‫ والمتغيصصرات الصصتي يسصصتقبلها هصصي‬BIT_SET ‫ هصصو‬macro ‫اسصصم‬
BIT_SET(PORTB,5);

:‫نستخدمه داخل البرنامج الرئيسي كالتالي‬

:‫جل مطلوب كالتالي‬
‫ داخل أي بت من أي ممس ك‬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‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#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<<RXEN) | (1<<TXEN‬‬
‫;)‪UCSRC |= (3<<UCSZ0‬‬
‫}‬
‫)‪void UART_send_char(char data‬‬
‫{‬
‫;) ) )‪while( ! (UCSRA & (1<<UDRE‬‬
‫;‪UDR = data‬‬
‫}‬
‫)(‪char UART_receive_char‬‬
‫{‬
‫;) ) )‪while (! (UCSRA & (1 << RXC‬‬
‫;‪return UDR‬‬
‫}‬

‫‪ 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 <util/delay.h‬‬
‫)‪int main(void‬‬
‫{‬
‫;)‪UART_init(9600‬‬
‫)‪while(1‬‬
‫{‬
‫;)'‪UART_send_char('H‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬
‫دصورة الكود الذي سيختبر المكتبة داخل برنامج ‪ATmel studio‬‬

‫لحظ أن أمر تضمين المكتبة ‪ 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 <avr/io.h>
#include <util/delay.h>
/* 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<<PB0);
/* Start the infinte task 1 loop */
while (1)
{
PORTB ^= (1<<PB0);

//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<<PB1);
/* Start the infinte task 2 loop */
while (1)
{
PORTB ^= (1<<PB1);

//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<<PB2‬‬
‫‪/* Start the infinte task 3 loop */‬‬
‫)‪while (1‬‬
‫{‬
‫‪//toggle PB0‬‬

‫;)‪PORTB ^= (1<<PB2‬‬

‫‪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

Sign up to vote on this title
UsefulNot useful