تهدف سلسلة كتب” تعلم ببساطة “ إلى توفير علوم اﻹلكترونيات الحديثة باللغة العربية
بصسسورة مجانيسسة ومفتوحسسة المصسسدر مسسع الحفاظ علسسى المبدأ السسساسي “البسسساطة” في شرح
المعلومات ،جميع الكتب موجهة للعامة من هواة اﻹلكترونيات و طلبة الكليات الهندسة.
رخصة الكتاب
كتاب "تعلم AVRببساطة" منشورل مجاناال للجميع تحت رخصة المشاع البداعي الدصدارة الرابعة
Creative Common v4 CC-NC-SAبشروط النسبة – المشاركة بالمثل – عدم الستغلل التجاري.
رخصةل المشاعل البداعيCC-NC-ل )غيرل تجارية(ل لك كامل الحق في نسخ وتوزيع وتعديل أو
الاضافة أو حتى طباعة الكتاب ورقياا كما تشاء وأشجعك على ذلك أيضاا شرط عدم إستغلل الكتاب
تجاري اا بأي دصورة مباشرة أو غير مباشرة ،كما يجوز طباعة الكتاب وتوزيعة بشكل عام شرط أن يباع بسعر
التكلفة دون أي ربح.
المشاركةل بالمثلSA-ل إذا تم اشتقاق أي عمل من هذا الكتاب بصورة إلكترونية أو مادية مثل عمل
كتاب آخر أو محااضرة تعليمية ) أو حتى كورس متكامل( أو فيديو فيجب أن يتم بصورة مجانية و بنفس
الرخصة ) المشاع البداعي :النسبة ،المشاركة بالمثل ،الغير تجارية( .يمكنك التعرف أكثر على رخصة
المشاع البداعي من الموقع الرسمي creativecommons.org
إهداء
4
شكر اا لكل من شارك
… ..............................................................................................
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.....................................................................................
6
الفهرس
… ..............................................................................................
7
الفهرس
… ..............................................................................................
.7الممقاطعة 174...........................................................Interrupt
7.1مقدمة عن الممقاطعة 175........................................................The interrupt
7.2المثال الول :تشغيل الممقاطعة 177........................................................INT0
7.3المثال الثاني :تشغيل الممقاطعة INT0مع 185...........................................INT1
م
.9الممحول التناظري-الرقمي 212.............................................. ADC
9.1مقدمة عن المحول التناظري-الرقمي 213.................................................ADC
9.2تركيب الص ADCداخل الممتحككم 215................................................ATmega16
9.3المثال الول :قراءة جهد متغير باستخدم مقاومة متغيرة217..............................
9.4حسابات الص 224.................................................................................ADC
8
الفهرس
… ..............................................................................................
.12المملحقات اﻹضافية271.............................................................
مملحق :تنصيب برنامج CodeBlocksعلى نظام ويندوز 272......................................
مملحق :ترجمة الملفات باستخدام 278.....................................................makefile
مملحق :رفع ملف الص Hexعلى الممتحككم الدقيق282..................................................
مملحق :كيف تستخدم لوحات آردوينو لتعلم برمجة 287.....................................AVR
قائمة المراجع291........................................................................
9
مقدمة
” العلم مغرس كـل فخر فافتخـر ...واحذر يفوتـك فخـر ذاك المغـرس
...من هـمـ ه في مطعـ م أو ملبـس‟ واعلم بأن العـلم ليس يناله
الإمام الشافعي
حول الكتاب – اﻹصدار 1.0
… ..............................................................................................
لقصصد حردصصصت علصصى أن يكصصون الشصصرح باللغصصة العربيصصة بخطصصوات يسصصيرة ومفصصصلة ومصصع ذلصصك سصصأحافظ
علصصى اسصصتخدام بعصصض المصصصطلحات النجليزيصصة فصصي الشصصرح حصصتى تعتصصاد علصصى هصصذه المصصصطلحات
ويصبح من اليسير لك قراءة المراجع النجليزية.
الكتصصاب ليصصس ممصصصمم ليكصصون مرجصصع شصصامل بقصصدر مصصاهو مصصوجه ليكصصون بدايصصة انطلق نحصصو احصصتراف
المجصصال ،الحقيقصصة أن هصصذا العلصصم ل يمكصصن احتصصواؤه أبصصداا فصصي كتصصاب أو مرجصصع حصصتى وإن كصصان 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مجاني )ومفتوح المصدر(.
وفي النهاية مضاف مجموعة من المملحقات التدريبية ،كل ملحق يشرح مهارة تقنية مختلفة
إذا لم يكن لديك اي خبرة بما سبق فأنصحك بقراءة المراجع التعليمية العربية )في نهاية
الكتاب( حيث تحتوي على موارد عربية رائعة لشرح علم اللكترونيات من الصفر
لتشصصغيل البرمجيصصات الصصتي سنسصصتخدمها فصصي تطصصبيق المثلصصة المصصذكورة فصصي الكتصصاب سصصتحتاج أن
تمتلك حاسب آلي بالمكانيات التالية على القل:
يمكنصصك الحصصصول علصصى نسصصخة مجانيصصة)مصصدى الحيصصاة( مصصن برنامصصج 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
هذا المعهد قام بوضع معيار موحد للغة السي وذلك حتى تصبح الكواد المكتوبة بها دصالحة على
منصات مختلفة )حتى وإن تطلبت تعديلت بسيطة( .فمثلا يمكنك كتابة برنامج بلغة السي على
نظصصام وينصصدوز ومصصن ثصصم تقصصوم بعمصصل ترجمصصة لصصه دون تعصصديل ليعمصصل علصصى نظصصام لينكصصس أو العكصصس
وباستخدام نفس المترجم .Compiler
إن تعلم لغة السي المعيارية والتدرب على تقنيات كتابة الكواد بها يعطيك القدرة علننى التعامننل
مع أنواع كثيرة جداا من الممتحككمات الدقيقنة ،فمث ا
ل بعصد انتهائصك مصن هصذا الكتصاب سصتكون قصادراا
علصصى قصصراءة الكصصواد المكتوبصصة لمتحكمصصات ARMبصصدون مجهصصود كصصبير ،بصصل قصصد تجصصد أن الوامصصر شصصبه
مصصن أجصصل هصصذه السصصباب سصصنتعامل فقصصط مصصع البرامصصج الصصتي تصصدعم هصصذه اللغصصة مباشصصرة مثصصل ATmel
Studioو CodeBlocksأمصصا بصصاقي البرامصصج مثصصل CodeVisionتجعلصصك تتعلصصم بعصصض الممارسصصات
السصصيئة فصصي كتابصصة الكصصود والصصتي قصصد ل تتوافصصق مصصع معصصايير الصصص ANSI – Cوبعصصض البرامصصج تضصصيف
مكتبات تغير طريقة البرمجة بالكامصل )مثصصل آردوينصو( وهصصذا أيضصاا ل أنصصصحك باسصصتعماله إذا كنصصت
تهدف احتراف تصميم النظمة المدمجة.
15
حول الكتاب – اﻹصدار 1.0
… ..............................................................................................
هذا السؤال دائم اا ما يتبادر لكل من يعمل أو بدأ يدخل مجال النظمة المدمجة ،دائماا سصصنجد هصصذا
الصصصراع القصصائم بيصصن فريصصق متحمصصس للصصص 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ريجستر" يمكصصن اسصصتخدامهم فصصي معالجصصة وتخزيصصن البيانصصات
مثال على ذلك ،البرنامج التصالي مكتصوب بلغصة السصي ومصصمم لكصي يبحصث عصن أكصبر قيمصة داخصل
مصصصفوفة مصصن الرقصصام Arrayوتصصم تشصصغيل نفصصس الكصصود علصصى مجموعصصة مصصن الممتحككمصصات الدقيقصصة
مثل ATmega16و PIC18Fو MSP
17
حول الكتاب – اﻹصدار 1.0
… ..............................................................................................
الجدول التالي يوضح عدد الص ) cylcesنبضصات الصصص (Clockوعصدد الوامصر بلغصة السصمبلي و سصرعة
التنفيصصصصذ النهائيصصصصة )بالميكروثانيصصصصة( للكصصصصود السصصصصابق علصصصصى مختلصصصصف الممتحككمصصصصات ،لحصصصصظ كيصصصصف أن
atmega16بصصالرغم مصصن أنصصصه يعمصصصل بسصصرعة 16ميجصصا إل أنصصه اسصصصتطاع أن يتفصصصوق علصصصى كصصصل مصصصن
PIC16C74وكذلك PIC18F452الذي يعمل بسرعة 40ميجاهرتز.
هنا يتفوق الص 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بصت ،لكصن مجصدد اا تصذكر أنصه فصصي بعصض الحصالت يكصون عليصك اختيصار ممتحككصم لنصصه
النسب والفضل سعراا.
➢ 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
الفصل اللول
22
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
المنتجننات الترفيهيننة مثصصل منصصصات اللعصصاب Xbox, Gameboy, Wiiوكصصذلك المنتجصصات •
التي أدصبحت تحمل ودصف " ذكية" مثل الهواتف الذكية ،السصصاعات الذكيصصة وحصصتى أنظمصصة
التلفاز الحديثة جميعها تعتبر أنظمه مدمجة.
23
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
أنظمة التصالت الحديثة والتي لها نصيب كبير مصصن هصذا المجصصال خادصصصة بعصصد ظهصصور •
تقنيصصات التصصصال اللسصصلكي مثصصل Bluetoothوالصصص Wifiحيصصث تحصصولت الجيصصال القديمصصة
مصصن أنظمصصة التصصصالت الصصتي كصصانت تعتمصصد علصصى الصصص Analog Electronicsإلصصى تقنيصصات
المعالجصصصة الرقميصصصة المعتمصصصدة علصصصى النظمصصصة المدمجصصصة فمثلا جميصصصع أجهصصصزة الموجهصصصات
Routersالصصصتي تصصصوفر لنصصصا النصصصترنت مصصصا هصصصي إل Embedded Linux Systemsوكصصصذلك
أنظمصصة الراديصصو القابلصصة للبرمجصصة SDRوشصصبكات المحمصصول هصصي أيضصصاا نصصوع مصصن النظمصصة
المدمجة عالية الداء.
أدوات الدخننننال Input devicesمثصصصصل الحساسصصصصات المختلفصصصصة ،أزار الضصصصصغط أو أي •
وسيلة إدخال معلومات للممتحككم.
أدوات إخنننراج Output devicesوالصصصتي متسصصصمى فصصصي بعصصصض الحصصصالت Actuators •
وتعتصصبر كصصل مصصا يتحكصصم بصصه الصصص Microcontrollerمثصصل الممحركصصات ،Motorsالشاشصصات
،LCDسماعات دصوتية … الخ.
يتم اختصار أدوات الدخال والخراج بكلمة I/Oوهي اختصار )(Input/Output Devices
24
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
التخطيصصط لمشصصروع ناجصصح وفعصصال ،فمثلا إذا جاءتصصك فكصصرة لجهصصاز رائصصع ،كيصصف تنفصصذها؟ مصصا هصصي
الدوات التي ستستخدمها؟ ما هي مراحل تطوير المشروع لتصل إلى منتج نهائي؟..
الصصصورة التاليصصة توضصصح الخطصصوات الصصتي يتبعهصصا مصصصممو النظمصصة المدمجصصة فصصي تطصصوير أي منتصصج
بدايصصة مصصن الفكصصرة حصصتى دصصصناعة المنتصصج بصصصورة تجاريصصة ،كمصصا نصصرى هنصصاك مسصصاران أساسصصيان وهمصصا
لوحة تجارب
تصميم اللوحة المطبوعة
PCB Design تصميم العتاد
Hardware Design
Test Kit
برنامصصج يكتصصب بصصداخلها وهصصذا البرنامصصج يجصصب أن يكتصصب بالصصصيغة الثنائيصصة الرقميصصة Binaryفقصصط
الصصصفر والواحصصد ،هصصذه الصصصيغة غيصصر مناسصصبة للفهصصم بالنسصصبة للبشصصر ويصصصعب تفسصصيرها .لصصذا تقصصوم
الشصصصركات المصصصصنعة للمعالجصصصات والممتحككمصصصات الدقيقصصصة بصصصصناعة بعصصصض الدوات البرمجيصصصة الصصصتي
في البداية كانت الشركات تصمم برمجيات التجميع Assemblersالتي تصصوفر للمطصصور مجموعصصة
25
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
والصصتي كصصانت أوامصصر قصصصيرة وسصصهلة نسصصبياا مثصصل ) ADDاجمصصع رقميصصن( أو ) SUBاطصصرح رقميصصن(
,ولكن كان هناك عيصصوب كصثيرة لكتابصصة البرامصصج بهصذه اللغصصة مثصل الحجصصم والصوقت ،حصتى أن بعصض
البرامج كانت تصل إلى عشرات اللف من السطور .وكان هناك مثل شهير يقول "كتابة برنامج
معقد بلغة اﻷسمبلي موازي لحفر أساسات ناطحة سحاب باستخدام ملعقة".
ظل المر هكصصذا فصصترة مصصن الزمصصن حصتى ظهصصرت اللغصصات عاليصة المسصصتوى High level language
مثل لغة السي .وهي لغات متسهل كتابة الكود البرمجي وتحويله إلى لغة اللة تلقائياا عن طريق
.1كتابة البرنامج بلغة السي :في هذه المرحلة نستخدم لغة السي للتعصصبير عصصن الوظصصائف
.2توليد ملف الن : Hexملف الهيكس هو الملف الذي يحتوي على البرنامج الحقيقي الذي
سيخزن داخل ذاكرة الممتحككم ويتم توليده تلقائياا من تحويل الكود المكتوب بلغة السي
إلى الوامر البرمجية بصيغة الص hexعن طريق الص ) toolchainسصصنتحدث عنهصصا بالتفصصصيل
26
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
.3رفع البرنامج من الحاسوب إلى ذاكرة الممتحككم :هصصذه المرحلصصة الصصتي يتصصم كتابصصة )أو كمصصا
يسميها البعض بعملية حرق (burnالبيانات الرقمية داخل ذاكرة الممتحككم ليبدأ بتنفيذها
حيصصصث يقصصصوم برنامصصصج الرفصصصع uploaderبقصصصراءة ملصصصف الهيكصصصس وتحويصصصل القيصصصم المسصصصجلة
بداخله إلى بيانصصات ثنائيصة binaryثصصم يقصصوم بكتابتهصا داخصصل العنصوانين المخصصصة لهصا فصي
ذاكرة الممتحككم.
.4اختبار البرنامج واكتشاف اﻷخطاء :في هذه المرحلة يتم تشغيل الممتحككم الصصدقيق علصصى
لوحصصة التجصصارب أو علصصى Test Kitللتأكصصد مصصن أن البرنامصصج ينفصصذ المطلصصوب أو لكتشصصاف أي
أخطصصاء ،وقصصد يتصصم تكصصرار هصصذا المصصر عشصصرات المصصرات حصصتى نصصصل إلصصى برنامصصج يصصؤدي جميصصع
للقيام بكل ما سبق سنحتاج لمجموعة من اﻷدوات البرمجية والمكونات اللكترونية وهو ما
27
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
بهصصا وهصصو مصصا يعصصرف بمفهصصوم الصصص ) Devices Interfacingمواجهصصة الجهصصزة المختلفصصة( فصصالمتحكم
الصصدقيق ل يعمصصل بمفصصرده وإنمصصا يحتصصاج أجهصصزة أخصصرى ليسصصتقبل منهصصا قصصراءات )مثصصل الحساسصصات
هناك طريقتين أساسيتين لعمصصل ذلصصك وهمصا ،اسصصتخدام اللوحصات التطويريصة Development Kit
هي لوحة اختبار مكونة من الممتح ككم الدقيق +مجموعة كبيرة من العنادصصصر اللكترونيصصة المتصصصلة
بصصصه بصصصصورة جصصصاهزة للتشصصصغيل مثصصصل شاشصصصة ،LCDلوحصصصة مفاتيصصصح ،أزرار تحكصصصم ،حساسصصصات حراريصصصة
وضوئية ،ريلي Relayوبعض أدوات التصال الرقمية مثل ممحول RS232وقد يوجصد بهصصا أكصصثر أو
28
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
أقل من ذلك .هذه اللوحات متسصهل عمليصة التطصوير بصصورة كصبيرة فهصي تحتصوي علصى معظصم مصا قصد
تحتصصاجه علصصى لوحصصة واحصصدة جصصاهزة ومتصصصلة ببعضصصها البعصصض وبالتصصالي لصصن تحتصصاج لشصصراء مكونصصات
أخرى أو تودصيل عنادصر إضافية وستوفر عليك وقت بناء الدوائر اللكترونية.
29
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
مرفق مع الكتاب مجلد يحتوي على تصميمات لمجموعة لوحات تطويرية مفتوحة المصدر
مخصصة للص AVRأغلبها مصمم للممتحككم الدقيق ATmega32/ATmega16و يمكنك دصناعتها
بنفسك بتكلفة أقل من شرائها.
الطريقة الثانية هصصي اسصصتخدام لوحصصة التجصصارب البلسصصتيكية والصصتي تسصصاعدك علصصى بنصصاء أي دائصصرة
إلكترونية باستخدام السلك ،تتميز هذه اللوحة بأنه يمكنك بناء أي دائرة قد تخطصصر علصصى بالصصك
فمن السصهل أن تفصصك وتركصصب أي عنصصر أو شصريحة إلكترونيصة )مصصن نصوع (DIPعلصصى هصذه اللوحصة،
سصصيتم اسصصتخدام هصصذه الطريقصصة فصصي الكتصصاب لنهصصا الخيصصار الرخصصص والكصصثر تصصوافراا فصصي كصصل البلد
العربية.
30
.1ممدقدمة عن الظنظمة الممدمجة
… ..............................................................................................
معلومة إضافية :الشرائح اللكترونية الص ) DIP (Dual in-line Packageهي التي تمتلك دصفين
من الرجل المعدنية والتي يمكن تودصيلها بثقوب على لوحة التجارب أو الص PCBأما SMD
وهي اختصار لكلمة Surface Mount Deviceهي الشرائح دصغيرة الحجم و تمتلك أرجل
معدنية دصغيرة جداا ويتم لحامها على سطح الص PCBفقط
)ATmega32 (DIP
ATmega32 (SMD
دصور مختلفة لنواع تغليف ممتحككمات AVRبجميع أنواع وأحجام الص DIPوالص SMD
31
الفصل الثاني
33
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
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الولى تسمى الص Flashلنها
سريعة جداا في كتابة البيانات وقد تصل سرعة الكتابة عليها إلى واحد MegaBit/Sفمثلا
قد تكتب 1بايت بداخل الفلش في زمن 1ميكروثانية فقط .بينما الص EEPROMالتقليدية
بطيئة للغاية مقارنة بالفلش حيث أن كتابة 1بايت بداخلها قد يستغرق 1مللي ثانية )يعني
أبطأ بنحو 1000مرة من الص .(Flash
معمارية 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بت.
37
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
مساحة الذاكرة المجال أو البيئة عدد وإمكانيات عدد أطراف سرعة معالجة
التي سيعمل بها المطلوبة والتي الن Peripheral التحكم العامة البيانات
الممتحككم مثل ستحدد حجم Devices GPIOوالتي والستجابة
درجة الحرارة و البرنامج الذي المتوفرة تمثل عدد المطلوبة
معدل استهلك سيوضع على للممتحككم المداخل
الطاقة الممتحككم والمخارج
علصصى حسصصب العوامصصل الخمسصصة السصصابقة سصصنجد أن شصصركة ATmelقسصصمت ممتحككمصصات AVRإلصصى 6
عائلت أساسية منها أربعة عائلت عامصة General purpose microcontrollersممصا يعنصي أنصه
يمكصصصصن اسصصصصتخدامها لجميصصصصع مجصصصصالت النظصصصصم المدمجصصصصة ومختلصصصصف المنتجصصصصات .وهنصصصصاك عصصصصائلتين
مصممتين لمنتجات محددة فقط:
megaAVR – 8 bit
ATTiny – 8 bit
AVR - 32 bit
38
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
Automotive AVRهذه العائلة ممصممة للنظمة المدمجة الخادصصصة بالسصصيارات لصذا فهصصي تتميصصز
بتحمصصل الظصصروف القاسصصية مثصصل درجصصات الحصصرارة المرتفعصصة )يمكنهصصا العمصصل فصصي بيئصصة تصصصل درجصصة
حرارتهصصصا إلصصصى 150درجصصصة مئويصصصة( ،كمصصصا تحتصصصوي علصصصى نظصصصم تشصصصفير خادصصصصة لحمايصصصة المعلومصصصات
المخزنصصة بصصداخلها وكصصذلك تحتصصوي علصصى أنظمصصة حمايصصة مصصن مشصصاكل التيصصار الكهربصصي وفصصرق الجهصصد
سيرتكز الكتاب على شرح العائلة الولى والثانية mega, ATTinyباعتبارهم أشهر العائلت
وأكثرها توافراا على مستوى العالم
الصورة التالية توضح ترتيصصب القصصوة والمميصصزات الصصتي تحتويهصا كصصل عائلصة ،حيصث نجصد أن الخصط
الفقصصي يعصصبر عصصن قصصوة الداة Performanceوالخطصصأ الرئسصصي يعصصبر عصصن مصصدى انخفصصاض اسصصتهلك
الطاقة.
39
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
عند الضغط على أي من أسماء العائلت بالعلى ستنتقل إلى دصفحة على موقصصع Atmelتوضصصح
جميصصع أفصصراد هصصذه العائلصصة مصصن الممتحككمصصات مصصع عصصرض سصصريع لخصصصائص كصصل ممتحككصصم مثصصل حجصصم
الذاكرة وعدد أطراف الممتحككصم .ه ذه الصصفحة تقصدم مقارنصة سصريعة بيصن الممتحككمصات لتسصاعدك
على اختيار الممتحككم النسب لمشروعك.
عند الضغط علصى اسصم أي مصن الممتحككمصات مثصل ATmega16س يتم نقلصك إلصى دصصفحة الممتحككصم
والتي تحتوي علصى جميصع البيانصات المتعلق ة به ذا الممتحككصم بمصا فصي ذلصك أهصم ملصف وهصو "دلينل
البيانننات "Datasheetوالصصذي يتصصوفر منصصه نسصصختين" summery ،مختصصصر سصصريع" أو الصصدليل
الكامل .complete
في هذا الكتاب دائما سنستخدم الدليل الكامل من أي .Datasheetلذا قم بتحميل كل من
الدليل الخاص بالمتحكم ATmega16و ATtiny84
مصصصن خلل الصصصصفحات السصصصابقة وملفصصصات الصصصص Datasheetيمكنصصصك تحديصصصد الممتحككصصصم الصصصدقيق الصصصذي
يمتلصصك المكانيصصات المناسصصبة للمشصصروع الصصذي تريصصده .بالتأكيصصد اختيصصار الممتحككصصم يجصصب أن يكصصون
مقترن بخبرتك في مجال البرمجة وتحسين الكواد المكتوبة للستفادة القصوى من الممتحككصم.
لصصصذا سصصصنجد أن مهصصصارة اختيصصصار الممتحككصصصم المناسصصصب سصصصتزداد عنصصصدما تتقصصصن برمجصصصة هصصذا النصصصوع مصصصن
الممتحككمات.
40
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
سصصنتناول الموضصصوعات المختلفصصة فصصي دليصصل البيانصصات علصصى مصصدار فصصصول الكتصصاب بالكامصصل ،حيصصث
سنتعلم في كل فصل أحد الخصائص التي تتمتصع بهصصا ممتحككمصصات AVRوسنحصصصل علصى تفادصصيل
هذه الخصائص من دليل البيانات.
هصصصذا الفصصصصل سصصصيركز علصصصى الجصصصزء الول مصصصن دليصصصل البيانصصصات والصصصذي غالبصصصاا مصصصا يكصصصون أول 5أو 8
دصفحات ويحتوي على النظرة العامة للممتحككم.
41
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
يوضصصح هصصذا الجصصزء الخصصصائص العامصصة لتقنيصصة معالجصصة البيانصصات وسصصرعة الممتحككصصم الصصدقيق حيصصث
نجد أن الممتحككم يتمتع بالقدرات التالية:
عدد single cycle execution Instruction – 131والتي تعني أن الممتحككم يمكن •
برمجتصصه باسصصتخدام 131أمصصر بلغصصة السصصمبلي ومعظصصم هصصذه الوامصصر يتصصم تنفيصصذها فصصي
نبضة واحدة فقط.
Mega Instruction Per Second (MIPS) 16وهي نفصصس الخادصصية السصصابقة والصصتي •
تعنصصي أن الممتحككصصم يمكنصصه تنفيصصذ 16مليصصون أمصصر برمجصصي عنصصدما يتصصم تشصصغيله بصصتردد 16
ميجصصاهرتز ) هصصذا بسصصبب أن معظصصم الوامصصر البرمجيصصة يمكنصصه تنفيصصذها فصصي نبضصصة واحصصدة
فقط( .وتعبر هذه الخادصية عن أقصى سرعة معالجة للممتحككم الدقيق وتعتبر من أهصصم
الخصائص التي تتمتع بها معالجات .AVR
مثال :إذا كان لدينا برنامج مكون من 10أوامر بلغة السمبلي والمتحكم يعمل بسرعة 1
ميجاهرتز )مما يعني أن زمن كل نبضة = 1ميكروثانية( فهذا يعني أن البرنامج سيستغرق
تنفيذه زمن 10نبضات وهو ما يساوي 10ميكروثانية فقط.
42
.2ظنظرة عامة على ممتحككمات AVR
… ..............................................................................................
يوضح هذا الجزء الخصائص التي تمتاز بهصصا الصصذاكرة الموجصصودة داخصصل ممتحككمصصات AVRبأنواعهصا
المختلفة مثل الص Flashوالص RAMوالص EEPROMومن أهم هذه الخصائص التالي:
الحتفاظ بالبيانات في كل من الن Flashوالن EEPROMلمنندة زمنينة تصننل إلننى 100 •
عننام كامننل عنصصد تشصصغيل الممتحككصصم فصصي درجصصة حصصرارة 25درجصصة مئويصصة أو 25عصصام عنصصد
تشغيل الممتحككم في درجة حرارة 80درجصصة مئويصصة وهصذا يعنصصي أن الممتحككصصم يسصصتطيع
العمل والحتفاظ بالبيانات لفترة طويلة جداا.
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
… ..............................................................................................
الطننرف RESETهصصذا الطصصرف يقصصوم بعمصصل 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
… ..............................................................................................
أيضاا تتميز هذه الممتحككمات بالستهلك المنخفض جداا للطاقصصة .حيصث يمكنهصصا العمصصل علصصى فصصارق
جهد 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
➢ www.microfusion.de/e-/Microcontroller/AVR-Overview/ATtiny.html
➢ en.wikipedia.org/wiki/Atmel_AVR_ATtiny_comparison_chart
وATTiny مرفق مع الكتاب ملف مقارنة شامل بين أفراد الممتحككمات في كل العائلتين
megaAVR
52
الفصل الثالث
يوضح هذا الفصصصل الدوات الصصتي سنسصصتخدمها فصصي تطصصوير النظمصصة المدمجصصة
سواء كانت العتصصاد "المكونصصات اللكترونيصصة" Hardwareأو الدوات البرمجيصصة
)ToolChain (Softwares
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تجهيز أدوات التجارب
… ..............................................................................................
الممبرمجصصة الرسصمية مصصن شصركة أتمصصل ،وتعصد مصن الممبرمجصصات المتطصورة نسصبياا حيصث تصصدعم معظصصم
عصصصائلت الصصصص AVRالصصصص 8بصصصت والصصصص 32بصصصت مثصصصل Xmegaويمكنهصصصا برمجصصصة الممتحككمصصصات بمختلصصصف
السرعات من 500هرتز إلى 8ميجا هرتز )هذه السرعة تمثل سرعة نقل البيانات وليس سرعة
الممتحككم نفسه( .
تعتصصبر AVRISP mkIIأفضصصل مصصن USBaspبكصصثير حيصصث تصصدعم USBaspسصصرعات برمجصصة بحصصد
أقصى 5ميجا فقط – كما أنها تدعم برمجصصة الممتحككمصصات الصصتي تعمصصل بفصصرق جهصصد مصصن 1.8فصصولت
حصصتى 5فصصولت .بالتأكيصصد كصصل هصصذه المميصصزات تصصأتي علصصى حسصصاب السصصعر الصصذي يبلصصغ نحصصو 40دولر
تقريباا .يمكنك قراءة كافة التفادصيل عنها من الرابط التالي
http://www.ATmel.com/tools/AVRISPMKII.aspx
تحذير :تنتشر بعض النسخ الصيني المزورة من هذه الممبرمجة بسعر منخفض )حوالي 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تجهيز أدوات التجارب
… ..............................................................................................
هصصذا النصصوع مصصن الممبرمجصصات يمكنصصه التعامصصل مصصع جميصصع الممتحككمصصات الدقيقصصة وشصصرائح الصصذاكرة مصصن
مختلصصصصف الشصصصصركات فمثلا معظصصصصم هصصصصذه الممبرمجصصصصات يمكنهصصصصا برمجصصصصة 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المكونات اﻹلـكترونية
سصصتحتاج لبعصصض المكونصصات اللكترونيصصة لداء التجصصارب فصصي هصصذا الكتصصاب ،بعصصض هصصذه المكونصصات
واجصصب تصصوافره والبعصصض الخصصر ميسصصتخلدم فقصصط فصصي التجصصارب الضصصافية لصصذا احصصرص علصصى اقتنصصاء
المكونصصات الصصتي سصصيكتب بجانبهصصا )واجننب( – أمصصا المكونصصات الصصتي سصصيكتب بجانبهصصا )اختينناري(
فيمكنك الستغناء عنها )ومع ذلك أنصحك بشرائها حتى تستفيد بأكبر قدر من التجارب(.
كريستالة 16 :ميجاهرتز
61
.3تجهيز أدوات التجارب
… ..............................................................................................
حسصصصصصصصصصصصصصصصصصصصصصصصصاس
)اختياري( عدد 1حساس حرارة والذي سنسصصتخدمه فصصي
الحصصصصصصصصصصصصصصصصصصصصصصصصرارة
فصل الحساسات التماثلية
LM35
مقاومصصصة ضصصصوئية
)اختينناري( عصصدد 1مقاومصصصة ضصصوئية والصصصتي سنسصصصتخدمها
LDR
في فصل الحساسات التماثلية
مقاومصصصصصصصصصصصصة متغيصصصصصصصصصصصصرة
)واجننب( عصصدد 1مقاومصصة متغيصصرة ذات 3أطصصراف تودصصصيل
potentiometer
مع عمود دوران
)اختياري( عدد 1محرك خطوي من نوع bipolarله سلك ذا محرك Stepper
4أطراف ويستخدم في تقنيات التحكم للماكينات ،يجب Motor
)(bipolar
أن ل يستهلك تيار أكبر من 500مللي أمبير )نصف أمبير(
وسنتعرف عليه بالتفصيل في فصل المحركات.
62
.3تجهيز أدوات التجارب
… ..............................................................................................
)اختياري( دائرة قيادة المحركات )قنطرة (Hوتعتصصبر مصصن L293 H-bridgeدائرة قيادة
أهصصم الشصصرائح الصصتي سنسصصتخدمها فصصي التحكصصم بالمحركصصات
سواء الص DCأو الص Stepper Motor
63
.3تجهيز أدوات التجارب
… ..............................................................................................
3.3أدوات إضافية
مصصصصن المحبصصصصذ أن تمتلصصصصك مجموعصصصصة مصصصصن الدوات الضصصصصافية حيصصصصث ستسصصصصاعدك كصصصصثيراا فصصصصي تعلصصصصم
الممتح ككمات الدقيقة واللكترونيات بشكل عام لذا احرص على اقتنائها إذا لم تكن لديك بالفعل.
القائمة التالية هي مثال على ما ينبغي أن تمتلكه:
64
.3تجهيز أدوات التجارب
… ..............................................................................................
3.4تجهيز الربرمجيات
البرمجيصصات المخصصصصة للنظمصصة المدمجصصة )أو كمصصا تسصصمى Firmwareفيصصرم-ويصصر( يتصصم تصصصميمها
باسصصصتخدام "مجموعصصصة أدوات التطصصصوير" أو كمصصصا تعصصصرف باسصصصم Development toolcahinمصصصن
الرائصصصع أن هصصذه الدوات متصصصوفرة لمتحكمصصصات الصصصص AVRمجانصصصاا وبصصصصورة مفتوحصصصة المصصصصدر لجميصصصع
أنظمصصصة التشصصصغيل ،هصصذا يعنصصصي أن جميصصع البرمجيصصصات الصصصتي سنسصصصتخدمها مجانيصصصة تمامصصصاا ويمكنصصصك
استخدامها بحرية بأي دصورة سواء كانت تعليمية أو تجارية .مجموعة الدوات هي:
اﻷدوات المساعدة – binutilsمجموعة من الدوات التي تساعد المصصترجم فصصي إتمصصام •
عملية تحويل البرنامج من اللغة عالية المستوى إلصصى ملصصف hexمتكامصصل )الهيكصصس hex
هي دصيغة نصية تمثل الص binaryفي دصورة أبسط وأكثر اختصاراا(.
المنقننح – 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تجهيز أدوات التجارب
… ..............................................................................................
اختر نسخة البرنامج المتكاملة والمضاف إليها باقة أدوات الص ) NET.هصذه النسصخة تحتصوي علصصى
كل الملفات المطلوبة( وعصصادة مصصا تتميصصز بحجمهصصا الكصصبير لصصذا احصصرص علصصى أن يكصصون لصصديك اتصصصال
سريع بالنترنت عند تحميل البرنامج.
سيطلب منك الموقع أن تسجل حساب جديد )أو تسجل دخصول إذا كصان لصديك حسصاب بالفعصل(،
الحسصصصاب مجصصصاني تمامصصصاا وسصصصيوفر لصصصك تحميصصصل جميصصصع أدوات الشصصصركة مجانصصصاا .بعصصصد النتهصصصاء مصصصن
تسجيل الحساب يمكنك تحميل البرنامج.
67
.3تجهيز أدوات التجارب
… ..............................................................................................
بعصصد النتهصصاء مصصن تنصصصيب Atmel studioسصصنقوم بتحميصصل برنامصصج AVRdudessوهصصو برنامصصج
avrdudeمضاف إليه واجهة رسومية رائعة ومزودة بالعديد مصصن الخيصصارات الصصتي متسصصهل برمجصصة
شرائح الص ،AVRيمكنك تحميل البرنامج من الموقع التالي:
http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude
هصصذا الجصصزء قصصد يختلصصف علصصى حسصصب الممبرمجصصة الصصتي ستسصصتخدمها ،شخصصصياا أسصصتخدم 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
يمكنصصصك تنصصصصيب جميصصصع الدوات مباشصصصرة عصصصبر المصصصر التصصصالي )تكتصصصب فصصصي طرفيصصصة سصصصطر الوامصصصر
(Terminal
sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude
يمكنك استخدام برنامج yumأو ) DNFالموجود في نظام فيدورا لينكس 22أو أعلى( وذلك
عبر الوامر التالية
sudo yum install avr-gcc avr-binutils avr-libc avr-gdb avrdude
يحتصصوي الملصصف الرسصصمي علصصى تعريفصصات نظصصام لينكصصس )متوافقصصة مصصع جميصصع النظمصصة بل اسصصتثناء(
وهي عبارة عن ملصصف 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
الفصل الرابع
ف ”ف إنف الخطرف الذيف يهددف اللكثيرينف مناف ليسف أنف نضعف أهدافااف عاليةف جدااف
فلاف نستطيعف بلوغها،ف بلف أنف نضعف أهدافااف منخفضةف للغاية،ف ثمف نبلغهاف ‟
فصصي هصصذا الفصصصل سصصنتعلم أساسصصيات تشصصغيل أطصصراف الممتحككصصم الصصدقيق وتشصصغيل المنافصصذ لتعمصصل
كصصصدخل أو كخصصصرج .كمصصصا سصصصنقوم بمجموعصصصة مصصصن التجصصصارب لتشصصصيغل بعصصصض العنادصصصصر اللكترونيصصصة
البسيطة مثل ..LEDs, Switchs, 7-Segmentsالخ.
74
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
في جميع التجارب التالية سنتبع أسصصلوب التصصصميم Designثصصم المحاكصصاة Simulateثصصم التنفيصذ
علصصى لوحصصة التجصصارب Prototypeوذلصصك لتسصصهيل تعلصصم البرمجصصة ،مصصع ملحظصصة أنصصه هنصصاك بعصصض
المثلة التي قد ل تصلح للمحاكاة ويجصصب أن تنفصصذ مباشصصرة علصصى لوحصة التجصارب كمصصا سصنرى فصصي
الفصول المتقدمة )مثل الص fusesوإدارة الطاقة(.
فكرة
كتابة البرظنامج
المحاكاة
تطبيق فعلي
ملحظة :جميع التجارب على لوحة الختبارات ) Breadboardالتطبيق الفعلي( +العديد من
التجارب الضافية ستشرح على هيئة فيديوهات مستقله عن الكتاب
75
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
سنستخدم في هذا المثال دايود ضوئي Ledيتم تودصيله على الطصصرف PA0ويمكنصك اسصتخدام
إمصصصا ATmega16أو ) ATtiny84كلهمصصصا يمتلكصصصان الطصصصرف (PA0كمصصصا هصصصو موضصصصح فصصصي المخطصصصط
التالي:
ملحظة :كلمة ممخطط Schematicتعني الرسمة التي تشرح تودصيل المكونات اللكترونية
ببعضها البعض ،دائماا ما يتم استخدام المخططات لشرح أي تصميم إلكتروني سواء كان
بسيطاا أو ممعقداا .في هذا الكتاب سأستخدم برنامج بروتس لرسم معظم المخططات للدوائر
التي سنقوم بتجربتها على مدار المثلة القادمة.
76
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
من الصفحة التي ستظهر اختر مشروع جديد بلغة السي GCC – C- Executableوقم باختيار
اسم المشروع والمجلد الذي سيحفظ به المشروع من الشريط السفلي .تذكر هذا المجلند جينداا
ﻷنه سيحتوي على ملف الهيكس الذي سنستعمله في الخطوات التالية.
77
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
الن يمكنك اختيار عائلة ونوع الممتحككم الدقيق المستخدم ،كما يمكنصك اسصتخدام مربصع البحصث
على الجانب اليمن من الصفحة )اختر الممتحككم ATmega16أو .(ATtiny84
بعصصد النتهصصاء مصصن هصصذه الختيصصارات سصصتظهر شاشصصة البرمجصصة الرئيسصصيةوبداخلها "هيكصصل فصصارغ"
Empty templateكما في الصورة التالية
78
GPIO Basics أساسيات التحكم.4
.............................................................................................. …
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
… ..............................................................................................
يمكنك استخدام أي إدصدارة من برنامج بروتس سواء كانت SP2 7.8أو الدصدار 8.1مع
العلم أن جميع الملفات المرفقة مع الكتاب تم تصميمها واختبارها على كل الدصدارين
فصصي البدايصصة قصصم بعمصصل مشصصروع جديصصد ولنسصصميه ATmega16_blink_ledواخصصتر المكصصان الصصذي
تريد أن تحفظ به ملفات المشروع كما في الصور التالية:
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
… ..............................................................................................
بذلك نكون قد انتهينا من تودصيل المكونات الساسية ويتبقى فقط إضصصافة ملصصف الهيكصصس hex 0
الخصصاص بصصالكود الصصذي كتبنصصاه علصصى برنامصصج CodeBlocksوذلصصك عصصبر الضصصغط بصصالزر اليمصصن علصصى
الممتحككم ATmega16واختيار "تعديل خصائص الممتحككصصم" ثصصم الضصصغط علصصى Program File
واختيصصصار ملصصصف الهيكصصصس الصصصذي دصصصصنعناه باسصصصتخدام ) Atmel stduioسصصصتجد الملصصصف فصصصي مجلصصصد
المشروع( كما في الصورة التالية:
86
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
87
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
هيكل الربرامج
الشكل التالي يوضح الهيكل الرئيسي لمعظم البرامج الخادصة بمتحكمات AVR
{ )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إلى جزأين كالتالي:
{ )int main(void
هنا تكتب إعدادات الممس ك
جلت //
)while(1
{
هنا تكتب كافة الكواد البرمجية //
// التي سيتم تنفيذها بصورة مستمرة على الممتحككم الدقيق
}
;return 0
}
89
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
أي بورت لتعمل إما كدخل 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
… ..............................................................................................
فهذا يعني أن الطرف PA0و PA1تعمل كخرج أما الطراف من P2إلى PA7تساوي دصفر
وتعمل كدخل.
91
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
ملحظة :عندما نكتب رقم يبدأ ب 0bفي لغة السي مثل 0b00011100فهذا يعني أننا
نكتب رقم بالصيغة الثنائية binaryأما عندما نكتب رقم يبدأ ب 0xمثل 0xffفهذا يعني أن
الرقم مكتوب بالصيغة .hexadecimalويمكنك أن تتعرف أكثر على أنواع الصيغ عبر قراءة
الملحق المسمى "أساسيات اﻷنظمة الرقمية".
كمصصا هصصو ملحصصظ فصصي الصصصورة الخادصصصة بالمسصصجل DDRAسصصنجد هنصصاك كلمصصة تسصصمى Initial value
والتي تعني القيم الفتراضية لكل البتات والتي تسصاوي دصصفر ممصا يعنصي أن جمي ع الطصراف تعمصل
بصورة افتراضية كدخل.
أيضصصاا سصصنجد أن أسصصفل كصصل بصصت كلمصصة Read/Writeوالصصتي تعنصصي أنصصه يمكنصصك تعصصديل محتصصوى هصصذا
الممسصصصص ك
جل writeكمصصصصا فعلنصصصصا فصصصصي المصصصصر DDRA=0b00000001أو يمكنصصصصك قصصصصراءة محتصصصصواه Read
وستتضح هذه الخادصية بالتفصيل في الفصل القادم حيث سنقوم بقراءة هذه الممس ك
جلت.
جل PORTxفصصي الخصصصرج الرقمصصصي لي طصصرف ،فمثلا عنصصصدما قمنصصا بتودصصصيل الصصدايود
يتحكصصصم الممسصصص ك
الضوئي على الطرف PA0قمنا بتشغيله وإطفاءه باستخدام هذا الممس ك
جل ،ومثل الص DDRxفإنه
يمتلك 8بت كل بت منهم تتحكم في أحد الطراف لكل بورت.
92
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
;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
… ..............................................................................................
)int main(void
{
;DDRA = 0b00000001 تفعيل الطرف اﻷول ليعمل كخرج //
; return 0
} نهاية البرنامج //
العديد من محترفي البرمجة قد يقومون بكتابة التعليقات حتى قبل البدء في كتابة الكواد
نفسها ويساعدهم ذلك على تنظيم الفكار وتحديد ما يجب أن يكتب بصورة منظمة ،لذا
احرص دائماا على توضيح وشرح كل سطر برمجي تكتبة باستخدام commentيسبق هذا
السطر
94
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
95
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
الـكود الربرمجي
#define F_CPU 1000000UL تحديد سرعة المعالج //
>#include <avr/io.h
>#include <avr/delay.h استدعاء المكتبات البرمجية //
)int main(void
{
)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
96
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
97
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
فصصي حالصصة الممتحككصصم 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 انتظر نصف ثانية //
شرح الـكود
في البرامج السابق قمنا باسصتخدام المسصصجلين 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
… ..............................................................................................
تتكون السيفين سيجمنت من 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
.............................................................................................. …
}
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
… ..............................................................................................
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إلخ.
في حالة عدم تطبيق أي جهد على أطراف الممتحككم تكون قيمة البتات = دصفر ويتم تغيصر هصذه
القيمة عند تطبيق جهد على الطرف الموازي لكل بت .مثلا لصصو قمنصصا بتطصصبيق جهصد 5فصصولت علصصى
فصصي البرنامصصج السصابق اسصتخدمنا الجملصصة الشصرطة ) if (conditionلتشصغيل الصصدايود الضصصوئي عنصصد
الضغط على الزر حيث كتبنا المر.
)if(PINB == 0b00000001
};{PORTA = 0b00000001
والصصذي يعنصصي أنصصه إذا كصصانت قيمصصة الممسصص ك
جل PINBتسصصاوي ) 0b00000001يعنصصي تصصم الضصصغط
على الزر المتصل بص (PB0قم بتشغيل الدايود الضوئي عبر المر PORTA = 0b00000001
else
};{PORTA = 0b00000000
وفي حالة عدم تطبيق هذا الشرط elseقم بإطفاء الدايود عبر PORTA = 0b00000000
108
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
السننتخدام اﻷول )إلغنناء النندخل العننائم( :جميصصع المكونصصات اللكترونيصصة الرقميصصة الصصتي تتعامصصل
بالصصصفر والواحصصد تعصصاني مصصن مشصصكلة خطيصصرة جصصداا تسصصمى المنطقصصة العائمصصة Floating Areaأو
) Nosie Marginنطاق الشوشرة( هذه المنطقة هي فارق الجهد بين الص ) Logic (0والص )Logic (1
وتستخدم المقاومات pull-up or downفي حل هذه المشكلة.
بطبيعة الحال جميع الجهزة اللكترونية تصدر نوع من الصصص 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
… ..............................................................................................
111
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
لحصصصظ أن الممسصصص ك
جل PORTxلصصصن يعمصصصل لكتابصصصة قيصصصم الخصصصرج
ولكصصصصصن هنصصصصصا سيسنننننتخدم لتفعينننننل الترانزسنننننتور الخننننناص
بمقاومننة الننن pull-upفقننط .أيضصصاا تصصذكر أنصصه بعصصد تفعيصصل المقاومصصة يصصصبح تصصأثير الضصصغط علصصى
المفتاح معكوس مما يعني أن قصراءة PINxتصصبح 0فصي حالصة الضصغط علصى المفتصاح وتصصبح 1
ترك المفتاح.
الصورة التالية توضح شكل تودصيل المفتاح مع تفعيل الص internal pull-up
112
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
إذا تم الضغط على المفتاح المتصل بالطرف 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 تفعيل خرج لتشغيل الثل ث دايودات ضوئية //
)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
114
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
وإذا كصصصانت القيمصصصة تسصصصاوي 0b11111101فهصصصذا يعنصصصي انصصصه تصصصم الضصصصغط علصصصى الصصصزر المتصصصصل
بالطرف PB1وسيؤدي ذلك لتشغيل الدايودات على الطراف PA0 + PA1ونفس المر مع
الزر الثالث )المتصل بالطرف (PB2والذي سيشغل الدايودات الثلثة .PA0, PA1, PA2
115
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
تعتصبر ه ذه الظصاهرة مصن المصور المزعجصة لمصصممي النظصم المدمجصة وذلصك لنهصا تجعصل المفاتيصح
الميكانيكية تنتج إشارات غير مطلوبة قد تؤثر على أداء النظام المدمج ككل .من حسصصن الحصصظ
أنه هناك العديد من الحلول المتوفرة لهذه الظاهرة وتسمى هذه الحلول debouncing
هذا الحل يعتبر أبسط طريقة وتسمى software debouncingحيث تعتمد هذه الطريقة علصصى
التأكد "مرتين" من الضغط على المفتاح مع وضع تأخير زمني بين كل مصصرة .الكصصود التصصالي يمثصصل
تشغيل دايود ضوئي عند الضغط على مفتاح ) والثاني(
116
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
تقرأ أكثر من مفتاح .وفي حالة استخدام نظام تشغيل RTOSل يمكن استخدام هصذا النصصوع مصصن
التأخير الزمني بصورة مباشرة )سيتم شرح التأخير الزمني لنظام ROTSبالتفصصصيل فصصي الفصصصل
السابع(.
هصصصذا الحصصصل يعتمصصصد علصصصى اسصصصتخدام دائصصصرة filterلترشصصصيح الذبصصصذبات الكهربيصصصة الناتجصصصة عصصصن الصصصص
bouncing effectوتسصصصصصمى Hardware Debouncingحيصصصصصث تسصصصصصتخدم هصصصصصذه الصصصصصدائرة فصصصصصي
امتصاص الذبذبات الكهربية وتمنع دخولها للمتحكم الدقيق.
على أي حال ،استخدام مكثصف واحصد فقصط كصافي لفلصترة الذبصذبات الكهربي ة الغيصر مرغصوب فيهصا
ول داعي لبناء دوائر أكثر تعقيداا كما أنه أوفر من ناحية للتكلفة.
الممينننزات :الفضصصصل مصصصن ناحيصصصة الداء .متوافقصصصة مصصصع جميصصصع الممتحككمصصصات الدقيقصصصة ول •
تتطلب أي تأخير زمني في الكود كمصا أنهصصا لصصن تتسصبب فصصي مشصاكل للصصص Interruptsأو الصصص
RTOS
العيوب :زيادة التكلفة بسبب استخدام مكونات إضافية مع المفتاح. •
117
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
هناك سببان لهذا المر .الول هو أن الدايود الضوئي )خادصة اللون الحمر( يفضل أن يت م تشصغيله
بتيار كهربي ما بين 15إلى 20مللي أمبير عند تطبيق فرق جهد 5فولت .وبالتعويض في قانون
أوم الكهربي )فرق الجهد 5فولت – التيار 15مللي أمبير(
إذا لم تستخدم هصذه المقاومصة قصد تحصدث العديصد مصن المشصاكل .فمثلا إذا تعصرض الصدايود الضصوئي
الحمر لكثر من 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مللصصي أمصصبير ،وهصصذا أكصصبر بكصصثير ممصصا قصصد يتحملصصه
المتحكم على طرف واحد(.
120
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
الدائرة بالعلى تمثل طريقة تودصيل المتحكم الدقيق مع الترانزستور ،حيث يتصصم تودصصصل طصصرف
المتحكم بقاعدة الترانزستور Baseمصصن خلل مقاومصصة يجصصب أن تكصون قيمتهصصا مصصا بيصصن 150اوم
إلى 1كيلو اوم.
يتم تودصيل الدايودات الضوئية على طرف المجمع collectorمع وضع مقاومصصة 300اوم قبصصل
كصصصل دايصصصود )لحمايصصصة الصصصدايود( ويتصصصم تودصصصصيل طصصصرف المشصصصع Emitterبصصصالطرف الرضصصصي ،،نظريصصصاا
تستطيع هذه الدائرة أن تشصغل حصتى 30دايصصود ضصوئي )مصصن النصوع أحمصر اللصصون( لكصن كمصا أشصصرنا
مسبقاا يستحسن أن يتم تشغيل أي عنصر إلكتروني بحد أقصى %85من قصصدرته الكاملصصة وهصصذا
يعني أن أقصى تيار للحمال المتصلة على 2n2222يجب أن يكون 400مللي أمبير فقط.
بعد النتهاء من توصيل هذه الدائرة يمكنك اختبارها عبر نفس المثال اﻷول Blinking led
ملحظة :يتم استخدام مقاومة بين طرف المتحكم وقاعدة الترانزستور لن أغلب
الترانزستورات ل تتحمل تيار على طرف القاعدة أكبر من 10مللي أمبير
121
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
أبسط دائرة لتشغيل المحرك هي نفس الدائرة السابقة مع وجود بعض التعديلت البسيطة
ملحظة :يحتوي برنامج بروتس على محرك 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
… ..............................................................................................
لتودصيل أكثر من نقطة ببعضصها البعصض كصل مصا عليصصك فعلصصه هصو الضصصغط
علصصى هصصذه الصصدائرة وتسصصميها بحصصرف معيصصن مثصصل A,B,C,Dوسصتقوم هصصذه
الدوائر بتودصيل جميع الدوائر المسماه بنفس السم ببعضها البعض.
124
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
يعمل كل مفتاحين مع بعضصصهما البعصصض ،فإمصصا أن يتصصم إغلق المفتصصاح S1و S4بحيصصث يمصصر التيصصار
الكهربي من الطرف اليسر إلى الطرف اليمن للمحرك )بذلك يدور المحرك مصصع عقصصارب السصصاعة(،
أو يتصصم إغلق المفتصصاحين S2و S3بحيصصث يمصصر التيصصار الكهربصصي مصصن الطصصرف اليمصصن إلصصى الطصصرف
اليسر وبالتالي يدور المحرك عكس عقارب الساعة.
125
.4أساسيات التحكم GPIO Basics
… ..............................................................................................
الربرنامج
لتشصغيل ه ذه القنطصرة يتصم اسصتخدام طرفيصن مثصل PA0و PA1حي ث يتصصل كصل طصرف بعصدد 2
من الترانزستورات كما هو موضح في الصورة الولى ،ويتم التحكم باتجصصاه دوران المحصصرك عصصن
طريق تشغيل الطرف PA0وإطفاء PA1أو العكس )لتغير اتجاه دوران المحرك(.
)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
الفصل الخامس
في هذا الفصل سنتعلم بعض القواعد والصيغ الشهير للغة السي المعيارية والمستخدمة بشكل
كصصصبير فصصي تطصصوير النظمصصة المدمجصصة .تتميصصز الصصصيغ المعياريصصة بإمكانيصصة تطبيقهصصصا علصصصى مختلصصف
الممتحككمات الدقيقة طالماا أن المترجم الخاص بها يدعم لغة السي.
128
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
مثلا فصصي حالصصة كتابصصة برنامصصج بلغصصة السصصي علصصى الحاسصصب اللصصي التقليصصدي والصصذي يمتلصصك معالصصج
وذاكصصرة ضصصخمة )تقصصدر بالجيجصصا بصصايت(وكلهمصصا مخصصصص للتعامصصل مصصع البيانصصات 32أو 64بصصت،
سصصصصنجد أن معظصصصصم المتغيصصصصرات الرقميصصصة تكصصصصون intأو doubleأو floatأمصصصصا فصصصصي حالصصصصة النظمصصصصة
المدمجة يعد استخدام هذه النواع "اهدار للذاكرة" لصصذا سصصنتعلم فصصي هصصذا الجصصزء كيفيصصة برمجصصة
أنواع البيانات المختلفة بصورة ممحسنة خصيصاا لذاكرة الممتحككمات الدقيقة.
البيانات الرقمية
تعتبر الرقام هي أكثر أنواع البيانات استخداماا في عصالم النظمصة المدمجصة فهصي تعصبر عصصن قيصم
المتغيرات مثل قراءات الحساسات )حرارة ،ضغط ،رطوبة ،ضوء.. ،الصصخ( أو قيصصم المخصصارج مثصصل
قيمة أي PORTأو سرعة Motorأو توقيت زمنصصي ..إلصصخ .وتعتصبر الرقصام هصي أكصثر مصا يسصتهلك
الذاكرة )خادصة الص (SRAMلذا سيكون لها نصيب كبير من الشرح في هذا الفصل.
هصصذه القائمصصة تمثصصل أشصصهر أنصصواع البيانصصات المسصصتخدمة فصصي تعريصصف المتغيصصرات فصصي لغصصة السصصي مصصع
حجم الذاكرة الذي تستهلكه كل منها .مع العلم أنه يمكنك برمجة جميع النظمة المدمجة بها.
أنواع البيانات التي تستخدم في حفظ الرقام والموجبة والسالبة تسمى signed numbers
أما إذا وضعنا قبلها كلمة unsignedفإنها تصلح للتعامل مع الرقام الموجبة فقط ولكن
بضعف مساحة التخزين
129
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
نوع البيانات أقصى قيمة يمكن وضعها داخل المتغير استهلك الذاكرة )عدد (Bytes
ملحظة :نوعي البيانات floatو doubleدائماا يكونا من نوع Signedول يمكن استخدام
العلمة unsignedمعهما
كما نلحصظ مصن الجصصدول السصابق أن جميصع أنصصواع البيانصات الشصهيرة تسصتهلك مسصاحة تبصصدأ مصن 2
بايت حتى 8بايت وتعتبر ه ذه المسصاحة كصبيرة نسصبياا فصي عصالم النظمصة المدمجصة .فمثلا قيمصة
جل مثل PORTxأو PINxأو DDRxلن تزيد أبداا عن 8بت.
أي ممس ك
والن لنتخيصصل أننصصا نحتصصاج متغيصصر اسصصمه ButtonStatusمصصن نصصوع intو سيسصصتخدم هصصذا المتغيصصر
130
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
يستهلك كصل متغيصر مصن القائمصة السصابقة مسصاحة = الرقصم المكتصوب بعصد كلمصة intأو uintفمثلا
int8_tتعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع intويصصصصلح لتخزيصصصن الرقصصصام الموجبنننة والسنننالبة فصصصي
مسصصصاحة تخزينيصصصة = 8بصصصت فقصصصط ) 1بصصصايت( .بينمصصصا uint16_tيعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع
unsigned intويصصصلح لتخزيصصن الرقصصام الموجبصصة فقصصط بمسصصاحة تصصصل إلصصى 16بصصت ) 2بصصايت(.
والن لنأخذ مجموعة من المثلة:
ما هو نوع المتغير المطلوب للقراءة أو الكتابة في أي بورت )مثل (port A, B,C؟
ما هو المتغير المناسب لتخزين درجة حرارة تتراوح بين سالب 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مللي ثانية.
)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قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
أيضصصصاا يمكصصصن كتابصصصة المتغيصصصرات بالصصصصيغة العشصصصرية Decimalوهصصصي نفصصصس دصصصصيغة الرقصصصام الصصصتي
نسصصصتخدمها فصصصي حياتنصصصا اليوميصصصة فمثلا الرقصصصم 0b00000011يسصصصاوي رقصصصم Decimal 3ويمكصصصن
كتابة نفس المر السابق بالصورة التالية:
;uint8_t variable = 3
ويمكن استخدام الصيغة الستة-عشرية .Hexadecimalفمثلا لنفترض أننا نريد تعيين المتغير
variableبقيمة 0b11110000والتي تساوي رقم 120بالصيغة العشرية
مرفق مع الكتاب ملحق خاص بنظام العداد وتحويل قيم الرقام من وإلى الصيغ الثنائية
والعشرية والستة-عشرية.
أيضاا لحظ أن القيم الستة-عشرية تبدأ بصص 0xبينما الصيغة الثنائية تبدأ بصص ob
مراجع إضافية
http://www.mjma3.com/programming/basics.html
133
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
الصور المختصرة
يمكن إجراء العمليات الحسابية على المتغيرات بصصورة مختصصرة .فمثلا إذا أردنصا جميصع الرقصم
4على قيمة المتغير Xفيمكن ذلك بأسلوب مختصر عبر إضافة علمة الجمع قبل أشارة =
;X += 4 اختصار اﻷمر // X = X+4
أيضاا يمكن تطبيق نفس الختصار على أي عملية حسابية
;X -= 4 اختصار اﻷمر // X = X – 4
;X *= 4 اختصار اﻷمر // X = X * 4
;X /= 2 اختصار اﻷمر // X = X / 2
134
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
أمثلة على AND أمثلة على OR أمثلة على NOT أمثلة على XOR
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مصصع محتصصوى المتغيصصر 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
ملحظة :يمكن اختصار جميع العمليات المنطقية ماعدا عملية )العكس (Invertوالتي تكتب
فقط بالصورة التالية:
xNumber = ~ xNumber
137
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
مثال :لنفرض أن لدينا الرقم 0b00000001لنقم بتطبيق عمليات الزاحة لجهة اليسار.
مثال :لنفرض أن لدينا الرقم 0b00000101لنقم بتطبيق نفس العمليات السابقة عليه.
تدعم لغة السي الوامر البرمجية لعمل الزاحة لجهة اليمين أو اليسار وتكتب كالتالي:
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
وهكذا … وتستمر هذه الدورة إلى ما ل نهاية.
لكصصن مصصاذا إذا أردنصصا تعصصديل طصصرف واحصد )وليكصصن الطصصرف الول فقصصط (PA0وفصصي نفصس الصصوقت ل
يمكننصا ذلصك بسصهولة عصبر دمصج مجموعصة مصن العمليصات المنطقصة وعمليصات الزاحصة .حيصث تتصوفر
دصيغ برمجية معينصة تمكننصصا مصن وضصع 1أو 0داخصصل بصت محصددة فصي أي متغيصر أو ممسصص ك
جل .كمصصا
يمكننا أن نعكس بت معينه أو نعزلها عن باقي البتات.
141
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
كذلك يمكننا استخدام العملية ORلدمج أكثر من دصيغة من النوع السابق فصي أمصر واحصد ،فمثلا
لنفترض أننا نريد ضبط الطرف PA1و PA2ليعملن كخرج ،يمكننا إما أن نكتب:
;)DDRA |= (1<<PA1
;)DDRA |= (1<<PA2
{ )(int main
142
.5قواعد لغة السي للظنظمة المدمجة
… ..............................................................................................
باستخدام هذه الصيغة يمكننا اختصار المثال ص blinking ledبأمرين فقط )بدلا من 4أوامر(.
)while (1
{
;)PORTA ^= (1<<PA0
;)_delay_ms(1000
}
تعد مجموعة الصيغ البرمجيصة السصابقة مصن أهصم الوامصصر الصتي ق د تسصتخدمها فصي برمجصة النظصم
المدمجة خادصصة أنهصا مكتوبصصة بلغصة السصصي المعياريصصة ممصصا يجعلهصصا طريقصة "معياريصة" لعمصصل setأو
resetلي بت مهما أختلف الممتحككم الدقيق أو الشركة المنتجة )طالماا أن المترجم الخاص
بهذا الممتحككم يدعم لغة السي المعيارية(.
لكن هناك دصيغة أفضل في حالة الرغبة بقراءة طرف واحد فقط وهي كالتالي:
)Reister & (1<<bitName
يمكن تطبيق نفس الصيغة على الكود السابق ليصبح كالتالي:
))if (PINB & (1<<PA0 تعني لو أن قيمة الطرف الول تساوي //1
};{PORTA = 0b00000001
143
الفصل السادس
145
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
الفيصصصوزات هصصصي وحصصصدات ذاكصصصرة )بتصصصات (Bitsيتصصصم برمجتهصصصا بصصصصورة مسصصصتديمة ،هصصصذا يعنصصصي أن
محتواها ل يتغير بإعادة تشغيل الممتحككم أو انقطاع الكهرباء أو حتى برمجة الصذاكرة الرئيسصصية
) ،(Flash Memoryهذه الفيصوزات تحتفصصظ بمجموعصصة خادصصصة مصصن العصصدادات المطلوبصصة وجودهصصا
بصورة مستديمة.
يتصصصصم تفعيصصصصل أحصصصد الوضصصصصاع بكتابصصصصة 0أو 1فصصصصي هصصصصذا الفيصصصصوز ،مصصصصع ملحظصصصة أن دصصصصصفر ل تعنصصصصي
unprogrammedبصل العكصس – حيصث يمكصن أن الفيصوز يتصم تفعيلصه programmedعنصدما تضصع
بداخله القيمة 0ويتم إلغاؤه عندما تضع بداخله القيمة .1
تحذير :بعض الفيوزات إذا تم برمجتها بصورة خاطئة قد تتسبب في تعطيل الممتحككم
أو إلغاء إمكانية برمجته مرة أخرى إل باستخدام مبرمجات خاصة High voltage
،programmersلذا كن على حذر عند اختيار قيم الفيوزات وتأكد أكثر من مرة من
جميع العدادات قبل برمجتها.
146
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
يمكنك التعرف علصى تفادصصيل الفيصوزات وكيفصة تفعيلهصا وذلصك عصبر فتصح الصص Datasheetالخادصصة
بمتحكمصصات الصصص AVRوالبحصصث عصصن جصصداول ) Fuse LOW Byte , Fuse High Byteموجصصودة فصصي
دصفحة 260للص Datasheetفي حالة الممتحككم .(ATmega16
يوضح الجدول قيمة كل بصت ف ي ج دول الفيصوزات الصص High Byteمصع القيمصة الفتراضصية لكصل
فيوز )هذه هي القيم التي تصأتي مبرمجصة مسصبقاا مصن المصصنع( ،وكمصا نصرى بعصض الفيصوزات تصأتي
مفعلة بينما بعض يكون غير مفعل بصورة افتراضية.
البصصووت-لصصودر هصصو برنامصصج )اختيصصاري( دصصصغير يتصصم تشصصغيله قبصصل البرنامصصج الرئيسصصي للقيصصام ببعصصض
الوظائف ،فمثلا أشهر بووت-لودر هو 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
SPIENتفعيصصل خادصصصية البرمجصصة عصصبر منفصصذ الصصص ،SPIهصصذا الفيصصوز فصصائق الهميصصة حيصصث يتحكصصم فصصي
تفعيصصل برمجصصة الصصصذاكرة .وعنصصدما يتصصم وضصصع قيمتصصه = 1يتصصم إلغصصاء إمكانيصصة برمجصصة الممتحككصصم مصصرة
أخصصرى وعنصصدها لصصن تسصصتطيع أن ترفصصع عليصصه أي برامصصج جديصصدة ،القيمصصة الفتراضصصية = 0وتعنصصي أن
البرمجة عبر الص spiتعمل .بعض الشركات تستخدم هذا الفيوز لتمنع أي شخص من إعادة برمجة
الممتحككم الدقيق مرة أخرى.
ل تقم بتغيير الفيوز SPIENأبداا طالماا أنك تتدرب على برمجة المعالج وإل لن تتمكن من
استخدام الممتحككم مرة أخرى
148
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
JTAGEN, OCDENكل الفيصصصصوزان يسصصصصتخدمان للتحكصصصصم فصصصصي تفعيصصصصل خادصصصصصية التنقيصصصصح عصصصصبر
بروتوكول الص Jtagالعالمي.
كما يمكن استخدام الص 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الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
قبصصصل شصصصرح الفيصصصوزات 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تتحكصصصم هصصصذه الفيصصصوزات فصصصي الزمصصصن الصصصذي سيسصصصتغرقه الممتحككصصصم مصصصن بدايصصصة تودصصصصيل
كما هو موضصح ف ي الجصدول ،نجصد أن تغييصر العصدادات سصيجعل الممتحككصم يتصأخر إمصا 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الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
إذا كان التردد = 1ميجاهرتز )السنرعة الفتراض ية لمعظنم ممتحككمنات النن (AVRهصذا •
يعنصصصي أن الممتحككصصصم يمكصصصن تنفيصصصذ 1مليصصصون أمصصصر بلغصصصة السصصصمبيلي فصصصي الثانيصصصة الواحصصصدة
ويستغرق المر 1ميكروثانية
إذا كان الصتردد = 1ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 1مليصون أمصصر بلغصصة •
السمبيلي في الثانية الواحدة ويستغرق المر 1ميكروثانية
إذا كان الصتردد = 2ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 2مليصون أمصصر بلغصصة •
السمبيلي في الثانية الواحدة ويستغرق المر نصف ميكروثانية أو ) 500نانوثانية(.
إذا كان الصتردد = 4ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 4مليصون أمصصر بلغصصة •
السمبيلي في الثانية الواحدة ويستغرق المر 250نانوثانية nano second
إذا كان الصتردد = 8ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 8مليصون أمصصر بلغصصة •
السمبيلي في الثانية الواحدة ويستغرق المر 125نانو ثانية
تصصدعم ممتحككمصصات الصصص AVRالعديصصد مصصن تقنيصصات توليصصد الذبصصذبات اللزمصصة لتشصصغيل الممتحككصصم أو كمصصا
تمسى Clock Sourceتختلف هذه التقنيات في مدى دقتها ونسبة الخطأ والتكلفة الماليصصة ،فصصي
هذه الجزء سنستعرض 4طرق مختلفة مع إيضاح مميزات وعيوب كل طريقة.
154
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
العيوب :نسبة الخطأ في التردد والتوقيت - %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الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
المميننزات :الدقصصة العاليصصة جصصداا وثبصصات الصصتردد مهمصصا تغيصصرت درجصصات الحصصرارة وبالتصصالي فهصصي تصصوفر
أداء ممتاز طوال فترة التشغيل
العيوب :التكلفة حيث تحتاج هذه الكريستالت إلى مكثفات إضافية عصصدد 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
158
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
External Resonators
هصصذا النصصوع مصصن المذبصصذبات يشصصبه لحصصد كصصبير الكريسصصتالة وفصصي الحقيقصصة هصصو يصصوازي "كريسصصتالة +
المكثفات الضافية" في قطعة إلكترونية واحدة ويتوفر في السواق بترددات مختلفة بدأ مصصن
1ميجاهرتز إلى 24ميجاهرتز
المميزات :السعر المنخفض )أرخ ص مصن الكريسصتالة( كمصا أنصه يحتصوي علصى المكثفصات المطلوبصة
بداخله وحجمه الصغير وتوافر معظم الترددات المطلوبة
العينننوب :يتملصصصك نسصصصبة خطصصصأ ) %0.5نصصصصف بالمئصصصة( ،وهصصصي تعتصصصبر نسصصصبة أفضصصصل بكصصصثير مصصصن الصصصص
internal RC oscillatorولكنها ل تقارن بدقة الكريستالة الكوارتز.
159
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
العيوب :السعر المرتفع ،حيث يبلع سصصعر هصصذا النصصوع مصصن المذبصذبات نحصصو 3دولر أو أكصصثر )يصصزداد
السعر بزيادة التردد المطلوب( وفي بعض الحيان يكون سعرها أكبر من سعر الممتحككم الصصدقيق
نفسه .الصور التالية توضح تودصيل الص AVRمع المذبذب الخارجي TTL oscillator
160
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
من ملف الص DataSheetالرسمي للممتحككم )والمرفق مع الكتاب( بداية من الصصصفحة رقصصم 24مصصع
ملحظة أن هذه الفيصوزات تعمصصل علصى كصصل مصصن ATmega16/ ATmega32لنهصم مصصن نفصس الفئصة
من الممتحككمات )وقد تختلف هذه الفيوزات في فئات أخرى من شرائح الصصص - .(AVRجميصع القيصم
161
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
أيضصصاا لحصصظ أن العصصدادات يتصصم وضصصعها للفيصصوزات CKSELمصصن 1إلصصى 3فقصصط ول يتصصم برمجصصة الصصص
CKSEL0معهم في هذا الوضع .ويتم برمجة الفيوز CKOPTفي حالة استخدام كريستالة أكبر
من 8ميجاهرتز.
162
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
هذا الفيوز يتحكصم فصي بعصصض المصصور المهمصة ،منهصصا تشصصغيل المذبصذب بالطاقصصة القصصصوى أو الطاقصصة
المنخفضة )وضع توفير الطاقة عندما يكون (CKOPT = 1 “unprogrammed”fuseهذا الوضع
يسصصصصصاهم فصصصصي تخفيصصصصض الطاقصصصصة الصصصصتي يسصصصصصتهلكها الممتحككصصصصصم الصصصصصدقيق لكنصصصصه ل يصصصصصصلح لتشصصصصصغيل
الكريستالت الكبر من 8ميجاهرتز لنه كلما زاد تصصردد الكريسصتالة كصانت النبضصات الناتجصة منهصا
أضعف من ناحية فرق الجهد وبالتالي قد ل تصلح لتشغيل المعالج.
للتغلصصب علصصى هصصذه المشصصكلة يتصصم تفعيصصل الصصص CKOPTوالصصذي سصصيقوم بتشصصغيل المذبصصذب بالطاقصصة
القصوى أو كما يسصصمى Full rail-to-rail swingممصصا يجعصصل المعالصصج يحصصصل علصصى أفضصصل نبضصصات
ممكنصصصه تكفصصصي لتشصصصغيله فصصصي السصصصرعات العاليصصصة وتكفصصصي أيضصصصاا لخصصصراج نبضصصصات دقيقصصصة لتشصصصغيل
المكونات الخارجية.
من المفيد جداا تفعيل هذا الفيوز في الدوائر الصتي سصصتتعرض إلصى noiseأو ستوضصصع فصي مكصصان
معرض لشعاع كهرومغناطيسي كبير نسبياا حيث يسصصاعد وضصصع Full rail-to-railعلصصى تحسصصين
أداء الممتحككم في البيئات ذات الص noiseالكبيرة.
الوظيفصصصة الثانيصصصة لصصصه هصصصي تفعيصصصل المكثصصصف الصصصداخلي "سصصصعة 36بيكوفصصصاراد" لتشصصصغيل دائصصصرة الصصصص
external RC circuitبالمقاومة فقط دون مكثف إضافي.
163
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
علصصي سصصبيل المثصصال إذا كصصانت سصصرعة الممتحككصصم = 1ميجصصاهرتز إذا يجصصب أن تكصصون سصصرعة رفصصع
البرنامج على الممتحككم أقل من 128كيلوهرتز وإل قد تجد خطصصأ مصصن برنامصصج AVRdudeمفصصاده
على أي حال إذا قرأت هذا الخطأ فكل ما عليك فعله هو تقليل سرعة الرفع عصصن طريصصق تودصصصيل
بجانبها( وإذا كنت تستخدم مبرمجة أخرى ل تحتوى هذا الوضع فيمكنك أن تختار سرعة الرفع
عنصصد اسصصتخدام الدالصصة _) delay_us(timeيجصصب أن يعمصصل المذبصصذب بكريسصصتالة خارجيصصة بصصتردد 8
ميجاهرتز على القل حتى تعمل الدالة بتوقيت دصحيح )إذا تم استخدام المذبصصذب الصصداخلي أو
كريستالة بتردد أقل فيحدث خطأ في الدالة delay_usولن يتم التأخير بالوقت المطلوب(
164
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
منخفصصض جصصداا للطاقصصة مثصصل بطاريننة أو لوحننة شمسننية دصصصغيرة ،مصصن أجصصل هصصذه التطبيقصصات يتصصم
معظصصم الممتحككمصصات الدقيقصصة )وبالتحديصصد المعالجصصات الدقيقصة الموجصصود بصصداخلها( تسننتهلك طاقنة
أكننثر كلمننا كننانت تعمننل بننتردد أكننبر وبالتصصالي نجصصد أن تخفيصصض الصصتردد يقلصصل بدرجصصة كصصبيرة جصصداا
كمصصصصا نصصصصرى علصصصصى المحصصصصور الرئيسصصصصي )اسصصصصتهلك التيصصصصار بصصصصالمللي أمصصصصبير( والمحصصصصور الفقصصصصي الصصصصتردد
)بالميجاهرتز( وكل خط مرسوم يمثل فرق الجهصصد الصصذي يعمصصل عنصصده الممتحككصصم الصصدقيق .مصصن هصصذا
الرسم نستنتج العديد من المور.
عند فرق جهد 1.8ميجا يمكن للممتحككم أن يعمل بصتردد مصن 1ميجصا إلصى 4ميجصا بحصد •
أقصى وباستهلك تيار من الثاني حتى 1.8مللي أمبير فقط.
165
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
عنصصد فصصرق جهصصد 2.7فصصولت يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى 10ميجصصاهرتز •
واستهلك تيار حوالي 3مللي أمبير.
عند فصصرق جهصد 3.6يمكصصن للممتحككصصم أن يعمصصل بصتردد يصصصل إلصصى 14.5ميجصصاهرتز تقريبصصاا •
وباستهلك تيار يصل إلى 5.7مللي أمبير.
عند فرق جهد 4فولت يمكن للممتحككصصم أن يعمصصل حصتى 17ميجصصاهرتز باسصصتهلك تيصصار 7 •
مللي أمبير.
عنصصد فصصرق جهصصد مصصن الخصصامس إلصصى 5.5يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى 20 •
ميجاهرتز.
بعض ممتحككمات الص AVRتدعم العمل بتردد 125كليوهرتز أو أقل ،هصذا المعصدل يجعصل اسصتهلك
التيار الكهربي منخفض جداا لدرجة أنه يصل إلى 100ميكرو أمبير ) 100جزء من المليون من
المبير وهو ما يساوي 0.1مللي أمبير(.
تختلف هذه المقصاييس قليلا بتغيصصر درجصة الحصرارة الصتي يعمصل عنصدها المعالصصج وتوجصد رسصومات
بيانيصة مفصصصلة تشصصرح معصدلت اسصصتهلك الطاقصصة بالتفصصيل عنصصد درجصات الحصرارة المختلفصة بصدءاا
من دصفحة 299في الص Datasheetالمرفقة )مع ملحظة أن بعض معدلت استهلك الطاقصصة قصصد
تختلف قليلا مع ممتحككمات الص AVRالخرى(.
166
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
استهلك الطاقة المذكور مسبقاا هو للممتحككم الدقيق نفسه وليس لي حمل loadمتصل به
ويمكن تخفيض هذا الستهلك قليلا بإيقاف تشغيل الص ADC
اسصصصتهلك الطاقصصصة الكلصصصي = Total loadفصصصرق الجهصصصد * )اسصصصتهلك التيصصصار للممتحككصصصم +الحمصصصال
المتصلة به( +الطاقة الضائعة من الص voltage regulatorإن وجد.
جميع البطاريات يكون لها سعة تقاس بالمللي أمبير\سصصاعة فمثل بطاريصة الهصصاتف المحمصصول نجصد
مكتوب عليها 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الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
ثصصصم الضصصصغط علصصصى زر 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الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
اﻷول :هو شراء و استخدام الص High Voltage programmersغالية الثمن مثل AVR •
Dragonحيث يمتلك القدرة على التنقيح والبرمجة عالية الجهد لتصليح الفيوزات.
الثنناني :بنصصاء دائصصرة AVR Fuse Doctorوهصصي مصصن الصصدوائر الرائعصصة الصصتي تسصصتخدم فصصي •
معالجصصة الفيصصوزات بتكلفصصة منخفضصصة جصصداا والصصتي جربتهصصا بنفسصصي وكصصانت رائعصصة كمصصا أنصصه
يمكنك دصناعتها بنفسك بنحو 5دولر فحسب.
http://mdiy.pl/atmega-fusebit-doctor-hvpp/?lang=en
170
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
… ..............................................................................................
تتوفر تصميمات مشابه أيضاا لنفس الدائرة لكن باستخدام ممتحككمات أخرى بدل مصصن atmega8
http://www.instructables.com/id/AVR-Attiny-fusebit-doctor-HVSP
171
الفصل السابع
.7الممدقاطعة Interrupt
سصصصنتعرف فصصصي هصصصذا الفصصصصل علصصصى كيفيصصصة تشصصصغيل المقاطعصصصات الخارجيصصصة External Interrupts
وفائصصصدة هصصصذه الخادصصصصية الرائعصصصة الصصصتي تتيصصصح دصصصصناعة تطبيقصصصات ذات اسصصصتجابة عاليصصصة السصصصرعة
للحداث الخارجية.
173
.7الممدقاطعة Interrupt
… ..............................................................................................
مث ا
ل نجد أن النظام المدمج داخل وحدة تحكم السيارة يعمل على إدارة الوقصصود وعصصرض سصصرعة
الحركة ومع ذلك في حالة حدوث ادصصصطدام بجسصصم مصا نجصد أن النظصصام يسصتجيب بسصصرعة عاليصة
) بصصالرغم أنصصه كصصان مشصصغول بمعالجصصة الوقصصود والسصصرعة( .تحصصدث هصصذه السصصتجابة فائقصصة السصصرعة
بسصصصبب أن الحساسصصصات المسصصصؤولة عصصصن الدصصصصطدام يتصصصم تودصصصصيلها علصصصى أطصصصراف دخصصصل الممقاطعصصصة
وتسمى هذه الطراف .External interrupts
الحقيقصصة أنصصه هنصصاك أنصصواع كصصثير للمقاطعصصة )بعضصصها داخلصصي وبعضصصها خصصارجي( سصصنتحدث فصصي هصصذا
الفصل عن النوع الخارجي فقط External interruptوسيتم شرح بعصصض النصصواع الخصصرى علصصى
مصصدار الفصصصول التاليصصة مثصصل مقاطعصصة الصصص ) ADCفصصي الفصصصل التصصالي( ومقاطعصصة المؤقتصصات Timer
.interrupt
174
.7الممدقاطعة Interrupt
… ..............................................................................................
ملحظة :الص RESETفي عالم الممتحككمات الدقيقة يختلف قليلا عن الحاسب اللي .فمثلا نجد
في الحاسب اللي )أو الهاتف الجوال( الزر RESETأو Restartوالذي يعني إيقاف تشغيل
الطاقة عن الحاسب ثم إعادة تشغيله .أما في الممتحككمات الدقيقة الزر RESETهو مقاطعة
خارجية تأمر المعالج أن يترك ما يفعله الن وينتقل إلى أول أمر في البرنامج المخزن
جلت ووحدات الذاكرة )وهذا يحاكي إعادة تشغيل الممتحككم
بداخله مع تصفير جميع الممس ك
الدقيق( ومع ذلك تظل الكهرباء متصله بالمتحكم ول يتم فصلها .والسر وراء تصميم الص
RESETبهذه الطريقة هو أن إعادة فصل وتودصيل الكهرباء بالمتحكم قد يستغرق 60مللي
ثانية وهذا رقم كبير نسبياا في التطبيقات التي تحتاج استجابة سريعة بينما الممقاطعة يتم
تشغيلها في أقل من 1ميكروثانية )يعني أسرع بنحو 60,000ضعف من فصل الكهرباء
وإعادة تودصيلها(.
سنتعرف بالتفصيل على هذا اﻷمر في الفصل الخاص بإدارة الطاقة والفيوزات.
عند إدخال إشارة رقمية علصصى هصذه الطصصراف تحصدث الممقاطعصة .وعنصصدها يصترك الممتحككصصم الصدقيق
البرنامج الرئيسي الذي ينفذه وينتقل إلى برنامج الص ISRليقوم بمعالجة الممقاطعصصة .الكصصود التصصالي
يمثل التركيب البسيط للص ISRمع ال .main program
175
.7الممدقاطعة Interrupt
… ..............................................................................................
)(int main
{
…........
}
)ISR(interrupt_type
{
…........
}
176
.7الممدقاطعة Interrupt
… ..............................................................................................
الـكود
#define F_CPU 1000000UL
>#include <avr/io.h
>#include <util/delay.h
>#include <avr/interrupt.h
)int main(void
{
;)(sei
)while(1
{
;)PORTA ^= (1 << PA0
;)_delay_ms(100
}
;return 0
}
177
.7الممدقاطعة Interrupt
… ..............................................................................................
شرح الـكود
في بداية الكود قمنا باستيراد المكتبة المسؤولة عن المقاطعات وذلك عن طريق المر
>#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
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تعمل على التقاط أي إشارة كهربية دصاعدة وتشغيل الممقاطعة.
181
.7الممدقاطعة Interrupt
… ..............................................................................................
فصصصإن هصصصذا المصصصر سصصصيجعل ال ممقاطعصصصة تعمصصصل عنصصصد الحافصصصة الهابطصصصة .ولقصصصد اخصصصترت هصصصذا النصصصوع مصصصن
الشارات لن المفتاح المتصل بالطرف INT0يعمل مع المقاومة الداخلية لهذا الطرف ممصا يعنصي
أنه عند الضغط على المفتاح سيتحول الطرف INT0من الحالة HIGHإلى الحالة LOWوهصصو مصصا
يوازي الحافة الهابطة .أيضاا كان يمكن أن نصصترك كل ISC00و ISC01بقيمصصة دصصصفر وهصصذا سصصيجعل
الممقاطعة تعمل عند الضغط على المفتاح لفترة زمنية قصيرة ) 1ميكروثانية على القل(.
بعصد النتهصاء مصن ضصبط نصوع إشصارة الممقاطعصة علينصا أن نخصبر الممتحككصم الصدقيق بأننصا نريصد تفعيصل
استقبال إشصارات الممقاطعصة علصى الطصرف INT0ويتصم ذلصك عصصن طريصق التلعصب بالبتصات الخادصصة
جل 3بتات هامصصة جصداا وهصي INT0و INT1و INT2كصل بصت مصصن الثلثصة تتحكصم
يمتلك هذا الممس ك
في تفعيل استقبال الممقاطعة على أحد الطراف فمثلا فعندما نضع القيمة 1داخل البصصت INT0
فهذا يعني أن الممتحككم سيبدأ استقبال إشارات الممقاطعة على الطرف INT0وهكذا ..
لذا استخدمنا المر التالي لخبار الممتحككم أن يبدأ تفعيل الممقاطعة INT0
;)GICR |= (1 << INT0
هصصذا المصصر مسصصؤول عصصن تفعيصصل اسصصتقبال طلبصصات الممقاطعصصة بشصصكل عصصام للمتحكصصم الصصدقيق وبنندون
كتابته فلنن تعمنل أي مقاطعنة مهمنا ك انت وذلصك حصتى وإن كنصت قصد كتبصت جميصع أوامصر ضصبط
الممقاطعة .ويعتبر استخدام هذا المر مع المر 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
مع وضع الوامر المطلوبة من الممقاطعة داخل القوسين }{ .وفصصي المثصصال السصصابق اسصصتخدام أمصصر
يقوم بعكس حالة الطرف PB0وهذا ما سيجعل الدايود الضوئي يضيء أو ينطفئ عند كل مرة
يتم فيها تفعيل الممقاطعة .INT0
;)PORTB ^= (1 << PB0
183
.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) | (1 << PB1
ضبط الطرف الخاص بالممقاطعة وتشغيل مقاومة الرفع // INT0 & INT1
184
.7الممدقاطعة Interrupt
… ..............................................................................................
تفعيل ال ممقاطعة عند استقبال إشارة من نوع الحافة الهابطة لكل المقاطعتين // INT0 & INT1
)while(1
{
;)PORTA ^= (1 << PA0
;)_delay_ms(100
}
;return 0
}
دالة الممقاطعة الولى //
دوال المقاطعة
)ISR(INT0_vect
{
;)PORTB ^= (1 << PB0
}
شرح الـكود
هصصذا المثصصال يعتصصبر مطصصابق للمثصصال السصصابق فصصي نفصصس الفكصصرة مصصع اختلف تشصصغيل كل المقصصاطعتين
INT0و INT1بحيصصصث تكصصصون كصصصل مقاطعصصصة مسصصصؤولة عصصصن تشصصصغيل وإطفصصصاء الصصصدايودات الضصصصوئية
المتصلة على الطراف PB0و .PB1
وكما هو ملحظ سنجد في نهاية البرنامج دالتين ISRالولى مسصصؤولة عصصن أوامصصر معالجصصة INT0
و الثانية مسؤولة عن أوامر معالجة INT1
185
الفصل الثامن
”الرجل الذي يستخدم مهاراته وخياله البناء لمعرفة أقصى ما يمكن أن
يقدمه مقابل دولار واحد بدلا ا من التفكير في أقل ما يمكن أي يقدمه
مقابل نفس الدولار ،حتما ا سينجح‟
في هذا الفصل سنتعرف على أحد أشهر طرق إرسال البيانات بصورة تسلسلية بين الممتحككمات
الدقيقصصة والعصصالم الخصصارجي وذلصصك عصصبر بروتوكصصول UARTوالصصذي يعتصصبر أشصصهر بروتوكصصول معيصصاري
لتبادل البيانات.
187
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
يعيصصب هصصذا السصصلوب فصصي نقصصل البيانصصات وجصصوب أن تكصصون المسصصافة بيصصن الجهصصازين قصصصيرة .لن
السلك تشوه شكل الشارات الكهربيصصة مصع طصول المسصافة ،كمصصا أن السصصلك المسصتخدمة لنقصل 8
بت في نفس الوقت يكون سعرها مرتفع.
أيضصصصصصص اا تحصصصصصصدث مجموعصصصصصصة مصصصصصصن الظصصصصصصواهر كهربيصصصصصصة تسصصصصصصمى "المكثفصصصصصصات الطفيليصصصصصصة Parasitic
”Capacitanceو "الملفصصصصصات الطفيليصصصصصة ”Parasitic inductanceهصصصصصذه الظصصصصصواهر تحصصصصصدث
للودصصصلت النحاسصصية المتقاربصصة مصصن بعضصصها البعصصض .وتتسصصبب فصصي تشصصويه كصصبير لشصصكل الشصصارة.
الصورة التالية توضح شكل إشارة كهربية على دصورة "نبضة ”pluseبعد التشويه.
لحل هذه المشكلة يتم استخدام التصال التسلسصلي Serial communicationلنقصل البيانصات
بيصصن النظمصصة الصصتي تفصصصل بينهصصا مسصصافات كصصبيرة ،وفصصي وقتنصصا الحاضصصر ومصصع تطصصور التكنولوجيصصا
أدصبح التصال التسلسلي أسرع من ذي قبل ،فتم تعميمه واستخدامه حاليا فصي جميصصع الجهصزة
تقريباا بدءاا من الحساسات في النظمة المدمجة إلى الحواسصصيب الشخصصصية وشصصبكات الحاسصصب
اللي.
188
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
تستخدم تقنية التصال التسلسلي طرف )سلك( واحد فقط لنقصصل البيانصصات مصصن جهصصاز لخصصر بصدلا
مصصصن 8أسصصصلك كمصصصا فصصصي حالصصصة التصصصصال المتصصصوازي Parallelولكصصصي يتصصصم إرسصصصال البيانصصصات بشصصصكل
تسلسلي يتم أولا تحويل البيانات مصصن 8بصصت Parallelإلصصى 8بتصصات متسلسصصلة وذلصصك باسصصتخدام
شريحة إلكترونيصصة )متواجصدة داخصصل الممتحككصصم الصصدقيق( تسصصمى Parallel-in-Serial-out shift
ملحظة :كلمة بروتوكول Protocolتعني طريقة تنظيم إرسال واستقبال البيانات مثل سرعة
البيانات وطريقة ترتيبها وترقيم البيانات المرسلة وكذلك الطراف المستخدمة لهذا الرسال
والستقبال
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
… ..............................................................................................
مم
فصصصي بعصصصض النظمصصصة تضصصصاف بصصصت أخصصصلرى وتسصصصمى ،Parity bitوتسصصصتخدم لمعرفصصصة إذا مصصصا كصصصانت
البيانات المستلمة دصحيحة أم بها خطأ.
191
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
في الوقت الحالي تدعم معظم الممتحككمات الدقيقة )بمصا ف ي ذلصك (AVRسصرعة أنظمصة الرسصال
التسلسلية من نوع Asynchronousبحد أقصى 115200بت في الثانية )نحو 100كيلصوبت
في الثانية(.
الطصصصصرف الصصصصتي تحمصصصصل الرمصصصصز RXDتسننننتخدم للسننننتقبال :ويتصصصصم تودصصصصصيلها بصصصصالطرف الخادصصصصصة
بالرسال في الممتحككم الخر.
الطرف التي تحمل الرمز TXDتستخدم للرسال :ويتم تودصيلها بصالطرف الخادصصة بالسصتقبال
في الممتحككم الخر.
192
.8التصال التسلسلي بروتوكول 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
الجدول التالي يوضح كيفية ضصصبط حجصصم الحزمصصة الواحصصدة مصصن البيانصصات وذلصصك بتغيصصر قيصصم هصذه
البتات.
194
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
سنستخدم في المثلة التالية نظام الرسال بحجم 8بت ) 1بايت( .وهذا النظام يعتصصبر قياسصصي
في معظم الممتحككمات الدقيقة والجهزة اللكترونية المختلفة.
نبدأ أول بتحديد معدل نقل البيانات 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
… ..............................................................................................
;return 0
}
شرح الـكود
بدايصصاة قمنصصا بتعريصصف متغيصر 16بصت اسصصمه UBRR_Valueلتخزيصصن القيمصة المطلصصوب كتابتهصصا فصصي
هصصذا الممسصص ك
جل 8بصصت فقصصط .حيصصث سصصيتم تخزيصصن أول 8بصصت فقصصط مصصن القيمصصة .ثصصم قمنصصا بتخزيصصن
197
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
والذي يقوم بوضع القيمة 1في كل من . UCSZ0 & UCSZ2ولكصن للتسصهيل اسصتخدمت المصر
بصورته الولى.
بذلك نكون قد انتهينا من تهيئة ال UARTونستطيع أن نرسل البيانات.ولكن لكي نبدأ الرسصصال
جل UDRوكما ذكرنصصا سصصابقاا ،يجصصب أن ننتظصصر حصصتى يصصصبح
يجب أن نضع هذه البيانات في الممس ك
الممتحككم جاهزاا لرسال البيانات لذلك استعنا بالمر التالي:
;)))While (! (UCSRA & (1 << UDRE
ومعنصصاه أن ينتظصصر الممتحككصصم دون فعصصل أي شصصيئ طالمصصا البصصت
جل UCSRAل تسصصاوي .1كمصصا ذكرنصصا سصصابقاا
رقصصم 5فصصي الممسصص ك
عنصصد شصصرح الممسصص ك
جلت أن وجصود 1فصي هصذه البصت يصدل علصصى
أن الممتحككم جاهز لرسال البيانات.
الصصصصورة التاليصصصة توضصصصح دائصصصرة محاكصصصاة الكصصصود علصصصى برنامصصصج
بروتصصس .مصصع العلصصم أنصصه يمكصصن محاكصصاة الصصص serial portوذلصصك
باستخدام الداة virtual terminal
198
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
)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
… ..............................................................................................
ملحظة :أثناء كتابة أي حرف على نافذة Virtual terminalل يتم طباعته على الشاشة ولكن
يتصصم إرسصصاله ،وإذا أردت أن يتصصم طبصصاعته للتحقصصق ممصصا تضصصغط عليصصه ،فكصصل مصصا عليكصصم فعلصصه هصصو
الضغط بالزر اليمن للماوس على النافذة واختيار .Echo Typed Characters
200
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
لحصصصظ تودصصصصيل الطصصصرف 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 تفعيل مقاومة الرفع//
201
UART التصال التسلسلي بروتوكول.8
.............................................................................................. …
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
… ..............................................................................................
أما الكود الخاص بالمتحكم المسئول عصن اسصتقبال الحصرف وإضصاءة أو إطفصاء الصدايود الضصوئي
فهو كالتالي:
#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
)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قام بإطفاء الدايود الضوئي.
204
.8التصال التسلسلي بروتوكول UART
… ..............................................................................................
بصصالرغم أن هصصذه الطريقصصة تصصصلح بالتأكيصصد لكنهصصا ليسصصت فعالصصة وتتطلصصب كتابصصة الكصصثير مصصن الكصصواد
البرمجيصصة )ممصصا يعنصصي اسصصتهلك المزيصصد مصصن ذاكصصرة الصصص ROMللمتحكصصم الصصدقيق( كمصصا أنصصه فصصي حالصصة
العبارات الطويلة سيؤدي ذلك لستهلك ضخم للذاكرة.
}
شرح الـكود
في هصذا الكصود اسصتخدمنا مؤشصصر يشصصير إلصى بدايصصة الكلمصة .ومصن أساسصيات علصصم الكمصصبيوتر أن أي
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
… ..............................................................................................
)(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
}
8.8دوال إضافية
مم
أليس هذا أسصهل مصن ذي قبصل؟ إذاا هي ا لنفعصل المثصل ونكتصب دالصة خادص ة بإرسصال حصرف ،وأخصلرى
مم
خادصة بإرسال كلمة أو جملة وأخلرى خادصة باسصصتقبال حصرف وواحصدة خادصصة باسصتقبال كلمصصة أو
جملة.
الدالة الخاصة بإرسال حرف
)void UART_send_char(char data
{
;) ) )while( ! (UCSRA & (1<<UDRE
;UDR = data
}
208
UART التصال التسلسلي بروتوكول.8
.............................................................................................. …
209
الفصل التاسع
في هذا الفصصصل سصصنتعرف علصصى كيفيصصة قصصراءة الجهصصود الكهربيصصة المتغيصصرة Analogوتحويلهصصا إلصصى
قيصصم رقميصصة وذلصصك باسصصتخدام المحصصول التنصصاظري-الرقمصصي المدمصصج داخصصل ممتحككمصصات .AVRحيصصث
يمكصصن اسصصتغلل هصصذا المحصصول فصي قصصراءة الحساسصصات التناظريصصة أو أي عنصصصر إلكصتروني لصصه خصرج
كهربي متغير.
211
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
نجصصد أن معظصصم الحساسصصات المتصصوفرة فصصي السصصواق يمكنهصصا تحويصصل كميصصة فيزيائصصة معينصصة مثصصل
)درجة الحرارة – الرطوبصة – ضصصغط – تركيصصز مصصادة كيميائيصة ..الصصخ( إلصى فصصرق جهصد كهربصصي يتغيصر
بتغير هذه القيم الفيزيائية.
بصورة طبيعية ل تستطيع الحواسيب أو الممتحككمات الدقيقة أن تفهم الشارات التماثليصصة فكصصل
ما تفهمه هذه الحواسيب هي الشارات الرقميصصة مثصصل 1و 0أو HIGHو .LOWلصصذا قصصام مصصصممو
اللكترونيصصات بصصصناعة شصصريحة خادصصصة تسصصمى بصصالمحول التنصصاظري الرقمصصي Analog to Digital
Converterوتختصصصر بكلمصصة ADCهصصذه الشصصريحة يمكصصن شصصرائها بصصصورة مسصصتقلة وتودصصصيلها مصصع
الممتحككم الدقيق.
لحسن حظنا نجد أن مصممي ممتحككمات AVRقامو بدمصصج هصذه الشصصريحة بصصورة جصاهزة للعمصل
علصصى معظصصم ممتحككمصصات عائلصصة mega AVRوبعصصض ممتحككمصصات عائلصصة .ATTinyوسصصيناقش هصصذا
الفصل طريقة تشغيل الص ADCالمدمج بعائلت .AVR
212
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
بعصصد أن تتسصصاوى الكفتصصان الخطصصوة التاليصصة هصصي معرفصصة عنندد اﻷوزان الصصتي تصصم وضصصعها فصصي كفصصة
القياس )مثلا قد نجد أنصه هنصاك 3قطصع وزن مصن نصوع مربصع كيلصو جصرام( ومنهصا يمكننصا أن نحسصب
وزن الثمرة والذي يساوي × 3مربع كيلوجرام = 750جرام.
المملكوون الثاني يسمى بص analog comparatorوهصو شصصريحة إلكترونيصصة تماثننل المينزان بالضننبط
وتمتلك طرفان للمقارنة .حيث تقوم بالمقارنة بيصصن فصصرق جهصد مطبصق علصصى طرفهصصا الول )والصصذي
يتم الحصول عليه من دائرة الص (samplingوفرق جهد مطبق على طرفها الثاني.
المملكوون الثالث هو عصصداد رقمصصي تزايصصدي +محصصول رقمصصي -تمصصاثلي .DACهصصذان المكونصصان يعملن
مثصصل الصصوزن المعصصروف مسصصبقاا .حيصصث نجصصد أن كل المكصصونين يقومصصان بتوليصصد جهصصد دصصصغير وارسصصالة
إلصصى الطصصرف الثصصاني لشصصريحة الصصص .comparatorوإذا لصصم يتسصصاوي كل الجهصصدين يقصصوم العصصداد والصصص
DACبزيادة الجهد مرة أخرى وهكذا ..وتظل هذه العملية إلى أن تقوم شريحة الص comparator
بالتبليغ أن الجهد المطبق من العداد والص DACقد تساوى أو تفوق على الجهد المطبق مصصن عينصصة
القياس.
عندما يحدث هصذا التبليصصغ يتوقصف العصداد والصصص DACعصن العمصصل ويتصصم تسصصجيل الرقصم الصصذي توقصصف
عنده .ويتم حفظ هذا الرقم في ممسجلت خادصة تسمى ADCLو ADCHومن خلل هذا الرقصصم
يمكننا معرفة قيمة الجهد الذي تم ادخالة للص .ADC
213
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
أولا :يمكصصن تشصصغيل هصصذا الصصص 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وكذلك التحكم في سرعة تشغيله.
215
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
الـكود
#define F_CPU 1000000UL
>#include <avr/io.h
متغير لحفظ قيمة الص //adc
;volatile uint8_t adcValue
)int main(void
{
ضبط إعدادات البورتات //
;DDRA = 0x00
;DDRC = 0xff
216
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه //
;)ADMUX |= (1 << MUX0
)while(1
{
ابدء عملية التحويل //
;)ADCSRA |= (1 << ADSC
شرح الـكود
في بداية البرنامج قمنا بعمل متغير 8بت من نوع uint8_tباسم .adcValueسيستخدم هذا
المتغير في حفظ القيمةالرقمية الناتجة من تحويل الجهد في الص .ADCلكن هناك كلمة غريبة
ظهرت لول مرة بجانب المتغير وهي volatileفما هي؟
217
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
قبل أن نتعرف على هذه الكلمة .عليك أن تتعرف على أحد الخواص الهامة للمترجمات وتصصدعى
.Code optimaizationكمصصا تتصصذكر مصصن الفصصصول السصصابقة إن جميصصع المترجمصصات مهمتمهصصا هصصي
تحويصصل اللغصصات عاليصصة المسصصتوى )مثصصل السصصي( إلصصى لغصصة التجميصصع Assemblyوالحقيقصصة أن المصصر
الواحصد مصصن لغصصة السصصي قصصد يتحصصول إلصصى 1أو 3أو حصتى 10أوامصصر مصصن لغصصة التجميصصع .المترجمصصات
الذكية تستيطع اختصار عدد أوامر لغة التجميع وذلك لزيادة سرعة الكود )أوامر أقصصل = سصرعة
أكبر(.
هنصصا يصصأتي دور الصصص .code optimaizationوهصصي خادصصصية مدمجصصة فصصي معظصصم المترجمصصات سصصواء
المجانيصصة مثصصل gccأو المدفوعصصة مثصصل .IAR workbenchوتهصصدف إلصصى اختصصصار أكصصبر قصصدر ممكصصن
من اوامر السمبلي .والن نعود للبرنامج السابق.
ملحظة :اعتبرها قاعدة عامة ،إذا كان هناك أي متغير أنت متأكد من تغير قيمته أثناء عمل
الممتحككم الدقيق ول تريد للمترجم أن يحذفة فيجب أن تكتب كلمة 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ويتصصم تحديصصد هصصذا الرقصصم مصصن البصصت
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بصصت يتصصم وضصصع
عنصصدما يعمصصل الصصص ADCفصصي وضصصع الصصص 8بصصت فصصإن قيمصصة تحويصصل الجهصصد يتصصم تسصصجيلها فصصي الممسصص ك
جل
ADCHوعندما يعمل في وضع الص 10بت فأن قيمة التحويل يتم تسصصجيلها فصي مسصصجيلن )لنهصصصا
220
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
وأخيصصراا نقصصوم بضصصبط الطصصرف الصصذي سصصيكون ) Input channelالطصصرف الصصذي سصصنقيس مصصن خللصصه
الجهد الكهربصي المتغيصر( .فصي المثصال السصابق اسصتخدمنا الطصرف PA1لصذا وجصب أن يتصم وضصع 1
داخل البت MUX0
اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه //
;)ADMUX |= (1 << MUX0
حيث تتحكم هذه البت مصصع البتصصات ) MUX(1,2,3,4فصي اختيصصار قنصصاة الصصدخل كمصصا هصو موضصصح فصصي
الجدول التالي.
بعد النتهاء من ضبط الص 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
قصصم بترجمصصة الكصصود السصصابق ثصصم ابصصدأ محاكصصاة المشصصروع علصصى برنامصصج بروتصصس .يمكنصصك أن تحصصرك
المقاومة المتغيرة لعلى ولسفل لتشاهد ان الدايودات الثمانية تعصرض أرقصصام مصصن 00000000
إلى 11111111كما هو موضح في الصورة التالية.
222
.9الممححول التناظري-الرقمي ADC
… ..............................................................................................
الص 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
الفصل العاشر
في هذا الفصل سنتحدث عن أكواد C preprocessorحيث سنتعرف علصى الفصارق بيصن الوامصصر
التنفيذية والوامر التوجيهية وأهميتها بصورة مفصصصلة مثصصل المصصر include#وكصذلك define
وكذلك سصصنتعرف علصصى كيفيصصة دصصناعة المكتبصصات البرمجيصة .librariesمصع شصرح مثصال لعمصصل uart
driverعلى دصورة مكتبة.
226
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
– defineأمر لتعريف دللت لكلمات كأن نعرف أنه كلما وردت كلمة Piفي الكود فهصصو
يعنصصصي 3.14وكصصصذلك لعطصصصاء معصصصررف)رمصصصز( لكتلصصصة أسصصصطر برمجيصصصة مصصصع إمكانيصصصة وجصصصود
الترجمصصة حسصصب شصصروط معينصصة ،مثصصال :نخصصبر المصصترجم أنصصه لصصو كنصصت فصصي نظصصام تشصصغيل
ويندوز قم بتضمين المكتبة الفلنية أما لو كنت في نظام تشغيل لينكس فقم بتضمين
مكتبة أخرى.
227
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
#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ليصبح البرنامج السابق كالتالي:
#define
ميستخلدم هذا المر التوجيهي directiveلتعريف كلمات كرموز )كلمات مفتاحية( ترد في الكود
ليتم استبدالها بالقيمة المحددة )أرقام أو حروف أو أسطر برمجية أخرى( مصصع أننصصا سصصنرى لحقصصاا
أن ال preprocessorل يستطيع التمييز بينها.
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
}
ملحظة مهمة :إن ما يرد بعد المر التصوجيهي ل يتصم معصالجته أو تنقيصح أخطصائه ،مثلا لصو قمنصا
بالتعديل التالي وهو إضافة تعليق
)while(1
خطأ
{
;PORTD=0xFF
;)_delay_ms(1000
PORTD=0x00 ; //set portD off
;)_delay_ms(1000
}
نلحظ أن الكود أدصبح يحتصوي علصى خطصأ حي ث أدصصصبحت الفادصصلة المنقوط ة بع د التعليصق ،فصال
preprocessorليصصس مصصن مهمتصصه فهصصم مصصا بعصصد الوامصصر التوجيهيصصة وإنمصصا فقصصط اسصصتبدال الرمصصوز
بقيمتها.
230
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
231
المعالج التمهيدي وصناعة المكتبات البرمجية.10
.............................................................................................. …
داخل أي بت من أي ممس ك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المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
ملحظة :تسمى المكتبات التي تشغل أي جزء داخل الممتحككم الدقيق مثل ADC , UART, i2C,
GPIOأو أي مكون إلكتروني خارجي .Software driver
أيضصصاا تسصصاعد المكتبصصات علصصى تسصصهيل العمصصل الجمصصاعي بيصصن الفصصراد .فمصصن الصصصعب علصصى مجموعصصة
مكونه من 10مبرمجين مثلا أن يكتبوا كل الكواد داخل ملف واحد فقط .وبصصدل مصصن ذلصصك يتصصم
تقسيم الكواد الكبيرة إلى مجموعة مصصن الصصص ) Modulesالوحصصدات( والصصتي عصصادة تكصصون مجموعصصة
من المكتبات البرمجية ويتصولى كصل شصخص مصن فريصصق التطصصوير العمصل علصصى أحصد هصذه الوحصدات
بالتوازي مع باقي الفريق.
مثلا لنفصصصترض أننصصصا نريصصصد تصصصصميم مكتبصصصة لتشصصصغيل التصصصصال التسلسصصصلي UARTوذلصصصك لتسصصصهيل
استخدام UARTدون الحاجة لعادة كتابة جميع الدوال في كل برنامج.
233
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
__#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
كما يستحسن أن نضيف بعض التعليقات في بداية المكتبة لتوضح تاريخ دصناعة هذه المكتبصصة
والوظائف التي تحققها .الشكل النهائي يمثل الصورة النهائية من ملف الهيدر.
__#ifndef __UARTDRIVER_H
__#define __UARTDRIVER_H
;uint16_t UBRR_Value // Variable to store the calculations needed to set speed
236
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
كما يجب أن يحتوي ملف التطبيق علصصى أمصصر التضصصمين includeوذلصصك لضصصافة ملصصف الهيصدر إلصصى
ملف التطبيق كما هو موضح في الكود التالي )والذي يمثل محتوى الملف .(uart.c
”#include “uart.h
)(char UART_receive_char
{
;) ) )while (! (UCSRA & (1 << RXC
;return UDR
}
237
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
238
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
والن لنكتصصب برنامصصج بسصصيط لرسصصال حصصرف 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
}
لحظ أن أمر تضمين المكتبة uart.hيكون مكتوب بين علمتي “” وذلك لن ملف المكتبة
يكون موجود داخل نفس مجلد المشروع بينما المكتبات الخرى مثل delay.hتكتب بين
علمتي >< لنها تكون موجودة داخل مجلد المكتبات العام التابع للص .toolchain
الصور التالية تمثل شكل الملف uart.hو uart.cداخل برنامج .ATmel Studio
240
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
الملف uart.c
241
.10المعالج التمهيدي وصناعة المكتبات البرمجية
… ..............................................................................................
بعد النتهاء من كتابة الكصود قصم بصصترجمته واسصتخلص ملصف الهيكصس ثصصم قصصم بمحاكصصاة البرنامصصج
بنفس الدائرة المذكورة فصصي المثصصال الول فصصي الفصصصل الخصصاص بالصصص .UARTوالصصصورة التاليصصة تمثصصل
نتيجة المحاكاة.
242
الفصل الحادي عشر
يشرح هذا الفصل استخدام أنظمصصة تشصصغيل الصصوقت الحقيقصصي Real Time OS
لتشصصغيل المهصصام المتعصصددة Multitaskingوأنظمصصة السصصتجابة السصصريعة .حيصصث
سيتم تنصصاول نظصام FreeRTOSفصصي هصذا الفصصصل باعتبصاره أفضصل نظصام RTOS
مجاني )ومفتوح المصدر(.
244
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
Soft Real Time Systemsوهي النظمة التي تسمح ببعض التأخير المحصصدود فصي التنفيصذ أو
السصصصتجابة للمهمصصات المطلصصوب تنفيصصذها .أمثلصصة علصصى ذلصصك ،الهواتصصف النقالصصة ،مشصصغلت اللعصصصاب،
أجهزة عرض الفيديو .كل ما سبق أنظمة يمكن التغاضصصي عصصن حصدوث تصأخير زمنصصي بسصيط أثنصصاء
تشصصصغيلها .فمثلا لصصصن تحصصصدث مشصصصكلة إذا تصصصأخرت شاشصصصة الهصصصاتف النقصصصال بضصصصعة مللصصصي ثانيصصصة فصصصي
الستجابة لوامر المستخدم.
Hard Real Time Systemsوهصصي النظمصصة الصصتي دائمنناا مننا يجننب أن تنجننح فصصي تنفيصصذ جميصصع
المهمات الخادصة بها في الزمن المطلوب وبدون أي تاخير في الستجابة مهما كان .وحدوث أي
تصصأخير يعنصصي فشصصل النظصصام ككصصل وقصصد يصصؤدي إلصصى كارثصصة .مصصن المثلصصة علصصى هصصذه النظمصصة وحصصدات
التحكم في المفاعلت النووية ،الصواريخ ،الطائرات الحربية ،بعض الجهزة الطبية مثل أجهصصزة
تنظيم ضربات القلب.
Firm Real Time Systemsتعتصصبر مماثلصصة للصصص Hard Real Time systemsمصصن ناحيصصة سصصرعة
الستجابة والتنفيذ لكن الختلف هو أنه في حالة الفشل بضع مرات للستجابة المطلوبة فلصصن
يؤدي ذلك إل ى فشصل النظصام ككصل .ومثصال علصى ذلصك جهصاز الراوتصر اللسصلكي Wireless Router
)الذي يبث النترنت بصورة لسلكية للهواتف أو الجهزة المحمولة( يحتوي على شصريحة تعمصصل
على إستقبال وإرسال حزم البيانات Data packetsباستجابة عاليصصة ومثاليصصة لكصصن إذا حصصدث أن
فقصصدت بعصصض الحصصزم أو لصصم يسصصتطع الراوتصصر التعامصصل معهصصا فصصإن ذلننك ل يعننني فشننل للنظننام ككننل
فهذا يعتبر خطأ مقبول طالماا أنه ليس متكرر بكثرة.
245
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
الطريقة اﻷولى :كتابصة الوظصائف الصتي ل تحتصاج اسصتجابة سصريعة داخصل الدالصة الرئيسصية 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
… ..............................................................................................
هنا تأتي وظيفة نصصواة النظصصام . Kernelهصصذه النصصواة تعمصصل داخصصل دالصصة مقاطعصة زمنيصة Interrupt
service routinويتصصم تكصصرار تشصصغيلها مصصن مئصصات إلصصى آلف المصصرات فصصي الثانيصصة الواحصصدة )يسصصمى
عدد مرات تشغيل النواة بالص .(System tickفي كل مرة يتصصم تشصصغيل النصصواة يبصصدأ جصزء مصصن هصصذه
النواة يسمى "برنامج الجدولة ”Schedulerبمراجعة قائمة المهام الموجودة ويحصصدد مصصا الصصذي
سيتم معالجته الن.
قصصد يختصصار برنامصصج الجدولصصة أن يكمصصل المهمصصة الحاليصصة أو ينتقصصل إلصصى مهمصصة أخصصرى علصصى حسصصب
خوارزميصصة التحويصصل )الصصص Round-Robinأو (Priority-basedوبعصصد أن يقصصرر المهمصصة ييقصصوم بنقصصل
البيانصصصات الخادصصصصة بمعالجصصصة هصصصذه المهمصصصة إلصصصى المعالصصصج وتتضصصصمن البيانصصصات محتصصصوى الممسصصص ك
جلت
249
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
حجصصم دصصصغير يسصصتهلك أقصصل مصصن 4إلصصى 9كيلصصو بصصايت مصصن ذاكصصرة الصصصص ROMممصصا يجعلصصه •
مناسصصب لمعظصصم الممتحككمصصات الدقيقصصة )تصصذكر أن ATmega16يمتلصصك 16كيلوبصصايت مصصن
الذاكرة بينما يمتلك ATmega32نحو 32كيلوبايت(.
تصصوفير مجموعصصة مصصن المكتبصصات البرمجيصة الجصصاهزة للتعامصل مصصع أنظمصصة الملفصصات FATوالصصص •
storage mediaمثل بطاقات الذاكرة
مدمج معه مكتبات خادصة لتسهيل معالجة البيانات القادمة من وإلى شبكات الحاسصصب •
اللصصصي عصصصبر بروتوكصصصول TCP/IPأو UDPممصصصا يجعلصصصه نظصصصام مناسصصصب لتطبيقصصصات إنصصصترنت
الشياء IoTوالتحكم عن بعد
250
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
الهيكل التالي شكل التقليدي للبرامج المكتوبة باستخدام RTOSحيصث تصصم إنشصصاء 3مهصام مختلفصصة
وتمتلك كل مهمة مجموعة الوامر الخادصة بها.
”#include “RTOS.h
)(int main
{
;)createTask( task1, task1_parameters إنشاء المهمة اﻷولى //
;)createTask( task2, task2_parameters إنشاء المهمة الثانية //
;)createTask( task3, task3_parameters إنشاء المهمة الثالثة //
; )while(1 ل تفعل أي شيء أخر داخل الدالة الرئيسية إلى ما ل نهاية //
;return 0
}
{ ) (void task1
{ )while(1
هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة اﻷولى //
}
}
{ ) (void task2
{ )while(1
هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثانية //
}
}
{ ) (void task3
{ )while(1
هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثالثة //
}
}
251
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
في البداية قم بتحميل أحدث إدصدار متوفر من نظام ) 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
بصيغة الهيكس) .هذه القيمة هي الفتراضية بالفعل(
254
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
إذا قمنا بوضع الرقم 1مكان هذه البت وباقي البتات = دصفر سنجد أن قيمة الص maskتساوي
00000010وهو ما يساوي 0x02بصيغة الهيكس .إذا يجب استبدال القيمة 0x10بالقيمة
0x02كالتالي:
255
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
الجصصصزء الخيصصصر مصصصن تعصصصديل ملصصصف port.cهصصصو إعصصصادة تسصصصمية الصصصص ISRالخادصصصصة بمقاطعصصصة Timer1
Compare A Matchوهصصصذا الجصصصزء يجصصصب تغييصصصره لمعظصصصم ممتحككمصصصات ) AVRسصصصواء القديمصصصة أو
الحديثة( .هذا الجزء ستجده في نهاية ملف port.cكما في الصورة التالية.
256
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
257
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
زيصصادة هصذا الرقصم سصتؤدي إلصى نقصص الصوقت المخصصصص للمعالجصصة لكصصل مهمصة فصي مقابصصل تحسصين
الستجابة للمهمات ككل ،ولكن هناك عيصب واحصد وهصصو أن الصصص kernelسصصيزداد معصدل اسصصتهلكها
للصصوقت والمصصوارد بزيصصادة هصصذا الرقصصم .فمثل إذا كصصان معصصدل الصصص tick = 3000 Hzفهصصذا يعنصصي أن الصصص
kernelسصصصتعمل 3000مصصصرة فصصصي الثانيصصصة وفصصصي كصصصل مصصصرة قصصصد تختصصصار أحصصصد المهمصصصات لتشصصصغيلها أو
التبديل مع مهمة أخرى .context switch
مصصن المفيصد زيصصادة هصذا الرقصصم فصي حالصصة أن المهمصصات تحتصصاج لسصتجابة سصريعة لكصن يستحسصن أن
يكون الممتحككم يعمل بسصصرعة 16أو 20ميجصصاهرتز علصصى القصصل .مصع العلصصم أنصه بزيصصادة هصذا الرقصم
258
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
سصصصيتم اسصصصتهلك المزيصصصد مصصصن الطاقصصصة .لصصصذا إن كصصصان مشصصصروعك يجصصصب تصصصصميمه باسصصصتهلك طاقصصصة
منخفض فيستحسن تقليل الرقم إلى ) 500سصيخفض سصرعة السصصتجابة للمهمصصات( وإذا كنصصت ل
تهتصصصصم بزيصصصصادة اسصصصصتهلك الطاقصصصصة فيمكنصصصصك أن تضصصصصع القيمصصصصة بيصصصصن 1000و 3000وفصصصصي حالصصصصة
الممتحككمات من عائلة AVR Xmegaأو AVR – 32 bitيمكن زيادة الرقم إلى .5000
أيضصصصاا يجصصصب زيصصصادة هصصصذا الرقصصصم إذا كصصصانت المهمصصصات الصصصتي سصصصيتم تشصصصغيلها سصصصتتعامل مصصصع دوال أو
عمليات حسابية كبيرة )أو أي عملية تحتاج أن تستخدم الص 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
الص Heapهي تقنيصة data-typeتسصصتخدم أنظمصصة RTOSلتخصصيص ذاكصصرة مرنصصة )قابلصصة للزيصصادة(
لكل مهمة تعمل في نظصام التشصصغيل .يتصم اسصصتخدام هصذه التقنيصصة فصي حفصظ جميصصع المتغيصرات أو
الثوابت المستخدمة في كل مهمة.
259
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
يتصصم تحديصصد هصصذا الرقصصم بصصصورة أساسصصية علصصى حسصصب حجصصم الصصذاكرة العشصصوائية الكليصصة للممتحككصصم
الصصصدقيق ويجصصب النتبصصاه أن الرقصصصم 1500يسصصصاوي قيمصصة الصصذاكرة بالبصصصايت byteوهصصذا يعنصصصي أن
ذاكرة الص heapهنا تساوى الخامس كيلو بايت تقريباا.
يمكن تحديد هذا الرقم بما هو إجمالي الذاكرة العشوائية للممتحككصم الصدقيق مصع مراعصصاة أن نظصام
freeRTOSيحتصصاج نحصصو 300إلصصى 400بصصايت لتشصصغيل الصصص kernelبينمصصا يمكصصن تخصصصيص بصصاقي
الذاكرة للمهمات المختلفة.
260
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
مثصال :تعصديل الصص driverليتوافصق مصع الممتحككصم ) atmega328يجصب اسصتبدال جميصع الممسص ك
جلت
بالسماء الصحيحة لها(.
UCSRB -> UCSR0B
UCSRC -> UCSR0C
UBRRL -> UBRR0L
UBRRH -> UBRR0H
UDR -> UDR0
ملحظة :لن يتم استخدام هذا الملف في جميع المثلة الموجودة في الكتاب والتعديلت
المذكورة بالعلى اختيارية في حالة أنك تريد استخدام الص UARTفي مشاريعك الخادصة
يوجد الملف 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كما في الصورة التالية
263
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
مخطط الدائرة
قصصم بفتصصح الملصصف main.cفصصي مجلصصد Demoوامسصصح الكصصواد البرمجيصصة الموجصصودة بصصه واسصصتبدلها
بالكواد التالية
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"
int main(void) {
/* Call FreeRTOS APIs to create tasks, all tasks has the same priority "1" with the
same stack size*/
while(1){};
return 0;
}
265
RTOS أظنظمة الوقت الحدقيدقي.11
.............................................................................................. …
static void ledBlinkingtask1(void* pvParameters){
266
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
{)static void ledBlinkingtask3(void* pvParameters
بعصصد النتهصصاء مصصن جميصصع التعصصديلت احفصصظ الملصصف ثصصم قصصم بفتصصح سصصطر الوامصصر فصصي نفصصس المجلصصد
واكتصصصب المصصصر makeلتبصصصدأ عمليصصصة الترجمصصصة ،إذا تمصصصت بنجصصصاح سصصصتظهر نتائصصصج مشصصصابهه للصصصصورة
التالية:
267
.11أظنظمة الوقت الحدقيدقي RTOS
… ..............................................................................................
الن يمكنك استخدام ملف الهيكس الناتج من عملية الترجمة سواء فصصي تجربصصة الصصص simulation
على برنامج بروتس أو تجربة الملف مباشرة على الممتحككم الدقيق .ATmega16
في حالة استخدام ممتحككم أخر مثل ATmega32أو atmega328ل تنسى أن تغير العدادات
الخادصة بالملف – makefileكما هو مذكور في الخطوات في بداية الفصل
ملحظة :بالرغم من إمكانية تصميم النظمة الص Hard Real timeأو Firm Real time
بإستخدام الممتحككمات الدقيقة مع RTOSإل أنه عادة ما يتم استخدام تقنية الص FPGAأو الص
ASICلتصميم هذه النظمة حيث تتمتع هذه التقنيات بالقدرة على معالجة العديد من
المهمات المختلفة والستجابة الفائقة لها جميعاا في نفس الوقت .بينما الممتحككمات الدقيقة ل
تستطيع أن تشغل أكثر من مهمة في نفس اللحظة حتى وإن كان باستطاعتها التبديل بين
المهمات بإستخدام الص RTOSوهذا لن أغلب الممتحككمات الدقيقة تمتلك نواة معالجة واحدة
Single CPU core
268
الملحقات
.12المملحدقات اﻹاضافية
270
.12المملحدقات اﻹاضافية
… ..............................................................................................
يعتمصصصد البرنامصصصج بصصصصورة أساسصصصية علصصصى المصصصترجم الشصصصهير GCCوالصصصذي سنسصصصتخدم الدصصصصدارة
المشتقة منه وهصي avr-gccكمصا سصنرى فصي الخطصوات القادمصة .فصي البدايصة قصم بتحميصل ملفصات
التنصصصيب الخادصصصة بالبرنامصصج عصصبر التصصوجه إلصصى موقصصع CodeBlocksالرسصصمي مصصن خلل الرابصصط
التالي:
http://www.codeblocks.org/downloads
اضصصغط علصصى زر تحميصصل ملفصصات التشصصغيل لتظهصصر لصصك دصصصفحة تحتصصوي 3خيصصارات للتحميصصل ،قصصم
بتنزيصصصل الخيصصصار الصصصذي يحمصصصل اسصصصم codeblocks-13.12mingw-setupوالصصصذي يعنصصصي أن برنامصصصج
CodeBlocksمضصصاف إليصصه جميصصع ملفصصات المصصترجم ) gcc-compilerقصصد يختلصصف الرقصصم 12-13
الموجود في اسم البرنامج إذا تم إدصدار نسخة جديدة(.
271
.12المملحدقات اﻹاضافية
… ..............................................................................................
بعد النتهاء من التحميل ابدأ بتنصيب الملف وتأكد من وضع علمة "دصح" على جميع خيارات
التنصيب الخادصة بالبرنامج )هذه الخيارات تعني تنصيب جميع ملحقات برنامج CodeBlocks
كما في الصور التالية:
272
.12المملحدقات اﻹاضافية
… ..............................................................................................
بعد النتهاء من التحميل قم بتنصيب البرنامج كما في الخطوات السصابقة .والن سصنقوم بتنصزل
برنامج الواجهة الرسصصومية ) 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
للبصصدء قصصم بالضصصغط مرتيصصن علصصى ملصصف main.cمصصن القائمصصة الجانبيصصة للبرنامصصج لتظهصصر الصصصفحة
275
.12المملحدقات اﻹاضافية
… ..............................................................................................
الخادصة بكتابة الكود البرمجي وبعد النتهاء من كتابة الكود اضغط على زر Buildمن الشريط
العلوي للبرنامج )الزر الذي يمتلك رمز الترس( كما في الصورة التالية:
ستظهر في القائمة السفلية للبرنامج عبارة تدل على نجاح عملية التجميع Compilationبصصدون
أخطاء . errorsالن يصبح لدينا ملف الصصص hexالصصذي يمكننصصا اسصصتخدامه إمصصا لبرمجصصة الممتحككصصم أو
يمكننا استخدامه مع برنامج المحاكاة بروتس Protuesلعمل محاكاة للممتحككم ATmega16
276
.12المملحدقات اﻹاضافية
… ..............................................................................................
تعتمصصصد هصصصذه الطريقصصصة علصصصى اسصصصتخدام المصصصترجم 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منصبة بصورة دصحيحة يفترض أن تظهر الرسالة التالية
277
.12المملحدقات اﻹاضافية
… ..............................................................................................
والن لنقصصم بتجربصصة الملصصف الول وهصصو المثصصال ،blinking ledقصصم بفتصصح المجلصصد المسصصمى compile
with make fileلتجد بداخله ملفين وهما
main.c
makefile
الملف main.cيحتوي على المثال الول في الكتاب blinking ledأما الملف makefileفيحتصصوي
علصصصى جميصصصع العصصصدادات الخادصصصصة بتحويصصصل الملصصصف main.cإلصصصى ملصصصف الهيكصصصس .قصصصم بفتصصصح الملصصصف
باستخدام أي محرر نصوص مثل ++notepad
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كما في الصورة التالية
280
.12المملحدقات اﻹاضافية
… ..............................................................................................
281
.12المملحدقات اﻹاضافية
… ..............................................................................................
بعد النتهصاء مصن تودصصيل دائصرة الممتحككصم علصى لوحصة التجصارب Breadboardسصنقوم برفصع ملصف
الهيكصصس باسصصتخدام برنامصصج avrdudeوذلصصك مصصن خلل الواجهصصة الرسصصومية .AVRdudessفصصي
البداية قم بفتح البرنامج AVRdudess
اختر نوع الممبرمجة المتوفرة لديك مثل USBaspكما هو موضح في الصورة التالية:
بعصصد اختيصصار الممبرمجصصة قصصم باختيصصار نصصوع الممتحككصصم الصصدقيق )مصصن القائمصصة الموجصصود علصصى الجصصانب
اليمصصن مصصن البرنامصصج( وفصصي حالصصة أن الممتحككصصم يعمصصل بصصدائرة المذبصصذب الصصداخلي بسصصرعة 1ميجننا
يجب أن تغير سرعة رفع البرنامج لتصبح 93كيلوبايت في الثانية أما إذا كان الممتحككم يعمصصل
282
.12المملحدقات اﻹاضافية
… ..............................................................................................
باستخدام دائرة مذبذب خارجي مثل الكريستالة 16ميجا فيمكنك أن تترك خيار سصصرعة الرفصصع
يساوي الخامس ميجا كما هو موضح في الصورة التالية.
ملحظة :يستطيع برنامج AVRdudessأن يتعرف على الممتحككم بصورة تلقائية وذلك عبر
الضغط على زر Detectالموجود على جانب الشاشة اليسر.
والن اختر ملف الهيكس الذي يحتوي على البرنامج المطلوب رفعة إلى الممتحككم الدقيق
283
.12المملحدقات اﻹاضافية
… ..............................................................................................
قصصد يبصصدو اسصصتخدام avrdudeمزعجصصاا أو مخيفصصاا لمصصن ل ميسصصتخلدم نظصصام لينكصصس و ليصصس علصصى
احتكاك بسطر الوامر إل أنه سنكتشف سوية مدى سهولة استخدامه.
284
.12المملحدقات اﻹاضافية
… ..............................................................................................
الممتحككم المنراد برمجت ه :بكتابصة -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المملحدقات اﻹاضافية
… ..............................................................................................
هناك أمر واحد يجب النتباه له عند التعامل مع لوحات آردوينو وهو "ترقيم اﻷطراف" ،حيصث
نجصصد أن مصصصممي لوحصصات آردوينصصو لصصديهم أسصصلوب مختلصصف لصصترقيم أطصصراف ممتحككمصصات 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
ميجا
287
.12المملحدقات اﻹاضافية
… ..............................................................................................
إذا لصصم تكصصن تفضصصل اسصصتخدام برنامصصج آردوينصصو فصصي كتابصصة الكصصود فيمكنصصك أن تسصصتخدم برنامصصج
Atmel Studioمصصصصصع إضصصصصصافة الصصصصصدعم المباشصصصصصر للوحصصصصصات آردوينصصصصصو بسصصصصصهولة مصصصصصن خلل إضصصصصصافة
visualmicroوالتي تجعل برنامج Atmel studioيتعامل مع لوحات آردوينو مباشرة
http://www.visualmicro.com/page/Arduino-for-Atmel-Studio.aspx
288
.12المملحدقات اﻹاضافية
… ..............................................................................................
أيضصصصاا يمكنصصصك اسصصصتخدام ملفصصصات makefileفصصي ترجمصصة الكصصصواد البرمجيصصصة وتحويلهصصصا إلصصصى ملصصصف
هيكصس )راجصع ملحصصق شصرح (makefileثصم اسصتخدام برنامصصج ARVdudessلرفعهصا علصى لوحصات
آردوينو
أيضاا بامكانك استخدام لوحات آردوينو كمبرمجصصة Programmerلي ممتحككصصم AVRوذلصصك عصصبر
برنامج ArduinoISP + AVRdudess
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
قائمة المراجع
.............................................................................................. …
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