You are on page 1of 291

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

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

‫كتاب "تعلم ‪ 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‬‬

‫بوجود ‪ 32‬ممس ك‬
‫جل عام ‪" Register‬ريجستر" يمكصصن اسصصتخدامهم فصصي معالجصصة وتخزيصصن البيانصصات‬

‫جل واحد فقصصط )ممسصص ك‬


‫جل الصصتراكم‬ ‫المؤقتة بسرعة وكفاءة بينما يجبرك الص ‪ 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‬ممدقدمة عن الظنظمة الممدمجة‬
‫… ‪..............................................................................................‬‬

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


‫النظصام المدمصج أو كمصصا يسصصمى فصصي بعصصض الحيصصان "النظصصام الممضصمن" هصو أي نظصصام حاسصصوبي دصصصغير‬
‫الحجم يقوم بمجموعة من الوظائف التي تخدم أداة أو منتج معيصن‪ ،‬وغالبصاا ل تبصاع هصذه النظمصة‬
‫المدمجصصة للنصصاس مباشصصرة ولكنهصصا تكصصون "مدمجصصة ‪ "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‬‬ ‫تحديد اﻷهداف‬
‫‪ +‬اختبار شامل للنظام‬ ‫فكرة‬
‫والوظائف‬

‫لوحة تجارب‬
‫تصميم اللوحة المطبوعة‬
‫‪PCB Design‬‬ ‫تصميم العتاد‬
‫‪Hardware 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‬‬
‫… ‪..............................................................................................‬‬

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


‫الممتحككم الدقيق هو حاسوب متكامل على شريحة واحدة ‪ 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‬‬

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


‫يقصصصد بكلمصصة معماريصصة ‪ 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‬‬ ‫التحكم العامة‬ ‫البيانات‬
‫الممتحككم مثل‬ ‫ستحدد حجم‬ ‫‪Devices‬‬ ‫‪ GPIO‬والتي‬ ‫والستجابة‬
‫درجة الحرارة و‬ ‫البرنامج الذي‬ ‫المتوفرة‬ ‫تمثل عدد‬ ‫المطلوبة‬
‫معدل استهلك‬ ‫سيوضع على‬ ‫للممتحككم‬ ‫المداخل‬
‫الطاقة‬ ‫الممتحككم‬ ‫والمخارج‬

‫علصصى حسصصب العوامصصل الخمسصصة السصصابقة سصصنجد أن شصصركة ‪ 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‬‬
‫… ‪..............................................................................................‬‬

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


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

‫التصصصصميم الصصصداخلي‪ ،‬وظصصصائف الطصصصراف‪ ،‬الممسصصص ك‬


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

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

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

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

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

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


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

‫المعمارية ‪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‬‬
‫… ‪..............................................................................................‬‬

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


‫يتملصصك الممتحككصصم ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪ATTiny‬‬ ‫‪ 2.7‬عائلة‬
‫تعتصصصصبر هصصصصذه العائلصصصصة مصصصصن الممتحككمصصصصات حديثصصصصة‬
‫نسصصصصبياا وهصصصصي مخصصصصصصة للسصصصصتخدامات الصصصصتي‬
‫تحتاج ممتحككم دقيق دصغير الحجم وسريع في‬
‫ذات الصصوقت دون التضصصحية بصصالمميزات الكاملصصة‬
‫الصصصتي قصصصد تجصصصدها فصصصي معظصصصم الممتحككمصصصات لصصصذا‬
‫قامت شركة ‪ 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‬ومصصصا هصصصي أسصصصماؤها؟ هصصصل جميصصصع‬ ‫•‬
‫البورتات تمتلك ‪ 8‬أطراف مثل الممتحككم ‪ ATmega16‬أم يوجد اختلف ؟‬

‫إذا قمنصصا بكتابصصة برنامصصج مكصصون مصصن ‪ 100‬أمصصر بلغصصة السصصمبلي بصصدون اسصصتخدام أي أمصصر‬ ‫•‬
‫تأخير وتم تشغيل نفس البرنامج على الممتحككم ‪ 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‬على الطلق‪.‬‬

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

‫الإصدار الـ ‪ DIP‬من الممربرمجة ‪USBasp‬‬ ‫الإصدار الـ ‪ SMD‬من الممربرمجة ‪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‬بيكوفصصصصصصصصصصصصصصصاراد هصصصصذه المكثفصصصصات سصصصصعرها رخيصصصصص جصصصصداا وحجمهصصصصا دصصصصصغير‬
‫وسصصصصهلة الضصصصصياع لصصصصذا يفضصصصصل أ ن تشصصصصتري منهصصصصا ‪ 10‬أو ‪20‬‬ ‫‪picofarad‬‬

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

‫)واجب( عدد ‪ 1‬كابل‬ ‫كابل مبرمجة ‪ISP‬‬


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

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

‫)واجننننب( عصصصصدد ‪ 10‬قطصصصصع دايصصصصود ضصصصصوئي )يفضصصصصل اللصصصصون‬


‫الحمر أو الخضر( ويفضل عدم استخدام اللون البيض‬

‫دايودات ضوئية )ليد ‪(LED‬‬

‫شصصصصريحة عصصصصرض أرقصصصصام "مقاطعصصصصة )واجب( عدد‪ 2 :‬قطعة‬


‫من المكونات الهامة والبسيطة فصصي ذات الصصوقت‪ ،‬تسصصتخدم‬ ‫سصصصصصصصصصصصصصصصصصصصصصصباعية"‬
‫فصصصي عصصصرض الرقصصصام عصصصن طريصصصق ‪ 7‬دايصصصودات ضصصصوئية لصصصذا‬ ‫‪seven‬‬
‫‪Segment‬‬
‫تسصصصصصصمى الشصصصصصصريحة ذات المقصصصصصصاطع السصصصصصصبعة ‪Segment 7‬‬
‫ويفضل الحصول على النوع ذا الطرف السصصالب المشصصترك‬
‫‪common cathode‬‬

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

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

‫محرك ‪DC Motor‬‬


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

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

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

‫)اختياري( دائرة قيادة المحركات )قنطرة ‪ (H‬وتعتصصبر مصصن‬ ‫‪ L293 H-bridge‬دائرة قيادة‬
‫أهصصم الشصصرائح الصصتي سنسصصتخدمها فصصي التحكصصم بالمحركصصات‬
‫سواء الص ‪ DC‬أو الص ‪Stepper Motor‬‬

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


‫تكصصن متصصوفرة فصصي السصصوق المحليصصة يمكنصصك شصصراء مفاتيصصح‬
‫الضغط ذات الطرفين فقط‪.‬‬
‫مفتاح ‪Push button‬‬

‫)اختينناري( عصصدد ‪ 1‬مصصصفوفة ‪ DIP – ON- OFF‬ذا ثمانيصصة‬ ‫مفتصصصصصصصصصصصصصصصصصصاح ‪DIP‬‬


‫مفاتيح أو يمكنك شراء ‪ 2‬مصفوفة ذات ‪ 4‬مفاتيح‬ ‫‪switch‬‬

‫)واجب( عدد ‪ 8‬مقاومات من كل القيم المذكورة‬ ‫‪Resistors‬‬


‫‪ 10‬كيلواوم‬
‫)‪ 10‬كيلواوم و ‪ 330‬اوم( بقدرة ربع وات أو‪:‬‬
‫‪ 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‬‬
‫‪ AVR-GCC-G++, AVR-GCC,‬فصصصي هصصصذا‬ ‫مباشصصصرة بمختلصصصف الدصصصصدارات ‪AVR32-GCC‬‬
‫الكتاب سنستخدم ‪ 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‬الرسمي وقم بتحميل الملف المضغوط الصصذي يحتصصوي علصصى‬
‫جميع ملفات المشروع )ملفات التصميم والتعريفات(‬
‫‪http://www.fischl.de/usbasp‬‬

‫‪68‬‬
‫‪ .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-using-
Arduino-IDE-an/

72
‫الفصل الرابع‬

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

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


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

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

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

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


‫أساسيات برمجة أطراف الص ‪AVR‬‬ ‫✔‬
‫المثال الثاني‪ :‬تشغيل مجموعة دايودات ضوئية‬ ‫✔‬
‫المثال الثالث‪ :‬تشغيل جميع أطراف البورت ‪ A‬والبورت ‪B‬‬ ‫✔‬
‫المثال الرابع‪ :‬تشغيل المقاطعة السباعية ‪7Segment‬‬ ‫✔‬
‫قراءة الدخل الرقمي‬ ‫✔‬
‫‪Internal & Externel Pull-Up‬‬ ‫✔‬
‫المثال السادس‪ :‬قراءة أكثر من مفتاح‬ ‫✔‬
‫مفهوم الص ‪ Bouncing‬وطرق الص ‪De-Bouncing‬‬ ‫✔‬

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

‫في جميع التجارب التالية سنتبع أسصصلوب التصصصميم ‪ Design‬ثصصم المحاكصصاة ‪ Simulate‬ثصصم التنفيصذ‬
‫علصصى لوحصصة التجصصارب ‪ Prototype‬وذلصصك لتسصصهيل تعلصصم البرمجصصة‪ ،‬مصصع ملحظصصة أنصصه هنصصاك بعصصض‬
‫المثلة التي قد ل تصلح للمحاكاة ويجصصب أن تنفصصذ مباشصصرة علصصى لوحصة التجصارب كمصصا سصنرى فصصي‬
‫الفصول المتقدمة )مثل الص ‪ fuses‬وإدارة الطاقة(‪.‬‬

‫فكرة‬

‫كتابة البرظنامج‬

‫المحاكاة‬

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

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

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


‫يعتبر تشغيل دايود ضوئي وإطفصصاؤه لمصصدة زمنيصة معينصة ‪ 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‬‬
‫… ‪..............................................................................................‬‬

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


‫عادة ما تم تنقسم البرامج البسيطة للمتحكمات إلى ‪ 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‬أشهر هذه الممس ك‬


‫جلت هي‪:‬‬

‫‪DDR x → Data Direction Register.‬‬


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

‫جل ‪DDRx Register‬‬


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

‫أي بورت لتعمل إما كدخل ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫هذا يعني أن نضع القيمة ‪ 00000001‬داخل الممس ك‬


‫جل ‪ DDRA‬والتي تعني أن البت الولى فق ط‬
‫= واحصصد أمصصا بصصاقي البتصصات = دصصصفر ممصصا يعنصصي أن الطصصرف ‪ 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‬فصصي الخصصصرج الرقمصصصي لي طصصرف‪ ،‬فمثلا عنصصصدما قمنصصا بتودصصصيل الصصدايود‬
‫يتحكصصصم الممسصصص ك‬
‫الضوئي على الطرف ‪ PA0‬قمنا بتشغيله وإطفاءه باستخدام هذا الممس ك‬
‫جل‪ ،‬ومثل الص ‪ DDRx‬فإنه‬
‫يمتلك ‪ 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‬‬ ‫قم بتشغيل البت اﻷولى‪//‬‬
‫;)‪_delay_ms(1000‬‬ ‫انتظر ‪ 1000‬مللي ثانية ‪//‬‬
‫;‪PORTA = 0b00000000‬‬ ‫قم بإطفاء البت اﻷولى ‪//‬‬
‫;)‪_delay_ms(1000‬‬ ‫انتظر ‪ 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‬‬
‫{‬

‫;‪DDRA = 0b00001111‬‬ ‫تفعيل أول ‪ 4‬أطراف كمخرج ‪//‬‬

‫)‪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‬‬
‫… ‪..............................................................................................‬‬

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


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

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

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

‫الـكود الربرمجي‬
‫‪#define F_CPU 1000000UL‬‬ ‫تحديد سرعة المعالج ‪//‬‬
‫>‪#include <avr/io.h‬‬
‫>‪#include <avr/delay.h‬‬ ‫استدعاء المكتبات البرمجية ‪//‬‬

‫)‪int main(void‬‬
‫{‬
‫;‪DDRA = 0b11111111‬‬ ‫تفعيل جميع أطراف ‪ Port A‬كخرج ‪//‬‬
‫;‪DDRB = 0b11111111‬‬ ‫تفعيل جميع أطراف ‪ Port B‬كخرج ‪//‬‬

‫)‪while(1‬‬
‫{‬
‫;‪PORTA = 0b11111111‬‬ ‫شغل جميع أطراف ‪// Port A‬‬
‫;‪PORTB = 0b11111111‬‬ ‫شغل جميع أطراف ‪// Port B‬‬
‫;)‪_delay_ms(500‬‬ ‫انتظر نصف ثانية ‪//‬‬

‫;‪PORTA = 0b00000000‬‬ ‫إطفاء جميع أطراف ‪// Port A‬‬


‫;‪PORTB = 0b00000000‬‬ ‫إطفاء جميع أطراف ‪// Port A‬‬
‫;)‪_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‬‬
‫… ‪..............................................................................................‬‬

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


‫"المقاطعة السباعية – تنطصق سصيفين سصيجمنت" ‪ 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; // Number 0
_delay_ms(1000);
PORTA = 0b00110000; // Number 1
_delay_ms(1000);
PORTA = 0b01011011; // Number 2
_delay_ms(1000);
PORTA = 0b01001111; // Number 3
_delay_ms(1000);
PORTA = 0b01100110; // Number 4
_delay_ms(1000);

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

PORTA = 0b01101101; // Number 5


_delay_ms(1000);
PORTA = 0b01111101; // 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‬‬
‫… ‪..............................................................................................‬‬

‫‪Inputs reading‬‬ ‫‪ 4.6‬المثال الخامس ‪ :‬قراءة الدخل الرقمي‬


‫في هذا المثال سنتعرف على طصصرق قصراءة الصصدخل الرقمصصي ‪ 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‬‬
‫للتأكيد أن أطراف الممتحككم تعمل كدخل‪.‬‬

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

‫‪) PIN x‬حيث تمثل ‪ x‬اسصم البصورت مثصل ‪ … A,B,C,D‬إلصخ( فمثلا الممسص ك‬
‫جل ‪ PINB‬يقصوم بتسصجيل‬

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

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

‫يعني أن الممس ك‬
‫جل ‪ PINB‬يتم تحديثة مليون مصرة فصي الثانيصة وفصي كصل مصرة يقصصوم بقصصراءة جميصع‬
‫أطراف البورت ‪.B‬‬

‫جل ‪ PINx‬على ‪ 8‬بتات كل بت تمثل قراءة الجهد على أحصصد أطصصراف البصصورت‪ ،‬فمثلا‬
‫يحتوي الممس ك‬
‫الممسصصص ك‬
‫جل ‪ PINB‬نجصصصد أنصصصه يتكصصصون مصصصن البتصصصات التاليصصصة )جميصصصع جصصصداول ‪ PINx‬متصصصوفرة فصصصي دليصصصل‬
‫البيانات(‪.‬‬

‫البت رقم دصفر ‪ PINB0‬تمثل قراءة الطرف ‪ PB0‬والبت رقصم ‪ 1‬تمثصل قصراءة الطصرف ‪ PB1‬والبصت‬
‫رقم ‪ 2‬تمثل قراءة الطرف ‪ … PB2‬إلخ‪.‬‬

‫جل ‪ PINB‬وجميع الممس ك‬


‫جلت ‪ PINx‬من نوع ‪ Read only‬مما يعني أنه يمكنك‬ ‫ملحظة‪ :‬الممس ك‬
‫أن تقرأ منها فقط ول يمكنك أن تغير محتواها بنفسك بكتابة أي اكود برمجية حيث يتم‬
‫جلت تلقائياا‪.‬‬
‫تحديث الممس ك‬

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

‫البصصصصت ‪ PB0‬و ‪ PB1‬و ‪ PB2‬سصصصصنجد أن قيمصصصصة الممسصصصص ك‬


‫جل ‪ PINB‬تسصصصصاوي ‪ 0b00000111‬وإذا قمنصصصصا‬
‫بتطبيق جهد على جميع البتات سنجد القيمة أدصبحت ‪ 0b11111111‬وهكذا ‪...‬‬

‫فصصي البرنامصصج السصابق اسصتخدمنا الجملصصة الشصرطة )‪ if (condition‬لتشصغيل الصصدايود الضصصوئي عنصصد‬
‫الضغط على الزر حيث كتبنا المر‪.‬‬
‫)‪if(PINB == 0b00000001‬‬
‫};‪{PORTA = 0b00000001‬‬
‫والصصذي يعنصصي أنصصه إذا كصصانت قيمصصة الممسصص ك‬
‫جل ‪ PINB‬تسصصاوي ‪) 0b00000001‬يعنصصي تصصم الضصصغط‬
‫على الزر المتصل بص ‪ (PB0‬قم بتشغيل الدايود الضوئي عبر المر ‪PORTA = 0b00000001‬‬
‫‪else‬‬
‫};‪{PORTA = 0b00000000‬‬
‫وفي حالة عدم تطبيق هذا الشرط ‪ else‬قم بإطفاء الدايود عبر ‪PORTA = 0b00000000‬‬

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

‫‪Pull Up & Pull Down Resistor‬‬ ‫‪4.7‬‬


‫من أشهر الكلمات التي قد تسمعها في عالم اللكترونيات الرقمية هي المقاومة رافعة الجهد أو‬
‫خافضة الجهد ‪ 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-Up‬‬ ‫‪Pull-Down‬‬

‫ملحظة‪ :‬قد تستخدم مقاومات الص ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪Internal Pull-Up‬‬ ‫‪ 4.8‬خاصية الـ‬


‫تمتلك معظم ممتحككمات الص ‪ AVR‬خادصية جميلة جداا وهي أن أطراف البورتات تمتلصصك )مقاومصصة‬
‫الرفع الداخلية ‪ (internal pull-up‬هذه المقاومة تجعلك تستخدم المفاتيصصح الصصتي تريصصدها بصصدون‬
‫أي مقاومصصات إضصصافية‪ .‬الشصصكل التصصالي يوضصصح تركيصصب مقاومصصة الرفصصع الداخليصصة وهصصي عبصصارة عصصن‬
‫ترانزستور ‪ +‬مقاومة ‪ Rpu‬حيث يتحكم الترانزستور في تفعيل المقاومة أو إلغائها‪.‬‬

‫بصصصورة افتراضصصية يتصصم إلغصصاء تفعيصصل هصذه المقاومصصة ويجصصب‬


‫عليك أن تشغلها بنفسك وذلك عصصبر جعصصل الطصصرف المطلصصوب‬

‫يعمصصصصل كصصصصدخل ‪ input‬ثصصصصم الكتابصصصصة فصصصصي الممسصصصص ك‬


‫جل ‪PORTx‬‬
‫لتفعيل هذه المقاومة‬

‫لحصصصظ أن الممسصصص ك‬
‫جل ‪ 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‬‬ ‫تأكيد أن جميع أطراف البورت تعمل كدخل‪//‬‬


‫;‪PORTB = 0b11111111‬‬ ‫تفعيل مقاومة الرفع لكل أطراف البورت ‪// B‬‬

‫)‪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‬‬
‫… ‪..............................................................................................‬‬

‫‪Bouncing effect & De-bouncing‬‬ ‫‪4.10‬‬


‫يعرف تأثير القفز ‪ 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‬أو الصصص‬
‫‪RTOS‬‬
‫العيوب‪ :‬زيادة التكلفة بسبب استخدام مكونات إضافية مع المفتاح‪.‬‬ ‫•‬

‫‪117‬‬
‫‪ .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‬قواعد لغة السي للظنظمة المدمجة‬
‫… ‪..............................................................................................‬‬

‫‪Data-types‬‬ ‫‪ 5.1‬أنواع البيانات في الأنظمة المدمجة‬


‫فصصصصي عصصصصالم النظمصصصصة المدمجصصصصة هنصصصصاك معيصصصصار مختلصصصصف قليلا لتعريصصصصف البيانصصصصات مثصصصصل المتغيصصصصرات‬
‫والثوابت‪ .‬حيث نجد أن معظم الممتحككمصصات الدقيقصة خادصصصة مصصن فئصصة ‪ Bit-8‬تمتلصصك قصدر محصصدود‬
‫جداا من الذاكرة سواء الص ‪ ROM‬أو الص ‪) RAM‬بعض الممتحككمات قد يمتلك ‪ 128‬بايت فقط مصصن الصصص‬
‫‪ .(RAM‬مما يتطلب أسلوب فعال لكتابة أكواد تحقق الهدف المطلوب بأقل استهلك للذاكرة‪.‬‬

‫مثلا فصصي حالصصة كتابصصة برنامصصج بلغصصة السصصي علصصى الحاسصصب اللصصي التقليصصدي والصصذي يمتلصصك معالصصج‬
‫وذاكصصرة ضصصخمة )تقصصدر بالجيجصصا بصصايت(وكلهمصصا مخصصصص للتعامصصل مصصع البيانصصات ‪ 32‬أو ‪ 64‬بصصت‪،‬‬
‫سصصصصنجد أن معظصصصصم المتغيصصصصرات الرقميصصصة تكصصصصون ‪ int‬أو ‪ double‬أو ‪ float‬أمصصصصا فصصصصي حالصصصصة النظمصصصصة‬
‫المدمجة يعد استخدام هذه النواع "اهدار للذاكرة" لصصذا سصصنتعلم فصصي هصصذا الجصصزء كيفيصصة برمجصصة‬
‫أنواع البيانات المختلفة بصورة ممحسنة خصيصاا لذاكرة الممتحككمات الدقيقة‪.‬‬

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

‫أنواع البيانات التقليدية‬

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

‫أنواع البيانات التي تستخدم في حفظ الرقام والموجبة والسالبة تسمى ‪signed numbers‬‬
‫أما إذا وضعنا قبلها كلمة ‪ unsigned‬فإنها تصلح للتعامل مع الرقام الموجبة فقط ولكن‬
‫بضعف مساحة التخزين‬

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

‫نوع البيانات‬ ‫أقصى قيمة يمكن وضعها داخل المتغير استهلك الذاكرة )عدد ‪(Bytes‬‬

‫‪int‬‬ ‫)‪2-bytes (16 bit‬‬ ‫‪-32,768 → +32,767‬‬


‫‪unsigned int‬‬ ‫)‪2-bytes (16 bit‬‬ ‫‪65,535‬‬
‫‪float‬‬ ‫)‪4-bytes (32 bit‬‬ ‫‪1.2E-38 to 3.4E+38‬‬
‫‪double‬‬ ‫)‪8-bytes (32 bit‬‬ ‫‪2.3E-308 to 1.7E+308‬‬
‫‪long‬‬ ‫)‪4-bytes (32 bit‬‬ ‫‪-2,147,483,648 → +2,147,483,647‬‬
‫‪unsigned long‬‬ ‫)‪4-bytes (32 bit‬‬ ‫‪4,294,967,295‬‬
‫‪long long‬‬ ‫)‪8-bytes (64 bit‬‬ ‫‪- 9.223372037×10¹⁸‬‬
‫‪+ 9.223372037×10¹⁸‬‬
‫‪unsigned long long‬‬ ‫)‪8-bytes (64 bit‬‬ ‫‪1.844674407×10¹⁹‬‬

‫ملحظة‪ :‬نوعي البيانات ‪ float‬و ‪ double‬دائماا يكونا من نوع ‪ Signed‬ول يمكن استخدام‬
‫العلمة ‪ unsigned‬معهما‬

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

‫في حفظ قراءة أطراف البورت ‪ B‬وبما أن الممس ك‬


‫جل ‪ PINB‬من نوع ‪ 8‬بت إذا كصل مصا يتطلبصه هصو‬
‫متغيصصر بسصصعة ‪ 8‬بصصت فقصصط ول داعصصي أبصصداا لسصصتخدام متغيصصر بمسصصاحة ‪ 16‬بصصت‪ .‬لصصذا فجميصصع أنصصواع‬
‫البيانات السابقة تعتبر اهدار للذاكرة‪.‬‬
‫لحل هذه المشكلة يتم استخدام أنواع البيانات المعيارية ‪ ANSI C - C99‬وهي دصصصورة محسصصنة‬
‫لنصصواع البيانصصات وتمكننصصا مصصن اختيصصار قيمصصة المتغيصصرات بالدقصصة والطصصول المطلصصوب دون أي اهصصدار‬
‫للذاكرة‪.‬‬
‫‪Signed‬‬ ‫أقصى قيمة‬ ‫‪Unsigned‬‬ ‫أقصى قيمة‬

‫‪int8_t‬‬ ‫‪-128 → +127‬‬ ‫‪uint8_t‬‬ ‫‪0 → 255‬‬


‫‪int16_t‬‬ ‫‪-32,768 → +32,767‬‬ ‫‪uint16_t‬‬ ‫‪0 → 65,535‬‬
‫‪int32_t‬‬ ‫→ ‪-2,147,483,648‬‬ ‫‪uint32_t‬‬ ‫‪0 → 4,294,967,295‬‬
‫‪+2,147,483,647‬‬
‫‪int64_t‬‬ ‫‪- 9.223372037×10¹⁸‬‬ ‫‪uint64_t‬‬ ‫‪1.844674407×10¹⁹‬‬
‫‪+ 9.223372037×10¹⁸‬‬

‫‪130‬‬
‫‪ .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‬‬

‫)‪int main(void‬‬
‫{‬
‫;‪uint8_t counter‬‬ ‫متغير بمساحة ‪ 8‬بت لتخزين قيمة العداد ‪//‬‬
‫;‪DDRA = 0b11111111‬‬ ‫ضبط كل أطراف البورت لتعمل كخرج ‪//‬‬

‫)‪for (counter = 0; counter <= 255; counter++‬‬ ‫عداد من ‪ 0‬إلى ‪// 255‬‬
‫{‬
‫;‪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‬بالصيغة العشرية‬

‫;‪uint8_t variable = 0b11110000‬‬ ‫‪// Binary‬‬


‫;‪uint8_t variable = 120‬‬ ‫‪// Decimal‬‬
‫;‪uint8_t variable = 0xF0‬‬ ‫‪// Hexadecimal‬‬

‫مرفق مع الكتاب ملحق خاص بنظام العداد وتحويل قيم الرقام من وإلى الصيغ الثنائية‬
‫والعشرية والستة‪-‬عشرية‪.‬‬
‫أيضاا لحظ أن القيم الستة‪-‬عشرية تبدأ بصص ‪ 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‬قواعد لغة السي للظنظمة المدمجة‬
‫… ‪..............................................................................................‬‬

‫‪Arithmetic Operations‬‬ ‫‪ 5.2‬العمليات الحسابية‬


‫تسصصتطيع مترجمصصات لغصصة السصصي المعياريصصة المخصصصصة للمتحكمصصات الدقيقصصة أن تتعامصصل مصصع نفصصس‬
‫أوامصصر العمليصصات الحسصصابية الصصتي يمكصصن تنفيصصذها علصصى الحواسصصيب مثصصل عمليصصات الجمصصع والطصصرح‬
‫والضرب والقسمة‪ .‬لنأخذ بعض المثلة‪:‬‬
‫;‪int X, Y, Z‬‬ ‫تعريف ‪ 3‬متغيرات ‪//X, Y, Z‬‬
‫;‪X = 5 + 6‬‬ ‫عملية جميع رقمين ووضع الناتج في المتغير ‪// X‬‬
‫;‪Y = 50 – x‬‬ ‫عملية طرح رقم من متغير ووضع الناتج في المتغير ‪// Y‬‬
‫;‪Z = X * Y‬‬ ‫عملية ضرب متغيرين ووضع النتيجة في المتغير ‪// Z‬‬
‫أيضاا يمكن تنفيذ العمليات الحسابية على قيمة المتغير نفسه‪ .‬فمثلا قيمة المتغير ‪ x‬فصصي المثصصال‬
‫السابق = ‪ 11‬والن نريد أن نزيد عليها ‪ 4‬لتصبح ‪ .15‬يمكن تنفيذ ذلك بالطريقة التالية‬
‫;‪X = X+4‬‬ ‫الن قيمة المتغير تساوي ‪// 15‬‬
‫المصصر السصصابق يعنصصي‪ :‬قصصم بإضصصافة الرقصصم ‪ 4‬إلصصى القيمصصة الموجصصودة بالفعصصل فصصي المتغيصصر ‪ X‬ثصصم قصصم‬
‫بكتابة النتيجة مرة أخرى داخل المتغير ‪ X‬وبذلك تصصصبح قيمتصصه ‪ .15‬مصع العلصصم أنصه يمكصصن إجصراء‬
‫نفس الطريقة مع جميع العمليات الحسابية‬
‫;‪X = X – 2‬‬ ‫أطرح الرقم ‪ 2‬من المتغير ‪//‬‬
‫;‪X = X * 4‬‬ ‫اضرب قيمة المتغير في ‪// 4‬‬

‫الصور المختصرة‬
‫يمكن إجراء العمليات الحسابية على المتغيرات بصصورة مختصصرة‪ .‬فمثلا إذا أردنصا جميصع الرقصم‬
‫‪ 4‬على قيمة المتغير ‪ X‬فيمكن ذلك بأسلوب مختصر عبر إضافة علمة الجمع قبل أشارة =‬
‫;‪X += 4‬‬ ‫اختصار اﻷمر ‪// X = X+4‬‬
‫أيضاا يمكن تطبيق نفس الختصار على أي عملية حسابية‬
‫;‪X -= 4‬‬ ‫اختصار اﻷمر ‪// X = X – 4‬‬
‫;‪X *= 4‬‬ ‫اختصار اﻷمر ‪// X = X * 4‬‬
‫;‪X /= 2‬‬ ‫اختصار اﻷمر ‪// X = X / 2‬‬

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

‫المنطقية ‪Logic Operation‬‬ ‫‪ 5.3‬العمليات‬


‫الص ‪ Logic operation‬مجموعة من الوامر المنطقيصة مثصل ‪ AND, OR, XOR, Invert, Shift‬هصذه‬
‫الوامر تساعدنا على القيام ببعض التحكم المتقدم سواء على المتغيرات أو إعصصدادات الممتحككصصم‬
‫أو أطراف الممتحككم )الدخل أو الخرج(‪ .‬جميع العمليات المنطقية )تمسى أيضاا الدوال المنطقية‬
‫‪ (Logic Function‬تمثل نفس البوابات المنطقيصصة المسصتخدمة فصصي الصصدوائر اللكترونيصة لكصصن يتصصم‬
‫تطبيقها بصورة برمجية‪ .‬الجدول التالي يوضح قائمة بهصذه العمليصصات والرمصصوز المسصتخدمة فصي‬
‫لغة السي لتنفيذ كل واحدة منهم‪.‬‬
‫‪Logic Function name‬‬ ‫”‪Logic Function in “ANSI C‬‬
‫‪OR‬‬ ‫|‬
‫‪AND‬‬ ‫&‬
‫‪NOT‬‬ ‫~‬
‫‪XOR‬‬ ‫^‬
‫‪Shift Left‬‬ ‫<<‬
‫‪Shift Right‬‬ ‫>>‬

‫أمثلة على ‪AND‬‬ ‫أمثلة على ‪OR‬‬ ‫أمثلة على ‪NOT‬‬ ‫أمثلة على ‪XOR‬‬

‫‪0&0=0‬‬ ‫‪0|0=0‬‬ ‫‪~0=1‬‬ ‫‪0^0=0‬‬


‫‪~1=0‬‬ ‫‪0^1=1‬‬
‫‪0&1=0‬‬ ‫‪0|1=1‬‬ ‫‪1^0=1‬‬
‫‪1&0=0‬‬ ‫‪1|0=1‬‬ ‫‪1^1=0‬‬
‫‪1&1=1‬‬ ‫‪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‬‬
‫‪Example 2:‬‬
‫;‪unit8_t Z = 0b11110000‬‬
‫;‪Z = ~ Z‬‬ ‫)‪// invert all Z bits (Z = 0b00001111‬‬

‫‪Example 3:‬‬
‫;‪unit8_t Z = 0b00110011‬‬
‫;‪Z = ~ Z‬‬ ‫)‪// invert all Z bits (Z = 0b11001100‬‬

‫اسنتخدام ‪ - OR‬لنف ترض أن لصدينا متغيصر ‪ 8‬بصت ‪ xNumber‬وقيمتصه = ‪) 12‬بالنظصام العشصري(‬


‫أو ‪ 0b00011000‬بالنظام الرقمي كما هو موضح‪:‬‬
‫‪Example 4:‬‬
‫;‪uint8_t xNumber = 0b00011000‬‬
‫;‪xNumber = xNumber | 0b00000001‬‬ ‫‪// 0b000011000 OR 0b0000001‬‬

‫المصصر السصصابق يعنصصي قصصم بتنفيصصذ العمليصصة المنطقيصصة ‪ OR‬مصصع محتصصوى المتغيصصر ‪ xNumber‬ثصصم ضصصع‬
‫النتيجة داخصصل المتغيصصر ‪ xNumber‬ممصصا سصصيجعل قيمصة المتغيصر تصصصبح ‪ .0b00011001‬وذلصصك لن‬
‫المر ‪ OR‬يقوم بعمل ‪ OR operation‬على كل بت بين الرقمين كالتالي‪:‬‬

‫قيمة ‪ xNumber‬الدصلية‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫الرقم الثاني‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫نتيجة الن ‪OR‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪Example 5:‬‬
‫;‪xNumber = 0b11111000‬‬
‫;‪xNumber = xNumber | 0b00000011‬‬

‫عند تنفيذ المر ‪ OR‬ستكون قيمة المتغير= ‪ 0b11111011‬كما هو موضح في الجدول التالي‪:‬‬

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

‫قيمة ‪ xNumber‬الدصلية‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫الرقم الثاني‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬

‫نتيجة الن ‪OR‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬

‫استخدام ‪ – AND‬تعمل عملية الص ‪ AND‬مثصل ضصرب رقميصن‪ .‬وعنصد تطبيقهصا بيصن المتغيصرات يتصم‬
‫عمل ‪ AND‬بين كل بت في المتغير الول وما يقابلها في المتغير الثاني‬
‫‪Example 6:‬‬
‫‪;xNumber = 0b11111000‬‬
‫;‪// 0b11111000 AND 0b1000001 xNumber = xNumber & 0b10000001‬‬
‫النتيجصصة سصصتكون ‪ 0b10000000‬وذلصصك لن نتيجصصة عمصصل ‪ AND‬مصصع أي بصصت تحتصصوي علصصى دصصصفر =‬
‫دصفر لذا نجد البت الخير فقط هي التي ستظل ‪ 1‬لن ‪1 = 1 & 1‬‬

‫قيمة ‪ xNumber‬الدصلية‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫الرقم الثاني‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬

‫نتيجة الن ‪AND‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬

‫اختصار العمليات المنطقية‬


‫يمكن اختصار العمليات المنطقية مثل العمليات الحسصصابية وذلصك عصبر وضصصع المصصر المنطقصي قبصصل‬
‫علمة = فمثلا يمكن إجراء الص ‪ logic operations‬كالتالي‪:‬‬
‫;‪xNumber |= 0b00000001‬‬ ‫;‪// xNumber = xNumber | 0b00000001‬‬
‫;‪xNumber &= 0b00000001‬‬ ‫;‪// xNumber = xNumber & 0b00000001‬‬
‫;‪xNumber ^= 0b00000001‬‬ ‫;‪// xNumber = xNumber ^ 0b00000001‬‬

‫ملحظة‪ :‬يمكن اختصار جميع العمليات المنطقية ماعدا عملية )العكس ‪ (Invert‬والتي تكتب‬
‫فقط بالصورة التالية‪:‬‬
‫‪xNumber = ~ xNumber‬‬

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

‫‪Shift operations‬‬ ‫‪ 5.4‬عمليات اﻹزاحة‬


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

‫مثال‪ :‬لنفرض أن لدينا الرقم ‪ 0b00000001‬لنقم بتطبيق عمليات الزاحة لجهة اليسار‪.‬‬

‫الرقم الدصلي‬ ‫‪0b00000001‬‬

‫إزاحة بمقدار ‪ 1‬بت جهة اليسار <<‬ ‫‪0b00000010‬‬

‫إزاحة بمقدار ‪ 2‬بت جهة اليسار <<‬ ‫‪0b00000100‬‬

‫إزاحة بمقدار ‪ 3‬بت جهة اليسار <<‬ ‫‪0b00001000‬‬

‫مثال‪ :‬لنفرض أن لدينا الرقم ‪ 0b00000101‬لنقم بتطبيق نفس العمليات السابقة عليه‪.‬‬

‫الرقم الدصلي‬ ‫‪0b00000101‬‬

‫إزاحة بمقدار ‪ 1‬بت جهة اليسار <<‬ ‫‪0b00001010‬‬

‫إزاحة بمقدار ‪ 2‬بت جهة اليسار <<‬ ‫‪0b00010100‬‬

‫إزاحة بمقدار ‪ 3‬بت جهة اليسار <<‬ ‫‪0b00101000‬‬

‫مثال‪ :‬لنفرض أن لدينا ‪ 0b01100000‬لنقم بتطبيق عمليات الزاحة لجهة اليمين‪.‬‬

‫الرقم الدصلي‬ ‫‪0b01100000‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬ ‫‪0b00110000‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬ ‫‪0b00011000‬‬

‫>> إزاحة بمقدار ‪ 1‬بت جهة اليمين‬ ‫‪0b00001100‬‬

‫تدعم لغة السي الوامر البرمجية لعمل الزاحة لجهة اليمين أو اليسار وتكتب كالتالي‪:‬‬

‫‪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‬‬
‫وهكذا … وتستمر هذه الدورة إلى ما ل نهاية‪.‬‬

‫‪Single Bit‬‬ ‫‪ 5.5‬التحك م على مستوى البت الواحدة‬


‫في الفصل السابق قمنا بالتعامل مع بعض الممس ك‬
‫جلت مثل ‪ 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‬نكتب‪:‬‬
‫;)‪DDRA |= (1<< PA0‬‬ ‫‪// set PA0 to work as output‬‬

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

‫أيضاا يمكننا استخدام نفس الصيغة لتشغيل نفس البت من الممس ك‬


‫جل ‪PORTA‬‬
‫;)‪PORTA |= (1<<PA0‬‬ ‫‪// turn on PA0‬‬

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

‫لنفترض أننا نريد ضبط الطرف ‪ PA1‬و ‪ PA2‬ليعملن كخرج‪ ،‬يمكننا إما أن نكتب‪:‬‬
‫;)‪DDRA |= (1<<PA1‬‬
‫;)‪DDRA |= (1<<PA2‬‬

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


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

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


‫عملية الصص ‪ Reset Bit‬هصي عك س عمليصة ‪ Set Bit‬وتعنصي وضصع دصصفر داخصل أي بصت مطلوبصة وتتصم‬
‫عبر دمج ‪ 3‬أوامر ‪ AND – left shift – invert‬وتكون الصيغة القياسية كالتالي‪:‬‬
‫;)‪Resgister &= ~ (1 << bitName‬‬
‫مثال‪ :‬لنفترض أننا نريد جعل الطرف ‪ PC3‬يعمل كدخل بغض النظر عن باقي أطراف البورت ‪C‬‬
‫;)‪DDRC &= ~(1<<PC3‬‬
‫أيضصصاا يمكصصن اسصصتخدام نفصصس الصصصيغة فصصي إلغصصاء تشصصغيل أي طصصرف‪ ،‬فمثلا إذا أردنصصا تشصصغيل دايصصود‬
‫ضوئي على البت ‪ PA0‬لمدة ثانية واطفاءة لمدة ثانية فيمكننا أن نكتب‪:‬‬

‫{ )(‪int main‬‬

‫;)‪DDRA |= (1<<PA0‬‬ ‫)‪// set 1 in PA0 (output‬‬


‫)‪while (1‬‬
‫{‬
‫;)‪PORTA |= (1<<PA0‬‬ ‫)‪// turn on led (set PA0‬‬
‫;)‪delay_ms(1000‬‬

‫;)‪PORTA &= ~ (1<<PA0‬‬ ‫)‪// turn off led (reset 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‬لي بت مهما أختلف الممتحككم الدقيق أو الشركة المنتجة )طالماا أن المترجم الخاص‬
‫بهذا الممتحككم يدعم لغة السي المعيارية(‪.‬‬

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


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

‫وذلك عبر قراءة بورت كامل من خلل الممس ك‬


‫جل ‪ .PINx‬الطريقة السابقة كصصانت تقصصرأ جميصصع بتصصات‬
‫البورت ‪ PINx‬وتقارنها برقم مثل‪:‬‬
‫)‪if (PINB == 0b00000001‬‬
‫};‪{PORTA = 0b00000001‬‬
‫‪else‬‬
‫};‪{PORTA = 0b00000000‬‬

‫لكن هناك دصيغة أفضل في حالة الرغبة بقراءة طرف واحد فقط وهي كالتالي‪:‬‬
‫)‪Reister & (1<<bitName‬‬
‫يمكن تطبيق نفس الصيغة على الكود السابق ليصبح كالتالي‪:‬‬
‫))‪if (PINB & (1<<PA0‬‬ ‫تعني لو أن قيمة الطرف الول تساوي ‪//1‬‬
‫};‪{PORTA = 0b00000001‬‬

‫‪143‬‬
‫الفصل السادس‬

‫”النجاح ليس نتيجة لعدم ارتكاب أي أخطاء‪،‬‬


‫وللكنه نتيجة لعدم تكرار نفس الخطأ مرتين ‟‬
‫جورج برنارد شو ‪ -‬مؤلف أيرلندي شهير‪.‬‬
‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة وسرعة التشغيل‬
‫… ‪..............................................................................................‬‬

‫‪ .6‬الفيوزات‪ ،‬الحماية‪ ،‬الطاقة‬


‫وسرعة التشغيل‬

‫هصصصذا الفصصصصل يشصصصرح العصصصدادات المتقدمصصصة لمتحكمصصصات ‪ AVR‬مثصصصل مفهصصصوم الفيصصصوزات‬


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

‫✔ الفيوزات ‪ Fuses‬للممتحككم ‪ATmega16‬‬


‫✔ تغير سرعة )تردد( الممتحككمات‬
‫✔ بتات الغلق والحماية ‪Lockbits‬‬
‫✔ برمجة الفيوزات‬
‫استهلك الطاقة والعمل على البطاريات‬ ‫✔‬

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

‫‪Fuses & Lockbits‬‬ ‫‪6.1‬‬


‫في جميع الممتح ككمات الدقيقة يجب أن تمتلك طريقة مصا لتتحكصم فصي بعصض العصدادات بصصورة‬
‫دائمة ل تتغير مع انقطاع الكهرباء عن الممتحككصم الصدقيق‪ ،‬فمثل ممتحككمصات الصص ‪ 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‬يتصصصم تفعيصصصل الحمايصصصة ويمننننع أي محاولنننة )كتابنننة(‬ ‫•‬
‫بيانات على كل من الص ‪ Flash‬والص ‪EEPROM‬‬
‫عنصصدما تكصصون ‪ LB1 = 0‬و ‪ LB2 =1‬يتصصم تفعيصصل الحمايصصة ويمنننع أي محاولننة )كتابننة أو‬ ‫•‬
‫قراءة( البيانات على كل من الص ‪ Flash‬والص ‪EEPROM‬‬

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

‫‪Clock Source‬‬ ‫‪ 6.3‬المذبذبات والـ‬


‫عندما نشتري أجهزة الحاسوب الخادصة نحاول‬
‫دائما شراء الجهاز السرع وهنا نجد الشركات‬
‫المصنعة دائماا تتباهي بأن منتجاتها هي الفضل‬
‫لنها تعمل بأعلى سرعة معالجة )تقاس‬
‫بالجيجاهرتز – مليار هرتز(‪ .‬ومثل أجهزتنا‬
‫شكل نبضات الساعة عبر الزمن‬
‫الشخصية نجد أن سرعة الممتحككمات الدقيقة هي‬
‫أيضاا تحدد عبر التردد الذي تعمل عليه أو كما تسمى )مصدر الساعة ‪.(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‬‬
‫=) ‪F( frequency‬‬
‫)‪( R∗C‬‬

‫حيصصث تمثصصل ‪ 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‬‬


‫قصصم بضصصبط الفيصصوزات بصصالقيم التاليصصة لختيصصار السصصرعة المطلوبصصة‪ ،‬مصصع ملحظصصة أن القيمصصة هصصي ‪,,‬‬
‫‪ CKSEL3,‬بنفصس الصترتيب حي ث يعصبر كصل ‪ 1‬بصت عصصن قيم ة الصصص‬ ‫‪CKSEL2,‬‬ ‫‪CKSEL1, CKSEL0‬‬
‫‪ CKSEL‬الموازية له‪.‬‬
‫)‪CKSEL(3,2,1,0‬‬ ‫‪Clock Frequency‬‬
‫‪0001‬‬ ‫‪1 Mhz‬‬

‫‪0010‬‬ ‫‪2 Mhz‬‬

‫‪0011‬‬ ‫‪4 Mhz‬‬

‫‪0100‬‬ ‫‪8 Mhz‬‬

‫فيوزات ضبط السرعة مع دائرة ‪External RC‬‬


‫)‪CKSEL(3,2,1,0‬‬ ‫‪Clock Frequency‬‬
‫‪0101‬‬ ‫التردد أقل من ‪ 0.9‬ميجاهرتز‬

‫‪0110‬‬ ‫التردد المتوقع أكبر من ‪ 0.9‬وأقل من ‪ 3‬ميجاهرتز‬

‫‪0111‬‬ ‫التردد المتوقع أكبر من ‪ 3‬وأقل من ‪ 8‬ميجاهرتز‬

‫‪1000‬‬ ‫التردد المتوقع أكبر من ‪ 8‬وأقل من ‪ 12‬ميجاهرتز‬

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

‫فيوزات ضبط السرعة مع ‪External Crystal or Ceramic‬‬


‫هصصذه العصصدادات يمكصصن اسصصتخدامها مصصع كصصل مصصن الصصص ‪ Crystal oscillator‬والصصص ‪ceramic resonator‬‬
‫مع ملحظة أنه فصي حالصة اسصتخدام الكريسصتالة يجصب أن يتصم وضصع مكثفصات إضصافية معهصا كمصا‬
‫ذكرنا سابقاا ول يتم وضع هذه المكثفات مع الص ‪.ceramic resonator‬‬

‫أيضصصاا لحصصظ أن العصصدادات يتصصم وضصصعها للفيصصوزات ‪ CKSEL‬مصصن ‪ 1‬إلصصى ‪ 3‬فقصصط ول يتصصم برمجصصة الصصص‬
‫‪ CKSEL0‬معهم في هذا الوضع‪ .‬ويتم برمجة الفيوز ‪ CKOPT‬في حالة استخدام كريستالة أكبر‬
‫من ‪ 8‬ميجاهرتز‪.‬‬

‫)‪CKSEL(3,2,1‬‬ ‫‪Clock Frequency‬‬ ‫سعة المكثفات‬


‫”‪“0 is not used‬‬
‫المقترحة‬

‫‪101‬‬ ‫‪ ceramic‬هذا الوضع ميستخلدم مع‬ ‫ل يتم استخدام مكثفات‬


‫‪resonator‬‬
‫‪CKOPT = 1‬‬ ‫وفي حالة أن التردد المطلوب ما بين ‪0.4‬‬
‫إلى ‪ 0.9‬ميجاهرتز‬

‫‪110‬‬ ‫التردد المتوقع أكبر من ‪ 0.9‬وأقل من ‪3‬‬ ‫السعة المقترحة بين‬


‫ميجاهرتز‬ ‫‪12 → 22 picofarad‬‬
‫‪CKOPT = 1‬‬
‫‪111‬‬ ‫التردد المتوقع أكبر من ‪ 3‬وأقل من ‪8‬‬ ‫السعة المقترحة بين‬
‫ميجاهرتز‬ ‫‪12 → 22 picofarad‬‬
‫‪CKOPT = 1‬‬
‫‪111‬‬ ‫التردد المتوقع أكبر من ‪ 8‬ميجا وحتى ‪16‬‬ ‫السعة المقترحة بين‬
‫ميجاهرتز‬ ‫‪12 → 22 picofarad‬‬
‫‪CKOPT = 0‬‬

‫‪162‬‬
‫‪ .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‬مللي أمبير‪.‬‬

‫عند فصصرق جهصد ‪ 3.6‬يمكصصن للممتحككصصم أن يعمصصل بصتردد يصصصل إلصصى ‪ 14.5‬ميجصصاهرتز تقريبصصاا‬ ‫•‬
‫وباستهلك تيار يصل إلى ‪ 5.7‬مللي أمبير‪.‬‬

‫عند فرق جهد ‪ 4‬فولت يمكن للممتحككصصم أن يعمصصل حصتى ‪ 17‬ميجصصاهرتز باسصصتهلك تيصصار ‪7‬‬ ‫•‬
‫مللي أمبير‪.‬‬

‫عنصصد فصصرق جهصصد مصصن الخصصامس إلصصى ‪ 5.5‬يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى ‪20‬‬ ‫•‬
‫ميجاهرتز‪.‬‬

‫ملحظة‪ :‬الحد القصى لتردد الص ‪ 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‬‬
‫=‪Battery WorkingTime‬‬
‫) ‪Total Load Current (mA‬‬

‫جميع البطاريات يكون لها سعة تقاس بالمللي أمبير\سصصاعة فمثل بطاريصة الهصصاتف المحمصصول نجصد‬
‫مكتوب عليها ‪ 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‬‬ ‫•‬
‫‪ Dragon‬حيث يمتلك القدرة على التنقيح والبرمجة عالية الجهد لتصليح الفيوزات‪.‬‬

‫الثنناني‪ :‬بنصصاء دائصصرة ‪ AVR Fuse Doctor‬وهصصي مصصن الصصدوائر الرائعصصة الصصتي تسصصتخدم فصصي‬ ‫•‬
‫معالجصصة الفيصصوزات بتكلفصصة منخفضصصة جصصداا والصصتي جربتهصصا بنفسصصي وكصصانت رائعصصة كمصصا أنصصه‬
‫يمكنك دصناعتها بنفسك بنحو ‪ 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‬‬ ‫✔‬
‫المثال الثاني‪ :‬تشغيل ‪ INT0‬مع ‪INT1‬‬ ‫✔‬

‫‪173‬‬
‫‪ .7‬الممدقاطعة ‪Interrupt‬‬
‫… ‪..............................................................................................‬‬

‫‪The interrupt‬‬ ‫‪ 7.1‬مقدمة عن الممقاطعة‬


‫فصصي الكصصثير مصصن النظمصصة المدمجصصة نجصصد بعصصض الوظصصائف الصصتي تتطلصصب اسصصتجابة فائقصصة السصصرعة‬
‫لحصصدث معيصصن‪ .‬لصصذا تمصصت مراعصصاة هصصذا المصصر فصصي معظصصم المعالجصصات والممتحككمصصات الدقيقصصة )حصصتى‬
‫القديمة منهصا( حيصث تصصم إضصصافة تقنيصة الممقاطعصصة ‪ 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‬‬

‫‪INT0‬‬ ‫‪ 7.2‬المثال الأول ‪ :‬تشغيل الممقاطعة‬


‫الصصصدائرة التاليصصصة عبصصصارة عصصصن ‪ 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‬ويتصم ذلصك عصصن طريصق التلعصب بالبتصات الخادصصة‬

‫بالمسجل ‪ ) GICR‬يمكنك الودصول لهذا الممس ك‬


‫جل في الصفحة ‪ 69‬بدليل البيانات ‪.(ATmega16‬‬

‫جل ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪INT1‬‬ ‫‪ 7.3‬المثال الثاني ‪ :‬تشغيل الممقاطعة ‪ INT0‬مع‬


‫فصصصي هصصصذا المثصصصال سصصصنقوم بتفعيصصصل كل المقصصصاطعتين ‪ 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‬‬


‫‪GICR‬‬ ‫;)‪|= (1 << INT0) | (1 << INT1‬‬

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

‫‪ register‬وهصصصصو عبصصصصارة عصصصصن ممسصصصص ك‬


‫جل إزاحصصصصة يكصصصصون دخلصصصصه ‪ 8‬بتصصصصات ‪ parallel‬وخرجصصصصه ‪ 8‬بتصصصصات‬
‫متسلسصصلة‪ .‬وعلصصى الجصصانب الخصصر‪ ،‬يجصصب أن يمتلصصك الممسصصتقبل شصصريحة أخصصرى تقصصوم بعكصصس هصصذه‬
‫مم‬
‫العملية وتسمى ‪ ،Serial-in-Parallel-out shift register‬لتحويل البيانات مرة أخصصلرى إلصصى ‪8‬‬
‫بت متوازية‪.‬‬

‫ملحظة‪ :‬كلمة بروتوكول ‪ Protocol‬تعني طريقة تنظيم إرسال واستقبال البيانات مثل سرعة‬
‫البيانات وطريقة ترتيبها وترقيم البيانات المرسلة وكذلك الطراف المستخدمة لهذا الرسال‬
‫والستقبال‬

‫أنواع الإرسال التسلسلي‬


‫يمكن نقل البيانات تسلسلياا ببروتوكول ‪ UART‬بطريقتين‪ ،‬لكل منهما مميزات وعيوب وهما‪:‬‬

‫‪Synchronous‬‬ ‫التصال التسلسلي المتزامن‪.‬‬ ‫•‬


‫‪Asynchronous‬‬ ‫التصال التسلسلي الغير متزامن‪.‬‬ ‫•‬

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

‫ميسصصتخلدم التصصصال المصصتزامن لنقصصل كميصصة مصصن البيانصصات دفعصصة واحصصدة ) ‪ ،( Block of data‬بينمصصا‬
‫ميستخلدم التصال الغير متزامن لنقل بايت واحد في كل مرة‪.‬‬
‫ويمكصصن برمجصصة الممتحككصصم للعمصصل بإحصصدى الطريقصصتين‪ ،‬ولكصصن البرنامصصج سصصيكون طصصويل‪ .‬لصصذلك تصصم‬
‫دصناعة دوائر متكاملة يتم دمجها داخصصل الممتحككصصم مخصصصصة للتصصصال التسلسصصلي‪ ،‬وأدصصصبح يرمصصز‬
‫إليهصصصا ب ‪ UART‬أي ‪ .Universal Asynchronous Receiver Transmitter‬أو ‪ USART‬أي‬
‫‪.Universal‬و تحتصصصصصصصصصوي‬ ‫‪Synchronous-Asynchronous‬‬ ‫‪Receiver‬‬ ‫‪Transmitter‬‬
‫ممتحككمات ‪ AVR‬علي ‪ USART‬داخلي‪.‬‬
‫هناك نوعان للرسال التسلسلي‪:‬‬
‫‪ :Simplex .1‬عنصصصصدما يكصصصصون هنصصصصاك إرسصصصصال فقصصصصط أو اسصصصصتقبال فقصصصصط‪ .‬مثصصصصل‪ :‬الطابعصصصصة‪،‬‬
‫فالكمبيوتر هو الوحيد الذي يرسل البيانات‪.‬‬
‫‪ :Duplex .2‬عندما يكون هناك قابلية للرسال والستقبال‪ ،‬وينقسم إلى نوعين‪:‬‬
‫‪ :Half-duplex .3‬وذلك عندما تكون هناك القابلية للرسال والستقبال ولكن ليس فصصي‬
‫آن واحصصصد‪ ،‬مثصصصل‪ :‬جهصصصاز اللسصصصلكي‪ ،‬عنصصصدما تريصصصد التحصصصدث تضصصصغط علصصصى الصصصزر وتبصصصدأ فصصصي‬
‫التحصصدث‪ ،‬والجهصصاز الخصصر يمكنصصه فقصصط السصصتماع‪ ،‬وعنصصد إزالصصة يصصدك مصصن علصصى الصصزر يمكصصن‬
‫للجهاز الخر إرسال الصوت وأنت يمكنك الستماع‪.‬‬
‫‪ :Full-duplex .4‬عندما تكون هنصاك القابليصة لللرسصال والسصتقبال فصي آن واح د‪ ،‬مثصل‪:‬‬
‫الهاتف المحمول‪ ،‬فبإمكانك التحدث والستماع لمن تخاطبه بنفس الوقت‪.‬‬

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

‫‪Asynchronous‬‬ ‫‪ 8.2‬التسلسلي الغير متزامن‬


‫تسصصتقبل البيانصصات بجهصصة المسصصتقبل علصصي هيئصصة ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪AVR‬‬ ‫‪ 8.3‬تهيئة الـ ‪ UART‬الداخلي لمتحكامات‬


‫يتم تهيئة ال ‪ UART‬للعمل عن طريق ضبط العصدادات الخادصصة ب‪ :‬معصدل نقصل البيانصات – عصدد‬
‫بتات الرسال – عدد بتات النهاية‪ ...‬وغيره من العصدادات والصتي يتصم ضصبطها عصن طريصق تغييصر‬

‫قيم الممس ك‬
‫جلت التي تتحكم في ال ‪.UART‬‬
‫يتحكم في ال ‪ UART 5‬مسجلت وهي‪:‬‬
‫‪.UBRR [H: L]: USART Baud Rate Register‬‬ ‫‪-1‬‬
‫‪.UCSRA: USART Control and Status Register A‬‬ ‫‪-2‬‬
‫‪.UCSRB: USART Control and Status Register B‬‬ ‫‪-3‬‬
‫‪.UCSRC: USART Control and Status Register C‬‬ ‫‪-4‬‬
‫‪.UDR: USART I/O Data Register‬‬ ‫‪-5‬‬

‫جلات‬
‫شرح الممس ك‬
‫]‪UBRR [H: L‬‬

‫وهصصو عبصصارة عصصن مسصصجلين ‪8‬بصصت ‪ UBRRL‬ويحمصصل ال ‪ 8‬بصصت ‪1‬بصصت القيمصصة الصصصغرى مصصن قيمصصة ال‬
‫‪ ،baud rate‬والمسجل الخر هو ‪ UBRRH‬ويحتوى على القيمة العظمى من ال ‪.baud rate‬‬
‫يتم وضع قيمة ال ‪ baud rate‬في البتات من ‪ 0‬إلى ‪.11‬‬

‫ملحظة‪ :‬بالنسبة لبعض الممس ك‬


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

‫‪UCSRA‬‬

‫البننت رقنم ‪ RXC :7‬هصذه البصت تصصصبح ‪ 1‬عنصصد اكتمصصال اسصتقبال البصصايت‪ ،‬وتظصل ‪ 0‬أثنصاء‬ ‫•‬

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

‫الستقبال‪.‬‬
‫البت رقم ‪ TXC :6‬هذه البت تصبح ‪ 1‬عند تمام الرسال‪ ،‬وتظل ‪ 0‬أثناء الرسال‪.‬‬ ‫•‬
‫البت رقم ‪ UDRE :5‬تكون قيمتها ‪ 0‬أثنصصاء انشصصغال الممتحككصصم وتصصصبح ‪ 1‬عنصصدما يكصصون‬ ‫•‬
‫مم‬
‫جاهزاا لرسال بيانات أخلرى‪.‬‬

‫‪UCSRB‬‬

‫البننت رقننم ‪ RXCIE :7‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬ ‫•‬
‫‪ Interrupt‬الخادصة باستقبال البيانات‪.‬‬
‫البننت رقننم ‪TXCIE :6‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬ ‫•‬
‫‪ Interrupt‬الخادصة بإرسال البيانات‪.‬‬
‫البننت رقننم ‪UDRIE :5‬عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ‪ ، 1‬يتصصم تفعيصصل المقاطعصصة‬ ‫•‬
‫‪ Interrupt‬الخادصة بجاهزية الممتحككم لرسال أو إستقبال البيانات‪.‬‬
‫البت رقم ‪RXEN :4‬عند جعل قيمة هذه البت تساوي ‪ 1‬يتم تفعيل إمكانيصصة اسصصتقبال‬ ‫•‬
‫البيانات‪.‬‬
‫البت رقم ‪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‬وسصصنفترض أننصصا نشصصغل الممتحككصصم‬ ‫•‬
‫بتردد ‪ 16‬ميجا هرتز‪.‬‬
‫‪ BAUD‬هي قيمة معدل إرسال البيانات والتي حددناها سلفاا ب ‪.bps 9600‬‬ ‫•‬

‫ملحظة‪ :‬في هذا المثال سيتم تشغيل الممتحككم بسرعة ‪ 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‬لتخزيصصن القيمصة المطلصصوب كتابتهصصا فصصي‬

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


‫جل ‪ UBRRL‬ولكصن‬

‫هصصذا الممسصص ك‬
‫جل ‪ 8‬بصصت فقصصط‪ .‬حيصصث سصصيتم تخزيصصن أول ‪ 8‬بصصت فقصصط مصصن القيمصصة‪ .‬ثصصم قمنصصا بتخزيصصن‬

‫باقي البتات في الممس ك‬


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

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


‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫ما تم تخزينه بالمسجل ‪ 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‬سنجد أنه هناك طريقتين لذلك‪.‬‬

‫الطريقة اﻷولى‪ :‬إرسال حروف متتالية‬

‫;)))‪while(!(UCSRA & (1<<UDRE‬‬


‫;'‪UDR = 'U‬‬ ‫إرسال حرف ‪// U‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'A‬‬ ‫إرسال حرف ‪// A‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'R‬‬ ‫إرسال حرف ‪// R‬‬
‫;)))‪while(!(UCSRA & (1<<UDRE‬‬
‫;'‪UDR = 'T‬‬ ‫إرسال حرف ‪// T‬‬
‫وسيتم إرسالها‪.‬‬

‫‪204‬‬
‫‪ .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
.............................................................................................. …

‫الدالة الخاصة باستقبال حرف‬ 


char UART_receive_char()
{
while (! (UCSRA & (1 << RXC) ) );
return UDR;
}
‫ سلسلة حروف‬String ‫الدالة الخاصة بإرسال‬ 
.(‫)لحظ أن هذه الدالة تعتمد على دالة إرسال حرف واحد‬
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‬‬ ‫✔‬
‫مثال‪ :‬قراءة جهد متغير باستخدام مقاومة متغيرة‬ ‫✔‬
‫الحسابات الرياضية الخادصة بالص ‪ADC‬‬ ‫✔‬

‫‪211‬‬
‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬
‫… ‪..............................................................................................‬‬

‫‪ADC‬‬ ‫‪ 9.1‬مقدمة عن المرحول التناظري‪-‬الرقمي‬


‫الشارات الكهربية في العالم الخارجي ليست مقتصرة فقط على الشصارات الرقميصة ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪ATmega16‬‬ ‫‪ 9.2‬تركيب الـ ‪ ADC‬داخل الممتحكك م‬


‫الصورة التالية تمثل تركيب الص ‪ 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‬‬

‫جلات‬
‫الممس ك‬
‫يحتوي الص ‪ ADC‬على مجموعة من الممس ك‬
‫جلت سنستخدم ‪ 3‬منهم لتشغيل وضع الص ‪ 8‬بت‪.‬‬

‫‪ :ADMUX‬هذا الممس ك‬
‫جل مسؤول عن اختيار الطرف الذي سيتم تودصيله بالص ‪ ADC‬لقياس الجهصصد‬
‫كما يحتوي علصى مجموعصصة مصصن البتصات الهامصصة لضصصبط الصصص ‪) analog Refrence‬انظصصر لشصصرح المثصصال‬
‫الول(‪.‬‬

‫‪ :ADCSRA‬الممس ك‬
‫جل المسؤول عن تشغيل وايقاف الص ‪ ADC‬وكذلك التحكم في سرعة تشغيله‪.‬‬

‫‪ :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‬وتهصصدف إلصصى اختصصصار أكصصبر قصصدر ممكصصن‬
‫من اوامر السمبلي‪ .‬والن نعود للبرنامج السابق‪.‬‬

‫سنجد أن المتغير ‪ adcValue‬ميستخلدم لنسخ قيمة الممس ك‬


‫جل ‪) ADCH‬وهو الممسصص ك‬
‫جل الصصذي يحفصصظ‬
‫فيه القيمة الرقمية لعملية التحويصصل(‪ .‬ثصصم نجصد أن المتغيصصر سيسصتخدم فصصي نقصل هصذه القميصة إلصصى‬
‫البورت ‪ 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‬ويتصصم تحديصصد هصصذا الرقصصم مصصن البصصت‬

‫‪ ADPS0‬و ‪ ADPS1‬و ‪ ADPS2‬الموجدتان داخل الممس ك‬


‫جل ‪ ADCSRA‬من خلل الجدول التالي‬

‫‪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‬بصصت يتصصم وضصصع‬

‫الرقم ‪ 1‬داخل البت ‪ ADLAR‬الموجصود فصي الممسصص ك‬


‫جل ‪ .ADMUX‬الوضصع الفتراضصي لهصذه البصت =‬
‫دصفر )أي أي الص ‪ ADC‬يعمل في وضع ‪ 10‬بت(‪.‬‬
‫تفعيل وضع الص ‪ 8‬بت ‪//‬‬
‫;)‪ADMUX |= (1 << ADLAR‬‬

‫عنصصدما يعمصصل الصصص ‪ ADC‬فصصي وضصصع الصصص ‪ 8‬بصصت فصصإن قيمصصة تحويصصل الجهصصد يتصصم تسصصجيلها فصصي الممسصص ك‬
‫جل‬
‫‪ ADCH‬وعندما يعمل في وضع الص ‪ 10‬بت فأن قيمة التحويل يتم تسصصجيلها فصي مسصصجيلن )لنهصصصا‬

‫‪220‬‬
‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬
‫… ‪..............................................................................................‬‬

‫‪ 10‬بصصت ول يكفصصي ممسصص ك‬


‫جل واحصصد لحفصصظ قيمتهصصا( وهمصصا ‪ ADCL‬و ‪ ADCH‬ويسصصمى هصصذا الوضصصع بالصصص‬
‫‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪ADC‬‬ ‫‪ 9.4‬حسابات الـ‬


‫في المثال السابق استطعنا أن نحول الجهد التنصصاظري المتغيصصر إلصصى أرقصام بيصصن ‪ 00000000‬إلصى‬
‫‪) 11111111‬ما بين ‪ 0‬إلى ‪ 255‬بالصيغة العشرية(‪ .‬لكن هذه الرقام ل تمثل قيمة فرق الجهصد‬
‫بصورة مباشرة لذا سنتعرف على في هذا الجزء على بعض المعادلت البسيطة التي ستساعدنا‬
‫على حساب فرق الجهد وكذلك حساب قيم الحساسات التماثلية‪.‬‬

‫تحو يل القيمة الرقمية إلى فرق جهد‬


‫المعادلة التالية تقوم بتحويل القيمة الرقمية إلى فارق جهد‪.‬‬
‫‪DigitalValue∗Vref‬‬
‫=‪Voltage‬‬
‫‪2n‬‬

‫‪ :Digital Value‬القيمة الرقمية الموجودة في ‪) ADCH‬بالصيغة العشرية(‬ ‫•‬


‫‪ :Vref‬الجهد المرجعي للص ‪) ADC‬أنظر للشرح بالسفل(‬ ‫•‬
‫‪ :n‬وضع دقة التشغيل )‪ 8‬بت أو ‪ 10‬بت(‬ ‫•‬

‫الص ‪ Vref‬هو الجهد المرجعي الذي يعتمد عليه الص ‪ ADC‬لحساب الجهد المتغير‪ .‬هذا الجهد يسصصاهم‬
‫فصصي تحديصصد حساسصصية قيصصاس الصصص ‪) ADC‬كمصصا سصصنرى فصصي الجصصزء التصصالي( ويتصصم تحديصصدة مصصن خلل‬
‫البتصصات ‪ REFS0‬و ‪ .RFS1‬فصصي المثصصال السصصابق تركنصصا هصصذه البتصصات علصصى الوضصصع الفصصتراض )دصصصفر(‬
‫والذي يعني أن الجهد المرجعي ‪.Vref = Vcc = 5 volt‬‬

‫الصورة التالية توضح طريقة تغير الص ‪ Vref‬بالتغير قيمة ‪ RFS0 , RFS1‬في الممس ك‬
‫جل ‪ADMUX‬‬

‫‪223‬‬
‫‪ .9‬الممححول التناظري‪-‬الرقمي ‪ADC‬‬
‫… ‪..............................................................................................‬‬

‫لنفترض أن القيمة الرقمية الصصتي حصصصلنا عليهصصا = ‪ 128‬وكصصان الصصص ‪ ADC‬يعمصصل علصصى الوضصصع ‪ 8‬بصصت‪.‬‬
‫إذا بالتعويض في المعادلة السابقة نجد أن قيمة الجهد الذي تم قياسه يساوي‬
‫‪128∗5 128∗5‬‬
‫=‬ ‫‪=2.5 volts‬‬
‫‪28‬‬ ‫‪256‬‬
‫مثصصال أخصصر‪ :‬لنفصصترض أن القيمصصة الرقميصصة الصصتي حصصصلنا عليهصصا = ‪ .56‬إذا بصصالتعويض فصصي المعادلصصة‬
‫السابقة نجد أن قيمة فرق الجهد هي‬

‫‪56∗5 56∗5‬‬
‫=‬ ‫‪=1.09 volts‬‬
‫‪2‬‬
‫‪8‬‬
‫‪256‬‬
‫حساسية القياس‬
‫تعصصصرف حساسصصصية القيصصصاس بأنهصصصا أقصصصل جهصصصد يمكصصصن للصصصص ‪ ADC‬أن يقيسصصصه ويتعصصصرف عليصصصه بصصصصورة‬
‫دصحيحة‪ .‬وتعتمد حساسية القياس للص ‪ ADC‬على عاملين وهما وضصصع التشصصغيل )‪ 8‬أو ‪ 10‬بصصت( و‬
‫الجهد المرجعصي ‪ .Vref‬كل العصاملين يصؤثران بشصكل كصبير جصداا فصي دقصة القيصاس‪ .‬المعادلصة التالي ة‬
‫تمثل حساسية القياس‪.‬‬
‫‪Vref‬‬
‫=‪sensitivity‬‬
‫‪2n‬‬

‫مجصدداا تمثصل ‪ n‬وضصع القيصاس )‪ 8‬أو ‪ 10‬بصت(‪ .‬فمثلا لصو أن ‪ vref = vcc = 5 volt‬ويعمصل الصصص ‪adc‬‬
‫بدقة ‪ 8‬بت فهذا يعني أن حساسية القياس تساوي‬
‫‪5‬‬ ‫‪5‬‬
‫=‬ ‫‪=0.019 volt‬‬
‫‪2 256‬‬
‫‪8‬‬

‫مما يعني أن أقل جهد يمكن قياسه هو ‪ 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‬المعالج التمهيدي وصناعة المكتبات البرمجية‬
‫… ‪..............................................................................................‬‬

‫التوجيهية ‪C - preprocessor syntax‬‬ ‫‪ 10.2‬قواعد الأوامر‬


‫أي سطر برمجي يبدأ برمز المربع ‪ 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‬‬

‫‪#define PORT_on PORTD=0xFF‬‬


‫‪#define PORT_off PORTD=0x00‬‬
‫‪#define set_port_output DDRD=0xFF‬‬ ‫نتيجة تنفيذ اﻷمر‬
‫)‪int main(void‬‬ ‫‪include‬‬
‫{‬
‫;‪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‬‬
‫{‬
‫;‪PORTD=0xFF‬‬ ‫نتيجة تنفيذ اﻷمر‬
‫;)‪_delay_ms(1000‬‬
‫;‪PORTD=0x00‬‬ ‫‪define‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫ملحظة مهمة‪ :‬إن ما يرد بعد المر التصوجيهي ل يتصم معصالجته أو تنقيصح أخطصائه‪ ،‬مثلا لصو قمنصا‬
‫بالتعديل التالي وهو إضافة تعليق‬

‫‪#define PORT_on PORTD=0xFF‬‬


‫‪#define PORT_off PORTD=0x00‬‬ ‫‪//set portD off‬‬
‫‪#define set_port_output DDRD=0xFF‬‬

‫سيصبح الكود الرئيسي بعد الص ‪ Preprocessor‬كالتالي‪:‬‬

‫)‪while(1‬‬
‫خطأ‬
‫{‬
‫;‪PORTD=0xFF‬‬
‫;)‪_delay_ms(1000‬‬
‫‪PORTD=0x00‬‬ ‫; ‪//set portD off‬‬
‫;)‪_delay_ms(1000‬‬
‫}‬
‫نلحظ أن الكود أدصبح يحتصوي علصى خطصأ حي ث أدصصصبحت الفادصصلة المنقوط ة بع د التعليصق‪ ،‬فصال‬
‫‪ preprocessor‬ليصصس مصصن مهمتصصه فهصصم مصصا بعصصد الوامصصر التوجيهيصصة وإنمصصا فقصصط اسصصتبدال الرمصصوز‬
‫بقيمتها‪.‬‬

‫‪230‬‬
‫‪ .10‬المعالج التمهيدي وصناعة المكتبات البرمجية‬
‫… ‪..............................................................................................‬‬

‫‪function-like macros‬‬ ‫‪10.3‬‬


‫يمكننا من خلل ال ‪ C preprocessor‬إنجاز ما يشبه الدوال ولذلك تسمى ‪ function-like‬مع‬
‫اختلف جوهري بين الدوال و ‪ ،function-like macros‬شصكل الشصلبه الوحي د هصو إمكانيصة إنجصاز‬
‫‪ macros‬يمكنصصه أن يسصصتقبل بعصصض المتغيصصرات‪ ،‬أمصصا مصصن الناحيصصة التنفيذيصصة فليصصس هنصصاك أي وجصصه‬
‫شبه‪:‬‬
‫‪ – function‬كتلصصة مصصن الكصصود الصصبرمجي يمكصصن أن نسصصتدعيها بصصأي مكصصان مصصن البرنامصصج‬ ‫•‬
‫الساسصي لتقصصوم بالتنفيصذ واسصصتخدام المتغيصصرات فصي حصصال وجودهصا مصع إمكانيصة إرجصاع‬
‫قيمة بعد التنفيذ‪.‬‬
‫‪ – Function-like macros‬مجموعصصة مصصن السصصطر البرمجيصصة المختصصصرة برمصصز‪ ،‬و عنصصد‬ ‫•‬
‫إيصصراد هصصذا الرمصصز فصصي الكصصود فهصصو بمثابصصة إيصصراد هصصذه السصصطر البرمجيصصة كمصصا هصصي‪ ،‬بخلف‬
‫مبدأ الدوال المعتمد على الستدعاء مع وجود الكود دون تكرار‪.‬‬
‫لبصصصد مصصصن التنصصصويه إلصصصى الجصصصانب السصصصلبي لسصصصتخدام ال ‪ C preprocessor‬وهصصصو حجصصصم البرنامصصصج‬
‫النهائي‪ ،‬إذا أن اسصصتخدام ال ‪ C preprocessor‬لنجصصاز مصصا يشصصبه الصصدوال ‪function-like macros‬‬
‫يصصؤدي إلصصى تضصصاعف حجصصم البرنامصصج‪ ،‬وذلصصك لن اسصصتخدام ال ‪ C preprocessor‬ل يتعصصدى فصصي‬
‫النهاية عن اختصار أسطر برمجية بكلمات مفتاحية‪.‬‬

‫‪macros syntax‬‬ ‫‪ 10.4‬قواعد كتابة الماكرو‬


‫لصناعة ‪ 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-c-
preprecessor/

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‬‬ ‫المتغير المسئول عن تحديد سرعة السيريال ‪//‬‬
‫الدوال‬
‫)(‪void UART_init‬‬ ‫تشغيل وضبط ‪// UART‬‬
‫)‪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‬‬

‫;‪uint16_t UBRR_Value‬‬ ‫‪// Variable to store the calculations needed to set speed‬‬

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

‫)‪void UART_send_string(char *data‬‬


‫{‬
‫)‪while(*data > 0‬‬
‫;)‪UART_send_char(*data++‬‬
‫;)'‪UART_send_char('\0‬‬
‫}‬

‫‪ATmel studio‬‬ ‫‪ 10.8‬تجربة المكتبة في برنامج‬


‫والن بعصصد أن انتهينصصا مصصن كتابصصة الصصص ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫‪Real Time Systems‬‬ ‫‪ 11.1‬مقدمة عن أنظمة الوقت الحقيقي‬

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


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

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

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

‫‪ Firm Real Time Systems‬تعتصصبر مماثلصصة للصصص ‪ Hard Real Time systems‬مصصن ناحيصصة سصصرعة‬
‫الستجابة والتنفيذ لكن الختلف هو أنه في حالة الفشل بضع مرات للستجابة المطلوبة فلصصن‬
‫يؤدي ذلك إل ى فشصل النظصام ككصل‪ .‬ومثصال علصى ذلصك جهصاز الراوتصر اللسصلكي ‪Wireless Router‬‬
‫)الذي يبث النترنت بصورة لسلكية للهواتف أو الجهزة المحمولة( يحتوي على شصريحة تعمصصل‬
‫على إستقبال وإرسال حزم البيانات ‪ Data packets‬باستجابة عاليصصة ومثاليصصة لكصصن إذا حصصدث أن‬
‫فقصصدت بعصصض الحصصزم أو لصصم يسصصتطع الراوتصصر التعامصصل معهصصا فصصإن ذلننك ل يعننني فشننل للنظننام ككننل‬
‫فهذا يعتبر خطأ مقبول طالماا أنه ليس متكرر بكثرة‪.‬‬

‫‪245‬‬
‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬
‫… ‪..............................................................................................‬‬

‫‪Real Time Embedded systems‬‬ ‫‪ 11.2‬طرق تصميم الـ‬


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

‫الطريقة اﻷولى‪ :‬كتابصة الوظصائف الصتي ل تحتصاج اسصتجابة سصريعة داخصل الدالصة الرئيسصية ‪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‬‬
‫… ‪..............................................................................................‬‬

‫‪RTOS Kernel‬‬ ‫‪ 11.3‬كيف تعمل النواة‬


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

‫هنا تأتي وظيفة نصصواة النظصصام ‪ . Kernel‬هصصذه النصصواة تعمصصل داخصصل دالصصة مقاطعصة زمنيصة ‪Interrupt‬‬
‫‪ service routin‬ويتصصم تكصصرار تشصصغيلها مصصن مئصصات إلصصى آلف المصصرات فصصي الثانيصصة الواحصصدة )يسصصمى‬
‫عدد مرات تشغيل النواة بالص ‪ .(System tick‬في كل مرة يتصصم تشصصغيل النصصواة يبصصدأ جصزء مصصن هصصذه‬
‫النواة يسمى "برنامج الجدولة ‪ ”Scheduler‬بمراجعة قائمة المهام الموجودة ويحصصدد مصصا الصصذي‬
‫سيتم معالجته الن‪.‬‬

‫قصصد يختصصار برنامصصج الجدولصصة أن يكمصصل المهمصصة الحاليصصة أو ينتقصصل إلصصى مهمصصة أخصصرى علصصى حسصصب‬
‫خوارزميصصة التحويصصل )الصصص ‪ Round-Robin‬أو ‪ (Priority-based‬وبعصصد أن يقصصرر المهمصصة ييقصصوم بنقصصل‬

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

‫المختلفة )كل من الممس ك‬


‫جلت العامة والخادصة(‪.‬‬

‫‪249‬‬
‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬
‫… ‪..............................................................................................‬‬

‫‪FreeRTOS‬‬ ‫‪ 11.4‬مقدمة عن نظام‬


‫تتوفر العديد من أنظمة تشغيل الوقت الفعلي المجانية والتي تختلف فيما بينها بمصصا تقدمصصة مصصن‬
‫إمكانيات ووظائف إضافية‪ ،‬مصصن هصذه النظمصة نجصصد ‪ 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‬‬
‫… ‪..............................................................................................‬‬

‫للـ ‪RTOS‬‬ ‫‪ 11.5‬الهيكل الربرمجي‬


‫بصورة افتراضية تكتب جميع أوامر برامج النظم المدمجة في الدالة الرئيسصصية علصصى عكصس أنظمصصة‬
‫الص ‪ RTOS‬حيث نجد أن كل مهمة ‪ task‬تماثل دالة رئيسية مستقله وتكون مهمة الص ‪Main Function‬‬
‫هي تعريف عدد وخصائص المهمات فقط‪.‬‬

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

‫”‪#include “RTOS.h‬‬
‫)(‪int main‬‬
‫{‬
‫;)‪createTask( task1, task1_parameters‬‬ ‫إنشاء المهمة اﻷولى ‪//‬‬
‫;)‪createTask( task2, task2_parameters‬‬ ‫إنشاء المهمة الثانية ‪//‬‬
‫;)‪createTask( task3, task3_parameters‬‬ ‫إنشاء المهمة الثالثة ‪//‬‬

‫;)(‪startRTOS_scheduler‬‬ ‫إبدء إدارة المهمات بإستخدام ‪// RTOS‬‬

‫; )‪while(1‬‬ ‫ل تفعل أي شيء أخر داخل الدالة الرئيسية إلى ما ل نهاية ‪//‬‬
‫;‪return 0‬‬
‫}‬

‫{ ) (‪void task1‬‬

‫{ )‪while(1‬‬
‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة اﻷولى ‪//‬‬
‫}‬
‫}‬

‫{ ) (‪void task2‬‬

‫{ )‪while(1‬‬
‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثانية ‪//‬‬
‫}‬
‫}‬

‫{ ) (‪void task3‬‬

‫{ )‪while(1‬‬
‫هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثالثة ‪//‬‬
‫}‬
‫}‬

‫‪251‬‬
‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬
‫… ‪..............................................................................................‬‬

‫‪AVR‬‬ ‫‪ 11.6‬تشغيل ‪ FreeRTOS‬على جميع ممتحككامات‬


‫عند تحميل نظام ‪ 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‬كالتالي‪:‬‬

‫لحظ أن الممتحككمات الحديثة نسبياا من عائلة ‪ AVR – 8bit‬ل تمتلك الممس ك‬


‫جل ‪TIMSK‬‬
‫وإنما يكون باسم ‪ 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‬‬

‫‪#define configTOTAL_HEAP_SIZE‬‬ ‫) ) ‪( (size_t ) ( 1500‬‬

‫الص ‪ 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‬يمكنصصك إضصصافة‬
‫مكتباتك الخادصة أو مسح المكتبات التي ل تحتاجها من هذا الجزء‪.‬‬

‫فصصصي المثلصصصة المصصصذكورة فصصصي الكتصصصاب ل داعصصصي لضصصصافة كصصصل هصصصذه المكتبصصصات لصصصذا سصصصنقوم بمسصصصحها‬
‫واستبدالها بالقائمة التالية فقط‬
‫‪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‬‬
‫المكتبات الممضافة بعد التعديل‬

‫‪262‬‬
‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬
‫… ‪..............................................................................................‬‬

‫تعديل الممبرمجة‬

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

‫‪AVRDUDE_PROGRAMMER = stk500‬‬
‫شخصصصصصياا أسصصصصتخدم ‪ usbasp‬لصصصصذا سصصصصأقوم باسصصصصتبدال ‪ stk500‬بكلمصصصصة ‪) usbasp‬اسصصصصتبدلها باسصصصصم‬
‫الممبرمجة التي لديك إذا كانت مختلفة عن ‪ (usbasp‬كما في الصورة التالية‬

‫ملحظة‪ :‬في حالة أنك ستستخدم ‪ usbasp‬يجب أن تمسح الخيار‬


‫)‪-P $(AVRDUDE_PORT‬‬
‫أمصصا فصصي حالصصة اسصصتخدام أي مبرمجصصة أخصصرى تمتلصصك بصصورت علصصى نظصصام وينصصدوز أو لينكصصس مثصصل‬
‫‪ usbTiny ISP‬أو ‪ AVRISP mkII‬فيجصصصصصصب أن تحصصصصصصدد رقصصصصصصم البصصصصصصورت فصصصصصصي الخيصصصصصصار المسصصصصصصمى‬
‫‪AVRDUDE_PORT‬‬

‫‪263‬‬
‫‪ .11‬أظنظمة الوقت الحدقيدقي ‪RTOS‬‬
‫… ‪..............................................................................................‬‬

‫‪Blinking 3 leds with 3 tasks‬‬ ‫‪ 11.7‬المثال اﻷول ‪:‬‬


‫يأتي نظام ‪ 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‬‬
‫{‬
‫;)‪PORTB ^= (1<<PB2‬‬ ‫‪//toggle PB0‬‬
‫‪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‬‬

‫يمتلك هذا الملف الكثير من العدادات وأهمها هي المجموعة التالية‪:‬‬


‫‪MCU=ATmega16‬‬

‫‪278‬‬
‫‪ .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-Systems-
Electronics/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

You might also like