سلسلة ” تعلم ببساطة “ تهدف سلسلة كتب” تعلم ببساطة “ إلى توفير علوم اﻹلكترونيات الحديثة باللغة العربية بصسسورة مجانيسسة ومفتوحسسة المصسسدر مسسع الحفاظ علسسى المبدأ السسساسي “البسسساطة” في شرح المعلومات ،جميع الكتب موجهة للعامة من هواة اﻹلكترونيات و طلبة الكليات الهندسة.
رخصة الكتاب كتاب "تعلم AVRببساطة" منشورل مجاناال للجميع تحت رخصة المشاع البداعي الدصدارة الرابعة Creative Common v4 CC-NC-SAبشروط النسبة – المشاركة بالمثل – عدم الستغلل التجاري.
رخصةل المشاعل البداعيCC-NC-ل )غيرل تجارية(ل لك كامل الحق في نسخ وتوزيع وتعديل أو
الاضافة أو حتى طباعة الكتاب ورقياا كما تشاء وأشجعك على ذلك أيضاا شرط عدم إستغلل الكتاب
تجاري اا بأي دصورة مباشرة أو غير مباشرة ،كما يجوز طباعة الكتاب وتوزيعة بشكل عام شرط أن يباع بسعر التكلفة دون أي ربح. المشاركةل بالمثلSA-ل إذا تم اشتقاق أي عمل من هذا الكتاب بصورة إلكترونية أو مادية مثل عمل كتاب آخر أو محااضرة تعليمية ) أو حتى كورس متكامل( أو فيديو فيجب أن يتم بصورة مجانية و بنفس الرخصة ) المشاع البداعي :النسبة ،المشاركة بالمثل ،الغير تجارية( .يمكنك التعرف أكثر على رخصة المشاع البداعي من الموقع الرسمي creativecommons.org جميع كتب سلسلة "تعلم ببساطة" منشورة بنفس الرخصة يمكنك تحميل السلسلة من الموقع http://simplyarduino.com/?page_id=889 للتوادصل مع المؤلف
[email protected] الغلف ممصمم بواسطة نور الدين – سوريا http://fb.com/NourHamda.Portfolio
[email protected] عبدالله علي عبدالله 1437هـ الموافق 2015م.
إهداء … ..............................................................................................
إهداء أبي و أمي … لولاكما ما تعلمت حرفا ا .. أساتذة هندسة الحاسبات بجامعة حلوان وأخص منهم،
أ.د .محمد العدوي
شكراا لنك أحببت العربية ،شكراا جزيلا على كل كتبك الرائعة ،فهي ذخر للمة
أ.د .علاء حمدي
شكراا على تبسيطك للعلم ،يعلم الله كم البهجة الذي أدخلته على قلوب الطلبة ((:
د .أحمد يوسف
شكراا على إخلدصك ،تحملك للطلبة والدصرار على إيصال العلم ،شكراا
4
شكر اا لكل من شارك … ..............................................................................................
شكراا لكل من شارك م .أحمد أأسامة – شكرا ا للمساهمة بفصل الـ UART
م .يحيى طو يل – شكرا ا على نصائحك ومقالات "عتاديات" الرائعة شكرا ا لكل من ساهم بمراجعة الكتاب
م .حمدي سلطان ،م .سعيد الشايب ،أحمد م .أبو زيد،
إسلام الليثي ،محمد عويس ،هاجر شرف ،لميس الموصلي.
ولكل من ساهم بنصيحة أو تعليق ب بّنناء ،شكرا ا لـكم جميعا ا
5
الفهرس … ..............................................................................................
الفهرس
حول الكتاب – اﻹصمدار 11.............................................................1.0 فصول الكتاب 11............................................................................................
لماذا سنستخدم ANSI – C؟15.......................................................................... حرب الممتحككمات -من هو الفضل الص AVRأم الص PIC؟16..........................................
م .1مقمدمة عن الظنظمة المممدمةجة22.................................................... 1.1معنى النظام المدمج 23..................................................Embedded System 1.2مكونات النظام المدمج 24........................................................................... 1.3مراحل تطوير النظمة المدمجة 25................................................................
م .2ظنظرة عامة على متحككمات 34...............................................AVR 2.1تركيب الممتحككم الدقيق ومعمارية 35......................................................AVR 2.2مميزات معمارية الص 37.........................................................................AVR 2.3كيف تختار بين عائلت الص AVRالمختلفة39..................................................... 2.4قراءة دليل البيانات 42...............................................................Datasheet 2.5الخصائص العامة للممتحككم 43......................................ATmega16/ATmega32 2.6أطراف الممتحككم 47...................................................................ATmega16 2.7عائلة 49.......................................................................................ATTiny 2.8تمارين إضافية52..................................................................................... 2.9مراجع إضافية 53.....................................................................................
.3تةجهيز أدوات التةجارب55............................................................. 3.1الممبرمجات 56.......................................................................................... 3.2المكونات اللكترونية 62.............................................................................
6
الفهرس … .............................................................................................. 3.3أدوات إضافية 65..................................................................................... 3.4تجهيز البرمجيات 66................................................................................. 3.5مراجع إضافية 73.....................................................................................
.4أساسيات التحكم 75..............................................GPIO Basics 4.1المثال الول77.....................................................................Hello World : 4.2شرح المثال الول وأساسيات برمجة الص 89................................................AVR 4.3المثال الثاني :استخدام 4دايود ضوئي96...................................................... 4.4المثال الثالث :تشغيل جميع أطراف 99.......................................PortA, Port B 4.5المثال الرابع :تشغيل المقاطعة السباعية 102....................................7segment 4.6المثال الخامس :قراءة الدخل الرقمي 107.................................Inputs reading 110.............................................................Pull Up & Pull Down Resistor 4.7 4.8خادصية الص 113..................................................................Internal Pull-Up 4.9المثال السادس :تشغيل 3دايودات 3 +مفاتيح114......................................... 117.......................................................Bouncing effect & De-bouncing 4.10 4.11حساب المقاومة المستخدمة قبل الحمال 119...............................................
تودصيل أحمال بتيارات كبيرة 121.......................................................................
تشغيل الممحركات 123................................................................................DC 4.12تشغيل الممحرك في كل التجاهين 125.........................................................
.5قواعمد لغة السي للظنظمة الممدمةجة129.......................................... 5.1أنواع البيانات في النظمة المدمجة 130.........................................Data-types 5.2العمليات الحسابية 135.............................................Arithmetic Operations 5.3العمليات المنطقية 136.......................................................Logic Operation 5.4عمليات الزاحة 139..........................................................Shift operations 5.5التحكم على مستوى البت الواحدة 142............................................Single Bit 5.6القراءة من بت واحدة 144....................................................Read single bit
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل 146................................ 7
الفهرس … .............................................................................................. 147..............................................................................Fuses & Lockbits 6.1 154..........................................................................................LockBits 6.2 6.3المذبذبات والص 155.................................................................Clock Source 6.4قيم الفيوزات لضبط السرعة 162.................................................................. 6.5الطاقة وسرعة تشغيل الممتحككمات166........................................................... 6.6كيف تبرمج الفيوزات 169........................................................................... 6.7كيف تعالج الفيوزات الممبرمجة بصورة خاطئة؟ 171..........................................
.7الممقاطعة 174...........................................................Interrupt 7.1مقدمة عن الممقاطعة 175........................................................The interrupt 7.2المثال الول :تشغيل الممقاطعة 177........................................................INT0 7.3المثال الثاني :تشغيل الممقاطعة INT0مع 185...........................................INT1
.8التمصال التسلسلي بروتوكول 188.........................................UART 8.1مقدمة عن التصال التسلسلي 189................................................................ 8.2التسلسلي الغير متزامن 192...................................................Asynchronous 8.3تهيئة الص UARTالداخلي لمتحكمات 194...................................................AVR 8.4المثال الول :تهيئة الص UARTللعمل كمرسل 196................................................ 8.5المثال الثاني :تهيئة ال UARTللعمل كمستقبل200............................................ 8.6المثال الثالث :الرسال والستقبال في وقت واحد202....................................... 8.7إرسال مجموعة بيانات مثل السلسل النصية205............................................. 8.8دوال إضافية 209.....................................................................................
م .9الممحول التناظري-الرقمي 212.............................................. ADC 9.1مقدمة عن المحول التناظري-الرقمي 213.................................................ADC 9.2تركيب الص ADCداخل الممتحككم 215................................................ATmega16 9.3المثال الول :قراءة جهد متغير باستخدم مقاومة متغيرة217.............................. 9.4حسابات الص 224.................................................................................ADC
8
الفهرس … ..............................................................................................
.10المعالج التمهيمدي وصناعة المكتبات البرمةجية227.......................... 10.1الوامر التنفيذية والوامر التوجيهية 228.....................................................
بعض استخدامات 228............................................................C - preprocessor 10.2قواعد الوامر التوجيهية 229..................................C - preprocessor syntax 232......................................................................function-like macros 10.3 10.4قواعد كتابة الماكرو 232.....................................................macros syntax 10.5مراجع إضافية 233................................................................................. 10.6تصميم المكتبات البرمجية في لغة السي234................................................. 10.7خطوات دصناعة المكتبة235...................................................................... 10.8تجربة المكتبة في برنامج 238................................................ATmel studio
.11أظنظمة الوقت الحقيقي 245...............................................RTOS 11.1مقدمة عن أنظمة الوقت الحقيقي 246..............................Real Time Systems 11.2طرق تصميم الص 247.....................................Real Time Embedded systems 11.3كيف تعمل النواة 250............................................................RTOS Kernel 11.4مقدمة عن نظام 251................................................................FreeRTOS 11.5الهيكل البرمجي للص 252....................................................................RTOS 11.6تشغيل FreeRTOSعلى جميع ممتحككمات 253..........................................AVR 11.7المثال الول265............................................Blinking 3 leds with 3 tasks :
.12المملحقات اﻹضافية271............................................................. مملحق :تنصيب برنامج CodeBlocksعلى نظام ويندوز 272...................................... مملحق :ترجمة الملفات باستخدام 278.....................................................makefile
مملحق :رفع ملف الص Hexعلى الممتحككم الدقيق282.................................................. مملحق :كيف تستخدم لوحات آردوينو لتعلم برمجة 287.....................................AVR
قائمة المراجع291........................................................................
9
مقدمة ” العلم مغرس كـل فخر فافتخـر ...واحذر يفوتـك فخـر ذاك المغـرس واعلم بأن العـلم ليس يناله
...من هـمـ ه في مطعـ م أو ملبـس‟
الإمام الشافعي
حول الكتاب – اﻹصدار 1.0 … ..............................................................................................
حول الكتاب – اﻹصدار 1.0 هذا الكتاب موجه إلى كل من يرغب بدخول مجال تطوير النظم المدمجة Embedded Systems بصصصصورة احترافيصصصة والبصصصدء بتعلصصصم أساسصصصيات هصصصذا المجصصصال الممتصصصع بأسصصصلوب عملصصصي معتمصصصد علصصصى
التجارب.
لقصصد حردصصصت علصصى أن يكصصون الشصصرح باللغصصة العربيصصة بخطصصوات يسصصيرة ومفصصصلة ومصصع ذلصصك سصصأحافظ
علصصى اسصصتخدام بعصصض المصصصطلحات النجليزيصصة فصصي الشصصرح حصصتى تعتصصاد علصصى هصصذه المصصصطلحات ويصبح من اليسير لك قراءة المراجع النجليزية. الكتصصاب ليصصس ممصصصمم ليكصصون مرجصصع شصصامل بقصصدر مصصاهو مصصوجه ليكصصون بدايصصة انطلق نحصصو احصصتراف
المجصصال ،الحقيقصصة أن هصصذا العلصصم ل يمكصصن احتصصواؤه أبصصداا فصصي كتصصاب أو مرجصصع حصصتى وإن كصصان 1000
دصفحة ،لذا قمصت بإضصافة مصصادر تعليميصة بعصصد كصل فصصل تشصرح المزيصصد مصن التجصارب والمعلومصات
عن نقاط هذا الفصل فاحرص على قراءة هذه المصادر الضافية لتستزيد من العلم.
فصول الكتاب
الفصل اﻷول :مقدمة سريعة عن النظمة المدمجة والمكونات المسصصتخدمة فصصي بنائهصصا وكيفيصصة اختيار هذه المكونات لتحقيق أقصى استفادة بأقل سعر وشرح عام لمراحل التطوير بدايصصة مصصن
الفكرة وإنتهائاا بالمنتج الذي يباع للمستهلك.
الفصننل الثنناني :يقصصصدم شصصصرح مبسصصصط للصصصتركيب الصصصداخلي للمتحكصصصم الصصصدقيق مصصصع شصصصرح لخصصصواص
ومميصصزات الممتحككمصصات مصصن نصصوع AVRوكيفيصصة قصصراءة دليصصل البيانصصات Datasheetالخادصصصة بهصصا واستخلص أهم المعلومات.
الفصننل الثننالث :يوضصصح هصصذا الفصصصل الدوات الصصتي سنسصصتخدمها فصصي تطصصوير النظمصصة المدمجصصة سصصصصصواء كصصصصصانت العتصصصصصاد "المكونصصصصصات اللكترونيصصصصصة" Hardwareأو الدوات البرمجيصصصصصة ToolChain )(Softwares
11
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. الفصننل الرابننع :مصصن هنصصا نبصصدأ رحلصصة تعلصصم الممتحككمصصات الدقيقصصة وسصصنبدأ مصصع أساسصصيات تشصصغيل
أطراف الممتحككم الدقيق وتشغيل المنافذ لتعمل كصصدخل أو كخصصرج .GPIOكمصصا سصصنقوم بمجموعصصة من التجارب لتشغيل العنادصر اللكترونية البسيطة مثل ..LEDs, Switchs, 7-Segmentsالخ.
الفصننل الخننامس :شصصصرح لهصصصم القواعصصصد والصصصصيغ الشصصصهير للغصصصة السصصصي المعياريصصصة والمسصصصتخدمة بشكل كبير في تطوير النظمة المدمجة .تتميز الصيغ المعيارية بإمكانية تطبيقها على مختلصصف
الممتحككمات الدقيقة طالماا أن المترجم الخاص بها يدعم لغة السي.
الفصل السادس :شرح العدادات المتقدمة لمتحكمات AVRمثصصل مفهصصوم الفيصصوزات ووظائفهصصا المختلفة مثصل تغيصر سصرعة التشصغيل Clock Rateواسصتهلك الطاقصة ،حمايصة البرامصج الموجصودة
على الممتحككم من السرقة أو التعديل وتشغيل بعض الخصائص المتقدمة الخرى.
الفصل السابع :سنتعرف في ه ذا الفصصل علصى كيفيصة تشصغيل المقاطعصات الخارجي ة External Interruptsوفائصصدة هصصذه الخادصصصية الرائعصصة الصصتي تتيصصح دصصصناعة تطبيقصصات ذات اسصصتجابة عاليصصة
السرعة للحداث الخارجية.
الفصننل الثننامن :شصصصرح أحصصصد أشصصصهر طصصصرق إرسصصصال البيانصصصات بصصصصورة تسلسصصصلية بيصصصن الممتحككمصصصات الدقيقصصة والعصصالم الخصصارجي وذلصصك عصصبر بروتوكصصول UARTوالصصذي يعتصصبر أشصصهر بروتوكصصول معيصصاري
لتبادل البيانات.
الفصل التاسع :في هذا الفصل سنتعرف على كيفية قراءة الجهود الكهربية المتغيرة Analog وتحويلها إلى قيم رقمية وذلك باستخدام المحول التنصصاظري-الرقمصصي المدمصصج داخصل ممتحككمصصات
.AVRحيث يمكن استغلل هذا المحول في قراءة الحساسات التناظرية أو أي عنصر إلكصصتروني له خرج كهربي متغير. الفصنننل العاشنننر :شصصصرح أكصصصواد C preprocessorحيصصصث سصصصنتعرف علصصصى الفصصصارق بيصصصن الوامصصصر التنفيذية والوامر التوجيهية وأهميتها بصورة مفصصصلة مثصصل المصصر include#وكصذلك define وكذلك سصصنتعرف علصصى كيفيصصة دصصناعة المكتبصصات البرمجيصة .librariesمصع شصرح مثصال لعمصصل uart
driverعلى دصورة مكتبة.
12
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. الفصل الحادي عشر :طرق استخدام أنظمة تشغيل الوقت الحقيقي Real Time OSلتشغيل المهصصصصصام المتعصصصصصددة Multitaskingوأنظمصصصصصة السصصصصصتجابة السصصصصصريعة .حيصصصصصث سصصصصصيتم تنصصصصصاول نظصصصصصام FreeRTOSفي هذا الفصل باعتباره أفضل نظام RTOSمجاني )ومفتوح المصدر(.
وفي النهاية مضاف مجموعة من المملحقات التدريبية ،كل ملحق يشرح مهارة تقنية مختلفة الكتاب موجه خصيصاا إلى طلبة الكليات الهندسية مثل: تخصص هندسة الحسابات والتصالت.
✔ ✔
تخصص هندسة اللكترونيات و الكهرباء.
✔
تخصص ميكاترونكس.
هواة اللكترونيات بشكل عام.
✔
يتطلب قراءة هذا الكتاب بعض المعرفة الممسبقة: ✔
أساسيات لغة السي Cبشكل عام مثل استخدام المتغيرات والثوابت if - for – while
✔
أساسيات اللكترونيات والكهرباء مثل المقاومات ،المكثفات ،البطاريات ..إلخ
إذا لم يكن لديك اي خبرة بما سبق فأنصحك بقراءة المراجع التعليمية العربية )في نهاية الكتاب( حيث تحتوي على موارد عربية رائعة لشرح علم اللكترونيات من الصفر لتشصصغيل البرمجيصصات الصصتي سنسصصتخدمها فصصي تطصصبيق المثلصصة المصصذكورة فصصي الكتصصاب سصصتحتاج أن
تمتلك حاسب آلي بالمكانيات التالية على القل: •
معالج بنتيوم 4أو أعلى مثل Core2Due – Core i3 – i5 - i7
•
ذاكرة عشوائية RAMسعة 1جيجا أو أكثر
•
مساحة تخزينية فارغة 5جيجا على القل
•
نظام تشغيل Windowsأو ) Linuxمصصع العلصم أن التطصصبيق الساسصصي سصصيكون علصى نظصام ويندوز(.
يمكنصصك الحصصصول علصصى نسصصخة مجانيصصة)مصصدى الحيصصاة( مصصن برنامصصج Atmel stduioمصصن الموقصصع الرسمي مع العلم أن الموقع يتطلب تسجيل حساب )مجاني( لتحميل البرنامج. http://www.atmel.com/tools/ATMELSTUDIO.aspx
13
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. كما يمكنك الحصول على نسخة مجانية )لمدة شهر( من برنامج المحاكاة بروتس Protuesمن الموقع الرسمي http://www.labcenter.com
سيتم استخدام كل البرنامجين بصورة أساسية في شرح التجارب المذكورة في الكتاب. ملحظة :برامج المحاكاة مثل بروتس تتطلب استهلك قدر كبير من الذاكرة و المعالج لذا احرص على إغلق أي تطبيقات أخرى ل تستخدمها عند تشغيل برنامج بروتس سيرتكز الكتاب على شرح الممتحككمات الدقيقة من نوع AVR – 8 bitالممصممة بواسطة الشركة
العملقة ATmelلما لها من مميزات رائعة ،وسيكون الشرح مبني على لغة السصصي Cالمعياريصصة أو كمصصا تعصصرف باسصصم ) ANSI – C (C89, C99وسصصيتم اسصصتخدام المصصترجم AVR-GCCالمضصصمن مصصع
برنامصصج ATmel Studioولصصن يتصصم اسصصتخدام البرامصصج الصصتي تغيصصر طصصرق البرمجصصة المعياريصصة مثصصل .(Arduino IDE, Code vision, MikroC
14
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. أتخيصصل أنصصك بعصصد هصصذه المقدمصصة قصصد تتسصصاءل ..لمصصاذا سصصيرتكز الشصصرح علصصى لغصصة السصصي المعياريصصة
ANSI – Cو سبب اختياري للص AVRبدلا من الص ... PIC
لماذا سنستخدم ANSI – C؟
لماذا نستخدم ANSI - Cبدلا من اللغات ومعصايير البرمجصة املخصصرى مثصل Bascomأو Flow Code بالرغم أن هذه الطرق قد تكون أسهل في البرمجة؟ لكي نفهم الجابة علينا أولا أن نتعرف علصى
كلمة ANSIوهي اختصار المعهد الوطني المريكي للمعايير )(ANSI
هذا المعهد قام بوضع معيار موحد للغة السي وذلك حتى تصبح الكواد المكتوبة بها دصالحة على
منصات مختلفة )حتى وإن تطلبت تعديلت بسيطة( .فمثلا يمكنك كتابة برنامج بلغة السي على نظصصام وينصصدوز ومصصن ثصصم تقصصوم بعمصصل ترجمصصة لصصه دون تعصصديل ليعمصصل علصصى نظصصام لينكصصس أو العكصصس
وباستخدام نفس المترجم .Compiler
إن تعلم لغة السي المعيارية والتدرب على تقنيات كتابة الكواد بها يعطيك القدرة علننى التعامننل
مع أنواع كثيرة جداا من الممتحككمات الدقيقنة ،فمث ا ل بعصد انتهائصك مصن هصذا الكتصاب سصتكون قصادراا علصصى قصصراءة الكصصواد المكتوبصصة لمتحكمصصات ARMبصصدون مجهصصود كصصبير ،بصصل قصصد تجصصد أن الوامصصر شصصبه
جلت Registersالتي سنتحدث عنهصصا فصصي متطابقة في الكثير من الحالت )باختلف أسماء الممس ك الفصول القادمصة( .ليصس هصذا فحسصب بصل س تجد أن تعلصم برمجصة أي ممتحككصم آخصر أدصصصبحت عمليصة
سهلة جداا طالما أن المترجم الخاص بهذا الممتحككم يدعم السي المعيارية.
مصصن أجصصل هصصذه السصصباب سصصنتعامل فقصصط مصصع البرامصصج الصصتي تصصدعم هصصذه اللغصصة مباشصصرة مثصصل ATmel
Studioو CodeBlocksأمصصا بصصاقي البرامصصج مثصصل CodeVisionتجعلصصك تتعلصصم بعصصض الممارسصصات السصصيئة فصصي كتابصصة الكصصود والصصتي قصصد ل تتوافصصق مصصع معصصايير الصصص ANSI – Cوبعصصض البرامصصج تضصصيف
مكتبات تغير طريقة البرمجة بالكامصل )مثصصل آردوينصو( وهصصذا أيضصاا ل أنصصصحك باسصصتعماله إذا كنصصت تهدف احتراف تصميم النظمة المدمجة.
15
حول الكتاب – اﻹصدار 1.0 … ..............................................................................................
حرب الممتحككامات -من هو الأفضل الـ AVRأم الـ PIC؟ هذا السؤال دائم اا ما يتبادر لكل من يعمل أو بدأ يدخل مجال النظمة المدمجة ،دائماا سصصنجد هصصذا الصصصراع القصصائم بيصصن فريصصق متحمصصس للصصص AVRوآخصصر للصصص ،PICالحقيقصصة أن حسصصم هصصذا الصصصراع أمصصر دصعب للغاية لكن اسمح لي أن أعرفك على بعض جوانب هذه الحرب .. في البداية لنعترف بشيء هام ،في مجال الصنظم المدمجة ل يوجد ما يسمى "ما هو أفضل ممتحككم دقيق" بصورة ممطللقة ولكن هناك "من النسب" للستخدام في تطبيق معين
في بعض الحيان نحتاج أن نصمم نظام تحكم بسعر رخيص جداا ول نحتاج لقدرات خارقصصة أو
ممتحككمات متطورة لتشغيله لذا نبحث عن الممتحككم "الرخص" والصصذي يكفصصي فقصصط لهصصذه المهمصصة لصصذا ل تسصصتغرب أن علمصصت أن الممتحككمصصات ) STM8 (8-bitتعتصصبر مصصن أكصصثر الممتحككمصصات مبيعصصاا فصصي
العالم لنها أرخص من كل من AVRوال PICالص 8بت وتتفوق عليهم في تقديم قصصدرات مناسصصبة
بسعر منخفض. لكصصن دعنصصا نعصصود للسصصؤال الدصصصلي والمتسصصبب فصصي حصصرب طويلصصة بيصصن المطصصورين ..مصصن الفضصصل الصصص
AVRأم PIC؟ للجابصصة سصصأقوم بعقصصد بعصصض المقارنصصات التقنيصصة والماليصصة بيصصن ممتحككمصصات كصصل مصصن AVR – 8 bitو الص PIC – 8 bit
أولا :مقارنة السرعة هنا سنجد أن ممتحككمصات الصصص AVR – 8 bitتتفصوق بفصارق كصبير ج داا ويعتصبر أدائهصا أسصرع بنحوصص 4
أضعاف من مثيلتها في الص PIC – 8 bitوذلك لن ممتحككمات الص AVRتستطيع أن تنفذ عدد أوامر في الثانية الواحدة = التردد الذي تعمل به أما الص PICفيمكنه تنفيذ مربع هذا العدد
مثلا لصصصو معنصصصا ممتحككصصصم AVRو PICوكلهمصصصا يعمصصصل بصصصتردد = 16ميجصصصاهرتز ) 16مليصصصون هرتصصصز(
سصصنجد أن الصصص AVRيمكنصصه تنفيصصذ 16مليصصون أمصصر برمجصصي فصصي الثانيصصة الواحصصدة Instruction per secondبينما الص PICبنفس السرعة يستطيع أن ينفذ فقط 4مليون أمر في الثانية الواحدة.
16
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. يرجع هذا المر إلى تقنية الص Pipelineالصتي تتميصز بهصا جميصع ممتحككمصات الصصص AVRول تتواج د إل
في بعض فئات الص PICالمتطورة نسبياا.
أيضاا تحتوي معظم شصصرائح الصصص AVRعلصى بعصض الدوات الصتي تسصصرع مصصن تنفيصذ الوامصصر مثصل الصصص
Hardware multiplierوهصصي وحصصدة معالجصصة لعمليصصات الضصصرب الحسصصابية يمكنهصصا تنفيصصذ عمليصصة الضرب في 2نبضة فقط )سنتعرف على النبضات ومفهوم التردد في فصل الفيصصوزات والتحكصصم في سصصرعة التشصغيل( .بينمصصا ممتحككمصصات الصصص PICالمماثلصة ل تحتصوي علصصى هصذا المصر وقصد تسصتغرق
نفس عملية الضرب عليها نحو 40ضعف الوقت المطلوب على الص .AVR
ثانياا :التصميم الداخلي ومعالجة البيانات عندما نكتب برنامج بلغة التجميع Assemblyنجد فارقاا ضخم بين كليهما حيث يتمتصصع الصصص AVR
جل عام " Registerريجستر" يمكصصن اسصصتخدامهم فصصي معالجصصة وتخزيصصن البيانصصات بوجود 32ممس ك جل الصصتراكم جل واحد فقصصط )ممسصص ك المؤقتة بسرعة وكفاءة بينما يجبرك الص PICعلى استخدام ممس ك (Accumulatorفصصي معظصصم الوامصصر وهصصذا يعنصصي أن البرامصصج المكتوبصصة علصصى الصصص AVRأكصصثر كفصصاءة
وأسرع بكثير من البرامج المكتوبة على الص .PIC مثال على ذلك ،البرنامج التصالي مكتصوب بلغصة السصي ومصصمم لكصي يبحصث عصن أكصبر قيمصة داخصل
مصصصفوفة مصصن الرقصصام Arrayوتصصم تشصصغيل نفصصس الكصصود علصصى مجموعصصة مصصن الممتحككمصصات الدقيقصصة
مثل ATmega16و PIC18Fو MSP
)int max(int *array { ;char a ;int maximum=-32768 )for (a=0;a<16;a++ )if (array[a]>maximum ;]maximum=array[a ;)return (maximum }
17
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. الجدول التالي يوضح عدد الص ) cylcesنبضصات الصصص (Clockوعصدد الوامصر بلغصة السصمبلي و سصرعة التنفيصصصصذ النهائيصصصصة )بالميكروثانيصصصصة( للكصصصصود السصصصصابق علصصصصى مختلصصصصف الممتحككمصصصصات ،لحصصصصظ كيصصصصف أن
atmega16بصصالرغم مصصن أنصصصه يعمصصصل بسصصرعة 16ميجصصا إل أنصصه اسصصصتطاع أن يتفصصصوق علصصصى كصصصل مصصصن
PIC16C74وكذلك PIC18F452الذي يعمل بسرعة 40ميجاهرتز.
ملحظة :المقارنة الكاملة ستجدها داخل ملف AVR_introductionالمرفق مع الكتاب وهو ملف رسمي من شركة Atmelيوضح مميزات هذه العائلة من الممتحككمات الدقيقة
ثالثاا :استهلك الطاقة هنا يتفوق الص PICعلى الص AVRبفارق واضصصح ،حيصث تتميصصز ممتحككمصات البيصصك باسصصتهلك منخفصصض للطاقصصة )سصصواء علصصى مسصتوى فصصارق الجهصد أو التيصصار الكهربصي( .ومصصع ذلصك نجصد شصركة Atmelقصد
حسصصنت كصصثيراا بعصصض إدصصصدارات الصصص AVRبتقنيصصات اسصصتهلك منخفضصصة للطاقصصة مثصصل Pico Power Saveلكن ستظل ممتحككمات البيك أفضل من الص AVRفي هذا الجانب.
رابعاا :البرمجة والدعم المجتمعي شصصصركة ATmelمنصصصذ بدايصصصة تصصصصنيع الصصصص AVRقصصصد اعتمصصصدت علصصصى مترجمصصصات compilersمفتوحصصصة المصصصدر وتصصدعم الصصص ANSI – Cمباشصصرة مثصصل AVR-GCCالمجصصاني ممصصا تسصصبب فصصي جعلهصصا الخيصصار المفضصصصل لصصصدى الهصصصواة والمحصصصترفين )وهصصصو نفصصصس السصصصبب الصصصذي جعصصصل مصصصصممي لوحصصصات آردوينصصصو
يختارون شرائح الص AVRبدلا من الص PICلصناعة آردوينو(.
18
حول الكتاب – اﻹصدار 1.0 … .............................................................................................. أمصصا شصصركة Microchipفقصصد اتخصصذت مسصصاراا ممختكلصصف ،حيصصث نجصصد أن برنامصصج MPLABيخصصالف الصصص ANSI – Cخادصة عند كتابة برامج لعائلت مثل PIC16Fمما يجعل تعديل الكواد المكتوبة بهصصا لستخدامها مرة أخرى أو نقلها لمتحكمات أخرى عملية دصعبة. هنا مجصدداا يتفصوق الصص ،AVRكمصا أنصه هنصاك دليصل واضصح أيضصاا علصى التفصوق القصوي وهصو مصدى كصبر حجم "مجتمع" الهواة والمطورين والمواقع اللكترونيصة الجنبيصة الصتي تصدعم الصص AVRوالصتي لصن
تجد مثلها في حالة الص .PIC
خامساا :السعر مقارنة بالمميزات المدمجة في السواق المحلية تعتبر ممتحككمات الص AVRوال PICمتقاربة جصصداا فصصي السصصعر لنفصصس العصصائلت
)عائلننننة الممتحككمننننات :هصصصصي مجموعصصصصة مصصصصن الممتحككمصصصصات الدقيقصصصصة الصصصصتي تشصصصصترك فصصصصي خصصصصصائص وإمكانيصصات مشصصتركة مثصصل سصصعة الصصذاكرة أو الحجصصم أو الطاقصصة المسصصتهلكة ..الصصخ( فمثلا نجصصد فصصي
السوق المصري أن سعر الص ATmega16مساوي تقريباا للص 25) PIC16F877aجنية مصري وقت كتابة هذه السطور وهو ما يساوي 3.5دولر(
لكننن نجصصد أن ATmega16يصصوفر قصصدرات ممضصصاعفة مقارنصصة بسصصعر Pic16Fمنهصصا مثلا :التميجصصا
أسصصرع 4مصصرات مصصن البيصصك +تصصوفير نحصصو 3أضصصعاف عصصدد مخصصارج الصصص PWMونحصصو ضصصعف معصصدل سصصحب التيصصار لكصصل طصصرف مصصن أطصصراف الممتحككصصم كمصصا أن الصصذاكرة فصصي الصصص ATmega16تسصصاوي مصصرة ونصف حجم الذاكرة في الص .PIC16F877
يجب التنوية أن هذه السعار هي أسعار محلية وقد تختلف من دولة لخرى أو عند الشراء بكميات كبيرة
نستنتج من ذلك أنه في حالة الرغبة بتطوير نظام سريع الستجابة أو يقوم بعمليات
حسابية معقدة وبسعر مناسب فإن الص AVRهو الخيار المثل لغلب النظمة المدمجة المعتمدة على الممتحككمات 8بت الرخيصة
19
حول الكتاب – اﻹصدار 1.0 … ..............................................................................................
سادساا :التوافر الكمي في اﻷسواق هنصصا نجصصد أن شصصركة ) MicroChipالمصصصنعة للصصص (PICتتفصصوق علصصى ATmelفكل السصصوقين المحلصصي والعالمي نجد أن منتجات Microchipمتوفرة ويسهل الودصول إليها مقارنة بالص . AVR هصصذه هصصي أهصصم السصصصباب الصصصتي قصصد تجعلصصك تفضصصصل الصصص AVRعصصن البيصصك وقصصد تحسصصم الصصصراع بيصصن
الممتحككمات الص 8بصت ،لكصن مجصدد اا تصذكر أنصه فصصي بعصض الحصالت يكصون عليصك اختيصار ممتحككصم لنصصه النسب والفضل سعراا.
وتستمر الحرب مع مقارنات إضافية إذا أحببصصت أن تقصصرأ المزيصصد عصصن حصصرب المقارنصصات بيصصن الصصص AVRوالصصص PICفعليصصك بهصصذه المقارنصصات الرائعة والتي ستوضح جوانب إضافية من هذه المقارنات ➢ www.kanda.com/pic-vs-avr.php ➢ www.youtube.com/watch?v=DBftApUQ8QI ➢ arstechnica.com/civis/viewtopic.php?f=11&t=409115 ➢ stackoverflow.com/questions/140049/avr-or-pic-to-start-programmingmicrocontroller
20
الفصل اللول ” هؤلاء الذين يمتللكون الجنون الكافي ليؤمنوا أن
بإمكانهم تغيير العالم ،هم من يغيرونه بالفعل ‟
ستيف جوبز – شر يك مؤسس لشركة Apple
.1ممدقدمة عن الظنظمة الممدمجة … ..............................................................................................
.1ممدقدمة عن الظنظمة الممدمجة
✔ معنى النظام المدمج
✔ مكونات النظمة المدمجة ✔ مراحل تطوير المنتجات اللكترونية المعتمدة على النظمة المدمجة ✔ كيفية اختيار الممتحككم الدقيق المناسب
22
.1ممدقدمة عن الظنظمة الممدمجة … ..............................................................................................
1.1معنى النظام المدمج
Embedded System
النظصام المدمصج أو كمصصا يسصصمى فصصي بعصصض الحيصصان "النظصصام الممضصمن" هصو أي نظصصام حاسصصوبي دصصصغير
الحجم يقوم بمجموعة من الوظائف التي تخدم أداة أو منتج معيصن ،وغالبصاا ل تبصاع هصذه النظمصة
المدمجصصة للنصصاس مباشصصرة ولكنهصصا تكصصون "مدمجصصة "Embeddedمصصع منتصصج معيصصن ،فمثلا عنصصد شصصراء
سيارة حديثة أو فرن ميكروويف أو غسالة كهربائية أو حتى مكيف هواء فإن ك س تجد أن جمي ع هذه المنتجات أدصبحت تحتوي على حواسيب دصصغيرة تقدم وظصائف تحك م ذكي ة ممصا يجعصل كصل
المنتجات السابقة تحتوي على نظم مدمجة. تستخدم النظمة المدمجة في مجموعة واسعة جداا من التطبيقات ،أشهرها: •
التحكنننم اللننني مثصصصصل النظمصصصصة المدمجصصصصة الموجصصصصصصصصصود فصصصصصصصصصي المصصصصصصصصصصانع ،الطصصصصصصصصصائرات،
الصواريخ والقمصصار الصصصناعية وأي ماكينصصة تعمل بصصصورة تلقائيصصة )أوتوماتيكيصة( هصذه
النظمة جميعها ت م صمم لغرض واحصصد فقصصط وهو التحكم في منتج معين. •
المنتجات الخدمية مثصصل المنتجصصات الصصتي عصصصصصادة نشصصصصصتريها لنفسصصصصصنا فصصصصصي المنصصصصصزل أو المكتصصصصصصصصصصصب مثصصصصصصصصصصصل مكيصصصصصصصصصصصف الهصصصصصصصصصصصواء أو
الميكروويصصصصف الصصصصذي يحتصصصصوي علصصصصى نظصصصصام تحكم إلكتروني في الحرارة. •
المنتجننات الترفيهيننة مثصصل منصصصات اللعصصاب Xbox, Gameboy, Wiiوكصصذلك المنتجصصات التي أدصبحت تحمل ودصف " ذكية" مثل الهواتف الذكية ،السصصاعات الذكيصصة وحصصتى أنظمصصة التلفاز الحديثة جميعها تعتبر أنظمه مدمجة.
23
.1ممدقدمة عن الظنظمة الممدمجة … .............................................................................................. أنظمة التصالت الحديثة والتي لها نصيب كبير مصصن هصذا المجصصال خادصصصة بعصصد ظهصصور
•
تقنيصصات التصصصال اللسصصلكي مثصصل Bluetoothوالصصص Wifiحيصصث تحصصولت الجيصصال القديمصصة مصصن أنظمصصة التصصصالت الصصتي كصصانت تعتمصصد علصصى الصصص Analog Electronicsإلصصى تقنيصصات المعالجصصصة الرقميصصصة المعتمصصصدة علصصصى النظمصصصة المدمجصصصة فمثلا جميصصصع أجهصصصزة الموجهصصصات
Routersالصصصتي تصصصوفر لنصصصا النصصصترنت مصصصا هصصصي إل Embedded Linux Systemsوكصصصذلك
أنظمصصة الراديصصو القابلصصة للبرمجصصة SDRوشصصبكات المحمصصول هصصي أيضصصاا نصصوع مصصن النظمصصة
المدمجة عالية الداء.
1.2مكونات النظام المدمج
عادة تتكون النظم المدمجة من 3مكونات رئيسية •
الممتحككم الدقيق MicroControllerوالذي يعتبر العقل الممتحككم في النظام.
•
أدوات الدخننننال Input devicesمثصصصصل الحساسصصصصات المختلفصصصصة ،أزار الضصصصصغط أو أي
•
أدوات إخنننراج Output devicesوالصصصتي متسصصصمى فصصصي بعصصصض الحصصصالت Actuators
وسيلة إدخال معلومات للممتحككم.
وتعتصصبر كصصل مصصا يتحكصصم بصصه الصصص Microcontrollerمثصصل الممحركصصات ،Motorsالشاشصصات
،LCDسماعات دصوتية … الخ.
يتم اختصار أدوات الدخال والخراج بكلمة I/Oوهي اختصار )(Input/Output Devices
24
.1ممدقدمة عن الظنظمة الممدمجة … ..............................................................................................
1.3مراحل تطوير الأنظمة المدمجة
قبصصصل أن نبصصصدأ تعلصصصم دصصصصناعة النظمصصصة المدمجصصصة علينصصصا أن نفهصصصم الخطصصصوات الصصصتي تسصصصاعدك علصصصى
التخطيصصط لمشصصروع ناجصصح وفعصصال ،فمثلا إذا جاءتصصك فكصصرة لجهصصاز رائصصع ،كيصصف تنفصصذها؟ مصصا هصصي الدوات التي ستستخدمها؟ ما هي مراحل تطوير المشروع لتصل إلى منتج نهائي؟.. الصصصورة التاليصصة توضصصح الخطصصوات الصصتي يتبعهصصا مصصصممو النظمصصة المدمجصصة فصصي تطصصوير أي منتصصج بدايصصة مصصن الفكصصرة حصصتى دصصصناعة المنتصصج بصصصورة تجاريصصة ،كمصصا نصصرى هنصصاك مسصصاران أساسصصيان وهمصصا تصميم الص softwareوتصميم الص .Hardware
تطوير الكود وتوليد ملف الـ Hex 0
تصحيح اﻷخطاء واضافة وظائف جديدة
تصميم البرمجيات Software Design
اختبار الكود فكرة
تجميع البرمجيات والعتاد في نموذج اختبار أولي Prototype +اختبار شامل للنظام
تحديد اﻷهداف والوظائف
لوحة تجارب تصميم العتاد Hardware Design
صناعة المنتج بصورة تجارية
تصميم اللوحة المطبوعة PCB Design
Test Kit
ا :مراحل تطوير برامج الممتحككامات الدقيقة أول ا مثصصل جميصصع أنظمصصة الحواسصصيب فصصي العصصالم نجصصد أن الممتحككمصصات الدقيقصصة ل يمكنهصصا أن تعمصصل دون برنامصصج يكتصصب بصصداخلها وهصصذا البرنامصصج يجصصب أن يكتصصب بالصصصيغة الثنائيصصة الرقميصصة Binaryفقصصط الصصصفر والواحصصد ،هصصذه الصصصيغة غيصصر مناسصصبة للفهصصم بالنسصصبة للبشصصر ويصصصعب تفسصصيرها .لصصذا تقصصوم الشصصصركات المصصصصنعة للمعالجصصصات والممتحككمصصصات الدقيقصصصة بصصصصناعة بعصصصض الدوات البرمجيصصصة الصصصتي متسهل على المطورين أن يصنعوا برامج بلغات مفهومة وقابلة للقراءة. في البداية كانت الشركات تصمم برمجيات التجميع Assemblersالتي تصصوفر للمطصصور مجموعصصة من الوامر تسمى بأوامر التجميع . Assembly Instructions
25
.1ممدقدمة عن الظنظمة الممدمجة … .............................................................................................. والصصتي كصصانت أوامصصر قصصصيرة وسصصهلة نسصصبياا مثصصل ) ADDاجمصصع رقميصصن( أو ) SUBاطصصرح رقميصصن( ,ولكن كان هناك عيصصوب كصثيرة لكتابصصة البرامصصج بهصذه اللغصصة مثصل الحجصصم والصوقت ،حصتى أن بعصض البرامج كانت تصل إلى عشرات اللف من السطور .وكان هناك مثل شهير يقول "كتابة برنامج معقد بلغة اﻷسمبلي موازي لحفر أساسات ناطحة سحاب باستخدام ملعقة". ظل المر هكصصذا فصصترة مصصن الزمصصن حصتى ظهصصرت اللغصصات عاليصة المسصصتوى High level language مثل لغة السي .وهي لغات متسهل كتابة الكود البرمجي وتحويله إلى لغة اللة تلقائياا عن طريق المترجمات Compilersوبذلك أدصبحت عملية تطوير الكود أسهل بكثير. باستخدام لغة السي يمكننا تطوير برامج الممتحككمات الدقيقة كالتالي: .1كتابة البرنامج بلغة السي :في هذه المرحلة نستخدم لغة السي للتعصصبير عصصن الوظصصائف التي نريد تنفيذها من الممتحككم الدقيق .2توليد ملف الن : Hexملف الهيكس هو الملف الذي يحتوي على البرنامج الحقيقي الذي سيخزن داخل ذاكرة الممتحككم ويتم توليده تلقائياا من تحويل الكود المكتوب بلغة السي إلى الوامر البرمجية بصيغة الص hexعن طريق الص ) toolchainسصصنتحدث عنهصصا بالتفصصصيل في الفصل التالي(.
26
.1ممدقدمة عن الظنظمة الممدمجة … .............................................................................................. .3رفع البرنامج من الحاسوب إلى ذاكرة الممتحككم :هصصذه المرحلصصة الصصتي يتصصم كتابصصة )أو كمصصا يسميها البعض بعملية حرق (burnالبيانات الرقمية داخل ذاكرة الممتحككم ليبدأ بتنفيذها حيصصصث يقصصصوم برنامصصصج الرفصصصع uploaderبقصصصراءة ملصصصف الهيكصصصس وتحويصصصل القيصصصم المسصصصجلة بداخله إلى بيانصصات ثنائيصة binaryثصصم يقصصوم بكتابتهصا داخصصل العنصوانين المخصصصة لهصا فصي ذاكرة الممتحككم.
.4اختبار البرنامج واكتشاف اﻷخطاء :في هذه المرحلة يتم تشغيل الممتحككم الصصدقيق علصصى لوحصصة التجصصارب أو علصصى Test Kitللتأكصصد مصصن أن البرنامصصج ينفصصذ المطلصصوب أو لكتشصصاف أي أخطصصاء ،وقصصد يتصصم تكصصرار هصصذا المصصر عشصصرات المصصرات حصصتى نصصصل إلصصى برنامصصج يصصؤدي جميصصع الوظائف المطلوبة منه بأقل نسبة خطأ.
للقيام بكل ما سبق سنحتاج لمجموعة من اﻷدوات البرمجية والمكونات اللكترونية وهو ما سيتم شرحه بالتفصيل في الفصل التالي.
27
.1ممدقدمة عن الظنظمة الممدمجة … ..............................................................................................
ثانياا :مراحل تطوير العتاد لتطوير أي مشروع سنحتاج أن نودصصل الممتحككصم الصدقيق بالمكونصات اللكترونيصة الصتي س يتحكم بهصصا وهصصو مصصا يعصصرف بمفهصصوم الصصص ) Devices Interfacingمواجهصصة الجهصصزة المختلفصصة( فصصالمتحكم الصصدقيق ل يعمصصل بمفصصرده وإنمصصا يحتصصاج أجهصصزة أخصصرى ليسصصتقبل منهصصا قصصراءات )مثصصل الحساسصصات (Sensorsأو ليتحكم بها مثل الشاشات والمحركات. هناك طريقتين أساسيتين لعمصصل ذلصصك وهمصا ،اسصصتخدام اللوحصات التطويريصة Development Kit أو استخدام لوحة التجارب ،Breadboardكل طريقة لها مميزات وعيوب. الن Development Kit
هي لوحة اختبار مكونة من الممتح ككم الدقيق +مجموعة كبيرة من العنادصصصر اللكترونيصصة المتصصصلة بصصصه بصصصصورة جصصصاهزة للتشصصصغيل مثصصصل شاشصصصة ،LCDلوحصصصة مفاتيصصصح ،أزرار تحكصصصم ،حساسصصصات حراريصصصة وضوئية ،ريلي Relayوبعض أدوات التصال الرقمية مثل ممحول RS232وقد يوجصد بهصصا أكصصثر أو
28
.1ممدقدمة عن الظنظمة الممدمجة … .............................................................................................. أقل من ذلك .هذه اللوحات متسصهل عمليصة التطصوير بصصورة كصبيرة فهصي تحتصوي علصى معظصم مصا قصد تحتصصاجه علصصى لوحصصة واحصصدة جصصاهزة ومتصصصلة ببعضصصها البعصصض وبالتصصالي لصصن تحتصصاج لشصصراء مكونصصات أخرى أو تودصيل عنادصر إضافية وستوفر عليك وقت بناء الدوائر اللكترونية. الصور التالية هي لمجموعة مختلفة من للن Development kits
29
.1ممدقدمة عن الظنظمة الممدمجة … .............................................................................................. مرفق مع الكتاب مجلد يحتوي على تصميمات لمجموعة لوحات تطويرية مفتوحة المصدر
مخصصة للص AVRأغلبها مصمم للممتحككم الدقيق ATmega32/ATmega16و يمكنك دصناعتها بنفسك بتكلفة أقل من شرائها. لوحة التجارب Breadboard الطريقة الثانية هصصي اسصصتخدام لوحصصة التجصصارب البلسصصتيكية والصصتي تسصصاعدك علصصى بنصصاء أي دائصصرة إلكترونية باستخدام السلك ،تتميز هذه اللوحة بأنه يمكنك بناء أي دائرة قد تخطصصر علصصى بالصصك فمن السصهل أن تفصصك وتركصصب أي عنصصر أو شصريحة إلكترونيصة )مصصن نصوع (DIPعلصصى هصذه اللوحصة، سصصيتم اسصصتخدام هصصذه الطريقصصة فصصي الكتصصاب لنهصصا الخيصصار الرخصصص والكصصثر تصصوافراا فصصي كصصل البلد العربية.
30
.1ممدقدمة عن الظنظمة الممدمجة … ..............................................................................................
معلومة إضافية :الشرائح اللكترونية الص ) DIP (Dual in-line Packageهي التي تمتلك دصفين من الرجل المعدنية والتي يمكن تودصيلها بثقوب على لوحة التجارب أو الص PCBأما SMD وهي اختصار لكلمة Surface Mount Deviceهي الشرائح دصغيرة الحجم و تمتلك أرجل معدنية دصغيرة جداا ويتم لحامها على سطح الص PCBفقط
)ATmega32 (DIP
ATmega32 (SMD
دصور مختلفة لنواع تغليف ممتحككمات AVRبجميع أنواع وأحجام الص DIPوالص SMD
31
الفصل الثاني علملا ا ”نحن ننتاج ما نفعله بتكرار ،الجودة إذا ا ليست ع بل هي ممتنتج العادات الجيدة ‟
أرسطو – فيلسوف يوناني
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
.2ظنظرة عامة على ممتحككمات AVR
✔ تركيب الممتحككم الدقيق ✔ مميزات معمارية AVR
✔ كيف تختار الممتحككم المناسب من عائلت AVRالمختلفة ✔ مقدمة عن قراءة دليل البيانات Datasheet ✔ نظرة عامة على الممتحككم ATmega16 ✔ نظرة عامة على الممتحككم ATTiny84
33
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.1تركيب الممتحكك م الدقيق ومعمار ية
AVR
الممتحككم الدقيق هو حاسوب متكامل على شريحة واحدة Computer On Chipميسصصتخلدم فصصي التحكم بمجموعة من الجهزة الخرى .ومثصصل جميصصع الحواسصصيب يحتصصوي الممتحككصصم الصصدقيق علصصى نفس مكونات الداخلية للحاسب اللي ولكن بقدرات مختلفة من حيصصث الكصصم والقصصوة.
الصصصورة
التالية تمثل التركيب الداخلي للص AVR
الممعالج Micro-processorقلب الممتحككم الدقيق ويتكون من وحدة الحساب والمنطق ALU المسصصؤولة عصصن جميصصع العمليصصات الحسصصابية والمنطقيصصة مصصع وحصصدات قصصراءة الوامصصر مصصن الصصذاكرة+
جلت العامصصصة والخادصصصصة Registerوالصصصتي سصصصنتعرف عليهصصصا فصصصي الفصصصصول مجموعصصصة مصصصن الممسصصص ك القادمصصة .يتصصم التحكصصم فصصي سصصرعة المعالصصج مصصن خلل دائصصرة المذبصصذب Oscillatorحيصصث تسصصاوى
سرعة المعالج عدد النبضات الناتجة من دائرة المذبذب )التردد(.
34
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. الننذاكرة ثابتننة وتنقسصصم إلصصى نصصوعين ،الول :ميسصصتخلدم فصصي تخزيصصن البرامصصج وتسصصمى بصصالفلش Flash Memoryوهي تماثل الهارديسك Hard-diskف ي الحاسصب الشخصصي ويحصب البعصض أن
يسصصميها .Program memoryأمصصا النصصوع الثصصاني فتسصصمى الصصص EEPROMوهصصي ذاكصصرة مخصصصصة لتخزيصصصن القيصصصم الصصصصغيرة والهامصصصة مثصصصل بعصصصض الثصصصوابت أو المتغيصصصرات الصصصتي تصصصؤثر فصصصي برنامصصصج
الممتحككم ويجب أن تحفظ من الضياع.
الننننذاكرة مؤقتننننة SRAMوهصصصصي اختصصصصصار لصصصصص ،Static RAMوهصصصصي تماثصصصصل الصصصصذاكرة العشصصصصوائية الموجودة في الحواسيب الشخصية التي نستخدمها. جلت Registersوهصصي أحصصد دصصصور الصصذاكرة وتماثصصل الصصذاكرة المؤقتصصة مصصن حيصصث الصصتركيب الممسنن ك
وطريقصصة العمصصل ولكنهصصا تسصصتخدم فصصي التحكصصم بجميصصع إعصصدادات ووظصصائف الممتحككصصم الصصدقيق كمصصا
سنرى في الفصول القادمة تبعاا.
الوحنندات الطرفيننة ) peripheral units (setsوهصصي مجموعصصة مصصن الوحصصدات الصصتي تسصصاعد
الممتح ككصصم الصصدقيق فصصي أداء وظيفتصصه الساسصصية )وهصصي التحكصصم بصصأجهزة أخصصرى( مصصن أمثصصال هصصذه الوحدات ،المنافذ العامة ،PORTSالمحول التناظري الرقمصصي ،ADCالمؤقتصصات ،Timersوحصصدات
التصصصصال ومعالجصصصة البيانصصصات التسلسصصصلية مثصصصل USART, SPI, i2Cو بعصصصض ممتحككمصصصات AVRقصصصد تحتوي على أنظمة للتشفير مدمجة بداخلها .. CryptoAuthenticationالخ.
ما الفرق بين الذاكرة العشوائية )المؤقتة( داخل الحواسيب الشخصية والممتحككمات الدقيقة ولماذا تسمى Staticوليس Dynamic؟
الفارق الساسي هو العنصر الذي تصنع منه الذاكرة ،حيث تتميز ذاكرة الممتحككمات بأنها تصنع من الص Flip-Flopالذي يتميز بالقدرة على الحتفاظ بالبيانات بأقل تيار كهربي ممكن وبالتالي فهو الخيار الفضل من ناحية الستهلك للطاقة كما أن البيانات الموجودة عليه ل تحتاج لعملية تجديد Refreshingمثل الذاكرة " ”dynamic RAMالموجودة في الحواسيب
التقليدية والتي تصنع من المكثفات الطفيلية Parasitic Capacitorsوالتي تحتاج دائماا
لعملية تجديد Refreshingوإل تضيع البيانات المخزنة بداخلها مع مرور الوقت )أكثر من 10 مللي ثانية كفيلة باختفاء البيانات من (DRAMكما أنها تستهلك الكثير من الطاقة بسبب هذه العملية.
35
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. ما الفارق بين الن Flashوالن EEPROMبالرغم أن كلهما تقنياا يعتبر EEPROM؟ الص EEPROMهي اختصار لعبارة Electrical Erasable Programmable Read Only Memroyوالتي تعني الذاكرة التي تستخدم للقراءة فقط ويتم برمجتها كهربياا.
الممتحككمات الدقيقة غالباا ما تحتوي على نوعين من الص EEPROMالولى تسمى الص Flashلنها سريعة جداا في كتابة البيانات وقد تصل سرعة الكتابة عليها إلى واحد MegaBit/Sفمثلا قد تكتب 1بايت بداخل الفلش في زمن 1ميكروثانية فقط .بينما الص EEPROMالتقليدية
بطيئة للغاية مقارنة بالفلش حيث أن كتابة 1بايت بداخلها قد يستغرق 1مللي ثانية )يعني أبطأ بنحو 1000مرة من الص .(Flash
2.2مميزات معمار ية الـ
AVR
يقصصصد بكلمصصة معماريصصة Architectureطريقصصة تودصصصيل المكونصصات الداخليصصة للممتحككصصم مصصع بعضصصها
البعض ومدى حجم البيانصصات الصتي تسصتطيع هصذه المكونصات أن تعالجهصصا .فمثلا جميصصع ممتحككمصات
AVRيوجصصد بهصصا المكونصصات السصصابق ذكرهصصا وبينهصصا العديصصد مصصن الشصصياء المشصصتركة .لكصصن سصصنجد أنصصه هناك اختلفات رئيسية بين العديد من ممتحككمات الص AVR
بعض الخصائص المشتركة بين جميع ممتحككمات AVR •
معمارية Harvardهذه المعمارية الحديثة نسصبياا تعنصي أن المعالصصج المركصزي يسصتطيع أن يتوادصصصصصل مصصصصع الصصصصذاكرة RAMو الصصصصص ROMفصصصصي نفصصصصس الصصصصوقت حيصصصصث نجصصصصد أن جميصصصصع
ممتحككمصصصات الصصصص AVRتسصصصتطيع أن تكتصصصب فصصصي الصصصص RAMوتقصصصرأ مصصصن الصصصص ROMفصصصي نفصصصس اللحظصة .علصصى عكصصس المعماريصات القديمصصة مثصصل Von Neumannوالصتي تسصصمح للمعالصصج أن يقوم بعمل شيء واحد فقط )إما القراءة أو الكتابة في نفس اللحظة(.
•
Single Cycle Executionمعظصصصم ممتحككمصصصات AVRتمتلصصصك القصصصدرة علصصصى تنفيصصصذ أوامصصصر
برمجيصصة = سصصرعة المعالصصج فمثلا إذا كصصان تصصردد المعالصصج = 16ميجصصا ) 16مليصصون نبضصصة(
فهصصذا يعنصصي أن الممتحككصصم يسصصتطيع أن ينفصصذ 16مليصصون أمصصر فصصي الثانيصصة الواحصصدة .ويرجصصع
36
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. الفضل إلى وجود نسختين من أنظمة قراءة الذاكرة وفك تشفير الوامر 2x program counter + 2x instruction decoderوكل النسختين تعملن معاا في نفس الوقت مما
يضاعف سرعة وعدد الوامر التي يتم نسخها من الذاكرة. •
Self programming memoryوتعتصصصبر أحصصصد مميصصصزات الصصصص AVRالرائعصصصة والصصصتي تعنصصصي إمكانيصصة اسصصتخدام الصصصذاكرة الفلش لتخزيصصن المتغيصصرات أثنصصاء تشصصغيل الممتحككصصم )كأنهصصا
تقوم بوظيفصة الصصص EEPROMالتقليديصصة( حيصث يمكصصن اسصصتخدام بعصصض الوامصصر البرمجيصة
لتغير محتوى الص Flash memoryأثناء تشغيل الممتحككم وبصدون اسصصتخدام أي مبرمجصصة خارجيصصصة ) .Programmer (burnerيمكنصصصك معرفصصصة كافصصصة التفادصصصصيل مصصصن الملصصصف الصصصذي
أدصصصصدرته شصصصركة ATmelويشصصصرح جميصصصع الوامصصصر البرمجيصصصة لهصصصذه الميصصصزة الرائعصصصة )بلغصصصة
السي(http://www.ATmel.com/Images/doc2575.pdf .
تختلف الممتحككمات فيمنا بينهنا علنى حسنب النن peripheral unitsالموجنودة بنداخلها وتقني ة معالجة البيانات سواء كانت 8أو 16أو 32بت.
ما معني 8بت أو 32بت؟
يعبر هذا الرقم عن حجصصم البيانصصات الصصذي يسصصتطيع المعالصصج المركصصز CPUداخصصل الممتحككصصم الصصدقيق أن يتعامل معه في النبضة الواحدة.
فمثل إذا كصصان الممتحككصصم مصصن نصصوع 8بصصت فصصإنه يسصصتطيع أن يجمصصع رقميصصن 8بصصت مصصع بعضصصهم فصصي
نبضة الواحدة .لكن إذا جعلت المعالج يجمع رقمين بطول 16بت فإنه سيضصصطر أن يتعامصصل مصصع
الرقام على أكثر من مرة بحيث يجزأ الرقام إلى مجموعات 8بت فقط .أما الممتحككمات الص 32 بصصت تعنصصي أن المعالصصج يمتلصصك القصصدرة علصصى القيصصام بجميصصع العمليصصات الحسصصابية والمنطقيصصة علصصى
بيانات بطول 32بت في النبضة الواحدة.
37
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.3كيف تختار بين عائلات الـ AVRالمختلفة
تعتصبر مهصارة اختيصار الممتحككصم المناسصب مصن أهصم مصا يجصب أن يتعلمصه أي مهنصدس نظصم مدمجصة.
حيث أن الشركات المنتجة للمتحكمات الدقيقة عصادة مصصا تصصنع المئصصات مصن الممتحككمصات الدقيقصة وتقسصصصمها إلصصى عصصصائلت تختلصصصف فيمصصصا بينهصصصا علصصصى حسصصب السصصصعر والمكانيصصصات لكصصصل ممتحككصصصم .لصصذا
سيتوجب عليك أن تتقن إختيار الممتحككم المناسب لداء أفضل تصميم بأقل سعر ممكن. تعتبر أهم العوامل المؤثرة في تصنيف الممتحككمات الدقيقة هي: سرعة معالجة
عدد أطراف
عدد وإمكانيات
مساحة الذاكرة المجال أو البيئة
البيانات
التحكم العامة
الن Peripheral
التي سيعمل بها
والستجابة
GPIOوالتي
Devices
المطلوبة
تمثل عدد
المتوفرة
المداخل
للممتحككم
والمخارج
المطلوبة والتي ستحدد حجم
الممتحككم مثل
البرنامج الذي
درجة الحرارة و
الممتحككم
الطاقة
سيوضع على
معدل استهلك
علصصى حسصصب العوامصصل الخمسصصة السصصابقة سصصنجد أن شصصركة ATmelقسصصمت ممتحككمصصات AVRإلصصى 6
عائلت أساسية منها أربعة عائلت عامصة General purpose microcontrollersممصا يعنصي أنصه يمكصصصصن اسصصصصتخدامها لجميصصصصع مجصصصصالت النظصصصصم المدمجصصصصة ومختلصصصصف المنتجصصصصات .وهنصصصصاك عصصصصائلتين
مصممتين لمنتجات محددة فقط:
العائلت العامة General purpose microcontrollers megaAVR – 8 bit ATTiny – 8 bit AVR Xmega – 8 & 16 bit AVR - 32 bit
38
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. العائلت الممتخصصة Special purpose microcontrollers Automotive AVRهذه العائلة ممصممة للنظمة المدمجة الخادصصصة بالسصصيارات لصذا فهصصي تتميصصز بتحمصصل الظصصروف القاسصصية مثصصل درجصصات الحصصرارة المرتفعصصة )يمكنهصصا العمصصل فصصي بيئصصة تصصصل درجصصة حرارتهصصصا إلصصصى 150درجصصصة مئويصصصة( ،كمصصصا تحتصصصوي علصصصى نظصصصم تشصصصفير خادصصصصة لحمايصصصة المعلومصصصات المخزنصصة بصصداخلها وكصصذلك تحتصصوي علصصى أنظمصصة حمايصصة مصصن مشصصاكل التيصصار الكهربصصي وفصصرق الجهصصد )مثل حدوث قصر في الدائرة (short circuit Battery Managementعائلصصصة الممتحككمصصصات الخادصصصصة بصصصإدارة وتشصصصغيل البطاريصصصات ،ومصصصصممة
لتدير عملية الشحن والتفريغ المن للبطاريات
سيرتكز الكتاب على شرح العائلة الولى والثانية mega, ATTinyباعتبارهم أشهر العائلت وأكثرها توافراا على مستوى العالم
الصورة التالية توضح ترتيصصب القصصوة والمميصصزات الصصتي تحتويهصا كصصل عائلصة ،حيصث نجصد أن الخصط الفقصصي يعصصبر عصصن قصصوة الداة Performanceوالخطصصأ الرئسصصي يعصصبر عصصن مصصدى انخفصصاض اسصصتهلك
الطاقة.
39
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. عند الضغط على أي من أسماء العائلت بالعلى ستنتقل إلى دصفحة على موقصصع Atmelتوضصصح
جميصصع أفصصراد هصصذه العائلصصة مصصن الممتحككمصصات مصصع عصصرض سصصريع لخصصصائص كصصل ممتحككصصم مثصصل حجصصم
الذاكرة وعدد أطراف الممتحككصم .ه ذه الصصفحة تقصدم مقارنصة سصريعة بيصن الممتحككمصات لتسصاعدك
على اختيار الممتحككم النسب لمشروعك.
عند الضغط علصى اسصم أي مصن الممتحككمصات مثصل ATmega16س يتم نقلصك إلصى دصصفحة الممتحككصم
والتي تحتوي علصى جميصع البيانصات المتعلق ة به ذا الممتحككصم بمصا فصي ذلصك أهصم ملصف وهصو "دلينل
البيانننات "Datasheetوالصصذي يتصصوفر منصصه نسصصختين" summery ،مختصصصر سصصريع" أو الصصدليل
الكامل .complete
في هذا الكتاب دائما سنستخدم الدليل الكامل من أي .Datasheetلذا قم بتحميل كل من الدليل الخاص بالمتحكم ATmega16و ATtiny84
مصصصن خلل الصصصصفحات السصصصابقة وملفصصصات الصصصص Datasheetيمكنصصصك تحديصصصد الممتحككصصصم الصصصدقيق الصصصذي يمتلصصك المكانيصصات المناسصصبة للمشصصروع الصصذي تريصصده .بالتأكيصصد اختيصصار الممتحككصصم يجصصب أن يكصصون
مقترن بخبرتك في مجال البرمجة وتحسين الكواد المكتوبة للستفادة القصوى من الممتحككصم.
لصصصذا سصصصنجد أن مهصصصارة اختيصصصار الممتحككصصصم المناسصصصب سصصصتزداد عنصصصدما تتقصصصن برمجصصصة هصصذا النصصصوع مصصصن
الممتحككمات.
40
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.4قراءة دليل البيانات
Datasheet
تسصصاعدك الصصص Datasheetعلصصى فهصصم الممتحككصصم الصصدقيق بصصصورة مفصصصلة فهصصي تحتصصوي علصصى طريقصصة
تشصصصصغيله وبرمجتصصصصه ،وتحتصصصصوي أيضصصصصاا علصصصصى جميصصصصع البيانصصصصات التقنيصصصصة المتعلقصصصصة بصصصصالمتحكم مثصصصصل:
جلت ،الطاقصصصة ،تقنيصصصات البرمجصصصة ،كيفيصصصة تفعيصصصل التصصصصميم الصصصداخلي ،وظصصصائف الطصصصراف ،الممسصصص ك
القدرات التي يملكها الممتحككم أو إلغائها … الخ .وتعتبر المرجع الشامل لي ممتحككم.
سصصنتناول الموضصصوعات المختلفصصة فصصي دليصصل البيانصصات علصصى مصصدار فصصصول الكتصصاب بالكامصصل ،حيصصث
سنتعلم في كل فصل أحد الخصائص التي تتمتصع بهصصا ممتحككمصصات AVRوسنحصصصل علصى تفادصصيل
هذه الخصائص من دليل البيانات.
هصصصذا الفصصصصل سصصصيركز علصصصى الجصصصزء الول مصصصن دليصصصل البيانصصصات والصصصذي غالبصصصاا مصصصا يكصصصون أول 5أو 8
دصفحات ويحتوي على النظرة العامة للممتحككم.
الصفحة الولى من دليل بيانات ATmega16
41
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.5الخصائص العامة للممتحكك م
ATmega16/ATmega32
في الصفحة الولى من دليل البيانات نجد المعلومات المتعلقة بالخصائص العامة للممتحككم )مصصع
العلم أن هذه الخصصصائص تكصصون مشصتركة بيصصن معظصصم أفصصراد العائلصصة مصصن الممتحككمصصات وقصد تختلصصف
فيما بينها بفروقات بسيطة( وهي كالتالي:
المعمارية Advanced RISC (Harvard based) Architecture يوضصصح هصصذا الجصصزء الخصصصائص العامصصة لتقنيصصة معالجصصة البيانصصات وسصصرعة الممتحككصصم الصصدقيق حيصصث
نجد أن الممتحككم يتمتع بالقدرات التالية: •
عدد single cycle execution Instruction – 131والتي تعني أن الممتحككم يمكن برمجتصصه باسصصتخدام 131أمصصر بلغصصة السصصمبلي ومعظصصم هصصذه الوامصصر يتصصم تنفيصصذها فصصي
نبضة واحدة فقط. •
Mega Instruction Per Second (MIPS) 16وهي نفصصس الخادصصية السصصابقة والصصتي
تعنصصي أن الممتحككصصم يمكنصصه تنفيصصذ 16مليصصون أمصصر برمجصصي عنصصدما يتصصم تشصصغيله بصصتردد 16 ميجصصاهرتز ) هصصذا بسصصبب أن معظصصم الوامصصر البرمجيصصة يمكنصصه تنفيصصذها فصصي نبضصصة واحصصدة
فقط( .وتعبر هذه الخادصية عن أقصى سرعة معالجة للممتحككم الدقيق وتعتبر من أهصصم الخصائص التي تتمتع بها معالجات .AVR مثال :إذا كان لدينا برنامج مكون من 10أوامر بلغة السمبلي والمتحكم يعمل بسرعة 1 ميجاهرتز )مما يعني أن زمن كل نبضة = 1ميكروثانية( فهذا يعني أن البرنامج سيستغرق تنفيذه زمن 10نبضات وهو ما يساوي 10ميكروثانية فقط.
•
On-Chip 2 cycle multiplierفصصي الجيصصال القديمصصة مصصن المعالجصصات والممتحككمصصات الدقيقة كان يتم حسصاب عملي ة ضصرب الرقصام باسصتخدام الجمصع المتكصرر فمثل حادصصل
ضصصرب =10×12جمصصع رقصصم 12مصصع نفسصصه 10مصصرات ).....+12+12+12+12الصصخ(. وهذا يعني تنفيذ أمر "الجمع" 10مرات )بلغة السمبلي( وبالتالي تستغرق وقصصت =10
نبضصصات .أمصصا فصصي ممتحككصصم الصصص AVRنجصصد وحصصدة معالجصصة الضصصرب تقصصوم بتنفيصصذ أي عمليصصة ضرب في نبضتين فقط مما يسرع هذا النوع من العمليات الحسابية بصورة كبيرة.
42
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. الذاكرة عالية التحمل High endurance Memory يوضح هذا الجزء الخصائص التي تمتاز بهصصا الصصذاكرة الموجصصودة داخصصل ممتحككمصصات AVRبأنواعهصا المختلفة مثل الص Flashوالص RAMوالص EEPROMومن أهم هذه الخصائص التالي: •
16كيلننو بننايت مننن الننذاكرة الثابتننة Self-programmable Flash memoryوالصصتي
تسصصتخدم لحفصصظ البرنامصصج الصصذي سيشصصغل الممتحككصصم الصصدقيق وتتمتصصع بخادصصصية البرمجصصة الذاتية التي تحدثنا عنها سابقاا) .يمتلك ATmega32ذاكرة ثابتة 32كيلوبايت(.
•
512بايت ) 8 *512بت( من ذاكرة EEPROM
•
1كيلوبايت من الذاكرة المؤقتة )العشوائية( SRAM
•
إمكانية الكتابة)برمجة(\مسح محتوى ذاكرة الفلش نحو 10,000مرة
•
إمكانية الكتابة)برمجة(\مسح محتوى ذاكرة EEPROMنحو 100,000مرة.
•
الحتفاظ بالبيانات في كل من الن Flashوالن EEPROMلمنندة زمنينة تصننل إلننى 100
عننام كامننل عنصصد تشصصغيل الممتحككصصم فصصي درجصصة حصصرارة 25درجصصة مئويصصة أو 25عصصام عنصصد
تشغيل الممتحككم في درجة حرارة 80درجصصة مئويصصة وهصذا يعنصصي أن الممتحككصصم يسصصتطيع العمل والحتفاظ بالبيانات لفترة طويلة جداا.
•
إمكانية استخدام ) Bootloaderالتفادصيل مذكورة في فصل الفيوزات(.
•
True Read-While-Write Operationتعنصصي أن الممتحككصصم يسصصتطيع قصصراءة بيانصصات مصصصن الصصصص ROMبينمصصصا يقصصصوم بكتابصصصة بيانصصصات فصصصي الصصصص RAMفصصصي نفصصصس الصصصوقت علصصصى عكصصصس
الممتح ككمصصات القديمصصة والصصتي كصصانت تسصصتطيع أن تقصصوم باحصصدى هصصذه العمليصصات فقصصط فصصي نفس اللحظة. •
Programming locksطبقصصة مصصن الحمايصصة لمنصصع سصصرقة البيانصصات المخزنصصة علصصى ذاكصصرة
الممتحككم باستخدام الص ) Lockbitsالتفصيل مذكورة في فصل الفيوزات(.
43
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. الجصصزاء التاليصصة مصصن دليصصل البيانصصات مثصصل Jtag, Peripheral devices, Power consumption
سيتم شرحها في فصولها الخادصة.
Microcontroller packaging الحجصصصصم الحقيقصصصصي لشصصصريحة السصصصيليكون الصصصصتي
يتكصصون منهصصا الممتحككصصم الصصدقيق غالبصصاا مصصا يكصصون
دصصصصغير جصصصداا لدرجصصصة أنصصصه قصصصد يصصصصل إلصصصى حجصصصم
"رأس عصصصصصود ثقصصصصصاب" ممصصصصصا يجعصصصصصل اسصصصصصتخدامه مباشصصرة عمليصصة دصصصعبة ،لصصذا يتصصم تصصصميم هيكصصل
خصصصصصارجي أكصصصصصبر حجمصصصصصاا مصصصصصن مصصصصصادة الصصصصصص Epoxy
ويسصصصصصصمى الصصصصصصص ) Packagingالغلف( للممتحككصصصصصصم
دصورة توضح الممتحككم الدقيق من الداخل والذي ل يتخطى حجمه )في معظم
الحالت( أكثر من %10من حجم الغلف
الدقيق ,ويخصرج منصه بعصض الطصراف المعدني ة الصصصصصصصغيرة الصصصصصصتي تتصصصصصصصل بصصصصصصالمتحكم الصصصصصصدقيق
الحقيقي.
حجم شريحة السيليكون مقارنة بحجم إدصبع النسان
44
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. تتوفر الممتحككمات الدقيقة بكل النوعين من التغليف DIPو SMDو سنجد أن شركة أتمصصل عصصادة
مصصصا تقصصصوم بإدصصصصدار معظصصصم الممتحككمصصصات مصصصن عائلصصصة atmegaو attinyبكل النصصصوعين DIPو SMD فمثل سصصنجد فصصي الصصصفحة الثانيصصة مصصن دليصصل البيانصصات وحصصدات الصصص packageالخادصصصة بصصالمتحكم
ATmega16وهي
DIP SMD – TQFP
• •
ملحظة :الص SMDيتوفر منه أحجام وأشكال مختلفة مثل TQFP, BGA, QFN, MLF
عندما تقوم الشركات بصناعة منتج ما فإنها تفضل استخدام معظم الشرائح اللكترونية بتغليف ،SMDحيث تتميز برخص السعر مقارنة بالص DIPكما أنه يمكن تصميم دوائر تحتوي
على الكثير من المكونات بمساحة دصغيرة جداا بفضل الحجم الصغير الذي تتمتع به شرائح الص .SMD ونجد نتيجة لهذا المر أن العائلت المتطورة مثل AVR32أو Xmegaغالباا ما يتم إنتاجها بتغليف SMDفقط وذلك لنها تحتوي على الكثير من الطراف )قد يصل إلى 120طرف( لذا سيكون من الصعب )والمكلف أيضاا( أن تصنع بتغليف DIPلن الحجم سيكون ضخم جداا.
45
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.6أطراف الممتحكك م
ATmega16
يتملصصك الممتحككصصم ATmega16مصصا مجموعصصة 40طصصرف – pinموزعصصة علصصى 4بورتصصات كصصل واحصصد منهصصصصم 8أطصصصصراف وهصصصصم PORTA, PORTB, PORTC, PORTDومضصصصصاف إليهصصصصم مجموعصصصصة مصصصصن الطراف المتعلقة بالطاقة والتردد كما في الصورة التالية.
•
الطننرف RESETهصصذا الطصصرف يقصصوم بعمصصل RESETللممتحككصصم الصصدقيق ويعنصصي أنصصه سصصيعيد
جلت )يجعصل قيمتهصا بصصفر( ويعيصد تشصغيل البرنامصصج الموجصود ف ي تصفير جمي ع الممسص ك
ذاكصصرة الممتحككصصم مصصن البدايصصة ،مصصع العلصصم أنصصه طصصرف active lowيعنصصي يتصصم تفعيلصصه عنصصدما
يتصل بالرضي GNDأو يحصل على إشارة LOW logicلذا يجصصب أن يودصصصل دائمصصاا بالصصص VCCعصصن طريصصق مقاومصصة 10كيلصصو اوم )وإل سصصيظل الممتحككصصم يقصصوم بعمصصل RESETولصصن
يشغل البرنامج الممخزن بالذاكرة أبداا(.
46
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. •
الطننرف VCCهصصذا الطصصرف الصصذي يسصصتقبل الطصصرف المصصوجب للبطاريصصة أو مصصصدر الطاقصصة
المسصصصتخدم )يجصصصب أن يكصصصون مصصصوجب بدايصصصة مصصصن 2.7فصصصولت حصصصتى 5.5فصصصولت بحصصصد
أقصى(. •
الطننرف GNDالطصصرف الرضصصي للممتحككصصم ويتصصم تودصصصيله بصصالطرف الرضصصي للبطاريصصة أو
مصدر الكهرباء المستخدم .قد تتساءل لما يمتلك الممتحككم زوج من اﻷطنراف GND؟
السر هو تقليل الضجيج الكهربي ،Noiseفعنصصدما يتواجصد أكصصثر مصصن مسصصار للرضصصي فصصإن
ذلك يحسن فصصي القضصصاء علصصى الصصص Noiseخادصصصة إذا كصصان الممتحككصصم يقصصوم بتوليصصد إشصصارات
عالية السرعة )بالميجاهرتز(. •
الطرفننان XTAL1, XTAL2الطصصراف الصصتي يتصصم تودصصصيلها بصصدائرة المذبصصذب الخصصارجي
والصصتي سصصنتعرف علصصى جميصصع أنواعهصصا بالتفصصصيل فصصي فصصصل )الفيصصوزات ،سصصرعة التشصصغيل
والطاقة(. •
الطننرف AVCCاختصصصار لكلمصصة ADC VCCهصصذا الطصصرف مسصصؤول عصصن تشصصغيل المحصصول
التنصصاظري الرقمصصي ADCالموجصصود داخصصل الممتحككصصم ويجصصب أن يتصصم تودصصصيله دائمصصاا بنفصس الجهد الذي يتصل به الص .VCC
•
الطرف AREFاختصار كلمة Analog Refrenceوالذي سيتم شرحه بالتفصصصيل مصصع الصصص ADC
بصصاقي أطصصراف الممتحككصصم موزعصصة علصصى البورتصصات المختلفصصة A,B,C,Dوالصصتي تمتلصصك القصصدرة علصصى التحكم بالمكونات اللكترونية المختلفة كما تستطيع استقبال البيانات القادمصصة مصصن الحساسصصات
)سصصواء كصصانت رقميصصة أو تماثليصصة( لصصذا تسصصمى " منافصصذ إدخصصال\إخصصراج عامصصة" GPIOكمصصا تمتلصصك مجموعصصصصصة مصصصصصن الوظصصصصصائف الضصصصصصافية Alternative functionsمثصصصصصل التصصصصصصالت التسلسصصصصصلية، المقاطعات ..الخ ،والتي سنتعرف عليها تبعا في الفصول التالية.
47
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.7عائلة
ATTiny
تعتصصصصبر هصصصصذه العائلصصصصة مصصصصن الممتحككمصصصصات حديثصصصصة
نسصصصصبياا وهصصصصي مخصصصصصصة للسصصصصتخدامات الصصصصتي
تحتاج ممتحككم دقيق دصغير الحجم وسريع في ذات الصصوقت دون التضصصحية بصصالمميزات الكاملصصة
الصصصتي قصصصد تجصصصدها فصصصي معظصصصم الممتحككمصصصات لصصصذا قامت شركة ATmelبإنتاج هذا الجيصصل المتميصصز
مصصصن الممتحككمصصصات والمسصصصمى ATTinyاختصصصصاراا لعبارة . ATmel Tiny
دصورة روبوت دصغير باستخدام الممتحككم ATTiny85
عنصصدما ننظصصر للصصصفحة الولصصى مصصن دليصصل البيانصصات للمتحكمصصات ATTiny 45/84/85نجصصد أن هصصذه
الممتحككمصصصصات تمتلصصصك معظصصصم القصصصدرات الموجصصصصودة فصصصي سلسصصصلة megaAVRفهصصصي تمتلصصصصك نفصصصس المعمارية وتعمل بسرعات تصل إلى 20ميجاهرتز مع القدرة على تنفيذ 20مليون أمر برمجي فصصصصصصي الثانيصصصصصصة الواحصصصصصصدة )هصصصصصصذا يعنصصصصصصي أنهصصصصصصا تتفصصصصصصوق علصصصصصصى الممتحككمصصصصصصات القصصصصصصدم نسصصصصصصبياا مثصصصصصصل
.(ATmega16/32/128
48
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. الفارق الساسي بين هذه العائلصة و megaAVRهصو الحجصم وع دد الطصراف الصتي تعمصل كصص GPIO
حيث نجد أدصغر ممتحككم في هذه العائلة يملصصك 6أطصصراف فقصصط منهصصم GPIO 4و 2للطاقصصة مثصصل .ATTiny4/5/9/10وتتميز ممتحككمات هذه العائلة بالقدرة على العمل بفرق جهد 1.8فولت.
مجموعة من أدصغر الممتحككمات من شركة أتمل مقارنة بعملة معدنية و تسمى ATTiny10
بالرغم من الحجم الصغير جداا إل أن هذه الممتحككمصصات تتضصصمن معظصصم الصصص Peripheral Devices
الموجصصودة فصصي ممتحككمصات megaAVRفمثل الممتحككصصم ATTiny85بصصالرغم مصصن امتلكصه 6أطصصراف تحكم فقط إل أنه يمكن تشغيلها كص .GPIO, ADC, PWM, SPI
49
.2ظنظرة عامة على ممتحككمات AVR … .............................................................................................. سنستخدم في التجارب القادمصة الممتحككصم ) ATtiny84بجصانب الممتحككصم (ATmega16والصذي
يمتلك 12طرف تحكم و 2طرف للطاقة.
أيضاا تتميز هذه الممتحككمات بالستهلك المنخفض جداا للطاقصصة .حيصث يمكنهصصا العمصصل علصصى فصصارق جهد 1.8فولت واستهلك تيصار يصصل إلصى 300ميكروأمصبير = 0.000300أمصبير ) 300جصزء مصصن مليصصون مصصن المصصبير( وهصصو مصصا يعنصصي اسصصتهلك أقصصل بنحصصو 12مصصرة مصصن اسصصتهلك ممتحككمصصات
megaAVRوالتي تستهلك تيار كهربي بمقدار 1مللي أمبير ) 1000ميكروأمبير( على القل. إدارة استهلك الطاقة مشروحه بالتفصيل في الفصل السابع
50
.2ظنظرة عامة على ممتحككمات AVR … ..............................................................................................
2.8تمارين إضافية •
قصصصارن بيصصصن الخصصصصائص الصصصتي يتمتصصصع بهصصصا الممتحككصصصم ATmega16والمتحكصصصم ATmega32 والمتحكم ATTiny84من حيث الذاكرة وعدد أوامر البرمجة.
•
كصصصم عصصصدد البورتصصصات الصصصتي يملكهصصصا الممتحككصصصم ATTiny84ومصصصا هصصصي أسصصصماؤها؟ هصصصل جميصصصع
•
إذا قمنصصا بكتابصصة برنامصصج مكصصون مصصن 100أمصصر بلغصصة السصصمبلي بصصدون اسصصتخدام أي أمصصر
البورتات تمتلك 8أطراف مثل الممتحككم ATmega16أم يوجد اختلف ؟
تأخير وتم تشغيل نفس البرنامج على الممتحككم ATmega16والمتحكم ،ATTiny84أي المتحكمين سيقوم بتنفيذ البرنامج أسرع ولماذا؟
نصيحة :لمعرفة الحل انظر إلى فارق سرعة تنفيذ الوامر MIPSفي الصفحة الولى من دليل البيانات لكل ممتحككم ثم احسب زمن تشغيل البرنامج على كل ممتحككم.
•
إذا كصصصان عصصصدد الوامصصصر البرمجيصصصة لنظصصصام تحكصصصم يصصصصل إلصصصى خمسصصصة كيلوبصصصايت فمصصصا هصصصو
الممتحككصصصم المناسصصصب لتشصصصغيل هصصصذا البرنامصصصج )اخصصصتر مصصصا يصصصصلح مصصصن بيصصصن ATmega16, (ATmega32, attiny45, attiny85, ATtiny84؟ وإذا كصصصصصصان حجصصصصصصم البرنامصصصصصصج 17
كيلوبايت هل تصلح جميع اختياراتك السابقة؟
51
AVR ظنظرة عامة على ممتحككمات.2 .............................................................................................. …
مراجع إضافية2.9 ATTiny مقارنة شاملة بين عائلة الممتحككمات ➢ www.microfusion.de/e-/Microcontroller/AVR-Overview/ATtiny.html ➢ en.wikipedia.org/wiki/Atmel_AVR_ATtiny_comparison_chart megaAVR مقارنة شاملة بين عائلة ➢ ATmega32-avr.com/avr-comparison/
وATTiny مرفق مع الكتاب ملف مقارنة شامل بين أفراد الممتحككمات في كل العائلتين megaAVR
52
الفصل الثالث ” هناك اختياران مبدئيان في الحياة :إما أن تتقبل
ظروف الوضع الحالي كما هي ،أو أن تتقبل مسؤولية
تغيير هذا الوضع ‟
د .دينيس ويتلي – كاتب ومحاضر أمريكي
.3تجهيز أدوات التجارب … ..............................................................................................
.3تجهيز أدوات التجارب
يوضح هذا الفصصصل الدوات الصصتي سنسصصتخدمها فصصي تطصصوير النظمصصة المدمجصصة سواء كانت العتصصاد "المكونصصات اللكترونيصصة" Hardwareأو الدوات البرمجيصصة )ToolChain (Softwares ✔ الممبرمجات )الحارقات .(Burners ✔ المكونات اللكترونية
✔ البرمجيات المستخدم في التطوير Toolchain
54
.3تجهيز أدوات التجارب … ..............................................................................................
3.1الممربرمجات تعتبر الممبرمجات من أهم القطصع اللكترونيصة لتعلصم الممتحككمصات الدقيقصة فهصي المسصؤولة عصن تحميصل البرنامج ال ذي نكتبصه علصى الحاسصب إلصى الممتحككصم الصدقيق نفسصه .البعصض يحصب تسصميتها بالصصحارقات
Burnerنسبة إلى عملية حرق "الكود البرمجي" على الممتحككم.
يمكصصن اسصصتخدام العديصصد مصصن ال ممبرمجصصات المتصصوفرة فصصي السصصوق ولكصصن هنصصا سصصأذكر لصصك أفضصصل هصصذه
ال ممبرمجات وما يميزها ولك حرية الختيار بينها )أي واحدة منهم ستفي بالغرض(.
USBasp تعتصصصبر أحصصصد أبسصصصط وأشصصصهر الممبرمجصصصات الصصصتي تعمصصصل عصصصبر مصصصدخل usbالتقليصصصدي وتتميصصصز بالسصصصعر
المنخفض حيث يمكنك دصناعتها بنفسك بتكلفة 3دولرات أو شرائها جاهزة بسعر يصصتراوح بيصصن
6إلى 9دولرات ،كما أنها تحتوي على وضع الرفع البطيصصء slow clock rate modeوهصو مصصن
الوضاع المهمة في برمجة الممتحككمات عندما تعمل على سرعات منخفضة )سنتحدث عصصن هصصذا الوضع بالتفصيل في فصل التلعب بالترددات والطاقة( ،بهذا السعر المنخفصصض وسصصهولة البنصصاء
تعتبر USBaspأشهر مبرمجة الص AVRعلى الطلق.
الصور التالية هي أشكال مختلفة من نفس الممبرمجة
الإصدار الـ SMDمن الممربرمجة USBasp
الإصدار الـ DIPمن الممربرمجة USBasp
الموقع الرسمي للممبرمجة USBaspيحتوي على جميع ملفات التصميم التي يمكنك تحميلها مجاناا ودصناعتها بنفسك www.fischl.de/usbasp
55
.3تجهيز أدوات التجارب … ..............................................................................................
AVRISP mkII – Atmel الممبرمجصصة الرسصمية مصصن شصركة أتمصصل ،وتعصد مصن الممبرمجصصات المتطصورة نسصبياا حيصث تصصدعم معظصصم عصصصائلت الصصصص AVRالصصصص 8بصصصت والصصصص 32بصصصت مثصصصل Xmegaويمكنهصصصا برمجصصصة الممتحككمصصصات بمختلصصصف السرعات من 500هرتز إلى 8ميجا هرتز )هذه السرعة تمثل سرعة نقل البيانات وليس سرعة
الممتحككم نفسه( .
تعتصصبر AVRISP mkIIأفضصصل مصصن USBaspبكصصثير حيصصث تصصدعم USBaspسصصرعات برمجصصة بحصصد
أقصى 5ميجا فقط – كما أنها تدعم برمجصصة الممتحككمصصات الصصتي تعمصصل بفصصرق جهصصد مصصن 1.8فصصولت حصصتى 5فصصولت .بالتأكيصصد كصصل هصصذه المميصصزات تصصأتي علصصى حسصصاب السصصعر الصصذي يبلصصغ نحصصو 40دولر
تقريباا .يمكنك قراءة كافة التفادصيل عنها من الرابط التالي http://www.ATmel.com/tools/AVRISPMKII.aspx
الممبرمجة AVRISP mkIIمن الخارج
الممبرمجة AVRISP mkIIمن الداخل
تحذير :تنتشر بعض النسخ الصيني المزورة من هذه الممبرمجة بسعر منخفض )حوالي 10 دولرات – ولديها نفس الغطاء الخارجي( احترس من هذه الممبرمجات لنها ل تحتوي على التصميم والمكونات الحقيقة للمبرمجة avrisp mkIIوبالتالي ل تمتلك المميزات المذكورة سابقاا.
56
.3تجهيز أدوات التجارب … ..............................................................................................
AVR Dragon إذا كنصصت تريصصد أقصصوى أداة للتعامصصل مصصع عصصائلت AVRإذاا عليصصك بهصصذا "التنيصصن" .تعتصصبر الممبرمجصصة
AVR Dragonأقوى أداة للتعامل من ممتحككمات AVRفهي تعمل كمبرمجة SPIأو OCDأو PDI
وكمنقح Jtag Debuggerويمكنها معالجة الفيوزات والبرمجة بالفولتية العالية High voltage burner – 12 Voltويمكنها دصيانة الممتحككمات المعطوبة أو نسخ ومعالجصصة المحتصصوى المكتصصوب
على الممتحككمات )سيتم شرح الفيوزات بالتفصيل في الفصل الخاص بها(.
يمكنصصصك الطلع علصصصى تفادصصصصيل هصصصذه الممبرمجصصصة مصصصن موقصصصع Atmelالرسصصصمي مصصصن الرابصصصط التصصصالي: www.ATmel.com/webdoc/avrdragon
تتصصوفر هصصذه الممبرمجصصة بسصصعر 55دولر أمريكصصي ،وتعتصصبر مصصن الدوات الممخصصصصة للمحصصترفين لمصصا تملكه من إمكانيات متطورة.
57
.3تجهيز أدوات التجارب … ..............................................................................................
الممربرمجات ذات التغطية العامة Universal Programmers هصصذا النصصوع مصصن الممبرمجصصات يمكنصصه التعامصصل مصصع جميصصع الممتحككمصصات الدقيقصصة وشصصرائح الصصذاكرة مصصن
مختلصصصصف الشصصصصركات فمثلا معظصصصصم هصصصصذه الممبرمجصصصصات يمكنهصصصصا برمجصصصصة PIC, AVR, ARM, 8051, , EPROMوالمزيد من الشرائح والممتحككمات .غالباا تسصتخدمها شصركات الصصيانة والتطصوير لنهصا توفر الجهد وتوفر شراء العديد من الممبرمجات لمختلف النواع.
المشكلة الوحيدة لهذا النوع هصو سصصعرها المرتفصصع جصصداا والصصذي يبصصدأ مصصن 100دولر وحصتى 1200
دولر )قد يبدو رقم 1200دولر ضخم لكن لصك أن تتخيصل أن هصذه الممبرمجصصات يمكنهصا التعامصصل مع أكثر من 8000شريحة إلكترونية من مختلف الشركات على هذا الكوكب(. ل أنصحك بشراء هذا النوع إل إذا كنت ترغب في تعلم استخدام أكثر من نوع من الممتحككمات الدقيقة ول تريد أن تتعب نفسك بشراء مبرمجات مختلفة.
58
.3تجهيز أدوات التجارب … ..............................................................................................
Arduino as ISP قصد يسصصتغرب البعصصض لمصصا تصصم وضصع آردوينصو فصي قائمصصة الممبرمجصصات ،الحقيقصة أن لوحصصات آردوينصصو المختلفة يمكنها العمل كمنصة تطصصوير AVRلنهصصا مصصن السصصاس عبصصارة عصصن شصصريحة Atmega328 مضصصاف إليهصصا بعصصض المكونصصات البسصصيطة +ممحصصول .USB-ttl converterهصصذه اللوحصصات يمكنهصصا
برمجة AVRبطريقتين: الطريقنة اﻷولنى :أن تقصوم برفصع برنامصج يسصمى ArduioISPعلصى لوحصة آردوينصو والصذي س يقوم بتحويل اللوحصة إلصصى مبرمجصة مشصابهه لصصص USBaspويمكنصك بعصدها أن تودصصصلها بصأي شصصريحة AVR لتبرمجهصصا كمصصا فصصي الصصصورة التاليصصة والصصتي يتصصم اسصصتخدام لوحصصة آردوينصصو بهصصا لبرمجصصة شصصريحة
ATmega32أو ATmega16
59
.3تجهيز أدوات التجارب … .............................................................................................. الطريقنننة الثانينننة :أن تسصصتخدم لوحصصة آردوينصصصو نفسصصصها كصصصص AVR development boardحيصصث
يمكنك الكتابة بلغة السي ANSI- Cداخل برنامج آردوينو.
في الواقع معيار آردوينو البرمجي ما هو إل لغة السي ومضصصاف إليهصصا بعصصض المكتبصصات البرمجيصصة
لذا يمكنك بسهولة أن تكتب أي برنامج ANSI - Cداخل برنامج آردوينو.
الخبر الجيد أنه في حالة امتلكك لوحة آردوينصو فل داعصي لشصراء أي مبرمجصة إضصافية ويكفصي
فقط أن تشتري باقي المكونات المطلوبة وتستغل لوحة آردوينو لتقوم بهذا العمل. الروابط التالية تشرح استخدام آردوينو كمبرمجة )مثل الطريقة الولى(:
➢ www.youtube.com/watch?v=_ZL-YNOH_jA ➢ www.arduino.cc/en/Tutorial/ArduinoISP ➢ www.instructables.com/id/AVR-Programming-with-Arduino-AVRdude-andAVR-gcc/ شخصننياا أسننتخدم الممبرمجننة USBaspفنني أغلننب اﻷوقننات وتعتننبر الممبرمجننة المفضننلة لنندي بسبب سعرها المنخفض وسهولة صناعتها في المنزل. في هذا الكتاب سنعتمد على شريحة ATmega16و شريحة ATTinyلذا فالطريقة الثانية من استخدام آردوينو كلوحة تطوير AVRوبالتحديد الممتحككم atmega328قد تحتاج أن تعدل بعض الكواد البرمجية المذكورة في الكتاب )خادصة الكواد المذكورة بدئاا من الفصل السابع حتى نهاية الكتاب( وذلك بسبب اختلف أسماء بعض الممسجلت Registerوأسماء بعض المخارج والمداخل ،لذا إذا رغبت في استخدام آردوينو كص AVR boardفأحرص على تغير جلت لتناسب المثلة. أسماء الممس ك
أيضاا سيتم شرح الص Datasheetلكل ممتحككم .والتي من خللها يمكنك تغيير هذه السماء
بسهولة و تطبيق كافة الكواد مع تعديلها قليلا لتتناسب مع الممتحككم Atmega328بدلا من الممتحككمات المذكورة سابقاا.
60
.3تجهيز أدوات التجارب … ..............................................................................................
3.2المكونات اﻹلـكترونية
سصصتحتاج لبعصصض المكونصصات اللكترونيصصة لداء التجصصارب فصصي هصصذا الكتصصاب ،بعصصض هصصذه المكونصصات
واجصصب تصصوافره والبعصصض الخصصر ميسصصتخلدم فقصصط فصصي التجصصارب الضصصافية لصصذا احصصرص علصصى اقتنصصاء
المكونصصات الصصتي سصصيكتب بجانبهصصا )واجننب( – أمصصا المكونصصات الصصتي سصصيكتب بجانبهصصا )اختينناري( فيمكنك الستغناء عنها )ومع ذلك أنصحك بشرائها حتى تستفيد بأكبر قدر من التجارب(. )واجننب( هصصذا هصصو الممتحككصصم الرئيسصصي الصصذي سصصنقوم بعمصصل
التجارب عليصصه ،وفصصي حالصصة عصصدم تصصوافره لصصديك فصصي السصصوق
المحلصصصصي يمكنصصصصك اسصصصصتخدام البصصصصديل المماثصصصصل ATmega32 شريحة ATmega16 شريحة ATTiny84
والصصصصذي يمصصصصاثله فصصصصي معظصصصصم الصصصصتركيب الصصصصداخلي باسصصصصتثناء
مساحة الذاكرة.
)اختياري( الممتحككم ATTiny84 )واجب( عدد 1كريستالة )ذات طرفين( 16ميجا
كريستالة 16 :ميجاهرتز مكثف سيراميكي )واجب( عدد 2مكثف على القل.
22بيكوفصصصصصصصصصصصصصصصاراد هصصصصذه المكثفصصصصات سصصصصعرها رخيصصصصص جصصصصداا وحجمهصصصصا دصصصصصغير picofarad
وسصصصصهلة الضصصصصياع لصصصصذا يفضصصصصل أ ن تشصصصصتري منهصصصصا 10أو 20
قطعة )الص 20قطعة ستكلفك نصف دولر فقط(. كابل مبرمجة ISP
)واجب( عدد 1كابل
ميسصصصتخلدم هصصصذا الكابصصصل فصصصي تودصصصصيل الممبرمجصصصة بصصصالمتحكم
الصصصدقيق )غالبصصصاا قصصصد تجصصصده مصصصع الممبرمجصصصة نفسصصصها عندئصصصذ ل داعي لشراءه(.
61
.3تجهيز أدوات التجارب … .............................................................................................. )واجننننب( عصصصصدد 10قطصصصصع دايصصصصود ضصصصصوئي )يفضصصصصل اللصصصصون الحمر أو الخضر( ويفضل عدم استخدام اللون البيض
دايودات ضوئية )ليد (LED شصصصصريحة عصصصصرض أرقصصصصام "مقاطعصصصصة )واجب( عدد 2 :قطعة سصصصصصصصصصصصصصصصصصصصصصصباعية" seven Segment
من المكونات الهامة والبسيطة فصصي ذات الصصوقت ،تسصصتخدم
فصصصي عصصصرض الرقصصصام عصصصن طريصصصق 7دايصصصودات ضصصصوئية لصصصذا
تسصصصصصصمى الشصصصصصصريحة ذات المقصصصصصصاطع السصصصصصصبعة Segment 7 ويفضل الحصول على النوع ذا الطرف السصصالب المشصصترك
common cathode حسصصصصصصصصصصصصصصصصصصصصصصصصاس
الحصصصصصصصصصصصصصصصصصصصصصصصصرارة LM35 مقاومصصصة ضصصصوئية LDR
)اختياري( عدد 1حساس حرارة والذي سنسصصتخدمه فصصي فصل الحساسات التماثلية
)اختينناري( عصصدد 1مقاومصصصة ضصصوئية والصصصتي سنسصصصتخدمها في فصل الحساسات التماثلية
مقاومصصصصصصصصصصصصة متغيصصصصصصصصصصصصرة potentiometer
)واجننب( عصصدد 1مقاومصصة متغيصصرة ذات 3أطصصراف تودصصصيل مع عمود دوران
محرك DC Motor
)واجننب( عصصدد 1محصصرك تيصصار مسصصتمر مثصصل الموجصصود فصصي اللعاب مثل السيارات
محرك Stepper Motor )(bipolar
)اختياري( عدد 1محرك خطوي من نوع bipolarله سلك ذا 4أطراف ويستخدم في تقنيات التحكم للماكينات ،يجب أن ل يستهلك تيار أكبر من 500مللي أمبير )نصف أمبير( وسنتعرف عليه بالتفصيل في فصل المحركات.
62
.3تجهيز أدوات التجارب … .............................................................................................. L293 H-bridgeدائرة قيادة
)اختياري( دائرة قيادة المحركات )قنطرة (Hوتعتصصبر مصصن
أهصصم الشصصرائح الصصتي سنسصصتخدمها فصصي التحكصصم بالمحركصصات
سواء الص DCأو الص Stepper Motor
)واجب( عصصدد 4مفاتيصصح ضصصغط ذات أربعصصة أطصصراف،إذا لصصم تكصصن متصصوفرة فصصي السصصوق المحليصصة يمكنصصك شصصراء مفاتيصصح
مفتاح Push button مفتصصصصصصصصصصصصصصصصصصاح DIP switch Resistors 10كيلواوم 330اوم
الضغط ذات الطرفين فقط. )اختينناري( عصصدد 1مصصصفوفة DIP – ON- OFFذا ثمانيصصة مفاتيح أو يمكنك شراء 2مصفوفة ذات 4مفاتيح
)واجب( عدد 8مقاومات من كل القيم المذكورة ) 10كيلواوم و 330اوم( بقدرة ربع وات أو: watt 1/8 )واجننب( عصصدد 20سصصلك يمكنصصك شصصراء السصصلك الخادصصصة بلوحصصصة التجصصصارب مباشصصصرة Male to Male Jumpersأو يمكنصصك أن تصصصنعها بنفسصك عصبر شصصراء سصلك )خصصط تليفصون
أرضصصصصي 0.6مللصصصصي( وتقطعيهصصصصا بنفسصصصصك ،شخصصصصصياا أفضصصصصل أسلك تودصيل
اسصصتخدام السصصلك الجصصاهزة ،ويفضصصل أن تكصصون بطصصول مصصا
بين 10إلى 15سنتي متر. )واجننننب( عصصصصدد 1لوحصصصصة تجصصصصارب ،Breadboardاحصصصصرص علصصى اقتنصصاء لوحصصة كصصبيرة الحجصصم ومصصن النصصوع الجيصصد لنهصصا
لوحة تجارب Breadboard
63
ستكون المنصة التي ستطبق عليها مختلف التجارب.
.3تجهيز أدوات التجارب … ..............................................................................................
3.3أدوات إضافية
مصصصصن المحبصصصصذ أن تمتلصصصصك مجموعصصصصة مصصصصن الدوات الضصصصصافية حيصصصصث ستسصصصصاعدك كصصصصثيراا فصصصصي تعلصصصصم
الممتح ككمات الدقيقة واللكترونيات بشكل عام لذا احرص على اقتنائها إذا لم تكن لديك بالفعل. القائمة التالية هي مثال على ما ينبغي أن تمتلكه: •
جهاز قياس متعدد )Digital Multimeter (AVO meter
•
عدة اللحام )كاوية +حامل للكاوية +حامل لوحات إلكترونية (PCB holder
•
قصدير لحام من نوع 30-70
•
مقص أسلك )قصافه( +قشارة أسلك.
•
عدسة مكبرة
•
64
مجموعة من المفكات +ماسكة أسلك )بنسه(.
.3تجهيز أدوات التجارب … ..............................................................................................
3.4تجهيز الربرمجيات
البرمجيصصات المخصصصصة للنظمصصة المدمجصصة )أو كمصصا تسصصمى Firmwareفيصصرم-ويصصر( يتصصم تصصصميمها باسصصصتخدام "مجموعصصصة أدوات التطصصصوير" أو كمصصصا تعصصصرف باسصصصم Development toolcahinمصصصن
الرائصصصع أن هصصذه الدوات متصصصوفرة لمتحكمصصصات الصصصص AVRمجانصصصاا وبصصصصورة مفتوحصصصة المصصصصدر لجميصصصع أنظمصصصة التشصصصغيل ،هصصذا يعنصصصي أن جميصصع البرمجيصصصات الصصصتي سنسصصصتخدمها مجانيصصصة تمامصصصاا ويمكنصصصك استخدامها بحرية بأي دصورة سواء كانت تعليمية أو تجارية .مجموعة الدوات هي: •
المنننترجم – AVR-GCC Compilerالبرنامصصصج الشصصصهير GCCيعتصصصبر أشصصصهر مصصصترجم فصصصي
العالم وهو البرنامج الرئيسي في أدوات التطوير و المسؤول عن تحويصصل اللغصصات عاليصصة
المسصصتوى مثصصل ++C/Cإلصصى ملفصصات تسصصتطيع اللت أن تفهمهصصا)بالتعصصاون مصصع برامصصج الصصص
Linkerو الصصصص (Assemblerقصصصامت شصصصركة ATmelبتعصصصديل الصصصص GCCليعمصصصل مصصصع الصصصص AVR
مباشصصصرة بمختلصصصف الدصصصصدارات AVR32-GCC
الكتاب سنستخدم AVR-GCCفقط. •
AVR-GCC-G++, AVR-GCC,فصصصي هصصصذا
اﻷدوات المساعدة – binutilsمجموعة من الدوات التي تساعد المصصترجم فصصي إتمصصام
عملية تحويل البرنامج من اللغة عالية المستوى إلصصى ملصصف hexمتكامصصل )الهيكصصس hex
هي دصيغة نصية تمثل الص binaryفي دصورة أبسط وأكثر اختصاراا(. •
المكتبننننات البرمجيننننة ) – Libraries (LibC-avrمجموعصصصصة مصصصصن الكصصصصواد والتعريفصصصصات
المكتوبصصة مسصصبقاا بلغصصات عاليصصة أو أقصصل مسصصتوى لتسصصهل عمليصصة البرمجصصة علصصى المطصصورين وتحتصصوي علصصى بعصصض الكصصواد والوامصصر الجصصاهزة والصصتي تختصصصر الكصصثير مصصن وقصصت كتابصصة
البرامج. •
المنقننح – GDP debuggerهصصذا البرنامصصج ميسصصتخلدم فصصي اكتشصصاف الخطصصاء البرمجيصصة والمساعدة في حل المشاكل التي تواجه المطور أثناء تشغيل واختبار البرنامج.
•
برنامننج الرفننع – AVRdudeالبرنامصصج المسصصتخدم فصصي رفصصع الملفصصات مصصن الحاسصصوب إلصصى
الممتحككمصصصصات الدقيقصصصصة مصصصصن نصصصصوع AVRويمكنصصصصه أيضصصصصاا أن يقصصصصوم بعكصصصصس هصصصصذه العمليصصصصة )اسصصتخراج البرامصصج المكتوبصصة علصصى الممتحككمصصات( كمصصا يمكنصصه قصصراءة محتويصصات الصصذاكرة EEPROMوكتابة الفيوزات )كما سنرى في الفصل الخاص بالفيوزات(.
65
.3تجهيز أدوات التجارب … .............................................................................................. هناك طريقتان لستخدام هذه الدوات ،الولى هي تحميل الصصص toolchainثصصم اسصصتخدام أي IDE أو حصصتى محصصرر نصصصوص يصصدعم لغصصة السصصي \ السصصي ++والطريقصصة الثانيصصة أن يتصصم تحميصصل منصصصة
التطصصوير المتكاملصصة مصصن شصصركة أتمصصل – ATmel Studioهصصذا البرنامصصج يحتصصوي علصصى كصصل الدوات
السابقة مدمجة بداخله )باستثناء AVRdudeفقط(.
الطريقصصة الولصصى تصصصلح لجميصصع أنظمصصة التشصصغيل ومناسصصبة جصصداا لنظمصصة Linuxو Macأمصصا الثانيصصة
مع السف برنامج ATmel Studioمتوفر على نظام ويندوز فقط ،علصصى أي حصصال سصصأقوم بشصصرح كل الطريقتين حتى يصبح لك حرية اختيار البرامج وحرية استخدام أي نظام تشغيل تريده. أيضصصاا يمكنصصك اسصصتخدام برنامصصج المحاكصصاة الشصصهير بروتصصس Protuesفصصي محاكصصاة جميصصع المثلصصة المصصصذكورة فصصصي فصصصصول الكتصصصاب دون الحاجصصصة لشصصصراء مكونصصصات إلكترونيصصصة حقيقصصصة .مصصصع العلصصصم أن
برنامج بروتس يمكنه العمل على نظام لينكس أيضاا عبر استخدام محاكي ويندوز Wine HQ معلومة إضافية :برنامج Atmel Studioيعمل بنفس الص toolchainالمذكورة سابقاا ومنها
المترجم AVR-GCCكذلك نجد أن برنامج آردوينو Arduinoيعمل بنفس ال ،toolchainوهذا يعني أنه يمكنك استخدام برنامج آردوينو كص IDEخفيفة لتكتب برامج بلغة السي\السي++ لبرمجة الص AVRولكني ل أحبذ هذا الخيار لنه يفتقر للكثير من الوظائف الحترافية والهامة لمبرمجي النظمة المدمجة.
66
.3تجهيز أدوات التجارب … ..............................................................................................
تجهيز اﻷدوات على نظام ويندوز توجه إلى موقع شركة Atmelلتحميل برنامج Atmel Studioمن الرابط التالي http://www.ATmel.com/tools/atmelstudio.aspx
اختر نسخة البرنامج المتكاملة والمضاف إليها باقة أدوات الص ) NET.هصذه النسصخة تحتصوي علصصى
كل الملفات المطلوبة( وعصصادة مصصا تتميصصز بحجمهصصا الكصصبير لصصذا احصصرص علصصى أن يكصصون لصصديك اتصصصال
سريع بالنترنت عند تحميل البرنامج.
سيطلب منك الموقع أن تسجل حساب جديد )أو تسجل دخصول إذا كصان لصديك حسصاب بالفعصل(،
الحسصصصاب مجصصصاني تمامصصصاا وسصصصيوفر لصصصك تحميصصصل جميصصصع أدوات الشصصصركة مجانصصصاا .بعصصصد النتهصصصاء مصصصن تسجيل الحساب يمكنك تحميل البرنامج.
67
.3تجهيز أدوات التجارب … .............................................................................................. بعصصد النتهصصاء مصصن تنصصصيب Atmel studioسصصنقوم بتحميصصل برنامصصج AVRdudessوهصصو برنامصصج
avrdudeمضاف إليه واجهة رسومية رائعة ومزودة بالعديد مصصن الخيصصارات الصصتي متسصصهل برمجصصة
شرائح الص ،AVRيمكنك تحميل البرنامج من الموقع التالي: http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude
تنصيب تعريفات الممبرمجة USBasp هصصذا الجصصزء قصصد يختلصصف علصصى حسصصب الممبرمجصصة الصصتي ستسصصتخدمها ،شخصصصياا أسصصتخدم USBasp
لنها;كما ذكرت سابقاا رخيصة ومفتوحصة المصصصدر ويمكنصصك دصصناعتها بنفسصصك .لصصذا اخترتهصصا كصأداة رئيسية للبرمجة في هذا الكتاب.
ملحظصصصة :إذا كنصصصت تسصصصتخدم أحصصصد مبرمجصصصات ATmelمثصصصل AVRISPأو AVR Dragonيمكنصصصك تحميل التعريفات الخادصة بها من نفس دصفحة برنامج ATmel studio في البداية توجه إلى موقع USBaspالرسمي وقم بتحميل الملف المضغوط الصصذي يحتصصوي علصصى جميع ملفات المشروع )ملفات التصميم والتعريفات(
68
http://www.fischl.de/usbasp
.3تجهيز أدوات التجارب … ..............................................................................................
بعد النتهاء من التحميل قم بتودصيل لوحة USBaspبالحاسوب وقم بفك ضغط الملصصف ،لحصصظ
أنصصه بمجصصرد تودصصصيل USBaspسصصيخبرك نظصصام وينصصدوز بصصأنه لصصم يسصتطع أن ينصصصب التعريفصصات كمصصا في الصورة التالية:
افتح مدير الجهزة Device Managerواختر USBasp - Uknowen deviceثم اضغط install new driverكما في الصورة التالية:
69
.3تجهيز أدوات التجارب … .............................................................................................. اختر مكان ملفات التعريفات )الموجودة داخل الملف الذي قمنا بتحميله سابقاا(
إذا ظهرت رسالة تطلب تأكيد تنصيب التعريفات قم بالضغط على Install
رائع ! أنت الن جاهز لتبدأ العمل على دصناعة النظمة المدمجة بالص (: AVR إذا كنت تستخدم نظام windows 8.1أو Windows 10يجب أن تقوم بإغلق )نظام التعريفات الموثقة( ،يمكنك قراءة التفادصيل من الرابط التالي http://www.atadiat.com/usbasp_win_driver/ https://openchrysalis.wordpress.com/2014/09/26/installing-usbasp-driversoftware-in-windows-8-1/
70
.3تجهيز أدوات التجارب … ..............................................................................................
تجهيز اﻷدوات على أنظمة لينكس
في أنظمة لينكس \ ماك \ FreeBSDيمكنصصك تنزيصصل جميصصع برامصصج الصصص toolchainمصصن مسصصتودعات البرامج الرسمية لكل نظام تشغيل ،كما ستحتاج لملف MakeFileوالذي سيقوم بتحويصصل الكصصود
إلى ملف hexبصورة تلقائية )ملف الص MakeFileمرفق مع الكتاب(.
أيضاا ستحتاج IDEأو محرر نصوص يدعم البرمجصة مثصصل البرنامصصج الرائصع ) CodeBlocksوالصذي أستخدمه شخصياا( أو Eclipsأو Sublimeأو المحرر النصي Geanyأو Vimأو .Emacs نظام Ubuntu / Debian يمكنصصصك تنصصصصيب جميصصصع الدوات مباشصصصرة عصصصبر المصصصر التصصصالي )تكتصصصب فصصصي طرفيصصصة سصصصطر الوامصصصر (Terminal
sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude نظام Fedora / RedHat / CentOS يمكنك استخدام برنامج yumأو ) DNFالموجود في نظام فيدورا لينكس 22أو أعلى( وذلك
عبر الوامر التالية
sudo yum install avr-gcc avr-binutils avr-libc avr-gdb avrdude لنظام فيدورا 22أو أعلى
sudo dnf install avr-gcc avr-binutils avr-libc avr-gdb avrdude
تنصيب تعريفات USBaspعلى لينكس يحتصصوي الملصصف الرسصصمي علصصى تعريفصصات نظصصام لينكصصس )متوافقصصة مصصع جميصصع النظمصصة بل اسصصتثناء( وهي عبارة عن ملصصف udev rulesوسصكربت تنصصيب ،كصل مصا عليصصك فعلصصه أن تفتصح المجلصصد الصصذي يحتوي على التعريفات وتشغل سكربت التنصيب بصلحية الرووت كما في الصورة التالية:
71
تجهيز أدوات التجارب.3 .............................................................................................. …
مراجع إضافية3.5
➢ http://www.ladyada.net/learn/avr/programmers.html ➢ http://avrprogrammers.com/programmers/all ➢ http://www.instructables.com/id/AVR-ISP-programmer ➢ http://www.instructables.com/id/Turn-Your-Arduino-Into-an-ISP ➢ http://elm-chan.org/works/avrx/report_e.html ➢ http://www.instructables.com/id/Programming-an-Atmel-AtTiny85-usingArduino-IDE-an/
72
الفصل الرابع ف ”ف إنف الخطرف الذيف يهددف اللكثيرينف مناف ليسف أنف نضعف أهدافااف عاليةف جدااف
فلاف نستطيعف بلوغها،ف بلف أنف نضعف أهدافااف منخفضةف للغاية،ف ثمف نبلغهاف ‟
مايكلف أنجلوف –ف رسامف ونحاتف إيطالي
.4أساسيات التحكم GPIO Basics … ..............................................................................................
.4أساسيات التحكم GPIO Basics
فصصي هصصذا الفصصصل سصصنتعلم أساسصصيات تشصصغيل أطصصراف الممتحككصصم الصصدقيق وتشصصغيل المنافصصذ لتعمصصل كصصصدخل أو كخصصصرج .كمصصصا سصصصنقوم بمجموعصصصة مصصصن التجصصصارب لتشصصصيغل بعصصصض العنادصصصصر اللكترونيصصصة
البسيطة مثل ..LEDs, Switchs, 7-Segmentsالخ. ✔
المثال الولHello World :
✔
أساسيات برمجة أطراف الص AVR
✔
المثال الثاني :تشغيل مجموعة دايودات ضوئية
✔
المثال الثالث :تشغيل جميع أطراف البورت Aوالبورت B
✔
المثال الرابع :تشغيل المقاطعة السباعية 7Segment
✔
قراءة الدخل الرقمي
✔
Internal & Externel Pull-Up
✔
المثال السادس :قراءة أكثر من مفتاح
✔
74
مفهوم الص Bouncingوطرق الص De-Bouncing
.4أساسيات التحكم GPIO Basics … .............................................................................................. في جميع التجارب التالية سنتبع أسصصلوب التصصصميم Designثصصم المحاكصصاة Simulateثصصم التنفيصذ
علصصى لوحصصة التجصصارب Prototypeوذلصصك لتسصصهيل تعلصصم البرمجصصة ،مصصع ملحظصصة أنصصه هنصصاك بعصصض
المثلة التي قد ل تصلح للمحاكاة ويجصصب أن تنفصصذ مباشصصرة علصصى لوحصة التجصارب كمصصا سصنرى فصصي
الفصول المتقدمة )مثل الص fusesوإدارة الطاقة(.
فكرة كتابة البرظنامج المحاكاة تطبيق فعلي ملحظة :جميع التجارب على لوحة الختبارات ) Breadboardالتطبيق الفعلي( +العديد من التجارب الضافية ستشرح على هيئة فيديوهات مستقله عن الكتاب
75
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.1المثال اﻷول :
Hello World
يعتبر تشغيل دايود ضوئي وإطفصصاؤه لمصصدة زمنيصة معينصة Blinking Ledهصو المثصصال الشصصهر لبصدء أي عملية تطوير في عصالم النظمصة المدمجصة .فصي هصذا المثصال سصنتعرف علصى أساسصيات التحكصم
في أطراف الص AVR microcontrollersوتشغيلها كص ) GPIOمنافذ إدخال وإخراج عامة(.
سنستخدم في هذا المثال دايود ضوئي Ledيتم تودصيله على الطصصرف PA0ويمكنصك اسصتخدام
إمصصصا ATmega16أو ) ATtiny84كلهمصصصا يمتلكصصصان الطصصصرف (PA0كمصصصا هصصصو موضصصصح فصصصي المخطصصصط التالي:
ملحظة :كلمة ممخطط Schematicتعني الرسمة التي تشرح تودصيل المكونات اللكترونية ببعضها البعض ،دائماا ما يتم استخدام المخططات لشرح أي تصميم إلكتروني سواء كان
بسيطاا أو ممعقداا .في هذا الكتاب سأستخدم برنامج بروتس لرسم معظم المخططات للدوائر التي سنقوم بتجربتها على مدار المثلة القادمة.
76
.4أساسيات التحكم GPIO Basics … ..............................................................................................
كتابة الربرنامج على Atmel Studio قم بتشغيل برنامج Atmel stduioثم اختر New Project
من الصفحة التي ستظهر اختر مشروع جديد بلغة السي GCC – C- Executableوقم باختيار
اسم المشروع والمجلد الذي سيحفظ به المشروع من الشريط السفلي .تذكر هذا المجلند جينداا ﻷنه سيحتوي على ملف الهيكس الذي سنستعمله في الخطوات التالية.
77
.4أساسيات التحكم GPIO Basics … .............................................................................................. الن يمكنك اختيار عائلة ونوع الممتحككم الدقيق المستخدم ،كما يمكنصك اسصتخدام مربصع البحصث
على الجانب اليمن من الصفحة )اختر الممتحككم ATmega16أو .(ATtiny84
بعصصد النتهصصاء مصصن هصصذه الختيصصارات سصصتظهر شاشصصة البرمجصصة الرئيسصصيةوبداخلها "هيكصصل فصصارغ" Empty templateكما في الصورة التالية
78
GPIO Basics أساسيات التحكم.4 .............................................................................................. … والن قم بكتابة أول برنامج #define F_CPU 1000000UL #include
#include int main(void) { DDRA = 0b00000001; while(1) { PORTA = 0b00000001; _delay_ms(500); PORTA = 0b00000000; _delay_ms(500); } return 0; } شكل الكود بعد كتابه داخل البرنامج
79
.4أساسيات التحكم GPIO Basics … ..............................................................................................
ترجمة الـكود
لترجمة البرنامج وتحويلة من لغة السي إلى ملف الهيكس يمكنك الضغط على زر F7أو اختيار "بناء البرنامج" من قائمة Build → Build Solution
بعصد النتهصاء مصن ترجمصة البرنامصصج سصصتجد ملصف الهيكصس فصي المجلصصد الصصذي اخترنصاه فصصي الخطصصوة الولى ،الن يمكننصصا البصصدء فصي محاكصصاة التجربصة علصى برنامصصج بروتصس أورفصع ملصف الهيكصس علصصى
الممتحككم الدقيق مباشرة )على الص (Breadboard
يمكنصصك اسصصتخدام طريقصصة تحويصصصل الملفصصات باسصصصتخدام المصصترجم GCCمباشصصرة دون اسصصصتخدام برنامج Atmel studioمثل ما هو مشروح في ملحق استخدام makefile
80
.4أساسيات التحكم GPIO Basics … ..............................................................................................
محاكاة التجربة على برنامج بروتس والن سنقوم بمحاكاة التجربة علصصى برنامصصج بروتصصس الشصصهير والصصذي يعصصد أفضصصل برنامصصج محاكصصاة
فصصي مجصصال اللكترونيصصات خادصصصة مصصع الممتحككمصصات الدقيقصصة .البرنامصصج مخصصصص للعمصصل علصصى نظصصام تشغيل ويندوز ومع ذلك يمكنك تشغيله على أنظمة لينكننس بسصصهولة باسصصتخدام محصصاكي برامصصج
ويندوز ) Wineوهو ما أفعله شخصياا ﻷنني أفضل استخدام نظام لينكس(.
يمكنك استخدام أي إدصدارة من برنامج بروتس سواء كانت SP2 7.8أو الدصدار 8.1مع العلم أن جميع الملفات المرفقة مع الكتاب تم تصميمها واختبارها على كل الدصدارين فصصي البدايصصة قصصم بعمصصل مشصصروع جديصصد ولنسصصميه ATmega16_blink_ledواخصصتر المكصصان الصصذي تريد أن تحفظ به ملفات المشروع كما في الصور التالية:
اختر تصميم مخطط جديد Create a new schematicبالمقاس الفتراضي Default
81
.4أساسيات التحكم GPIO Basics … ..............................................................................................
لن نحتاج أن نصنع تصميم PCBفي الصصوقت الحصصالي ،لصصذا قصصم باختيصصار Don't Create PCBثصصم اختر في الصفحة التي تليها No Firmware ملحظة :الدصدارات الخادصة ببرنامج بروتس بدء من 8أو أعلى تدعم برمجة الممتحككمات من داخل البرنامج باستخدام المترجم AVRASMأو gcc-avrلكننا لن نستخدم هذه الخادصية الن وسنكتفي باستخدام برنامج Atmel studioأو CodeBlocksكبيئة برمجة مع gcc-avr
والن أدصبح لدينا ملصف المخطصط Schematicجصاهز لنبصدأ بتودص يل المكونصات اللكترونيصة مصع بعضها البعض ،في التجارب القادمة سنقوم باستخدام المكونات التالي ة )سصنقوم بإضصصافتها فصي
قائمة المكونات المستخدمة في المحاكاة من خلل الضغط على زر Pمن قائمة devices
82
.4أساسيات التحكم GPIO Basics … .............................................................................................. ATmega16
•
)LED (yellow
•
Resistor 330
•
LED bar
•
يمكنك استخدام خادصية البحث عن المكونات كما في الصور التالية
ابحث عن جميع المكونات المذكورة بالعلى ثم ضفها إلى القائمة
بعصصد إضصصافة جميصصع المكونصصات سصصنجد أن المسصصتطيل الجصصانبي الخصصاص بالمكونصصات أدصصصبح يحتصصوي
على معظم المكونات التي نحتاجها للتجارب القادمة كما في الصورة التالية:
83
.4أساسيات التحكم GPIO Basics … ..............................................................................................
والن سنبدأ في بناء أول دائصرة لتجربصة الصص ،Blinking ledفصي البدايصة سصنقوم بوضصع الممتحككصم ATmega16داخل إطار رسم برنامج بروتس كما في الصورة التالية:
ثصصم سصصنختار قائمصصة terminalمصصن برنامصصج بروتصصس )القائمصصة الصتي تحتصصوي علصصى رمصوز البطاريصصة –
المصصصصصوجب والسصصصصصالب( ومنهصصصصصا سنضصصصصصيف powerونقصصصصصوم بتودصصصصصصيلها بالمصصصصصدخل AREFو AVCC
)سنتحدث عن كل المخرجين بالتفصيل في الفصل الخاص بالمحول التناظري\الرقمي .(ADC
84
.4أساسيات التحكم GPIO Basics … ..............................................................................................
والن قم بإضصافة الصدايود الضصوئي والمقاومصة علصى المخصرج PA0ثصم ودصصل الطصرف السصالب مصن
الصصدايود علصصى علمصصة ) Groundيمكنصصك إضصصافتها مصصن قائمصصة Terminalsأيضصصاا( كمصصا فصصي الصصصورة
التالية:
قم بإضافة مقاومة أخرى وودصلها بالمدخل RESETفي الطصصرف اليسصصر مصن الممتحككصصم ثصصم ودصصصل
الطرف الخر بعلمة – Powerوقم بتعديل قيمصة المقاومصة لتصصبح 10كيلصو )تكتصب (10kكمصا في الصورة التالية:
85
.4أساسيات التحكم GPIO Basics … .............................................................................................. بذلك نكون قد انتهينا من تودصيل المكونات الساسية ويتبقى فقط إضصصافة ملصصف الهيكصصس hex 0
الخصصاص بصصالكود الصصذي كتبنصصاه علصصى برنامصصج CodeBlocksوذلصصك عصصبر الضصصغط بصصالزر اليمصصن علصصى
الممتحككم ATmega16واختيار "تعديل خصائص الممتحككصصم" ثصصم الضصصغط علصصى Program File واختيصصصار ملصصصف الهيكصصصس الصصصذي دصصصصنعناه باسصصصتخدام ) Atmel stduioسصصصتجد الملصصصف فصصصي مجلصصصد
المشروع( كما في الصورة التالية:
86
.4أساسيات التحكم GPIO Basics … .............................................................................................. وأخيراا قم بتعديل CKSEL Fusesباختيار Int. RC 1 Mhzكما في الصورة التالية
قصصصصم بحفصصصصظ العصصصصدادات عصصصصبر الضصصصصغط علصصصصى زر OKثصصصصم قصصصصم
بتشصصغيل المحاكصصاة عصصبر الضصصغط علصصى زر playفصصي الشصصريط السصصصفلي لبرنامصصصج بروتصصصس والن يفصصصترض أن يضصصصئ الصصصدايود
الضوئي لمدة نصف ثانية وينطفئ لمدة نصف ثانية أخرى.
87
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.2شرح المثال اﻷول وأساسيات برمجة الـ
AVR
عادة ما تم تنقسم البرامج البسيطة للمتحكمات إلى 3أجزاء أساسية: •
استدعاء المكتبات وتعريف الثوابت
•
الدالة الرئيسية للبرنامج Main Function
•
الدوال الضافية "إن وجدت"
هيكل الربرامج
الشكل التالي يوضح الهيكل الرئيسي لمعظم البرامج الخادصة بمتحكمات AVR
استدعاء المكتبات والتعريفات
#define F_CPU 1000000UL >#include #include
البرنامج الرئيسي
;PORTA = 0b00000001 ;)_delay_ms(500 ;PORTA = 0b00000000 ;)_delay_ms(500 } ;return 0 }
في الجزء الول من البرنامج نجد المر #defne F_CPU 1000000ULوالتي تعني تعريف
الثابت F_CPUبقيمصة = 1000000وه ذه السصرعة تعصبر سصرعة المعالصج الصداخلي )الصتردد الصذي
يعمل به المعالج داخل الممتحككم الدقيق( .يجب دائماا أن نضع هذه العبارة في بدايصصة أي برنامصصج للمتحكمات الدقيقة ،وكما سنرى في الفصول المتقدمة أنه يمكننا تغير هذا الرقم وكذلك سرعة
المعالج من 1ميجاهرتز إلى 16ميجاهرتز. ملحظصصة :الرمصصز ULفصصي العبصصارة #define F_CPU 1000000ULيعنصصي كلمصصة unsigned long وتستخدم للتحكم في حجم الثوابت والمتغيرات كما سنرى في الفصل القادم.
88
.4أساسيات التحكم GPIO Basics … .............................................................................................. فصصي السصصطر الثصصاني والثصصالث .قمنصصا باسصصتدعاء مكتبصصتين وهمصصا avr/io.hو util/delay.hويتصصم ذلصصك باسصصتخدام المصصر الخصصاص باسصصتدعاء المكتبصصات #includeثصصم يكتصصب اسصصم المكتبصصة داخصصل
قوسين ><....
•
>#include #include
التجارب القادمة(. •
المكتبة الثانية delay.hهي المسصصؤولة عصصن التلعصصب بصصالزمن وحسصاب الصصوقت الصصذي يمصر على تشغيل المعالج وهي المكتبة التي تمكننصصا مصصن إضصصافة تصصأخير زمنصي أو التحكصصم فصصي
وقت تشغيل أي مخرج.
ملحظة :كلمتي avrو utilالموجودة قبل أسماء المكتبات تعبر عن أسماء "المجلدات
”Foldersالتي تتواجد بها هذه المكتبات ،حيث قامت شركة ATmelبتوزيع المكتبات على مجلدات لتسهيل عملية تصنيفها. الجزء الثاني من البرنامج هو الدالة Mainوالتي ستحتوي بداخلها على البرنامج الحقيصصق الصصذي
يتم تشغليه على الممتحككم الدقيق .غالبا ما يتم تقسيم الص Mainإلى جزأين كالتالي: •
جلت Registers configurations العدادات الخادصة بالممس ك
•
البرنامج الذي يتم تشغيله باستمرار while loop { )int main(void جلت // هنا تكتب إعدادات الممس ك )while(1 { هنا تكتب كافة الكواد البرمجية //
التي سيتم تنفيذها بصورة مستمرة على الممتحككم الدقيق
// } ;return 0
} 89
.4أساسيات التحكم GPIO Basics … ..............................................................................................
إعدادات ممسجلات الدخل والخرج الرقمي Digtial I/O تمتلك ممتحككمات AVRعدد 3مسجلت أساسيات للتحكم في أي بورت والتي يتم ضصصبطها فصصي
جلت هي: الص Main functionأشهر هذه الممس ك
جل DDRx Register الممس ك
DDR x → Data Direction Register. PORT x → Port Output Register. PIN x → Port Input Register.
جل 8بت يتحكم في "اتجاه البيانات" ويعتبر المسؤول عن التحكم فصصي أطصصراف DDRxهو ممس ك
جل )وكصذلك أي بورت لتعمل إما كدخل Inputأو خرج ،Outputحصرف الن xفصصي نهايصصة اسصم الممسصص ك جلت( يعصصصبر عصصصن أحصصصد الرمصصصوز A,B,C,Dوهصصصي أسصصصماء البورتصصصات .فمثل DDRCهصصصو جميصصصع الممسصصص ك
جل اتجاه البيانات للبورت Cوالمسجل DDRAهو الخاص بالبورت Aوهكذا .. ممس ك
كل بت داخل هذا الممس كجل تتحكم في أحد الطراف الخادصة بصصالبورت حيصصث يعصصبر رقصصم 1عصصن أن
هذا الطرف يعمل كخرج outputأما 0فيعبر عن أن هذا الطرف يعمل كدخل .input
عندما نضبط أحد الطراف لتعمل كخرج فهذا يعني أنه يمكن تودصصصيل أي عنصصصر إلكصصتروني بهصصذا
الطرف والتحكم به خلل إرسال إشصارات كهربيصة إلصى " ”output signalهصذه العنادصصر قصد تكصون ...Led, Motor, LCD, Relay, speakerالخ .كما سنرى في التجارب القادمة.
أما إذا جعلنا هذا الطصرف يعم ل كصدخل عنصدها يمكن ك اسصتقبال إشصارة كهربيصة م ن خللصه "input ”signalمثل الشارات القادمة من المفاتيح switchأو الحساسات .sensors وكمصصصصصا نصصصصصرى فصصصصصي الجصصصصصدول التصصصصصالي )الخصصصصصاص بالمسصصصصصجل DDRAدصصصصصصفحة 66مصصصصصن دليصصصصصل بيانصصصصصات
.(ATmega16نجد أنه يتكون من 8بت بدءاا من البت رقم 0إلى البت رقم 7
يتم التحكم في هذه البتات عبر وضع القيمة المطلوب بها مباشرة مثل أن نكتب المر
;DDRA = 0b00000001 90
.4أساسيات التحكم GPIO Basics … .............................................................................................. جل DDRAوالتي تعني أن البت الولى فق ط هذا يعني أن نضع القيمة 00000001داخل الممس ك
= واحصصد أمصصا بصصاقي البتصصات = دصصصفر ممصصا يعنصصي أن الطصصرف PA0يعنصصي كخصصرج outputأمصصا بصصاقي الطراف في البورت تعمل كدخل inputكما في الصورة التالية:
وإذا قمنا بتعديل المر ليصبح:
;DDRA = 0b00000011 فهذا يعني أن الطرف PA0و PA1تعمل كخرج أما الطراف من P2إلى PA7تساوي دصفر
وتعمل كدخل.
وإذا قمنا بكتابة المر السابق ليصبح
;DDRA = 0b00001111 فهذا يعني أن أول 4أطراف من البورت PA0,1,2,3تعمل كخرج وأخر 4أطراف تعمل كدخل
91
.4أساسيات التحكم GPIO Basics … .............................................................................................. ملحظة :عندما نكتب رقم يبدأ ب 0bفي لغة السي مثل 0b00011100فهذا يعني أننا
نكتب رقم بالصيغة الثنائية binaryأما عندما نكتب رقم يبدأ ب 0xمثل 0xffفهذا يعني أن الرقم مكتوب بالصيغة .hexadecimalويمكنك أن تتعرف أكثر على أنواع الصيغ عبر قراءة الملحق المسمى "أساسيات اﻷنظمة الرقمية".
جلت والرقام الثنائية تبدأ العد من اليمين إلى اليسار وهذا يعني أيضاا لحظ أن جميع الممس ك أن الص ) LSBأول بت( هي البت الموجود على الطرف اليمن من الرقم 0bxxxxxxxxأما الص ) MSBأخر بت( فهي الموجود على الطرف اليسر بعد الحرف bمباشرة 0bxxxxxxxx كمصصا هصصو ملحصصظ فصصي الصصصورة الخادصصصة بالمسصصجل DDRAسصصنجد هنصصاك كلمصصة تسصصمى Initial value والتي تعني القيم الفتراضية لكل البتات والتي تسصاوي دصصفر ممصا يعنصي أن جمي ع الطصراف تعمصل
بصورة افتراضية كدخل. أيضصصاا سصصنجد أن أسصصفل كصصل بصصت كلمصصة Read/Writeوالصصتي تعنصصي أنصصه يمكنصصك تعصصديل محتصصوى هصصذا
جل writeكمصصصصا فعلنصصصصا فصصصصي المصصصصر DDRA=0b00000001أو يمكنصصصصك قصصصصراءة محتصصصصواه Read الممسصصصص ك جلت. وستتضح هذه الخادصية بالتفصيل في الفصل القادم حيث سنقوم بقراءة هذه الممس ك
جل PORTx Register الممس ك جل PORTxفصصي الخصصصرج الرقمصصصي لي طصصرف ،فمثلا عنصصصدما قمنصصا بتودصصصيل الصصدايود يتحكصصصم الممسصصص ك
جل ،ومثل الص DDRxفإنه الضوئي على الطرف PA0قمنا بتشغيله وإطفاءه باستخدام هذا الممس ك
يمتلك 8بت كل بت منهم تتحكم في أحد الطراف لكل بورت.
جل ) PORTAدصفحة 66من دليل البيانات(. الصورة التالية مثال على الممس ك
92
.4أساسيات التحكم GPIO Basics … .............................................................................................. جل تحمصل إمصا القيمصة LOW - 0أو القيمصة HIGH – 1وعنصدما يتصم وضصع كصل بصت فصي هصذا الممسص ك
القيمصصة = 1فهصصذا يعنصصي أن الممتحككصصم سننيخرج إشننارة كهربيننة logic HIGHوالصصتي سصصتكون 5 فولت )أو نفس قيمة فصارق الجهصصد الصصذي يعمصصل بصه الممتحككصصم( .أمصصا إذا كصانت القيمصة = دصصفر فهصذا
يعنصصي أن الطصصرف سصصيكون LOWأو 0فصصولت وسصصيتنقل إلصصى وضصصع الصصص ) sink modeسصصيتم شصصرح sink modeبالتفصيل في الفصل التالي(. في المثال السابق استخدمنا مجموعة الوامر
)while(1 { ;PORTA = 0b00000001 ;)_delay_ms(1000 ;PORTA = 0b00000000 ;)_delay_ms(1000 } هذه الوامر كانت تستخدم للتلعب بالقيم الخادصة بالمسجل PORTAكالتالي: المصصر PORTA = 0b00000001يعنصصي تغييصصر قيمصصة البصصت الخادصصصة بصصالطرف PA0لتسصصاوي 1أمصصا بصصاقي البتصصات تسصصاوي 0وهصصذا يعنصصي إخصصراج إشصصارة كهربيصصة بقيمصصة ) HIGH (5 voltعلصصى الطصصرف PA0والتي ستجعل الدايود الضوئي المتصل بهذا الطصرف يضصيء نتيجصة الشصارة الكهربيصة أمصصا
باقي الطراف تكون )LOW (0 volt المر _) delay_ms(1000يعني أن الممتحككم الدقيق سينتظر 1000مللي ثانية قبل تنفيصذ المصصر التالي )لحظ أن الص 1000مللي ثانية = 1ثانية(. المر PORTA = 0b00000000مثل المر السابق ولكن باختلف أن جميع البتات الن أدصبحت تساوي دصفر بما في ذلك البصت الخادصصة بصالطرف PA0ممصا سصيجل هصذا الطصرف يسصاوي LOW (0
) voltوسيؤدي ذلك إلى انطفاء الدايود الضوئي.
ثم يأتي المر _) delay_ms(1000ليجعل الممتحككم الدقيق ينتظر 1000مللي ثانيصصة مصصرة أخصصرى قبل أن يعاد تنفيذ جميع الوامر السابقة بسبب الدالة )while (1
93
.4أساسيات التحكم GPIO Basics … ..............................................................................................
نظرة عامة على المثال اﻷول
الكود التالي هو نفس المثال بعد إضافة تعليقات على كل سطر تشرح وظيفته. تحديد سرعة المعالج //
#define F_CPU 1000000UL
استدعاء المكتبات البرمجية //
>#include #include
تفعيل الطرف اﻷول ليعمل كخرج //
استمر في هذا البرنامج إلى ما ل نهاية //
)while(1 {
قم بتشغيل البت اﻷولى//
;PORTA = 0b00000001
انتظر 1000مللي ثانية //
;)_delay_ms(1000
قم بإطفاء البت اﻷولى //
;PORTA = 0b00000000
انتظر 1000مللي ثاني//
;)_delay_ms(1000 } نهاية البرنامج //
; return 0 }
ملحظة :العلمات //أو العلمات /* */تعني أن الكلم المكتوب هو تعليق commentول
يحتسب ضمن أكواد البرنامج ،ويعتبر استخدام التعليقات أمر هام جداا لتوضيح الكواد .لذا أنصحك أن تكتب دائماا تعليق على كل سطر برمجي أو دالة في برنامجك.
العديد من محترفي البرمجة قد يقومون بكتابة التعليقات حتى قبل البدء في كتابة الكواد نفسها ويساعدهم ذلك على تنظيم الفكار وتحديد ما يجب أن يكتب بصورة منظمة ،لذا
احرص دائماا على توضيح وشرح كل سطر برمجي تكتبة باستخدام commentيسبق هذا السطر
94
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.3المثال الثاني :استخدام 4دايود ضوئي
فصصي هصصذا المثصصال سنسصصتخدم 4دايصصوادت ضصصوئية حيصصث سصصنقوم بتطصصوير الكصصود المسصصتخدم فصصي
المثال الول ليعمل بع دد 4منن الندايودات ضنوئية .وكمصا ه و موضصح فصي الصصورة التاليصة نجصد الصصصدايودات متصصصصلة علصصصى الطصصصراف مصصصن PA0إلصصصى PA3سصصصواء كنصصصت تسصصصتخدم ATmega16أو
.ATtiny84
في حالة استخدام ATTiny84تكون التودصيلت كالتالي:
95
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الـكود الربرمجي تحديد سرعة المعالج // استدعاء المكتبات البرمجية //
#define F_CPU 1000000UL >#include #include
تفعيل أول 4أطراف كمخرج //
;DDRA = 0b00001111 )while(1 {
شغل الطرف اﻷول //
;PORTA = 0b00000001
انتظر نصف ثانية //
;)_delay_ms(500
شغل الطرف الثاني مع اﻷول //
;PORTA = 0b00000011
انتظر نصف ثانية //
;)_delay_ms(500
شغل الطرف اﻷول ،الثاني والثالث //
;PORTA = 0b00000111
انتظر نصف ثانية //
;)_delay_ms(500
شغل أول أربعة أطراف من البورت //
;PORTA = 0b00001111
انتظر نصف ثانية //
;)_delay_ms(500 } ;return 0
شرح الـكود
}
كمصصصا نصصصرى فصصصي المثصصصال بصصصالعلى ،يعتصصصبر مطصصصابق لنفصصصس المثصصصال الول بصصصاختلف أننصصصا اسصصصتخدمنا 4
جل DDRAليجعصل أول 4اطصصراف تعمصصل كخصرج PA0, PA1, دايودات وبالتالي قمنصا بضصبط الممسص ك PA2, PA3وبالتصصالي يمكصصن اسصصتغللها فصصي تشصصغيل الصصدايوادات الربعصصة .ثصصم يصصأتي الكصصود المكتصوب
داخصصل ) while (1والصصذي يقصصوم بتغيصصر محتصصوى PORTAبصصصورة تصصصاعدية بحيصصث يشصصغل دايصصود واحد كل 500مللي ثانية )نصف ثانية( .والصور التالية توضح ما سيحدث للدايودات.
96
.4أساسيات التحكم GPIO Basics … ..............................................................................................
97
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.4المثال الثالث :تشغيل جميع أطراف
PortA, Port B
فصصي هصصذا المثصصال سصصنقوم بتودصصصيل 16دايصصود علصصى جميصصع أطصصراف البصصورت Aو Bبحيصصث يتصصصل 8 دايودات ضوئية لكل بورت كما هو موضح بالصورة التالية
فصصي حالصصة الممتحككصصم ATTiny84سصصيتم تودصصصيل 11دايصصود فقصصط ) (3+8لن البصصورت Aيمتلصصك 8 أطراف بينما البورت Bيمتلك 3أطراف فقط كما هو موضح في الصورة التالية
98
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الـكود الربرمجي
تحديد سرعة المعالج // استدعاء المكتبات البرمجية //
تفعيل جميع أطراف Port Aكخرج // تفعيل جميع أطراف Port Bكخرج //
#define F_CPU 1000000UL >#include #include
شغل جميع أطراف // Port A
;PORTA = 0b11111111
شغل جميع أطراف // Port B
;PORTB = 0b11111111
انتظر نصف ثانية //
;)_delay_ms(500
إطفاء جميع أطراف // Port A
;PORTA = 0b00000000
إطفاء جميع أطراف // Port A
;PORTB = 0b00000000
انتظر نصف ثانية //
;)_delay_ms(500 } ;return 0 }
شرح الـكود في البرامج السابق قمنا باسصتخدام المسصصجلين DDRAو DDRBلتشصغيل جميصصع أطصراف البصصورت
Aوالبورت Bلتعمل كخرج .ثم قمنا باستخدام الممسجلين PORTAو PORTBلتشصغيل جميصع الصص Ledsعلى هذه الطراف لمدة نصف ثانية ثم إطفائها لنصف ثانية .وهكذا إلى ما ل نهاية. الصورة التالية تمثل محاكاة البرنامج السابق على بروتس مع الممتحككم ATmega16
99
.4أساسيات التحكم GPIO Basics … ..............................................................................................
تمارين إضافية •
قم بتشغل 8دايودات ضوئية على جميع أطصراف البصورت Aواجعلهصصا تضصيء بصالترتيب التصصصالي مصصع تصصأخير ربصصصع ثانيصصة فقصصط بيصصصن كصصصل أمصصصر) .ل تنسصصى أن جميصصع أطصصصراف البصصورت
ستعمل كخرج(
00000001 00000011 00000111 00001111 10000000 11000000 11100000 11110000 •
مصصصاهو أقصصصصى عصصصدد مصصصصن الصصصدايودات الضصصصوئية يمكصصصن تودصصصصيله بصصصالمتحكم ATmega16
والمتحكم ATtiny84؟
100
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.5المثال الرابع :تشغيل المقاطعة السباعية
7segment
"المقاطعة السباعية – تنطصق سصيفين سصيجمنت" 7segmentوه ي عبصارة عصصن مسصصتطيل دصصصغير يحتصصوي علصصى 7مقصصاطع مضصصيئة باسصصتخدام دايصصودات ضوئية )مت وفرة بصاللون الحمصر والخضصر والزرق(.وتسصتخدم ف ي عصرض
الرقام وبعض حروف اللغة النجليزية.
تتصصوفر هصصذه القطعصصة اللكترونيصصة فصصي السصصواق بمختلصصف الحجصصام فمنهصصا مصصاهو دصصصغير جصصداا مثصصل المسصصتخدمة فصصي السصصاعات الرقميصصة الرخيصصصة ومنهصصا مصصاهو كصصبير الحجصصم مثصصل المسصصتخدمة فصصي إشارات المرور )اللوحة المضيئة التي تعرض الوقت المتبقي لتفتح إشارة المرور(.
تتكون السيفين سيجمنت من 7دايودات ضوئية متصلة ببعضها البعض إما عن طريق تودصصصيل الطصصصرف المصصصوجب وتسصصصمى common anodeأو عصصصن طريصصصق تودصصصصيل الطصصصرف السصصصالب وتسصصصمى
) common cathodeسنستخدم في التجارب التالية النوع .(common cathodeويسمى كل دايصصود ضصصوئي بأحصصد حصصروف البجديصصة النجليزيصصة A,B,C,D,E,F,Gكمصصا هصصو موضصصح فصصي الصصصورة
التالية:
101
.4أساسيات التحكم GPIO Basics … .............................................................................................. لتشغيل هذا العنصر اللكتروني سنقوم بتودصيل الطصصراف السصصبعة a,b,c,d,e,f,gبأحصصد البورتصصات
في الممتحككم الدقيق )سنستخدم البورت .(A
ملحظة :بعض السيفن-سيجمنت المتوفرة في السواق )خاصة صغيرة الحجم( تحتوي
على طرف إضافي وهو دايود ضوئي دصغير موجود على الجانب اليمن السفلي ويستخدم في بعرض الفادصلة العشرية ) (.لكن برنامج بروتس ل يحتوي على هذا الدايود الضوئي لذا لن نستخدمه في المحاكاة(.
لعرض أي رقم من الرقام العشرية سنستخدم الجدول التالي والصصذي يوضصصح الحالصصة الصصتي يجصصب أن يكون عليها كل دايود ضوئي حتى يتم عرض رقم معين.
الشكل التالي يوضح طريقة تودصيل الممتحككم ATmega16بالسيفين-سيجمنت على البورت .A وسنقوم بكتابة كود بسيط يعرض الرقام من 0إلى 9بالترتيب وبتأخير زمني 1ثانية بين كل
رقم.
102
GPIO Basics أساسيات التحكم.4 .............................................................................................. …
الـكود الربرمجي #define F_CPU 1000000UL #include #include int main(void) { DDRA =0b11111111; while(1) { PORTA = 0b00111111; _delay_ms(1000); PORTA = 0b00110000; _delay_ms(1000); PORTA = 0b01011011; _delay_ms(1000); PORTA = 0b01001111; _delay_ms(1000); PORTA = 0b01100110; _delay_ms(1000);
// Number 0 // Number 1 // Number 2 // Number 3 // Number 4
103
GPIO Basics أساسيات التحكم.4 .............................................................................................. … PORTA = 0b01101101; _delay_ms(1000); PORTA = 0b01111101;
// Number 5 // Number 6
_delay_ms(1000); PORTA = 0b00000111;
// Number 7
_delay_ms(1000); PORTA = 0b11111111;
// Number 8
_delay_ms(1000); PORTA = 0b01101111;
// Number 9
_delay_ms(1000); } return 0; } .الصور التالية تمثل المحاكاة بعد ترجمة الكود السابق
104
.4أساسيات التحكم GPIO Basics … ..............................................................................................
شرح الـكود
البرنامصصصج السصصصابق قصصصام بتشصصصغيل السصصصيفن سصصيجمنت بحيصصصث تعصصصرض جميصصصع الرقصصصام مصصصن 0إلصصصى 9
جل .PORTA بصورة متتابعة وذلك عبر كتابة قيمة الرقم المطلوب داخل الممس ك
جل PORTA هناك ملحظة هامة حول هذا الكود وهي أن الرقام التي يتم وضعها داخل الممسصص ك
تعتصصبر معكوسصصة عصصن الجصصدول المكتصصوب بصصالعلى وذلصصك بسصصبب أن الطصصراف الصصتي قمنصصا بتودصصصيلها
على برنامج بروتس تم عكسها فبدلا من تودصيل a,b,c,d,e,f,gتم تودصيلها .g,f,e,d,c,b,a
أيضاا يمكنك كتابة بعض الحروف النجليزية البسيطة مثصصل A,C,F,E,H,Lكصل مصا عليصصك فعلصه هصو إضافة الجزء التالي للكود بالعلى )داخل الص .(while loop
;PORTA = 0b01110111 // Letter A ;)_delay_ms(1000 ;PORTA = 0b00111001 // Letter C ;)_delay_ms(1000 ;PORTA = 0b01110001 // Letter F ;)_delay_ms(1000 ;PORTA = 0b00111000 // Letter L ;)_delay_ms(1000 ;PORTA = 0b01110110 // Letter H ;)_delay_ms(1000 الصور التالية توضح عرض حروف البجدية النجليزية باستخدام السيفن-سيجمنت
105
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.6المثال الخامس :قراءة الدخل الرقمي
Inputs reading
في هذا المثال سنتعرف على طصصرق قصراءة الصصدخل الرقمصصي Digital Inputsوذلصك عصبر مجموعصة
من التجصارب باسصتخدام المفاتيصح .Switchsسصيتم اسصتخدام مفتصاح الضصغط Push buttonمصع
مقاومصصة 10كيلصصو اوم متصصصلة علصصى الرضصصي كصصدخل للطصصرف PB0وذلصصك للتحكصصم بتشصصغيل دايصصود ضوئي متصل على الطرف PA0كما هو موضح بالصورة التالية:
لعمل نفس الدائرة باستخدام الممتحككم الدقيق ATTiny84
106
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الـكود الربرمجي
#define F_CPU 1000000UL >#include
شرح الـكود
بصصصصورة افتراضصصصية تعمصصل جميصصصع أطصصراف الممتحككمصصصات الدقيقصصة كصصصدخل ) Input portليصصس AVR
فحسب وإنما معظم الممتحككمات الدقيقة من مختلف الشركات( لذا نجصصد الكصصود السصصابق ل يقصصوم
بضصبط أطصراف البصورت Bلتعمصل ك دخل ،ومصع ذلصك يمكنصك كتابصة المصر DDRB = 0b00000000
للتأكيد أن أطراف الممتحككم تعمل كدخل.
جل يقوم الممتح ككم الدقيق بصورة تلقائية بقصراءة محتويصات جمي ع الطصراف ويخزنهصا ف ي الممسص ك جل PINBيقصوم بتسصجيل ) PIN xحيث تمثل xاسصم البصورت مثصل … A,B,C,Dإلصخ( فمثلا الممسص ك جل قيمة الجهد الداخل على جميع أطصراف البصصورت Bبصصصورة مسصتمرة ويتصم تحصصديث هصذا الممسص ك
بنفصصس سصصرعة عمصصل الممتحككصصم الصصدقيق فمثلا إذا كصصان الممتحككصصم يعمصصل بسصصرعة 1ميجصصاهرتز فهصصذا
107
.4أساسيات التحكم GPIO Basics … .............................................................................................. جل PINBيتم تحديثة مليون مصرة فصي الثانيصة وفصي كصل مصرة يقصصوم بقصصراءة جميصع يعني أن الممس ك أطراف البورت .B
جل PINxعلى 8بتات كل بت تمثل قراءة الجهد على أحصصد أطصصراف البصصورت ،فمثلا يحتوي الممس ك
جل PINBنجصصصد أنصصصه يتكصصصون مصصصن البتصصصات التاليصصصة )جميصصصع جصصصداول PINxمتصصصوفرة فصصصي دليصصصل الممسصصص ك البيانات(.
البت رقم دصفر PINB0تمثل قراءة الطرف PB0والبت رقصم 1تمثصل قصراءة الطصرف PB1والبصت
رقم 2تمثل قراءة الطرف … PB2إلخ.
جلت PINxمن نوع Read onlyمما يعني أنه يمكنك جل PINBوجميع الممس ك ملحظة :الممس ك أن تقرأ منها فقط ول يمكنك أن تغير محتواها بنفسك بكتابة أي اكود برمجية حيث يتم جلت تلقائياا. تحديث الممس ك
في حالة عدم تطبيق أي جهد على أطراف الممتحككم تكون قيمة البتات = دصفر ويتم تغيصر هصذه القيمة عند تطبيق جهد على الطرف الموازي لكل بت .مثلا لصصو قمنصصا بتطصصبيق جهصد 5فصصولت علصصى
جل PINBتسصصصصاوي 0b00000111وإذا قمنصصصصا البصصصصت PB0و PB1و PB2سصصصصنجد أن قيمصصصصة الممسصصصص ك بتطبيق جهد على جميع البتات سنجد القيمة أدصبحت 0b11111111وهكذا ...
فصصي البرنامصصج السصابق اسصتخدمنا الجملصصة الشصرطة ) if (conditionلتشصغيل الصصدايود الضصصوئي عنصصد
الضغط على الزر حيث كتبنا المر.
)if(PINB == 0b00000001 };{PORTA = 0b00000001 جل PINBتسصصاوي ) 0b00000001يعنصصي تصصم الضصصغط والصصذي يعنصصي أنصصه إذا كصصانت قيمصصة الممسصص ك
على الزر المتصل بص (PB0قم بتشغيل الدايود الضوئي عبر المر PORTA = 0b00000001 else
};{PORTA = 0b00000000 وفي حالة عدم تطبيق هذا الشرط elseقم بإطفاء الدايود عبر PORTA = 0b00000000 108
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.7
Pull Up & Pull Down Resistor
من أشهر الكلمات التي قد تسمعها في عالم اللكترونيات الرقمية هي المقاومة رافعة الجهد أو
خافضة الجهد Pull-Up & Pull-Downهذه المقاومات التي تتراوح قيمتها بين 2.2كيلواوم
إلى 10كيلوأوم تستخدم بصورة أساسية في دخل النظمة الرقمية Digital Inputsبداية من البوبات المنطقية البسيطة مثل AND, OR, NOTوانتهائاا بالممتحككمات الدقيقة.
إذ اا لماذا استخدامنا هذا النوع من المقاومات مثل المقاومة الن 10كيلو أوم مع المفتاح في المثال السابق؟ ولماذا لم نوصل المفتاح بالن VCCمباشرة؟ هناك 3أسباب لهذا المر.. السننتخدام اﻷول )إلغنناء النندخل العننائم( :جميصصع المكونصصات اللكترونيصصة الرقميصصة الصصتي تتعامصصل
بالصصصفر والواحصصد تعصصاني مصصن مشصصكلة خطيصصرة جصصداا تسصصمى المنطقصصة العائمصصة Floating Areaأو
) Nosie Marginنطاق الشوشرة( هذه المنطقة هي فارق الجهد بين الص ) Logic (0والص )Logic (1 وتستخدم المقاومات pull-up or downفي حل هذه المشكلة. والسبب في ذلك أن معظصم المكونصات اللكتروني ة تعتصبر أي جه د دخل input voltageبين دصفر و 0.8فولت هو 0أو كما يسمى
Lowيبنما أي جهصصد بيصصن 2وحصصتى 5فصصولت يعتصصبر 1رقمصصي HIGH
لكصصصصن إذا كصصصصان هنصصصصاك دخصصصصل بقيمصصصصة 0.9فصصصصولت أو 1.25أو 1.9
تحدث مشنكلة المنطقنة العائم ة حيصث ل تسصتطيع اللكترونيصات الرقميصة أن تتعصصرف علصصى هصذا الجهصصد وبالتصصالي ل يمكنهصصا أن تحصصدد
بدقصصة هصصل هصصو ) HIGH(1أم ) LOW(0وتبصصدأ بالتصصصرف العشصصوائي )وقد تصاب الدائرة بنوع من الجنون(. بطبيعة الحال جميع الجهزة اللكترونية تصدر نوع من الصصص Electric noiseشوشصصرة كهربيصصة بمصصا في ذلك جسد النسان لصذا عنصد تصرك أي ط رف inputفصإنه يتعصرض لشوشصرة كهربيصة بفصرق جهصد
دصغير نسبياا مما يتسبب في دخول الجهاز بوضع الص .Floating Area
وجود مقاومة متصلة بطرف الدخل والطرف الرضي يضمن تماماا أن الطرف = دصفر حصصتى مصصع وجود الشوشصصرة ول يتصم تغييصصر هصذا الجهصد إل عنصد إدخصال جهصد كصبير نسصبياا مصصن المفتصاح مثصصل 5
فولت .وتكون قيمة المقاومة بين 2.2إلى 10كيلوأوم.
109
.4أساسيات التحكم GPIO Basics … .............................................................................................. يمكنك أن تجرب بنفسك تأثير المنطقة العامة عبر المثال السابق حيث يتصصم تركيصب الصصدائرة كمصصا
هصصصي علصصصى لوحصصة التجصصصارب breadboardبصصصدون مقاومصصصة 10كيلصصصو .ثصصصم حصصصاول أن تضصصصغط الصصصزر وشصصاهد مصصاذا سصصيحدث )سصصتجد أن الممتحككصصم الصصدقيق يبصصدأ باتخصصاذ قصصرارت عشصصوائية بمجصصرد أن
تقترب يدك من الممتحككم(.
السننتخدام الثنناني )عكننس الجهنند الننداخل( :فصصي بعصصض الحصصالت يكصصون مطلصصوب عكصصس الجهصصد
الداخل من المفتاح ،في المثصصال السصصابق تصصم تودصصصيل المقاومصصة مصصع المفتصصاح بأسصصلوب Pull-Down
مما يجعل المفتاح ميدخل جهد 5فولت للطرف PB0عند الضغط عليه وعند ترك المفتصصاح يكصصون الجهد دصفر فولت )أرضي(.
Press Button = HIGH Releas Button = LOW يمكصصن اسصصتخدام المقاومصصة الرافعصصة Pull-up Resistorلعكصصس هصصذا الجهصصد وبصصذلك يصصصبح الجهصصد
الساسي للطرف PB0هو HIGHوعند ضغط المفتاح يتحول هذا الجهد إلى دصفر )أرضي(. Press Button = LOW Releas Button = HIGH يتم تودصيل المقاومة الرافعة Pull-upبحيث ينعكس مكانها بين الص VCCوالمفتاح والصور
التالية توضح الفرق بين تودصيله الص Pull-UPوال Pull-Down
Pull-Down
Pull-Up
ملحظة :قد تستخدم مقاومات الص Pull-Up & Pull-Downمع بروتوكولت التصالت مثل
i2Cلعكس جهد النبضات ويتم استخدام مقاومات بقيمة تتراوح بين 2.2إلى 4.7كيلوأوم
110
.4أساسيات التحكم GPIO Basics … .............................................................................................. السننتخدام الثننالث )ممحننول تيننار إلننى جهنند( :بعصصض الحساسصصات الشصصهيرة
مثصصصل الميكروفصصصون Microphoneأو المقاومصصصة الضصصصوئية LDRأو الحراريصصصة NTCتقوم بتحويل الحرارة أو الضوء إلصى تغيصر فصي التينار الكهربصي ولي س
تغير ف ي الجهند ممصا يمثصل مشصكلة فصي فهصم ه ذه الحساسصصات .حي ث نجصد أن جميصع الممتحككمصات الدقيقة التي تحتوي على ADCيمكنها قراءة تغير الجهد فقط ول تستطيع التعرف على التيار الكهربي المتغير لذا يتصم اسصتخدام مقاومصصة Pull-Downأو Pull-Upلتحويصصل التيصصار المتغيصصر إلصى
جهد.
111
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.8خاصية الـ
Internal Pull-Up
تمتلك معظم ممتحككمات الص AVRخادصية جميلة جداا وهي أن أطراف البورتات تمتلصصك )مقاومصصة الرفع الداخلية (internal pull-upهذه المقاومة تجعلك تستخدم المفاتيصصح الصصتي تريصصدها بصصدون
أي مقاومصصات إضصصافية .الشصصكل التصصالي يوضصصح تركيصصب مقاومصصة الرفصصع الداخليصصة وهصصي عبصصارة عصصن
ترانزستور +مقاومة Rpuحيث يتحكم الترانزستور في تفعيل المقاومة أو إلغائها. بصصصورة افتراضصصية يتصصم إلغصصاء تفعيصصل هصذه المقاومصصة ويجصصب عليك أن تشغلها بنفسك وذلك عصصبر جعصصل الطصصرف المطلصصوب
جل PORTx يعمصصصصل كصصصصدخل inputثصصصصم الكتابصصصصة فصصصصي الممسصصصص ك لتفعيل هذه المقاومة
جل PORTxلصصصن يعمصصصل لكتابصصصة قيصصصم الخصصصرج لحصصصظ أن الممسصصص ك
ولكصصصصصن هنصصصصصا سيسنننننتخدم لتفعينننننل الترانزسنننننتور الخننننناص
بمقاومننة الننن pull-upفقننط .أيضصصاا تصصذكر أنصصه بعصصد تفعيصصل المقاومصصة يصصصبح تصصأثير الضصصغط علصصى المفتاح معكوس مما يعني أن قصراءة PINxتصصبح 0فصي حالصة الضصغط علصى المفتصاح وتصصبح 1
ترك المفتاح.
الصورة التالية توضح شكل تودصيل المفتاح مع تفعيل الص internal pull-up
112
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.9المثال السادس :تشغيل 3دايودات 3 +مفاتيح
فصصي هصصذا المثصصال سنسصصتخدم 3مفاتيصصح مصصع تفعيصصل خادصصصية الصصص Internal pull-upوبصصذلك سصصنوفر استخدام 3مقاومات 10كيلو .وسيتحكم كل مفتاح في تشغيل عدد من الدايودات بحيث: •
إذا تم الضغط على المفتاح المتصل بالطرف PB0يتم تشغيل دايود واحد فقط
•
إذا تم الضغط على المفتاح المتصل بالطرف PB1يتم تشغيل 2دايود
•
إذا تم الضغط على المفتاح المتصل بالطرف PB2يتم تشغيل 3دايود
جل PINxمعكوسة لذا تذكر أنه بعد تشغيل مقاومة الرفع تصبح قراءة المفتاح والممس ك سنجد القيمة الفتراضية للمسجل PINx = 0b11111111وعند الضغط على أي مفتاح
ستتحول البت المقابلة له إلى دصفر ،فمثلا الضغط على المفتاح المتصل ب PB0سيجعل قيمة PINBتساوي 0b11111110
113
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الـكود الربرمجي #define F_CPU 1000000UL >#include
تفعيل خرج لتشغيل الثل ث دايودات ضوئية //
)int main(void { ;DDRA =0b00000111
تأكيد أن جميع أطراف البورت تعمل كدخل//
;DDRB = 0b00000000
تفعيل مقاومة الرفع لكل أطراف البورت // B
;PORTB = 0b11111111
)while(1 { if (PINB == 0b11111110) {PORTA = 0b00000001;} // Button 1 pressed else if (PINB == 0b11111101) {PORTA = 0b00000011;} // Button 2 pressed else if (PINB == 0b11111011) {PORTA = 0b00000111;} // Button 3 pressed };else {PORTA = 0b00000000 } ;return 0
شرح الـكود
}
في البداية قمنا بتشغيل جميع أطراف البورت Bلتعمل كدخل )تذكر أن هذه الخطوة اختيارية
وهدفها التأكيد فقط( ثم قمنا بتفعيل جميع مقاومات الص Pull-UPعلى أطصصراف البصصورت Bوذلصصك
عبر المر PORTB = 0b11111111 جل PINBومقارنصصة محتصصواه مصصع مجموعصصة مصصن ثصصم بصصدء البرنامصصج الساسصصي فصصي قصصراءة الممسصص ك
الشروط بحيث إذا كصانت القيمصصة = ) 0b11111110تصم الضصغط علصى الصزر المتصصل ب (PB0 يتم تشغيل الدايود المتصل بالطرف PA0
114
.4أساسيات التحكم GPIO Basics … .............................................................................................. وإذا كصصصانت القيمصصصة تسصصصاوي 0b11111101فهصصصذا يعنصصصي انصصصه تصصصم الضصصصغط علصصصى الصصصزر المتصصصصل بالطرف PB1وسيؤدي ذلك لتشغيل الدايودات على الطراف PA0 + PA1ونفس المر مع الزر الثالث )المتصل بالطرف (PB2والذي سيشغل الدايودات الثلثة .PA0, PA1, PA2
115
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.10
Bouncing effect & De-bouncing
يعرف تأثير القفز Bouncing effectبأنها ظاهرة تحدث للمفاتيح switchsالميكانيكيصصة خادصصصة مفاتيح الضغط Push Buttonsحيث تتكون هصذه المفاتيصصح عصصادة مصصن شصصريحتين مصصن الصصصفائح المعدنيصة والصتي عنصد الضصغط عليهصا يحصدث بينهصم تلمصس .contactلكصن بسصبب طريق ة دصصناعة هصصذه الصصصفائح فصصإنه عنصصد الضصصغط عليهصصا تقفصصز اللصصواح المعدنيصصة أكصصثر مصصن مصصرة ،هصصذا المصصر يجعصصل
الصفائح تقوم "بعشرات التلمسات" في الثانية الواحدة قبل أن تستقر.
تعتصبر ه ذه الظصاهرة مصن المصور المزعجصة لمصصممي النظصم المدمجصة وذلصك لنهصا تجعصل المفاتيصح
الميكانيكية تنتج إشارات غير مطلوبة قد تؤثر على أداء النظام المدمج ككل .من حسصصن الحصصظ أنه هناك العديد من الحلول المتوفرة لهذه الظاهرة وتسمى هذه الحلول debouncing
الحل اﻷول :التأخير الزمني هذا الحل يعتبر أبسط طريقة وتسمى software debouncingحيث تعتمد هذه الطريقة علصصى
التأكد "مرتين" من الضغط على المفتاح مع وضع تأخير زمني بين كل مصصرة .الكصصود التصصالي يمثصصل
تشغيل دايود ضوئي عند الضغط على مفتاح ) والثاني( الكود التقليدي لقراءة المفتاح بدون debouncing
};if (PINB == 0b11111110) { PORTA = 0b00000001 قراءة المفتاح باستخدام ال )software debouncing (delay
تأخير زمني// إعادة التأكد أن المفتاح مازال مضغوط //
)if (PINB == 0b11111110 { ;)delay_ms(10 )if (PINB == 0b11111110
};{ PORTA = 0b00000001 } هصصذه الطريقصصة لهصصا عيصوب كصصثيرة جصصداا منهصصا أنهصصا ل تحصصل مشصصكلة الذبصذبات الكهربيصصة نفسصصها ولكنهصصا تتأكصصد فقصصط مصصن ضصصغط المفتصصاح لفصصترة كافيصصة حصصتى تنتهصصي تلصصك الذبصصذبات كمصصا أنصصك تضصصطر إلصصى إضافة تأخير زمني للبرنامصصج ممصصا قصد يتسصبب فصي تصصأخير اسصتجابة النظصصام ككصل خادصصة إذا كنصصت
116
.4أساسيات التحكم GPIO Basics … .............................................................................................. تقرأ أكثر من مفتاح .وفي حالة استخدام نظام تشغيل RTOSل يمكن استخدام هصذا النصصوع مصصن التأخير الزمني بصورة مباشرة )سيتم شرح التأخير الزمني لنظام ROTSبالتفصصصيل فصصي الفصصصل
السابع(.
الحل الثاني :استخدام فلتر )مرشح( هصصصذا الحصصصل يعتمصصصد علصصصى اسصصصتخدام دائصصصرة filterلترشصصصيح الذبصصصذبات الكهربيصصصة الناتجصصصة عصصصن الصصصص
bouncing effectوتسصصصصصمى Hardware Debouncingحيصصصصصث تسصصصصصتخدم هصصصصصذه الصصصصصدائرة فصصصصصي امتصاص الذبذبات الكهربية وتمنع دخولها للمتحكم الدقيق. أبسصصصط دائصصصرة مرشصصصح هصصصي تودصصصصيل مكثصصصف سصصصيراميكي علصصصى التصصصصوازي مصصصصع المفتصصصصاح Ceramic - capacitorبقيمصصصصة 0.1 ميكروفصصاراد )يكصصون مكتصصوب علصصى المكثصصف الرقصصم .(104مصصع العلصصم أنصصه يمكصصن تودصصصيل هصصذا المكثصصف سصصواء كنصصت تسصصتخدم
المفتاح مع Pull upأو Pull down resistor
هنصصصاك دوائصصصر أخصصصرى أكصصصثر تعقيصصصداا وقصصصوة فصصي الترشصصصيح مثصصصل
استخدام مقاومة 10كيلو +دايود +مكثف )بنفصصس القيمصصة( .أو باسصصتخدام دوائصصر رقميصصة مثصصل AND gatesلعمل .digital trigger
على أي حال ،استخدام مكثصف واحصد فقصط كصافي لفلصترة الذبصذبات الكهربي ة الغيصر مرغصوب فيهصا
ول داعي لبناء دوائر أكثر تعقيداا كما أنه أوفر من ناحية للتكلفة. •
الممينننزات :الفضصصصل مصصصن ناحيصصصة الداء .متوافقصصصة مصصصع جميصصصع الممتحككمصصصات الدقيقصصصة ول تتطلب أي تأخير زمني في الكود كمصا أنهصصا لصصن تتسصبب فصصي مشصاكل للصصص Interruptsأو الصصص
•
117
RTOS العيوب :زيادة التكلفة بسبب استخدام مكونات إضافية مع المفتاح.
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.11حساب المقاومة المستخدمة قبل اﻷحمال
ال ك حمل Loadهو أي جهاز يتصل بخرج الممتحككم الدقيق مثل الدايود الضوئي ،في المثلة السابقة لحظنصصا وجصصود مقاومصصة قبصصل كصصل دايصصود بقيمصصة ) 330أوم( ،لمصصاذا اسصصتخدمنا هصصذه المقاومصصة وبتلصصك
القيمة تحديداا؟
هناك سببان لهذا المر .الول هو أن الدايود الضوئي )خادصة اللون الحمر( يفضل أن يت م تشصغيله
بتيار كهربي ما بين 15إلى 20مللي أمبير عند تطبيق فرق جهد 5فولت .وبالتعويض في قانون أوم الكهربي )فرق الجهد 5فولت – التيار 15مللي أمبير(
)Voltage(V )=Current (I )× Resistance ( R نجد أن المقاومة المناسبة هي 330أوم . إذا لم تستخدم هصذه المقاومصة قصد تحصدث العديصد مصن المشصاكل .فمثلا إذا تعصرض الصدايود الضصوئي
الحمر لكثر من 25مللي أمبير لفترة طويلة نسبياا ) ساعة أو أكثر( ف أنه سصيحترق وبالتأكيصد أنصت ل تريد دائرة إلكترونية تحتاج لتغيير دايود ضوئي كل ساعة !
ثانيصص اا :قصصد يصصؤدي تشصصغيل الحمصصال بصصدون مقاومصصة لفصصترات طويلصصة إلصصى تصصدمير أطصصراف )بورتصصات(
الممتح ككم الصدقيق .وذلصك بسصبب محدوديصة التيصار الكهربصي الصذي يمكصن سصحبه مصن كصل طصرف ،إذا نظصصصصرت إلصصصصى الصصصصصفحة الخادصصصصصة بالخصصصصصائص الكهربيصصصصة للمتحكصصصصم Electrical Charchtaristics
)دصفحة 291دليل بيانصصات الممتحككصصم .(ATmega16سصصتجد جصصدول الصصص " Absolute valuesالقيصصم المطلقة" وهي أقصى قيم كهربية يتحملها الممتحككم الدقيق.
118
.4أساسيات التحكم GPIO Basics … .............................................................................................. لحظ السطر قبل اﻷخير حيث نجد DC current per I/O = 40 mA هذا يعني أن أقصى تيار يمكن سحبة من أي ط رف مصن أطصراف الممتحككصم = 40مللصصي أمصبير وإذا
كان ال ك حمل يسحب أك ثر م ن ذلصك فهصذا سصيؤدي إلصى تل ف الممتحككصم الصدقيق .عليصك أن تت ذكر هصذا الرقم جيداا عند تصميم أي دائرة إلكترونية.
الفضل أن تسحب الحمال تيار = %85من القيمة القصصوى وذلصك ح تى تضصمن أن يكصون العمصر
الفتراضي للمتحكم الدقيق أطول ما يكون .فمث لا إذا طبقنا هذه القاعدة سصصنجد أن التيصصار المصصن
هو 34 = 40 * 0.85مللي أمبير. هذا يعني أن أقل مقاومة يمكن توصيلها على أي طرف من أطراف الممتحككننم )مننن قننانون أوم( تساوي 147أوم ،مع ملحظة أننه يمكنن توصنيل أي قيمننة أعلنى ﻷن المقاومنات اﻷكنبر سنتمرر تيار كهربي أقل وهذا آمن تماماا.
119
.4أساسيات التحكم GPIO Basics … ..............................................................................................
توصيل أحمال بتيارات كبيرة أغلصصب الممتحككمصصات الدقيقصصة سصصواء القديمصصة أو حصصتى الحديثصصة نسصصبياا مثصصل ARMل تسصصتطيع أن
تشصصغل أحمصصال تسصصحب تيصصار أعلصصى مصصصن 50مللصصي أمصصبير )أغلصصب ممتحككمصصات ARMيمكنهصصا إمصصداد
الحمال بتيار ما بين 15إلى 25مللي أمصصبير( .لحصصل هصصذه المشصصكلة يتصصم اسصصتخدام دوائصصر القيصصادة Driver circuitsهذه الدوائر عبارة عن عنادصر تعمل كمكبر للجهد أو التيار أو كليهما.
عادة ما تبنى هذه الدوائر باستخدام الترانزستور سواء BJTمثل NPNأو الصصص MOSFETويكصصون الفصصصصصارق الساسصصصصصي بينمهصصصصصا هصصصصصو أقصصصصصصى تيصصصصصار يمكصصصصصن أن يتحملصصصصصه الترانزسصصصصصتور .حيصصصصصث تتميصصصصصز
ترانزستورات MOSFETبتحمل تيارات قد تصل إلى 40أمبير علصى عك س الصصص )NPN (or PNP والتي ل تتحمل أكثر من 5أمبير كأقصى تقدير. لنأخذ مثال علصى ه ذه الصدوائر :لنفصترض أنصك تريصد تشصغيل 5دايصودات ضصوئية ويجصب أن تعمصل
مع اا في نفصس الصوقت ،سصنجد أنصه يتصوفر خيصاران لتشصغل هصذه الصدايودات ،الول هصو اسصتخدام 5 أطراف من المتحكم الدقيق وتودصيل كل دايود على طرف مستقل ولكن هذا الخيار يعد إهصصدار
لطراف المتحكم. الخيار الثاني هو تودصيل الص 5دايودات كلها على طرف واحد باستخدام دائرة قيادة )وذلك لن الصصدايودات الخمسصصة ستسصصهلك 75 = 15×5مللصصي أمصصبير ،وهصصذا أكصصبر بكصصثير ممصصا قصصد يتحملصصه المتحكم على طرف واحد(.
دائرة الترانزستور 2n2222
ميعد هذا الترانزستور أشهر أفراد عائلة الص NPNوأكثرهصصا تصصوافراا فصصي السصصواق ،كمصصا يتميصصز بالسصصعر المنخفض )يمكنك شراء نحو 10قطع منه بدولر واحد( ويسصصتطيع تشصصغيل أحمصصال بتيصصار يصصصل إلصصى نصصصف أمصصبير ) 500مللصصي( ،بصصافتراض أنصصك لصصم تجصصده فصصي السصصوق المحلصصي يمكنصصك شصصراء أحصصد
البدائل مثل: •
– 2n3904مماثل للص 2n2222باستثناء أنه يتحمل 380مللي أمبير فقط
•
- BC547مماثل للص 2n2222باستثناء أنه يتحمل 100مللي أمبير فقط
120
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الدائرة بالعلى تمثل طريقة تودصيل المتحكم الدقيق مع الترانزستور ،حيث يتصصم تودصصصل طصصرف
المتحكم بقاعدة الترانزستور Baseمصصن خلل مقاومصصة يجصصب أن تكصون قيمتهصصا مصصا بيصصن 150اوم إلى 1كيلو اوم.
يتم تودصيل الدايودات الضوئية على طرف المجمع collectorمع وضع مقاومصصة 300اوم قبصصل كصصصل دايصصصود )لحمايصصصة الصصصدايود( ويتصصصم تودصصصصيل طصصصرف المشصصصع Emitterبصصصالطرف الرضصصصي ،،نظريصصصاا
تستطيع هذه الدائرة أن تشصغل حصتى 30دايصصود ضصوئي )مصصن النصوع أحمصر اللصصون( لكصن كمصا أشصصرنا
مسبقاا يستحسن أن يتم تشغيل أي عنصر إلكتروني بحد أقصى %85من قصصدرته الكاملصصة وهصصذا يعني أن أقصى تيار للحمال المتصلة على 2n2222يجب أن يكون 400مللي أمبير فقط.
بعد النتهاء من توصيل هذه الدائرة يمكنك اختبارها عبر نفس المثال اﻷول Blinking led ملحظة :يتم استخدام مقاومة بين طرف المتحكم وقاعدة الترانزستور لن أغلب الترانزستورات ل تتحمل تيار على طرف القاعدة أكبر من 10مللي أمبير
121
.4أساسيات التحكم GPIO Basics … ..............................................................................................
تشغيل الم مرحركات
DC
تعد المحركات )المواتير (Motorsمن اشصهر العنادصصصر اللكتروميكانيكيصة والصصتي عصادة مصصا نجصدها فصصي النظمصصة المدمجصصة الخادصصصة بالروبوتصصات ،مصصن أشصصهر هصصذه المحركصصات الصصص ) DC motorمحصصرك التيار المستمر( .هذا المحرك من المكونات التي تستهلك الكصصثير مصصن التيصصار الكهربصصي لصصذا ل يمكصصن
تودصليه مباشرة بالمتحكم الدقيق ويجب أن نستخدم Driver circuitلتشغيله. أبسط دائرة لتشغيل المحرك هي نفس الدائرة السابقة مع وجود بعض التعديلت البسيطة ملحظة :يحتوي برنامج بروتس على محرك DCيسمى ) Active (Animated DCوهذا هو الموجود في الصورة بالسفل.
كما نرى من الصورة بالعلى يتم تودصيل المحرك في نفس مكصصان الصصدايودات الضصصوئية باسصصتثناء وجصصصصود دايصصصصود 1n4001متصصصصصل بطرفصصصصي المحصصصصرك ،يسصصصصتخدم هصصصصذا الصصصصدايود فصصصصي الحفصصصصاظ علصصصصى الترانزستور والمتحكم الدقيق من ظاهرة التيار المستحث العكسي.
هصصذه الظصصاهرة تحصصدث مصصع جميصصع الحمصصال الصصتي تتكصصون مصصن ملصصف Coilمثصصل المحصصرك أو الممر ك حصصل
Relayوذلك بسبب أن الملفصصات النحاسصصية تسصصتطيع أن تخصصزن بعصصض الطاقصصة بصصداخلها وعنصصد قطصصع
122
.4أساسيات التحكم GPIO Basics … .............................................................................................. الكهربصصاء عنهصصا فإنهصصا تقصوم بتفريصصغ هصذه الطاقصصة المخزنصة علصى هيئصة تيصار عكسصي وقصد يصصؤدي هصذا
التيار إلى تضصصرر الترانزسصتور والمتحكصم الصدقيق ،ويتصم اسصتخدام الصدايود بصصورة معكوسصة كمصا في الصورة السابقة لكي يمنع مرور هذه التيار من المحرك إلى الترانزستور ملحظة :في حالة استخدام ترانزستور NPNمثل الص 2n2222يستحسن أن تستخدم مقاومة على طرف المشع )قبل أن يتصل بطرف الص (GNDوذلك للحفاظ على الترانزستور من
السخونة والحتراق وهو ما يعرف باسم الص ،thermal stabilityحيث أن مرور التيار الخاص بتشغيل المحرك مباشرة إلى الترانزستور NPNبدون وجود هذه المقاومة قد يؤدي إلى ارتفاع درجة حرارة الترانزستور مع الوقت ثم يحترق.
بالرغم أن الدائرة السابقة تصلح لتشغيل المحرك إل أنه يفضل استخدام أحد الترانزستورات الصص MOSFETبصصصدل الصصصص NPNحيصصصث أنهصصصا تسصصصتطيع تحمصصصل التيصصصار الكهربصصصي العصصصالي مثصصصل الترانزسصصصتور ) IRZ44Nالذي يمكنه تحمل حتى 41أمبير( كما هو موضح بالصورة التالية:
هصصذا الترانزسصصتور يتميصصز بوجصصود دايصصود الحمايصصة مدمصصج بصصداخله كمصصا هصصو موضصصح بالصصصورة لصصذا ل داعي لضافة الدايود .1n4001يمكنك تجربة هذه الدائرة بنفس الكود الخاص بالمثال الول.
123
.4أساسيات التحكم GPIO Basics … ..............................................................................................
4.12تشغيل الم مرحرك في كلا الاتجاهين
جميع التجارب السابقة لتشغيل المحرك ىدائرة القيادة المعتمدة علصصى الترانزسصصتور كصصانت تعمصصل
علصصصى تشصصصغيل المحصصصرك فصصصي اتجصصصاه واحصصصد فقصصصط ،مصصصاذا إذا أردنصصصا تشصصصغيل المحصصصرك فصصصي اتجصصصاهين
مختلفين؟
يمكننصصا ذلصصك باسصصتخدام مصصا يعصصرف باسصصم H-Bridgeوهصصي قنطصصرة مكونصصة مصصن 4ترانزسصصتور علصصى
شكل الحرف Hويتصل المحرك بوسط هذه القنطرة مثل الشكل التالي:
ملحظننننة :الصصصصدوائر الصصصصتي تحتصصصصوي علصصصصى حرفصصصصي A,Bتسصصصصمى Default Terminalوهصصي نقصصاط تودصصصيل تسصصتخدم لتودصصصيل المكونصصات ببعضصصها
البعصصض بصصصورة سصصهلة بصصدلا مصصن السصصلك المتداخلصصة ويمكنصصك الودصصصول إليها عبر الضغط على قائمة Terminalثم اختيار .Default
لتودصيل أكثر من نقطة ببعضصها البعصض كصل مصا عليصصك فعلصصه هصو الضصصغط علصصى هصصذه الصصدائرة وتسصصميها بحصصرف معيصصن مثصصل A,B,C,Dوسصتقوم هصصذه الدوائر بتودصيل جميع الدوائر المسماه بنفس السم ببعضها البعض.
124
.4أساسيات التحكم GPIO Basics … ..............................................................................................
مبدأ عمل قنطرة H تعمل الص H-bridgeمثل 4مفاتيح ،كما هو موضح في الصورة التالية
يعمل كل مفتاحين مع بعضصصهما البعصصض ،فإمصصا أن يتصصم إغلق المفتصصاح S1و S4بحيصصث يمصصر التيصصار الكهربي من الطرف اليسر إلى الطرف اليمن للمحرك )بذلك يدور المحرك مصصع عقصصارب السصصاعة(،
أو يتصصم إغلق المفتصصاحين S2و S3بحيصصث يمصصر التيصصار الكهربصصي مصصن الطصصرف اليمصصن إلصصى الطصصرف اليسر وبالتالي يدور المحرك عكس عقارب الساعة.
125
.4أساسيات التحكم GPIO Basics … ..............................................................................................
الربرنامج
لتشصغيل ه ذه القنطصرة يتصم اسصتخدام طرفيصن مثصل PA0و PA1حي ث يتصصل كصل طصرف بعصدد 2 من الترانزستورات كما هو موضح في الصورة الولى ،ويتم التحكم باتجصصاه دوران المحصصرك عصصن
طريق تشغيل الطرف PA0وإطفاء PA1أو العكس )لتغير اتجاه دوران المحرك(.
#define F_CPU 1000000UL >#include #include
;PORTA = 0b00000001
انتظر لمدة ثانيتين //
;)_delay_ms(2000
تشغيل المحرك عكس عقارب الساعة //
;PORTA = 0b00000010
انتظر لمدة ثانيتين //
;)_delay_ms(2000
إطفاء جميع الترانزستور وإيقاف المحرك //
;PORTA = 0b00000000
انتظر لمدة ثانيتين //
;)_delay_ms(2000 } ;return 0 }
126
الفصل الخامس ” قل للذي أحصى السنين مفاخرا يا صاح ليس السر ر في السنوات للكنه في المرء كيف يعيشها في يقظة ،أم في عميق سبات ‟
إيليا أبو ماضي – شاعر عربي
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
.5قواعد لغة السي للظنظمة المدمجة
في هذا الفصل سنتعلم بعض القواعد والصيغ الشهير للغة السي المعيارية والمستخدمة بشكل كصصصبير فصصي تطصصوير النظمصصة المدمجصصة .تتميصصز الصصصيغ المعياريصصة بإمكانيصصة تطبيقهصصصا علصصصى مختلصصف
الممتحككمات الدقيقة طالماا أن المترجم الخاص بها يدعم لغة السي. ✔
أنواع البيانات في النظمة المدمجة Data-types
✔
العمليات الحسابية واختصاراتها Arithmatic operations
✔
العمليات المنطقية واختصاراتها Logic operations
✔
عمليات الزاحة
✔
التلعب بالبتتات
128
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
5.1أنواع البيانات في الأنظمة المدمجة
Data-types
فصصصصي عصصصصالم النظمصصصصة المدمجصصصصة هنصصصصاك معيصصصصار مختلصصصصف قليلا لتعريصصصصف البيانصصصصات مثصصصصل المتغيصصصصرات
والثوابت .حيث نجد أن معظم الممتحككمصصات الدقيقصة خادصصصة مصصن فئصصة Bit-8تمتلصصك قصدر محصصدود
جداا من الذاكرة سواء الص ROMأو الص ) RAMبعض الممتحككمات قد يمتلك 128بايت فقط مصصن الصصص .(RAMمما يتطلب أسلوب فعال لكتابة أكواد تحقق الهدف المطلوب بأقل استهلك للذاكرة. مثلا فصصي حالصصة كتابصصة برنامصصج بلغصصة السصصي علصصى الحاسصصب اللصصي التقليصصدي والصصذي يمتلصصك معالصصج وذاكصصرة ضصصخمة )تقصصدر بالجيجصصا بصصايت(وكلهمصصا مخصصصص للتعامصصل مصصع البيانصصات 32أو 64بصصت،
سصصصصنجد أن معظصصصصم المتغيصصصصرات الرقميصصصة تكصصصصون intأو doubleأو floatأمصصصصا فصصصصي حالصصصصة النظمصصصصة
المدمجة يعد استخدام هذه النواع "اهدار للذاكرة" لصصذا سصصنتعلم فصصي هصصذا الجصصزء كيفيصصة برمجصصة
أنواع البيانات المختلفة بصورة ممحسنة خصيصاا لذاكرة الممتحككمات الدقيقة.
البيانات الرقمية
تعتبر الرقام هي أكثر أنواع البيانات استخداماا في عصالم النظمصة المدمجصة فهصي تعصبر عصصن قيصم المتغيرات مثل قراءات الحساسات )حرارة ،ضغط ،رطوبة ،ضوء.. ،الصصخ( أو قيصصم المخصصارج مثصصل
قيمة أي PORTأو سرعة Motorأو توقيت زمنصصي ..إلصصخ .وتعتصبر الرقصام هصي أكصثر مصا يسصتهلك الذاكرة )خادصة الص (SRAMلذا سيكون لها نصيب كبير من الشرح في هذا الفصل.
أنواع البيانات التقليدية هصصذه القائمصصة تمثصصل أشصصهر أنصصواع البيانصصات المسصصتخدمة فصصي تعريصصف المتغيصصرات فصصي لغصصة السصصي مصصع
حجم الذاكرة الذي تستهلكه كل منها .مع العلم أنه يمكنك برمجة جميع النظمة المدمجة بها.
أنواع البيانات التي تستخدم في حفظ الرقام والموجبة والسالبة تسمى signed numbers أما إذا وضعنا قبلها كلمة unsignedفإنها تصلح للتعامل مع الرقام الموجبة فقط ولكن بضعف مساحة التخزين
129
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. نوع البيانات
أقصى قيمة يمكن وضعها داخل المتغير استهلك الذاكرة )عدد (Bytes
-32,768 → +32,767
)2-bytes (16 bit
int
65,535
)2-bytes (16 bit
unsigned int
1.2E-38 to 3.4E+38
)4-bytes (32 bit
float
2.3E-308 to 1.7E+308
)8-bytes (32 bit
double
-2,147,483,648 → +2,147,483,647
)4-bytes (32 bit
long
4,294,967,295
)4-bytes (32 bit
unsigned long
- 9.223372037×10¹⁸ + 9.223372037×10¹⁸
)8-bytes (64 bit
long long
1.844674407×10¹⁹
)8-bytes (64 bit
unsigned long long
ملحظة :نوعي البيانات floatو doubleدائماا يكونا من نوع Signedول يمكن استخدام العلمة unsignedمعهما
كما نلحصظ مصن الجصصدول السصابق أن جميصع أنصصواع البيانصات الشصهيرة تسصتهلك مسصاحة تبصصدأ مصن 2
بايت حتى 8بايت وتعتبر ه ذه المسصاحة كصبيرة نسصبياا فصي عصالم النظمصة المدمجصة .فمثلا قيمصة
جل مثل PORTxأو PINxأو DDRxلن تزيد أبداا عن 8بت. أي ممس ك
والن لنتخيصصل أننصصا نحتصصاج متغيصصر اسصصمه ButtonStatusمصصن نصصوع intو سيسصصتخدم هصصذا المتغيصصر
جل PINBمن نوع 8بت إذا كصل مصا يتطلبصه هصو في حفظ قراءة أطراف البورت Bوبما أن الممس ك
متغيصصر بسصصعة 8بصصت فقصصط ول داعصصي أبصصداا لسصصتخدام متغيصصر بمسصصاحة 16بصصت .لصصذا فجميصصع أنصصواع البيانات السابقة تعتبر اهدار للذاكرة.
لحل هذه المشكلة يتم استخدام أنواع البيانات المعيارية ANSI C - C99وهي دصصصورة محسصصنة لنصصواع البيانصصات وتمكننصصا مصصن اختيصصار قيمصصة المتغيصصرات بالدقصصة والطصصول المطلصصوب دون أي اهصصدار
للذاكرة. أقصى قيمة
130
Unsigned
أقصى قيمة
0 → 255
uint8_t
-128 → +127
int8_t
0 → 65,535
uint16_t
-32,768 → +32,767
int16_t
0 → 4,294,967,295
uint32_t
→ -2,147,483,648 +2,147,483,647
int32_t
1.844674407×10¹⁹
uint64_t
- 9.223372037×10¹⁸ + 9.223372037×10¹⁸
int64_t
Signed
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. يستهلك كصل متغيصر مصن القائمصة السصابقة مسصاحة = الرقصم المكتصوب بعصد كلمصة intأو uintفمثلا
int8_tتعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع intويصصصصلح لتخزيصصصن الرقصصصام الموجبنننة والسنننالبة فصصصي مسصصصاحة تخزينيصصصة = 8بصصصت فقصصصط ) 1بصصصايت( .بينمصصصا uint16_tيعنصصصي أن هصصصذا المتغيصصصر مصصصن نصصصوع
unsigned intويصصصلح لتخزيصصن الرقصصام الموجبصصة فقصصط بمسصصاحة تصصصل إلصصى 16بصصت ) 2بصصايت(.
والن لنأخذ مجموعة من المثلة: ما هو نوع المتغير المطلوب للقراءة أو الكتابة في أي بورت )مثل (port A, B,C؟ •
جل PINxوالصصصذي يكصصصون 8بصصصت بمصصصا أن جميصصصع البورتصصصات يتصصصم قراءتهصصصا مصصصن خلل الممسصصص ك
جل PORTxوالصذي يعتصبر 8بصصت أيضصصاا وكذالك يتم كتابة في أي بورت باسصتخدام الممسصص ك
إذا أفضل نوع بيانصات هصو uint8_tحيصث يمكنصه تخزيصصن الرقصصام مصن 0b0000000إلصى 0b11111111 ما هو المتغير المناسب لتخزين عداد رقمي من صفر إلى 10,000؟ •
بما أن الرقم ل يحتوي على أرقام سالبة وأقصى رقم مطلصوب هصو 10000وهصذا الرقصم
أكبر من 255لصذا ل يمكصصن اسصصتخدام متغيصصر بمسصصاحة 8بصصت ويجصب أن نسصتخدم متغيصر
بمساحة 16بت والذي يستطيع التعامل مصع ارقصام تصصل إلصى .65,535إذا أفضصل نصوع
بيانات هو uint16_t
ما هو المتغير المناسب لتخزين درجة حرارة تتراوح بين سالب 50إلى موجب 100؟ •
هنصصاك إجصصابتين لهصصذا السصصؤال ،الولصصى :فصصي حالصصة أننصصا نريصصد تخزيصصن أرقصصام دصصصحيحة فقصصط
مثل 20أو 50أو أي رقم بدون كسر عشري فسنجد أن افضل نصصوع بيانصصات هصو int8_t حيصصث يسصصتطيع هصصذا النصصوع مصصن البيانصصات أن يخصصزن أي قيمصصة تصصتراوح بيصصن 128 -إلصصى +
127ويستهلك 1بايت فقط من مساحة الذاكرة. •
الثانيصة :فصصي حالصة وجصود كسصر عشصري مثصصل أن 25.1أو 30.5يجصب أن نسصتخدم نصصوع
البيانات floatمع العلم أنه في المقابل سيتم اسصصتهلك مسصصاحة ذاكصصرة = 4بصصايت )32 بت(.
السؤال الخير يدفعنا لنقطة هامة جداا وتسصمى الصص - Variable precisionدقصة المتغيصر – بعصض
المتغيرات يجصب أن يتصم تخزينهصا بدقصة عاليصة جصداا .والبعصض الخصر ل يتطلصب هصذه الدقصة فمثلا
إذا مطلب منك أن تصنع ساعة رقمية وبها حساس لعرض درجة حرارة الغرفة ،سنجد أن المتغير
131
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. المناسب لتخزين قيم هصصذا الحسصصاس هصو int8_tوذلصصك لن درجصصة الحصصرارة المتوقعصة لي غرفصصة لصصن
تزيد عن 45أو تقصل عصن ) 5-حصتى أقصصصى بلد العصالم بصرودة تكصون درجصة حصرارة المنصازل معزولصة عصن درجصة الهصواء الخصارجي بفصارق 10درجصة علصصى القصل( كمصا أن الشصخص الصذي سيسصتخدم هصذه
السصصصاعة الرقميصصصة لصصصن يهتصصصم بعصصصرض درجصصصة الحصصصرارة بدقصصصة 25.20وسصصصيكتفي فقصصصط بمعرفصصصة الرقصصصم
الصحيح )مثل 25درجة( .ولكن إذا طلب منك تصميم مقيصاس حصرارة طصصبي مثصل المسصتخدم فصي المستشصصفيات لقيصصاس درجصصة حصصرارة المرضصصى فيجصصب أن تكصصون درجصصة الحصصرارة محصصددة بدقصصة مثصصل
36.25لذا يجب أن يتم استخدام متغير من نوع floatلتخزين ومعالجة هذه القيم.
أمثلة برمجية
قم بتودصيل 8دايودات ضوئية على أطراف البورت Aثم اكتب برنامج يقوم بإخراج القيم مصصن 0إلى 255على البورت مع وضع تأخير زمني بين كل قيمة 100مللي ثانية.
#define F_CPU 1000000UL >#include #include
متغير بمساحة 8بت لتخزين قيمة العداد //
)int main(void { ;uint8_t counter
ضبط كل أطراف البورت لتعمل كخرج //
;DDRA = 0b11111111
عداد من 0إلى // 255
)for (counter = 0; counter <= 255; counter++ { ;PORTA = counter ;)_delay_ms(100 } ;return 0 }
132
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
صور مختلفة لكتابة المتغيرات الرقمية
فصصي لغصصة السصصي يمكصصن كتابصصة قيصصم المتغيصصرات الرقميصصة بطصصرق متنوعصصة .فمثلا فصصي المثلصصة السصصابقة
قمنا باستخدام الصيغة الرقمية الثنائية Binaryمثل:
;uint8_t variable = 0b00000011
أيضصصصاا يمكصصصن كتابصصصة المتغيصصصرات بالصصصصيغة العشصصصرية Decimalوهصصصي نفصصصس دصصصصيغة الرقصصصام الصصصتي نسصصصتخدمها فصصصي حياتنصصصا اليوميصصصة فمثلا الرقصصصم 0b00000011يسصصصاوي رقصصصم Decimal 3ويمكصصصن
كتابة نفس المر السابق بالصورة التالية:
;uint8_t variable = 3 ويمكن استخدام الصيغة الستة-عشرية .Hexadecimalفمثلا لنفترض أننا نريد تعيين المتغير
variableبقيمة 0b11110000والتي تساوي رقم 120بالصيغة العشرية
// Binary // Decimal // Hexadecimal
;uint8_t variable = 0b11110000 ;uint8_t variable = 120 ;uint8_t variable = 0xF0
مرفق مع الكتاب ملحق خاص بنظام العداد وتحويل قيم الرقام من وإلى الصيغ الثنائية والعشرية والستة-عشرية.
أيضاا لحظ أن القيم الستة-عشرية تبدأ بصص 0xبينما الصيغة الثنائية تبدأ بصص ob
مراجع إضافية http://www.mjma3.com/programming/basics.html فيديو :تحويل العداد من النظام العشري إلى الثنائي https://www.youtube.com/watch?v=-yrwpEuRjl0 فيديو :تحويل العداد من النظام الثنائي إلى العشري https://www.youtube.com/watch?v=lLbc5_JpTWI فيديو :تحويل العداد من النظام الثنائي إلى الست-عشري https://www.youtube.com/watch?v=B33Iof0bUKg
133
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
5.2العمليات الحسابية
Arithmetic Operations
تسصصتطيع مترجمصصات لغصصة السصصي المعياريصصة المخصصصصة للمتحكمصصات الدقيقصصة أن تتعامصصل مصصع نفصصس
أوامصصر العمليصصات الحسصصابية الصصتي يمكصصن تنفيصصذها علصصى الحواسصصيب مثصصل عمليصصات الجمصصع والطصصرح
والضرب والقسمة .لنأخذ بعض المثلة:
تعريف 3متغيرات //X, Y, Z
;int X, Y, Z
عملية جميع رقمين ووضع الناتج في المتغير // X
;X = 5 + 6
عملية طرح رقم من متغير ووضع الناتج في المتغير // Y
;Y = 50 – x
عملية ضرب متغيرين ووضع النتيجة في المتغير // Z
;Z = X * Y
أيضاا يمكن تنفيذ العمليات الحسابية على قيمة المتغير نفسه .فمثلا قيمة المتغير xفصصي المثصصال السابق = 11والن نريد أن نزيد عليها 4لتصبح .15يمكن تنفيذ ذلك بالطريقة التالية
الن قيمة المتغير تساوي // 15
;X = X+4
المصصر السصصابق يعنصصي :قصصم بإضصصافة الرقصصم 4إلصصى القيمصصة الموجصصودة بالفعصصل فصصي المتغيصصر Xثصصم قصصم بكتابة النتيجة مرة أخرى داخل المتغير Xوبذلك تصصصبح قيمتصصه .15مصع العلصصم أنصه يمكصصن إجصراء نفس الطريقة مع جميع العمليات الحسابية
الصور المختصرة
أطرح الرقم 2من المتغير //
;X = X – 2
اضرب قيمة المتغير في // 4
;X = X * 4
يمكن إجراء العمليات الحسابية على المتغيرات بصصورة مختصصرة .فمثلا إذا أردنصا جميصع الرقصم
4على قيمة المتغير Xفيمكن ذلك بأسلوب مختصر عبر إضافة علمة الجمع قبل أشارة =
اختصار اﻷمر // X = X+4
;X += 4
أيضاا يمكن تطبيق نفس الختصار على أي عملية حسابية
134
اختصار اﻷمر // X = X – 4
;X -= 4
اختصار اﻷمر // X = X * 4
;X *= 4
اختصار اﻷمر // X = X / 2
;X /= 2
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
5.3العمليات
المنطقية Logic Operation
الص Logic operationمجموعة من الوامر المنطقيصة مثصل AND, OR, XOR, Invert, Shiftهصذه
الوامر تساعدنا على القيام ببعض التحكم المتقدم سواء على المتغيرات أو إعصصدادات الممتحككصصم
أو أطراف الممتحككم )الدخل أو الخرج( .جميع العمليات المنطقية )تمسى أيضاا الدوال المنطقية
(Logic Functionتمثل نفس البوابات المنطقيصصة المسصتخدمة فصصي الصصدوائر اللكترونيصة لكصصن يتصصم تطبيقها بصورة برمجية .الجدول التالي يوضح قائمة بهصذه العمليصصات والرمصصوز المسصتخدمة فصي
لغة السي لتنفيذ كل واحدة منهم. ”Logic Function in “ANSI C
Logic Function name
|
OR
&
AND
~
NOT
^
XOR
<<
Shift Left
>>
Shift Right
أمثلة على XOR
أمثلة على NOT
أمثلة على OR
أمثلة على AND
0^0=0 0^1=1 1^0=1 1^1=0
~0=1 ~1=0
0|0=0
0&0=0
0|1=1 1|0=1 1|1=1
0&1=0 1&0=0 1&1=1
لنفهم هذه العمليات بصورة أفضل لنأخذ مجموعة من اﻷمثلة البرمجية.
135
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. استخدام - NOTميستخلدم المر NOT “invert” valueفي عكس جميع البتات داخل أي متغير
جل فمثلا إذا كان لدينا المتغير Zكالتالي: أو أي ممس ك
Example 1: ;unit8_t Z = 0b00000000 ;Z = ~ Z )// invert all Z bits (Z = 0b11111111 تطصصبيق المصصر الخيصصر يعنصصي :قصصم بعكصصس جميصصع البتصصات الموجصصودة فصصي المتغيصصر Xثصصم ضصصع القيمصصة
الجديدة داخل المتغير Xوبذلك تصبح القيمة = 0b11111111
)// invert all Z bits (Z = 0b00001111
Example 2: ;unit8_t Z = 0b11110000 ;Z = ~ Z
)// invert all Z bits (Z = 0b11001100
Example 3: ;unit8_t Z = 0b00110011 ;Z = ~ Z
اسنتخدام - ORلنف ترض أن لصدينا متغيصر 8بصت xNumberوقيمتصه = ) 12بالنظصام العشصري(
أو 0b00011000بالنظام الرقمي كما هو موضح:
Example 4: ;uint8_t xNumber = 0b00011000 ;xNumber = xNumber | 0b00000001
// 0b000011000 OR 0b0000001
المصصر السصصابق يعنصصي قصصم بتنفيصصذ العمليصصة المنطقيصصة ORمصصع محتصصوى المتغيصصر xNumberثصصم ضصصع
النتيجة داخصصل المتغيصصر xNumberممصصا سصصيجعل قيمصة المتغيصر تصصصبح .0b00011001وذلصصك لن المر ORيقوم بعمل OR operationعلى كل بت بين الرقمين كالتالي: 0
0
0
0
1
1
0
0
قيمة xNumberالدصلية
1
0
0
0
0
0
0
0
الرقم الثاني
1
0
0
0
1
1
0
0
نتيجة الن OR
Example 5: ;xNumber = 0b11111000 ;xNumber = xNumber | 0b00000011 عند تنفيذ المر ORستكون قيمة المتغير= 0b11111011كما هو موضح في الجدول التالي:
136
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. 0
0
0
1
1
1
1
1
قيمة xNumberالدصلية
1
1
0
0
0
0
0
0
الرقم الثاني
1
1
0
1
1
1
1
1
نتيجة الن OR
استخدام – ANDتعمل عملية الص ANDمثصل ضصرب رقميصن .وعنصد تطبيقهصا بيصن المتغيصرات يتصم
عمل ANDبين كل بت في المتغير الول وما يقابلها في المتغير الثاني
Example 6: ;xNumber = 0b11111000 ;// 0b11111000 AND 0b1000001 xNumber = xNumber & 0b10000001 النتيجصصة سصصتكون 0b10000000وذلصصك لن نتيجصصة عمصصل ANDمصصع أي بصصت تحتصصوي علصصى دصصصفر = دصفر لذا نجد البت الخير فقط هي التي ستظل 1لن 1 = 1 & 1 0
0
0
1
1
1
1
1
قيمة xNumberالدصلية
1
0
0
0
0
0
0
1
الرقم الثاني
0
0
0
0
0
0
0
1
نتيجة الن AND
اختصار العمليات المنطقية
يمكن اختصار العمليات المنطقية مثل العمليات الحسصصابية وذلصك عصبر وضصصع المصصر المنطقصي قبصصل
علمة = فمثلا يمكن إجراء الص logic operationsكالتالي: ;// xNumber = xNumber | 0b00000001 ;// xNumber = xNumber & 0b00000001 ;// xNumber = xNumber ^ 0b00000001
;xNumber |= 0b00000001 ;xNumber &= 0b00000001 ;xNumber ^= 0b00000001
ملحظة :يمكن اختصار جميع العمليات المنطقية ماعدا عملية )العكس (Invertوالتي تكتب فقط بالصورة التالية: xNumber = ~ xNumber
137
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
5.4عمليات اﻹزاحة
Shift operations
جل أو أي تعرف عمليات الزاحة بأنها تحريك البتات إلى اليمين أو اليسصصار داخصصل متغيصصر أو ممسصص ك قيمصصصة رقميصصصة .تعصصصد هصصصذه العمليصصصات مصصصن أهصصصم الوامصصصر الصصصتي تسصصصتخدم فصصصي برمجصصصة المعالجصصصات
والممتحككمات الدقيقة كما سنرى.
مثال :لنفرض أن لدينا الرقم 0b00000001لنقم بتطبيق عمليات الزاحة لجهة اليسار. 0b00000001
الرقم الدصلي
0b00000010
إزاحة بمقدار 1بت جهة اليسار <<
0b00000100
إزاحة بمقدار 2بت جهة اليسار <<
0b00001000
إزاحة بمقدار 3بت جهة اليسار <<
مثال :لنفرض أن لدينا الرقم 0b00000101لنقم بتطبيق نفس العمليات السابقة عليه. 0b00000101
الرقم الدصلي
0b00001010
إزاحة بمقدار 1بت جهة اليسار <<
0b00010100
إزاحة بمقدار 2بت جهة اليسار <<
0b00101000
إزاحة بمقدار 3بت جهة اليسار <<
مثال :لنفرض أن لدينا 0b01100000لنقم بتطبيق عمليات الزاحة لجهة اليمين. 0b01100000
الرقم الدصلي
0b00110000
>> إزاحة بمقدار 1بت جهة اليمين
0b00011000
>> إزاحة بمقدار 1بت جهة اليمين
0b00001100
>> إزاحة بمقدار 1بت جهة اليمين
تدعم لغة السي الوامر البرمجية لعمل الزاحة لجهة اليمين أو اليسار وتكتب كالتالي:
138
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. الزاحة لجهة اليسار:
)قيمة الزاحة << الرقم(
الزاحة لجهة اليمين:
)قيمة الزاحة >> الرقم( المثال الول :قم بتودصيل 8دايودات ضوئية على البورت Aثم جرب البرنامج التالي:
)int main(void { ;uint8_t counter ;DDRA = 0xff )while(1 { )for(counter = 0; counter <= 7; counter++ { ;)PORTA = (1 << counter ;)_delay_ms(500 } } ;return 0 } 139
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. نتيجة تنفيذ الكود ان الصدايودات الضصوئية سصتبدأ بالضصاءة واح دة تلصو الخصرى بدايصة مصن PA0
إلى PA7بالترتيب كما في الصور التالية )الصور مرتبة من اليمين إلى اليسار(:
شرح الـكود فصصي البدايصصة تصصم تعريصصف متغيصصر يسصصمى counterحيصصث ستسصصخدم هصصذا المتغيصصر فصصي زيصصادة قيمصصة
الزاحة بصورة تلقائية .أيضاا تم تعريف جميع أطراف البورت Aلتعمل كخرج.
;uint8_t counter ;DDRA = 0xff
داخصصل الصصص while loopاسصصتخدمنا دالصصة التكصصرار forوذلصصك لزيصصادة قيمصة المتغيصصر counterبصصصورة تلقائية من 0إلى .7
)for(counter = 0; counter <= 7; counter++ والن يأتي أمر المحاذاة .حيث تم استخدام البورت Aلعرض كيف تتحرك البت 1لجهة اليسار مع تأخير زمني نصف ثانية وهذا ما يسبب أن تضيء الدايودات الضوئية بالترتيب واح دة تلصو
الخرى.
;)PORTA = (1 << counter ;)_delay_ms(500 لحظ أن الرقم )1المكتوب بالصيغة العشرية( الموجود في العبارة )PORTA = (1 << counter
يوازي بالضبط )PORTA = (0b00000001 << counter
140
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. ,بسبب الدالة forنجد أنه عندما تكون قيمة counter = 1فهذا يجعل المر السابق يساوي
;)PORTA = (0b00000001 << 1
وعندما تكون قيمة counter = 1فهذا يوازي المر
;)PORTA = (0b00000001 << 2 وعندما تكون قيمة counter = 3فهذا يوازي المر
;)PORTA = (0b00000001 << 3
وهكذا … وتستمر هذه الدورة إلى ما ل نهاية.
5.5التحك م على مستوى البت الواحدة
Single Bit
جلت مثل PINx, PORTx, DDRxوذلصك بكتابصصة في الفصل السابق قمنا بالتعامل مع بعض الممس ك
جلت .جميصع المثلصصة السصصابقة اشصتركت فصي أمصصر هصام وهصصو بعض القيم الرقميصة داخصل هصذه الممسصص ك
جل فصصي نفصصس الصصوقت .فمثلا عنصصدما نقصصوم بضصصبط أول 3 كتابصصة جميصصع قيصصم البتصصات داخصصل كصصل ممسصص ك
أطصصصراف للبصصصورت Aلتعمصصصل كخصصصرج فأننصصصا نكتصصصب DDRA = 0b00000111ممنننا يجعنننل اﻷطنننراف الثل ث اﻷولى خرج واﻷطراف الباقية تعمل كدخل.
لكصصن مصصاذا إذا أردنصصا تعصصديل طصصرف واحصد )وليكصصن الطصصرف الول فقصصط (PA0وفصصي نفصس الصصوقت ل
جل DDRA؟ نريد أن نغير قيمة أو محتوى أي بت أخرى في الممس ك
يمكننصا ذلصك بسصهولة عصبر دمصج مجموعصة مصن العمليصات المنطقصة وعمليصات الزاحصة .حيصث تتصوفر
جل .كمصصا دصيغ برمجية معينصة تمكننصصا مصن وضصع 1أو 0داخصصل بصت محصددة فصي أي متغيصر أو ممسصص ك
يمكننا أن نعكس بت معينه أو نعزلها عن باقي البتات.
كتابة 1داخل أي بت Set Bit
تعصصرف الصصصيغة البرمجيصصة Set Bitأنهصصا وضصصع 1داخصصل قيمصصة أي بصصت .بصصالعودة للسصصؤال السصصابق
لنفترض أننا نريد ضبط الطرف PA0فق ط ليعمصل كخصرج بغصض النظصر عصن بصاقي أطصراف البصورت .Aيمكن ذلك بسهولة عبر دمج المر ORمع left shiftوتكون الصيغة العامة
;)Register |= (1 << bitName يتصصم اسصصتبدال كلمصصة Registerبالمسصصجل المطلصصوب ويتصصم اسصصتبدال كلمصصة bitNameباسصصم البصصت جل DDRAو الطرف PA0نكتب: المطلوب تغيير قيمتها .فمثلا بتطبيق هذه الصيغة على الممس ك
// set PA0 to work as output
141
;)DDRA |= (1<< PA0
.5قواعد لغة السي للظنظمة المدمجة … .............................................................................................. جل PORTA أيضاا يمكننا استخدام نفس الصيغة لتشغيل نفس البت من الممس ك
// turn on PA0
;)PORTA |= (1<
كذلك يمكننا استخدام العملية ORلدمج أكثر من دصيغة من النوع السابق فصي أمصر واحصد ،فمثلا لنفترض أننا نريد ضبط الطرف PA1و PA2ليعملن كخرج ،يمكننا إما أن نكتب:
;)DDRA |= (1<
أو يمكن اختصار المرين في جملة واحدة فقط كالتالي:
كتابة 0داخل أي بت Reset Bit
;)DDRA |= (1<
عملية الصص Reset Bitهصي عك س عمليصة Set Bitوتعنصي وضصع دصصفر داخصل أي بصت مطلوبصة وتتصم عبر دمج 3أوامر AND – left shift – invertوتكون الصيغة القياسية كالتالي:
;)Resgister &= ~ (1 << bitName مثال :لنفترض أننا نريد جعل الطرف PC3يعمل كدخل بغض النظر عن باقي أطراف البورت C
;)DDRC &= ~(1<
{ )(int main )// set 1 in PA0 (output
;)DDRA |= (1<
)// turn on led (set PA0
;)PORTA |= (1<
)// turn off led (reset PA0
;)PORTA &= ~ (1<
142
.5قواعد لغة السي للظنظمة المدمجة … ..............................................................................................
عكس بت محددة Toggle Bit
تعصصد الصصصيغة البرمجصصة Toggle Bitمصصن أفضصصل الصصصيغ المسصصتخدمة فصصي البرمجصصة وتعنصصي أنصصه فصصي حالة أن البت المطلوبة = 1قم بعكسها إلصصى 0وإذا كصصانت تسصصاوي 0قصصم بعكسصصها إلصصى .1وتكصصون
الصيغة القياسية كالتالي:
;)Resgister ^= (1 << BitName باستخدام هذه الصيغة يمكننا اختصار المثال ص blinking ledبأمرين فقط )بدلا من 4أوامر(.
)while (1 { ;)PORTA ^= (1<
تعد مجموعة الصيغ البرمجيصة السصابقة مصن أهصم الوامصصر الصتي ق د تسصتخدمها فصي برمجصة النظصم المدمجة خادصصة أنهصا مكتوبصصة بلغصة السصصي المعياريصصة ممصصا يجعلهصصا طريقصة "معياريصة" لعمصصل setأو
resetلي بت مهما أختلف الممتحككم الدقيق أو الشركة المنتجة )طالماا أن المترجم الخاص
بهذا الممتحككم يدعم لغة السي المعيارية(.
5.6القراءة من بت واحدة
Read single bit
فصصي الفصصصل السصصابق شصصاهدنا بعصصض المثلصصة عصصن قصصراءة مفتصصاح إلكصصتروني )push button(switch
جل .PINxالطريقة السابقة كصصانت تقصصرأ جميصصع بتصصات وذلك عبر قراءة بورت كامل من خلل الممس ك
البورت PINxوتقارنها برقم مثل:
)if (PINB == 0b00000001 };{PORTA = 0b00000001 else };{PORTA = 0b00000000
لكن هناك دصيغة أفضل في حالة الرغبة بقراءة طرف واحد فقط وهي كالتالي: )Reister & (1<
))if (PINB & (1<
};{PORTA = 0b00000001
143
الفصل السادس ”النجاح ليس نتيجة لعدم ارتكاب أي أخطاء، وللكنه نتيجة لعدم تكرار نفس الخطأ مرتين ‟
جورج برنارد شو -مؤلف أيرلندي شهير.
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل
هصصصذا الفصصصصل يشصصصرح العصصصدادات المتقدمصصصة لمتحكمصصصات AVRمثصصصل مفهصصصوم الفيصصصوزات ووظائفهصصصا المختلفصصصة مثصصصل تغيصصصر سصصصرعة التشصصصغيل Clock Rateواسصصصتهلك الطاقصصصة،
حمايصصة البرامصصج الموجصصودة علصصى الممتحككصصم مصصن السصصرقة أو التعصصديل وتشصصغيل بعصصض الخصائص المتقدمة الخرى. ✔ الفيوزات Fusesللممتحككم ATmega16 ✔ تغير سرعة )تردد( الممتحككمات
✔ بتات الغلق والحماية Lockbits ✔ برمجة الفيوزات ✔
145
استهلك الطاقة والعمل على البطاريات
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.1
Fuses & Lockbits
في جميع الممتح ككمات الدقيقة يجب أن تمتلك طريقة مصا لتتحكصم فصي بعصض العصدادات بصصورة
دائمة ل تتغير مع انقطاع الكهرباء عن الممتحككصم الصدقيق ،فمثل ممتحككمصات الصص AVRتصأتي بصصورة
افتراضصصصية مصصصن المصصصصنع تعمصصصل بصصصتردد 1ميجصصصاهرتز وقصصصد نحتصصصاج أن تغيصصصر هصصصذه السصصصرعة ليعمصصصل
الممتحككم دائما بسرعة 16ميجاهرتز ،مثل هصذه العصصدادات يجصصب أن تتصصم مصصرة واحصدة ول تتغيصصر في المستقبل ..هنا يأتي دور الفيوزات .Fuses
الفيصصصوزات هصصصي وحصصصدات ذاكصصصرة )بتصصصات (Bitsيتصصصم برمجتهصصصا بصصصصورة مسصصصتديمة ،هصصصذا يعنصصصي أن
محتواها ل يتغير بإعادة تشغيل الممتحككم أو انقطاع الكهرباء أو حتى برمجة الصذاكرة الرئيسصصية ) ،(Flash Memoryهذه الفيصوزات تحتفصصظ بمجموعصصة خادصصصة مصصن العصصدادات المطلوبصصة وجودهصصا بصورة مستديمة.
تنقسم الفيوزات في ممتحككمات الص AVRإلى 3فيوزات رئيسية وص هي:
: Low Fuse Byteيتكون من 8بتات – كل 1بت تتحكم في خادصية معينة في الص AVR
:HIGH Fuse Byteأيضاا 8بت -كل 1بت تتحكم في مجموعة خصائص :Extended Fuse Byteفي معظم الممتحككمات تكون أقل من 5بتات جميع البتات في الفيوزات الثلثة السابقة لها وضعان من البرمجة • •
programmed = 0الفيوز تم برمجته وتفعيل الخادصية التي يتحكم بها
unprogrammed = 1الفيوز لم ميفعل وتم إلغاء الخادصية التي يتحكم بها
يتصصصصم تفعيصصصصل أحصصصد الوضصصصصاع بكتابصصصصة 0أو 1فصصصصي هصصصصذا الفيصصصصوز ،مصصصصع ملحظصصصة أن دصصصصصفر ل تعنصصصصي unprogrammedبصل العكصس – حيصث يمكصن أن الفيصوز يتصم تفعيلصه programmedعنصدما تضصع
بداخله القيمة 0ويتم إلغاؤه عندما تضع بداخله القيمة .1
تحذير :بعض الفيوزات إذا تم برمجتها بصورة خاطئة قد تتسبب في تعطيل الممتحككم أو إلغاء إمكانية برمجته مرة أخرى إل باستخدام مبرمجات خاصة High voltage ،programmersلذا كن على حذر عند اختيار قيم الفيوزات وتأكد أكثر من مرة من جميع العدادات قبل برمجتها. 146
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. يمكنك التعرف علصى تفادصصيل الفيصوزات وكيفصة تفعيلهصا وذلصك عصبر فتصح الصص Datasheetالخادصصة
بمتحكمصصات الصصص AVRوالبحصصث عصصن جصصداول ) Fuse LOW Byte , Fuse High Byteموجصصودة فصصي
دصفحة 260للص Datasheetفي حالة الممتحككم .(ATmega16
Fuse High Byte
يوضح الجدول قيمة كل بصت ف ي ج دول الفيصوزات الصص High Byteمصع القيمصة الفتراضصية لكصل
فيوز )هذه هي القيم التي تصأتي مبرمجصة مسصبقاا مصن المصصنع( ،وكمصا نصرى بعصض الفيصوزات تصأتي مفعلة بينما بعض يكون غير مفعل بصورة افتراضية. قبل أن نبدأ مع الفيوزات سنحتاج أن نتعرف على مفهوم الن Bootload البصصووت-لصصودر هصصو برنامصصج )اختيصصاري( دصصصغير يتصصم تشصصغيله قبصصل البرنامصصج الرئيسصصي للقيصصام ببعصصض
الوظائف ،فمثلا أشهر بووت-لودر هو Arduino bootloaderهو السر الذي جعل تكلفصصة لوحصصات آردوينصصو منخفضصصة جصصداا .يقصصوم هصصذا البصصووت-لصصودر بوظيفصصة بسصصيطة وهصصي فتصصح منفصصذ السصصيريال
UARTونقصصل البيانصصات )أن وجصصدت( إلصصى ذاكصصرة الممتحككصصم flash memoryهصصذا يعنصصي أنصصه يقصصوم
ببرمجة الممتحككم عبر السصيريال بصصورة ذاتي ة self programmingدون الحاجصة لسصتخدام أي
147
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. جهصصصاز programmerوبالتصصصالي يصصصوفر كصصصثيراا فصصصي تكلفصصصة دصصصصناعة اللوحصصصات التطويريصصصة ويعطصصصي
الممتح ككم إمكانية البرمجة الذاتية عبر منفذ السيريال بدون تكلفة تصصذكر .فمثل لوحصصة Arduino Nanoتباع من المواقع الصينية بنحو 3دولر فقط مما يجعلها أرخص لوحة تطصصوير فصصي العصصالم
وتشمل الممتحككم الدقيق atmega328مع USB to ttl converter والن نعود مرة أخرى للفيوزات:
جل BOOTRSTعنصصد تفعيصصل هصصذا الفيصصوز يبصصدأ الممتحككصصم الصصدقيق بتشصصغيل الصصص bootloaderالممسصص ك
فصصي الصصذاكرة أولا وبعصصد النتهصصاء مصصن تنفيصصذه يتصصم النتقصصال إلصصى الصصص ،main functionفصصي أغلصصب الحالت ل يتم اسصتخدام ه ذا الفيصوز مصالم تسصتخدم ،bootloaderالقيمصة الفتراضصية = 1ممصا
يعني أن الممتحككم سيشغل البرنامج الرئيسي وسيتجاهل البووت-لودر.
) BOOTSZ(0,1يتحكم هذا الفيوز في حجم ومكان تسجيل البصووت-لصودر فصي الصذاكرة ولصديهم جصصدول كامصصل مصصن العصصدادات موجصصودة فصصي دصصصفحة ) 257مجصصدداا إذا لصصم تكصصن تنصصوي اسصصتخدام
بووت-لودر فل تقم بتغير إعدادات هذا الفيوز(.
EESAVEيتحكم الفيوز في ما سيحدث لذاكرة الص EEPROMعند برمجصة الممتحككصم ،عنصدما يتصم
وضع قيمته = 1سيقوم الممتحككم بمسح الص EEPROMفي كل مرة يتم رفع ملف هيكس جديد وعنصصدما تكصصون قيمتصصه = 0فصصإن الممتحككصصم لصصن يقصصوم بمسصصح محتصصوى الصصص EEPROMأبصصداا مهمصصا كصصان عدد مرات البرمجة .القيمة الفتراضية = 1
CKOPTيتحكصصصم فصصصي طاقصصصة المذبصصصذب clock oscillatorوالمكثفصصصات الداخليصصصة )سصصصيتم شصصصرحه بالتفصيل في الجزء الخاص بالمذبذبات(. SPIENتفعيصصل خادصصصية البرمجصصة عصصبر منفصصذ الصصص ،SPIهصصذا الفيصصوز فصصائق الهميصصة حيصصث يتحكصصم فصصي
تفعيصصل برمجصصة الصصصذاكرة .وعنصصدما يتصصم وضصصع قيمتصصه = 1يتصصم إلغصصاء إمكانيصصة برمجصصة الممتحككصصم مصصرة أخصصرى وعنصصدها لصصن تسصصتطيع أن ترفصصع عليصصه أي برامصصج جديصصدة ،القيمصصة الفتراضصصية = 0وتعنصصي أن
البرمجة عبر الص spiتعمل .بعض الشركات تستخدم هذا الفيوز لتمنع أي شخص من إعادة برمجة
الممتحككم الدقيق مرة أخرى.
ل تقم بتغيير الفيوز SPIENأبداا طالماا أنك تتدرب على برمجة المعالج وإل لن تتمكن من استخدام الممتحككم مرة أخرى
148
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. JTAGEN, OCDENكل الفيصصصصوزان يسصصصصتخدمان للتحكصصصصم فصصصصي تفعيصصصصل خادصصصصصية التنقيصصصصح عصصصصبر
بروتوكول الص Jtagالعالمي.
ما هو الـ Jtag
Jtagبروتوكول عالمي Universal protocolيتوفر في معظم الممتحككمات المختلفصصة فصصي العصصالم سواء كانت PIC, AVR, ARMأو حتى المصصفوفات المنطقيصة FPGAويسصتخدم فصي العديصد مصن الشياء المفيدة أهمها عملية التنقيح Debuggingوقراءة محتويات الممتحككم الداخلية.
جل ما ويتخذ قرار معين بناء على هذه القيمصصة لكصصن فمثلا قد نقوم بكتابة برنامج يقرأ قيمة ممس ك
عنصصد تنفيصصذ البرنامصصج نجصصد أن البرنامصصج يتصصصرف بصصصورة خاطئصصة ،هصصذا التصصصرف الخصصاطئ يسصصمى
– bugيعمصصل الصصص Jtag debuggerعلصصى الودصصصول إلصصى محتويصصات المعالصصج وإيقصصافه فصصي لحظصصة مصصا
جلت أو المصصر إلصصى وقراءة جميع المحتويات مثل قيمة المتغيرات في الذاكرة أو محتصصوى الممسصص ك
سيتم تنفيذه في الص .. Program counterالخ.
كما يمكن استخدام الص Jtagلتشغيل الممتحككصصم بخادصصصية single instruction executionوالصتي تعني تنفيذ كل أمر بصورة يدوية ،يعني أن الممتحككم لن يقصوم بتنفيصذ الوامصصر البرمجيصة بصصصورة متتالية ولكن سينفذ كل أمر على حدى عندما تأمره أنت بذلك.
بهصصصذه المميصصصزات يسصصصاعدك الصصصص Jtag debuggerعلصصصى تتبصصصع الخطصصصاء وادصصصصلحها والتأكصصصد مصصصن أن
الممتحككم يعالج البيانات بصورة دصحيحة .كما أن بروتوكول الص jTagميستخلدم أيضصصاا فصصي برمجصصة الممتحككمات المختلفة وحتى الص .FPGA
يمكنك قراءة المزيد عن هذا البروتوكول بصورة مفصلة من الرابط التالي: en.wikipedia.org/wiki/Joint_Test_Action_Grou www.ATmel.com/webdoc/atmelice/atmelice.using_ocd_physical_jtag.hl لحظ أن ATmega16يأتي مفعلا بخيار تشغيل الص jtagوهذا الخيار يلغي إمكانية استخدام معظم أطراف البورت PORTCكمنافذ IN/OUTلذا ،إذا كنت تريد استخدام هذا البورت بالكامل يجب عليك أن تلغي تفعيل الص jtagبوضع قيمة JTAGEN =1
149
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
LOW Byte Fuse
مجموعة الفيوزات الص ) CKSEL(0,1,2.3سيتم شرحها بالتفصيل في جزء المذبذبات قبصصصل شصصصرح الفيصصصوزات BODيجصصصب أن نتعصصصرف علصصصى مفهصصصوم جديصصصد أيضصصصا وهصصصو الصصصص Brown Out Detectionأو ما يعرف اختصاراا بص .BOD
تعمل هذه الخادصية على إيقاف تشغيل الممتحككصم الصصدقيق عنصدما يقصل فصرق الجهصصد المطبصصق عليصه
عن حد معين .وهنذا سنيدفعنا للتس اؤل – لمناذا قند نحتناج أن نوق ف تشنغيل الممتحككنم عنندما يقل فرق الجهد ؟؟
العديد من الممتحككمات الدقيقة )ليس الص AVRفقط( تتطلب فرق جهد معين ليعمصصل عنصصد سصصرعة
محددة بصصصورة مسصتقرة .فمثل الممتحككصصم ATmega16يمكنصصه العمصصل بسصصرعة 1ميجصصا بفصصرق جهصد 1.8فولت ولكن إذا تم تشغيله بسرعة 16ميجاهرتز يجب أن يكون فرق الجهد الذي يعمصصل بصصه
= خمسصصة فصصولت علصصى القصصل وحصصتى 5.5فصصولت علصصى الكصصثر .وإذا انخفصصض الجهصصد عصصن الخصصامس فولت سيحدث اضطراب للمذبذب ولن يقوم بتوليد نبضات زمنية دصحيحة. بالتصصالي فصصان أي أمصصر delayأو أي أمصصر معتمصصد علصصى عامصصل زمنصصي سصصيتم تنفيصصذه بصصصورة خاطئصصة.
أيضاا انخفاض الجهد عنصد تشصغيل الممتحككصصم علصى سصرعات عاليصصة قصد يصصصحبه أخطصصاء فصي قصراءة
الصصذاكرة والصصص EEPROMوقصصد يتسصصبب فصصي أخطصصاء أخصصرى عشصصوائية .لصصذا يتصصم اسصصتخدام الصصص BOD ليقصصاف تشصصغيل الممتح ككصصم إذا كصصان فصصارق الجهصصد المطبصصق عليصصه أقصصل مصصن المطلصصوب ويتصصم إعصصادة
تشغيله تلقائياا عندما يعود فارق الجهد للمستوى المناسب ليعمل الممتحككم بكفاءة.
150
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. الحقيقة أنه ل داعي لتشغيل الص BODإل إذا كنت ستشغل الممتحككم بسرعة أكبر من 4
ميجاهرتز لن معظم ممتحككمات الص AVRيمكنها العمل بصورة طبيعية حتى فرق جهد 1.8 فولت على سرعات من 1إلى 4ميجا. BODENيقصصصوم هصصصذا الفيصصصوز بتفعيصصصل خادصصصصية الصصصص BODويصصصأتي بقيمصصصة ) 1غيصصصر مفعصصصل( بصصصصورة
افتراضية
BODLEVElيتحكصم الفيصوز فصصي فصارق الجهصصد الصصذي سصيتم إيقصصاف الممتحككصصم عصصن التشصغيل عنصصدما
يصل إليه ،فإذا كانت قيمصة الفيصصوز = 1هصذا يعنصي أن الممتحككصم سصيتم إيقصاف تشصغيله عنصد فصصرق
جهد أقصل مصصن 2.7فصولت أمصصا إذا كصانت قيمصصة الفيصوز = 0هصذا يعنصي أن الممتحككصم سصيتوقف عنصد
فصصرق جهصصد أقصصل مصصن 4فصصولت )مصصع ملحظصصة أن هصصذه العصصدادات تصصصبح فعالصصة إذا كصصانت قيمصصة الصصص BODENمفعلة أي أنها تساوي دصفر(. ) SUT(0,1تتحكصصصم هصصصذه الفيصصصوزات فصصصي الزمصصصن الصصصذي سيسصصصتغرقه الممتحككصصصم مصصصن بدايصصصة تودصصصصيل
جل بصصداخله أو الصصوقت المسصصتغرق لعمصصل .Reset الكهربصصاء حصصتى البصصدء فصصي تنفيصصذ البرنامصصج الممسصص ك
يمكنك ضبط هذا الفيصوز بمجموعصة مصصن القيصم المختلفصة )الجصدول يوضصح زمصن تصأخير التشصغيل
عنصصصد اسصصصتخدام المذبصصصذب الصصصداخلي مصصصع ملحظصصصة أن هصصصذه العصصصدادات تختلصصصف عنصصصد اسصصصتخدام
كريستالة خارجية أو مذبذب من نوع أخر(.
كما هو موضصح ف ي الجصدول ،نجصد أن تغييصر العصدادات سصيجعل الممتحككصم يتصأخر إمصا 0أو 4أو
65مللصصي ثانيصصة عنصصد بدايصصة التشصصغيل )يعنصصي أنصصه سيسصصتغرق 64مللصصي ثانيصصة مصصن بصصدء تودصصصيل الكهرباء إلى أن يبدأ تنفيذ البرنامج(.
لماذا نحتاج أن نجعل الممتحككم يتأخر فترة ما قبل أن يبدأ تنفيذ البرنامج؟ 151
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. هناك سببين لهذا المر. •
اﻷول :بعصض الصدوائر والعنادصصر اللكترونيصة الصتي قصد تتصصل بصالمتحكم الصدقيق تحتصاج القليل من الوقت بعد تودصيل الكهرباء حتى تكصصون جصصاهزة للعمصصل بصصصورة مسصصتقرة لصصذا
يستحسصصن أن يتصصأخر الممتحككصصم الصصدقيق قليلا قبصصل أن يبصصدأ العمصصل أو التصصصال مصصع هصصذه المكونات. •
الثنناني :معظصصم دوائصصر المذبصصذبات Oscillatorالصصتي تولصصد الصصص CPU Clockتحتصصاج لصصوقت
كبير نسبياا حتى تستقر النبضات المتولصدة منهصا )مثصل دوائصر الصصص RC oscillatorوبعصصض
الص (ceramic oscillatorلذا يجب علصى الممتحككصم أن يتصأخر قليلا حصتى تسصتقر ذبصذبات الساعة الداخلية. يستحسن أن تجعل التأخير الزمني = 65مللي ثانية لضمان أفضل أداء للممتحككم وهذا يعني أن تجعل قيمة الص SUT0 – SUT1كلهما = 1
152
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
LockBits 6.2 مثصصل الفيصصوزات تتحكصصم الصصص lockbitsفصصي مجموعصصة مصصن الخصصصائص الثابتصصة الصصتي ل تتغيصصر إذا تصصم برمجتها ،هصذه الخصصائص ه ي " إمكانيصة الودصصول وحمايصة الصذاكرة" .حيصث يمكنصك اسصتخدام الصص
lockbitsفصصي حمايصصة البيانصصات علصصى ذاكصصرة الممتحككصصم الرئيسصصية flashمصصن النسصصخ أو القصصراءة كمصصا يمكنك حماية بعض أجصزاء الصذاكرة eepromمصن الكتابصة عليهصا ومنصع أي برنامصج أو شصخص مصن
الودصول إلى محتواها.
أيضاا تستخدم الص lockbitsفي تخصصيص جصزء ثصابت مصن الصذاكرة ل يقبصل التعصديل بعصد برمجتصه
مثصصل مصصا يحصصدث مصصع الصصص ) bootloaderأشصصهر مثصصال للبوتلصصودر هصصو (arduino bootloaderوهصصو البرنامج المسؤول عن استقبال ملف الص hexمن السيريال بدل من الص .SPI كمصصا نصصرى فصصي الجصصدول التصصالي اعصصدادت الصصص lockbitالصصتي يمكنهصصا أن تغلصصق إمصصا القصصراءة والكتابصصة أو القراءة فقط من جميع أنواع الذاكرة Flash & EEPROMوذلك عصبر التحكصم فصي قيصم الصص LB1و LB2
•
عندما تكون LB1 = 1و LB2 =1ل يتصم تفعيصل الصص lockbitويسنمح بنالقراء والكتاب ة من وإلى الذاكرة
•
عنصصصدما تكصصصون LB1 = 0و LB2 =1يتصصصم تفعيصصصل الحمايصصصة ويمننننع أي محاولنننة )كتابنننة(
•
عنصصدما تكصصون LB1 = 0و LB2 =1يتصصم تفعيصصل الحمايصصة ويمنننع أي محاولننة )كتابننة أو
بيانات على كل من الص Flashوالص EEPROM
قراءة( البيانات على كل من الص Flashوالص EEPROM
153
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.3المذبذبات والـ
Clock Source
عندما نشتري أجهزة الحاسوب الخادصة نحاول دائما شراء الجهاز السرع وهنا نجد الشركات
المصنعة دائماا تتباهي بأن منتجاتها هي الفضل لنها تعمل بأعلى سرعة معالجة )تقاس
بالجيجاهرتز – مليار هرتز( .ومثل أجهزتنا
الشخصية نجد أن سرعة الممتحككمات الدقيقة هي
شكل نبضات الساعة عبر الزمن
أيضاا تحدد عبر التردد الذي تعمل عليه أو كما تسمى )مصدر الساعة .(clock source
حيصصث يتصصم تنفيصصذ الوامصصر بسصصرعة = )÷1الصصتردد( الصصذي يعمصصل بصصه الممتحككصصم ،علصصى سصصبيل المثصصال.
جميع شرائح الص AVRتقوم بتنفيذ أمر واحد كل 1نبضة من الص .clock source •
إذا كان التردد = 1ميجاهرتز )السنرعة الفتراض ية لمعظنم ممتحككمنات النن (AVRهصذا
يعنصصصي أن الممتحككصصصم يمكصصصن تنفيصصصذ 1مليصصصون أمصصصر بلغصصصة السصصصمبيلي فصصصي الثانيصصصة الواحصصصدة ويستغرق المر 1ميكروثانية •
إذا كان الصتردد = 1ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 1مليصون أمصصر بلغصصة السمبيلي في الثانية الواحدة ويستغرق المر 1ميكروثانية
•
إذا كان الصتردد = 2ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 2مليصون أمصصر بلغصصة السمبيلي في الثانية الواحدة ويستغرق المر نصف ميكروثانية أو ) 500نانوثانية(.
•
إذا كان الصتردد = 4ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 4مليصون أمصصر بلغصصة السمبيلي في الثانية الواحدة ويستغرق المر 250نانوثانية nano second
•
إذا كان الصتردد = 8ميجصصاهرتز هصذا يعنصي أن الممتحككصم يمكنصه تنفيصذ 8مليصون أمصصر بلغصصة السمبيلي في الثانية الواحدة ويستغرق المر 125نانو ثانية النانو ثانية ) = Nano Second (nSجزء من مليار جزء من الثانية الميكرو ثانية ) = Micro Second (uSجزء من مليون جزء من الثانية.
تصصدعم ممتحككمصصات الصصص AVRالعديصصد مصصن تقنيصصات توليصصد الذبصصذبات اللزمصصة لتشصصغيل الممتحككصصم أو كمصصا
تمسى Clock Sourceتختلف هذه التقنيات في مدى دقتها ونسبة الخطأ والتكلفة الماليصصة ،فصصي هذه الجزء سنستعرض 4طرق مختلفة مع إيضاح مميزات وعيوب كل طريقة.
154
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
Internal Calibrated RC oscillator كلمة RC oscillatorتعني "المذبذب الداخلي المصنوع بمقاومة ومكثف" وتعتصصبر هصذه الطريقصصة هصصصي أرخصصصص أسصصصلوب للحصصصصول علصصصى الصصصص Clock sourceحيصصصث تحتصصصوي شصصصرائح الصصصص AVRومنهصصصا
ATmega16على مذبذب RCداخلي يمكنه العمل بسرعات من 1إلى 8ميجاهرتز )يتم ضصصبطها
بالفيوزات كما سنرى لحقاا( .ول تتطلب هذه الطريقة تودصيل أي مكونات إضافية وبالتالي يتم تصغير حجم المشروع وتقليل التكلفة
العيوب :نسبة الخطأ في التردد والتوقيت - %3هذه النسبة قد ل تؤثر في معظصصم التطبيقصصات، لكنها خطيرة جداا في التطبيقات التي تحتاج توقيت دقيصصق أو تسصصتخدم دوال delay_msعلصصى فترات بعيدة .على سبيل المثال :إذا كان مشصصروعك عبصصارة عصصن تشصصغيل loadكصصل ثانيصصة واحصصدة فلن تشعر بهذا الخطأ لن التوقيت الحقيقي = 1ثانية ) (-\+نسبة الخطأ =
) (0.03 = 1 * 0.03وهو ما يساوي 1.03ثانية أو 1ثانية طرح 0.97 = 0.03ثانية. لكصصن تخيصصل أن مشصصروعك يقصوم بتشصصغيل الصصص loadكصل 1سصصاعة = 3600ثانيصصة ،عنصصدها سصتجد أن الوقت الحقيقي يصصبح (3600 * 0.03) -\+ 3600وهصو مصا يسصاوي 3708ثانيصة )هصذا يعنصي أنصصصه هنصصصاك )تصصصأخير أو تقصصصديم( 108ثانيصصصة إضصصصافية والصصصذي يعتصصصبر رقصصصم كصصصارثي وبعيصصصد تمامصصصاا عصصصن
التوقيت المطلوب(.
متى نستخدمها؟ إذا كان مشروعك لن يتواجد به أي تأخير زمنصصي يزيصصد عصصن بضصصعة ثصصواني فقصصط
)أقل من 10ثواني( وتريد أن تصغر تكلفة المشروع.
External RC Circuit هصصذه الطريقصصة مماثلصصة للسصصابقة ولكصصن الختلف الوحيصصد أن دائصصرة الصصص RCتكصصون موجصصودة خصصارج
شصصريحة الصصص AVRوتصصوفر تصصرددات أكصصبر مصصن 8ميجصصا حيصصث يمكنصصك ضصصبط الصصتردد عصصبر التحكصصم فصصي قيمة المقاومة والمكثف عبر القانون التالي:
1 )( R∗C
=) F( frequency
حيصصث تمثصصل Rقيمصصة المقاومصصة بصصالوم ،و Cقيمصصة المكثصصف بالفصصاراد ويتصصم تودصصصيل الصصدائرة علصصى
الطرف XTAL1بالطريقة التالية ) NCيعني غير متصل بشيء(
155
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
المميننزات :يمكنصصك الحصصصول علصصى تصصرددات أكصصبر مصصن الصصص internal oscillatorبتكلفصصة قليلصصة كمصصا يمكنك تغير التردد في أي وقت عبر وضع مقاومة متغيرة بدلا من المقاومة الثابتة.
العيننوب :مثصصل النصصوع السصصابق ،غالبصصاا ل يمكنصصك تحديصصد قيمصصة المكثصصف ول المقاومصصة بدقصصة كصصبيرة حيصصث تحتصصوي هصصذه العنادصصصر علصصى نسصصبة خطصصأ %5وبالتصصالي الصصتردد الحقيقصصي الناتصصج عنهصصا يكصصون
مضاف إليه نسبة خطأ %5
فصصي حالصصة أنصصك تريصصد اسصصتخدام هصصذه الطريقصصة يجصصب النتبصصاه إلصصى قيمصصة المكثصصف حيصصث يجصصب أن
تكون 22بيكوفاراد أو أكثر ويجب أن يكون من النوع السيراميكي )منعصصدم القطبيصصة( ceramic capacitor معلومة إضافية :بعض ممتحككمات AVRتحتوي على مكثف داخلي بقيمة 36بيكوفاراد وبالتالي لن تحتاج سوى أن تودصل مقاومة فحسب.
156
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
External Crystal “Quartz” Oscillator تعتصصصبر هصصصذه الطريقصصصة هصصصي الكصصصثر شصصصيوعاا والمفضصصصلة لصصصدى جميصصصع الشصصصركات ومصصصصممي النظمصصصة المدمجصصة ،حيصصث يتصصم اسصصتخدام الكريسصصتالة ذات الطرفيصصن لتوليصصد الصصتردد المطلصصوب بدقصصة عاليصصة
جداا وبأقل نسبة خطأ ممكنه حيث تبلغ نسبة الخطأ في الكريسصصتالة حصصوالي 10هرتصصز مصصن أدصصصل 1مليصون وهصو مصا يسصصاوي 0.00001واحصد مصن كصصل مئصصة آلصف وهصذا يعنصصي أنهصصا أكصثر بدقصصة بنحصو 1000مرة من الص .RC oscillator
المميننزات :الدقصصة العاليصصة جصصداا وثبصصات الصصتردد مهمصصا تغيصصرت درجصصات الحصصرارة وبالتصصالي فهصصي تصصوفر أداء ممتاز طوال فترة التشغيل
العيوب :التكلفة حيث تحتاج هذه الكريستالت إلى مكثفات إضافية عصصدد 2مكثصصف بسصعة 22 بيكوفصصاراد ممصصا يزيصصد التكلفصصة لتصصصل إلصصى 1دولر تقريبصصاا )تكلفصصة الكريسصصتالة بمفردهصصا = نصصصف
دولر(.
أشهر هذه الكريستالت هي 16ميجا والص 12ميجصصا والصصص 8ميجصصا والصصص 24ميجصا ،فصصي هصذا الكتصصاب
سنستخدم الص 16ميجا في بعض التجارب )وهو أقصى تصردد يمكصصن لشصصريحة الصصص ATmega16أن تعمل به مع العلم أن المتحكم ATTinyيمكنه العمل بسرعة تصل إلى 20ميجاهرتز(. يتم تودصيل الكريستالة والمكثفات بالصورة التالية:
157
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. معلومصصة إضصصافية :الكريسصصتالة هصصي عنصصصر إلكصصتروني مصصصنوع مصصن مصصادة بلوريصصة اسصصمها "الكصصوارتز
"Quartzوعندما يتم تودصيلها بالكهرباء فإنها تعمل كأنها دائرة رنين مكونة مصصن مكثصصف وملصصف ومقاومصصصة R-L-C circuitتنتصصصج Sin waveولكصصصن عنصصصدما تتصصصصل بصصصدائرة pierce oscillator
داخصصصل الممتحككصصصم الصصصدقيق يتصصصم تحويصصصل الذبصصصذبات المتولصصصدة علصصصى هيئصصصة sin waveإلصصصى pulse باستخدام عاكس inverterيمكنك معرفة المزيد عن الص pierce oscillatorمن الرابط التالي: http://www.abracon.com/Support/facn_abracon_jul2011.pdf ويمكنك قراءة دصفحة الكريستالت على ويكيبيديا لتتعرف أكثر عليها. en.wikipedia.org/wiki/Crystal_oscillator
التركيب الداخلي الذي تمثله الكريستالة عندما تتصل بدائرة كهربية
تركيب دائرة المذبذب )الكريستالة + المكثفات +العاكس(
158
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
External Resonators هصصذا النصصوع مصصن المذبصصذبات يشصصبه لحصصد كصصبير الكريسصصتالة وفصصي الحقيقصصة هصصو يصصوازي "كريسصصتالة + المكثفات الضافية" في قطعة إلكترونية واحدة ويتوفر في السواق بترددات مختلفة بدأ مصصن
1ميجاهرتز إلى 24ميجاهرتز
المميزات :السعر المنخفض )أرخ ص مصن الكريسصتالة( كمصا أنصه يحتصوي علصى المكثفصات المطلوبصة بداخله وحجمه الصغير وتوافر معظم الترددات المطلوبة
العينننوب :يتملصصصك نسصصصبة خطصصصأ ) %0.5نصصصصف بالمئصصصة( ،وهصصصي تعتصصصبر نسصصصبة أفضصصصل بكصصصثير مصصصن الصصصص internal RC oscillatorولكنها ل تقارن بدقة الكريستالة الكوارتز.
External Pure Pulse (TTL) Oscillator المذبذبات الكصثر دقصة علصى الطلق حيصث تبلصغ نسصبة الخطصأ 5هرتصز لكصصل 1مليصصون هرتصصز وهصصو مصصا يسصصاوي 0.000005والصصذي يعنصصي أنهصصا تمتلك دقة توازي 20ضعف دقة الكريستالت الكوارتز.
تتصصصصوفر هصصصصذه المذبصصصصذبات بأشصصصصكال عديصصصصدة أغلبهصصصصا تكصصصصون مربعصصصصة أو
مسصصتطيله الشصصكل وتمتلصصك 4أطصصراف VCC – CLK – GNDوالطصصرف الرابصصع غيصصر مسصصتخدم .يتصصم
تودصيل الطرف CLKبالطرف XTAL1ف ي شصريحة الممتحككصم AVRوتودصصيل الطصرف VCCبنف س مصدر الجهد الخاص بالص ) AVRسواء كان 5فولت أو 3.3فولت(.
159
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. العيوب :السعر المرتفع ،حيث يبلع سصصعر هصصذا النصصوع مصصن المذبصذبات نحصصو 3دولر أو أكصصثر )يصصزداد
السعر بزيادة التردد المطلوب( وفي بعض الحيان يكون سعرها أكبر من سعر الممتحككم الصصدقيق
نفسه .الصور التالية توضح تودصيل الص AVRمع المذبذب الخارجي TTL oscillator
الصور التالية توضح أشكال وأحجام مختلفة للمذبذب
160
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.4قيم الفيوزات لضبط السرعة
القيم التالية هي المستخدمة في التحكم بسرعة شريحة – ATmega16جميع القيصصم تصصم أخصصذها
من ملف الص DataSheetالرسمي للممتحككم )والمرفق مع الكتاب( بداية من الصصصفحة رقصصم 24مصصع ملحظة أن هذه الفيصوزات تعمصصل علصى كصصل مصصن ATmega16/ ATmega32لنهصم مصصن نفصس الفئصة من الممتحككمات )وقد تختلف هذه الفيوزات في فئات أخرى من شرائح الصصص - .(AVRجميصع القيصم مخصصة للفيوزات Clock Selectأو كما تعرف اختصاراا بي CKSEL
فيوزات ضبط السرعة مع المذبذب الداخلي Internal RC قصصم بضصصبط الفيصصوزات بصصالقيم التاليصصة لختيصصار السصصرعة المطلوبصصة ،مصصع ملحظصصة أن القيمصصة هصصي ,, CKSEL1, CKSEL0
CKSEL2,
CKSELالموازية له.
CKSEL3,بنفصس الصترتيب حي ث يعصبر كصل 1بصت عصصن قيم ة الصصص
Clock Frequency
)CKSEL(3,2,1,0
1 Mhz
0001
2 Mhz
0010
4 Mhz
0011
8 Mhz
0100
فيوزات ضبط السرعة مع دائرة External RC Clock Frequency
161
)CKSEL(3,2,1,0
التردد أقل من 0.9ميجاهرتز
0101
التردد المتوقع أكبر من 0.9وأقل من 3ميجاهرتز
0110
التردد المتوقع أكبر من 3وأقل من 8ميجاهرتز
0111
التردد المتوقع أكبر من 8وأقل من 12ميجاهرتز
1000
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
فيوزات ضبط السرعة مع External Crystal or Ceramic
هصصذه العصصدادات يمكصصن اسصصتخدامها مصصع كصصل مصصن الصصص Crystal oscillatorوالصصص ceramic resonator مع ملحظة أنه فصي حالصة اسصتخدام الكريسصتالة يجصب أن يتصم وضصع مكثفصات إضصافية معهصا كمصا
ذكرنا سابقاا ول يتم وضع هذه المكثفات مع الص .ceramic resonator
أيضصصاا لحصصظ أن العصصدادات يتصصم وضصصعها للفيصصوزات CKSELمصصن 1إلصصى 3فقصصط ول يتصصم برمجصصة الصصص CKSEL0معهم في هذا الوضع .ويتم برمجة الفيوز CKOPTفي حالة استخدام كريستالة أكبر من 8ميجاهرتز. سعة المكثفات
Clock Frequency
)CKSEL(3,2,1 ”“0 is not used
ceramicهذا الوضع ميستخلدم مع
101
resonator وفي حالة أن التردد المطلوب ما بين 0.4
CKOPT = 1
المقترحة ل يتم استخدام مكثفات
إلى 0.9ميجاهرتز السعة المقترحة بين
التردد المتوقع أكبر من 0.9وأقل من 3
12 → 22 picofarad
ميجاهرتز
السعة المقترحة بين
التردد المتوقع أكبر من 3وأقل من 8
12 → 22 picofarad
ميجاهرتز
السعة المقترحة بين
التردد المتوقع أكبر من 8ميجا وحتى 16
12 → 22 picofarad
162
ميجاهرتز
110 CKOPT = 1 111 CKOPT = 1 111 CKOPT = 0
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. ما هي أهمية الفيوز CKOPT؟ هذا الفيوز يتحكصم فصي بعصصض المصصور المهمصة ،منهصصا تشصصغيل المذبصذب بالطاقصصة القصصصوى أو الطاقصصة المنخفضة )وضع توفير الطاقة عندما يكون (CKOPT = 1 “unprogrammed”fuseهذا الوضع يسصصصصصاهم فصصصصي تخفيصصصصض الطاقصصصصة الصصصصتي يسصصصصصتهلكها الممتحككصصصصصم الصصصصصدقيق لكنصصصصه ل يصصصصصصلح لتشصصصصصغيل
الكريستالت الكبر من 8ميجاهرتز لنه كلما زاد تصصردد الكريسصتالة كصانت النبضصات الناتجصة منهصا أضعف من ناحية فرق الجهد وبالتالي قد ل تصلح لتشغيل المعالج.
للتغلصصب علصصى هصصذه المشصصكلة يتصصم تفعيصصل الصصص CKOPTوالصصذي سصصيقوم بتشصصغيل المذبصصذب بالطاقصصة
القصوى أو كما يسصصمى Full rail-to-rail swingممصصا يجعصصل المعالصصج يحصصصل علصصى أفضصصل نبضصصات ممكنصصصه تكفصصصي لتشصصصغيله فصصصي السصصصرعات العاليصصصة وتكفصصصي أيضصصصاا لخصصصراج نبضصصصات دقيقصصصة لتشصصصغيل
المكونات الخارجية.
من المفيد جداا تفعيل هذا الفيوز في الدوائر الصتي سصصتتعرض إلصى noiseأو ستوضصصع فصي مكصصان
معرض لشعاع كهرومغناطيسي كبير نسبياا حيث يسصصاعد وضصصع Full rail-to-railعلصصى تحسصصين
أداء الممتحككم في البيئات ذات الص noiseالكبيرة.
الوظيفصصصة الثانيصصصة لصصصه هصصصي تفعيصصصل المكثصصصف الصصصداخلي "سصصصعة 36بيكوفصصصاراد" لتشصصصغيل دائصصصرة الصصصص external RC circuitبالمقاومة فقط دون مكثف إضافي.
فيوزات ضبط السرعة مع المذبذب الخارجي Pulse Oscillator عنصصصد اسصصصتخدام أي مصصصصدر خصصصارجي لنبضصصصات السصصصاعة pulsesمثصصصل الصصصص TTL oscillatorأو حصصصتى
شريحة IC 555يتم وضع كل قيم CKSEL(3,2,1,0) = 0000
163
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
ملخص إعدادات الفيوزات للتحك م بالسرعة •
إذا أردت تشغيل الممتحككم الدقيق بأقل استهلك ممكن للطاقصصة قصصم بتفعيصصل الصصتردد علصصى 1ميجاهرتز فقط عبر وضع .CKSEL(3,2,1,0) = 0001
•
إذا أردت تشصصغيل الممتحككصصم بأقصصصى سصصرعة ) 8ميجصصاهرتز( دون اسصصتخدام أي مكونصصات إضافية قم بوضع القيم .CKSEL(3,2,1,0) = 0100
•
إذا كنت تنوي أن تستخدم أي كريستالة خارجيصصة فالفضصصل أن تشصصغل الصصص Full rail-to-
railعبر تفعيل الفيوز CKOPTبوضع القيمصصة 0بصصداخله واختيصصار CKSEL(3,2,1) = 111
– هذا الوضع سيعمل بصورة ممتازة مع جميع الكريستالت.
ملاحظات هامة بخصوص تعديل السرعة يجب النتباه عند تغيصصر سصصرعة الممتحككصم الصدقيق حيصث أن سصصرعة رفصصع البرنامصصج )ملصف الهيكصس( يجب أن تكون أقل من 1/8من تردد الص Clockالمستخدم. علصصي سصصبيل المثصصال إذا كصصانت سصصرعة الممتحككصصم = 1ميجصصاهرتز إذا يجصصب أن تكصصون سصصرعة رفصصع البرنامج على الممتحككم أقل من 128كيلوهرتز وإل قد تجد خطصصأ مصصن برنامصصج AVRdudeمفصصاده أن البرنامج ل يستطيع أن يتوادصل مع الممتحككم الدقيق. على أي حال إذا قرأت هذا الخطأ فكل ما عليك فعله هو تقليل سرعة الرفع عصصن طريصصق تودصصصيل طرفصصصصصصي الصصصصصصص jumperالموجصصصصصصودة بصصصصصصدائرة الممبرمجصصصصصصة ) USBaspسصصصصصصتجد كلمصصصصصصة slowمكتوبصصصصصصة بجانبها( وإذا كنت تستخدم مبرمجة أخرى ل تحتوى هذا الوضع فيمكنك أن تختار سرعة الرفع من برنامج ) AVRdudessاجعل قيمتها = 500هرتز فقط(. عنصصد اسصصتخدام الدالصصة _) delay_us(timeيجصصب أن يعمصصل المذبصصذب بكريسصصتالة خارجيصصة بصصتردد 8 ميجاهرتز على القل حتى تعمل الدالة بتوقيت دصحيح )إذا تم استخدام المذبصصذب الصصداخلي أو
كريستالة بتردد أقل فيحدث خطأ في الدالة delay_usولن يتم التأخير بالوقت المطلوب(
164
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.5الطاقة وسرعة تشغيل الممتحككامات
فصصصي العديصصصد مصصصن التطبيقصصصات يجصصصب أن يتصصصم تصصصصميم النظصصصام المدمصصصج بحيصصصث يعمصصصل علصصصى مصصصصدر
منخفصصض جصصداا للطاقصصة مثصصل بطاريننة أو لوحننة شمسننية دصصصغيرة ،مصصن أجصصل هصصذه التطبيقصصات يتصصم ضبط الممتحككم للعمل على الترددات المنخفضة. معظصصم الممتحككمصصات الدقيقصصة )وبالتحديصصد المعالجصصات الدقيقصة الموجصصود بصصداخلها( تسننتهلك طاقنة أكننثر كلمننا كننانت تعمننل بننتردد أكننبر وبالتصصالي نجصصد أن تخفيصصض الصصتردد يقلصصل بدرجصصة كصصبيرة جصصداا استهلك التيار الكهربي كما هو ملحوظ في الرسم البياني التالي:
معدلت استهلك الطاقة لعائلة ATTinyوبعض أفراد عائلة atmega كمصصصصا نصصصصرى علصصصصى المحصصصصور الرئيسصصصصي )اسصصصصتهلك التيصصصصار بصصصصالمللي أمصصصصبير( والمحصصصصور الفقصصصصي الصصصصتردد
)بالميجاهرتز( وكل خط مرسوم يمثل فرق الجهصصد الصصذي يعمصصل عنصصده الممتحككصصم الصصدقيق .مصصن هصصذا الرسم نستنتج العديد من المور. •
عند فرق جهد 1.8ميجا يمكن للممتحككم أن يعمل بصتردد مصن 1ميجصا إلصى 4ميجصا بحصد أقصى وباستهلك تيار من الثاني حتى 1.8مللي أمبير فقط.
165
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. •
عنصصد فصصرق جهصصد 2.7فصصولت يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى 10ميجصصاهرتز
•
عند فصصرق جهصد 3.6يمكصصن للممتحككصصم أن يعمصصل بصتردد يصصصل إلصصى 14.5ميجصصاهرتز تقريبصصاا
•
عند فرق جهد 4فولت يمكن للممتحككصصم أن يعمصصل حصتى 17ميجصصاهرتز باسصصتهلك تيصصار 7
•
عنصصد فصصرق جهصصد مصصن الخصصامس إلصصى 5.5يمكصصن للممتحككصصم أن يعمصصل بسصصرعة تصصصل إلصصى 20
واستهلك تيار حوالي 3مللي أمبير.
وباستهلك تيار يصل إلى 5.7مللي أمبير.
مللي أمبير.
ميجاهرتز.
ملحظة :الحد القصى لتردد الص ATmega16/ATmega32هو 16ميجاهرتز فقط ،بينما الممتحككمات الحدث منها مثل ATmega328أو عائلة ATTinyيمكنها أن تصل إلى 20 ميجاهرتز بعض ممتحككمات الص AVRتدعم العمل بتردد 125كليوهرتز أو أقل ،هصذا المعصدل يجعصل اسصتهلك التيار الكهربي منخفض جداا لدرجة أنه يصل إلى 100ميكرو أمبير ) 100جزء من المليون من المبير وهو ما يساوي 0.1مللي أمبير(. تختلف هذه المقصاييس قليلا بتغيصصر درجصة الحصرارة الصتي يعمصل عنصدها المعالصصج وتوجصد رسصومات بيانيصة مفصصصلة تشصصرح معصدلت اسصصتهلك الطاقصصة بالتفصصيل عنصصد درجصات الحصرارة المختلفصة بصدءاا
من دصفحة 299في الص Datasheetالمرفقة )مع ملحظة أن بعض معدلت استهلك الطاقصصة قصصد تختلف قليلا مع ممتحككمات الص AVRالخرى(.
كيف تحسب عمر البطار ية
عند اسصتخدام البطاريصصات سصيكون مصصن المفيصد جصداا أن تحسصصب وقصت التشصغيل حصتى تنفصذ طاقصة البطاريصصة وقصصد يحصصدد هصصذا الصصوقت الصصتردد المطلصصوب لتشصصغيل الممتحككصصم .وقبصصل أن نبصصدأ الحسصصابات
علينا أن نتعرف على بعض المور.
166
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. استهلك الطاقة المذكور مسبقاا هو للممتحككم الدقيق نفسه وليس لي حمل loadمتصل به ويمكن تخفيض هذا الستهلك قليلا بإيقاف تشغيل الص ADC
اسصصصتهلك الطاقصصصة الكلصصصي = Total loadفصصصرق الجهصصصد * )اسصصصتهلك التيصصصار للممتحككصصصم +الحمصصصال المتصلة به( +الطاقة الضائعة من الص voltage regulatorإن وجد.
قانون حساب وقت البطارية ) 0.8×Battery Capacity (mAH ) Total Load Current (mA
=Battery WorkingTime
جميع البطاريات يكون لها سعة تقاس بالمللي أمبير\سصصاعة فمثل بطاريصة الهصصاتف المحمصصول نجصد
مكتوب عليها 3.7فولت ) mAH 3000مللي أمبير\ساعة( أو تكتب ) A/hour 1لن كل 1000 مللصي أمصصبير = 1أمصصبير( .وهصذا يعنصصي أنصصه فصصي حالصة تشصصغيل هصذه البطاريصصة علصصى أحمصال تسصتهلك 3000مللي أمبير فإن البطارية ستظل تعمل 1ساعة فقط.
مثال :إذا كان الممتحككم الدقيق يعمل بفرق جهد 3.7فصولت و بصتردد 16ميجصاهرتز )يسصتهلك 7 مللي أمبير( ومتصل به دايود ضوئي يستهلك 7مللي أمصصبير كمصصا أن منظصصم الجهصصد يسصصتهلك تيصصار
إضافي 6مللي أمبير .احسب زمن التشغيل على بطارية سعتها 1000مللي أمبير بصصافتراض أن جميع الحمال تعمل بصورة مستمرة دون أن تنطفئ.
الحل
أولا :نحسب استهلك التيار الكلي = 7مللي )للممتحككم( 7 +مللصي )للصدايود( 6 +مللصي لمنظصم الجهد = 20مللي أمبير إجمالي استهلك طاقة.
ثانياا :بالتعويض بالقيم في القانون السابق نجد أن ساعات التشغيل = 40ساعة Working Time = 0.8 * (1000/20) = 40 hours معلومة إضافية :لماذا نضرب الرقم 0.8في القانون السابق بالرغم من أنه يفترض أن نقسم سعة البطارية على الستهلك مباشرة؟ السبب هو تواجد استهلك ضائع من الطاقة يحدث
من البطارية نفسها بسبب المقاومة الداخلية Battery Internal Resistorكما أن السلك والتودصيلت في الدائرة الكهربية أيضاا تساهم في ضياع بعض الطاقة خادصة إذا كان هناك أسلك من معدن اللومنيوم
167
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.6كيف تربرمج الفيوزات
برمجة الفيوزات عملية سهلة للغاية عبر برنامج AVRdudessكل ما عليك فعله هو اختيار نوع
الممتحككم الدقيق وأداة البرمجة programmer
ثصصصم الضصصصغط علصصصى زر Bit selectorمصصصن مربصصصع Fuses & lockbitsلتظهصصصر لوحصصصة اختيصصصار قيصصصم الفيوزات )لحظ أن ATmega16ل يمتلك :(Extended Fuses
اختر تفعيل )أو إلغاء تفعيل( الفيوزات المرغوبة كما تريد ثم اضغط Okلتجد أن قيمة الصصص Low Byte Fuseوالص HIGH Byte Fuseأدصبحت جاهزة للبرمجة كما في الصورة التالية
168
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
الن يمكنصصصصك الضصصصصغط علصصصصى زر Writeالموجصصصصود فصصصصي العلصصصصى )بجصصصصانب الفيصصصصوزات( وسصصصصيقوم الصصصصص programmerبحرق قيم الفيوزات المطلوبة.
يصصصوفر برنامصصصج AVRdudessخيصصصار Set fusesوالصصصذي يعنصصصي أن البرنامصصصج سصصصيقوم بإعصصصادة كتابصصصة
الفيوزات في كل مرة يقوم فيهصا برفصع ملصف هيك س جدي د علصى الممتحككصم الصدقيق .منن اﻷفضنل عدم استخدام هذا الخيار والكتفاء ببرمجة الفيوزات عبر زر Writeفحسب. أيضا الزر Readبجانب Writeوالذي عند الضغط عليه سيقوم الص Programmerبقصراءة قيمصة
الفيوزات على الشريحة المتصله به. أيضاا ستجد كلمة Fuse Settingوهي عبارة عن رابط لموقع خاص يعمل كآلة حاسبة للفيوزات لكصصل أنصصواع شصصرائح الصصص AVRكصصل مصصا عليصصك هصصو الصصدخول إليصصه وتحديصصد الخصصصائص الصصتي تريصصدها وسيخبرك الموقع بأي الفيوزات ينبغي لك أن تفعلها وأي منها ل يجب أن تفعلها.
169
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … ..............................................................................................
6.7كيف تعالج الفيوزات الممربرمجة بصورة خاطئة؟
كمصا ذكصرت سصابقاا العصدادات الخاطئصة للفيصوزات قصد تتسصبب فصي عصدم إمكانيصة برمجصة الممتحككصم مصصرة أخصصرى وبصصذلك قصصد تخسصصر الممتحككصصم ،ومصصع ذلصصك هنصصاك خصصبر جيصصد وهصصو أنصصه يتصصوفر نصصوعين مصصن
الحلول لهذا المر. •
اﻷول :هو شراء و استخدام الص High Voltage programmersغالية الثمن مثل AVR
•
الثنناني :بنصصاء دائصصرة AVR Fuse Doctorوهصصي مصصن الصصدوائر الرائعصصة الصصتي تسصصتخدم فصصي
Dragonحيث يمتلك القدرة على التنقيح والبرمجة عالية الجهد لتصليح الفيوزات.
معالجصصة الفيصصوزات بتكلفصصة منخفضصصة جصصداا والصصتي جربتهصصا بنفسصصي وكصصانت رائعصصة كمصصا أنصصه
يمكنك دصناعتها بنفسك بنحو 5دولر فحسب. جميع التصميمات لهذه الدائرة يمكنك أن تجدها على الموقع التالي: http://mdiy.pl/atmega-fusebit-doctor-hvpp/?lang=en
170
.6الفيوزات ،الحماية ،الطاقة وسرعة التشغيل … .............................................................................................. تتوفر تصميمات مشابه أيضاا لنفس الدائرة لكن باستخدام ممتحككمات أخرى بدل مصصن atmega8 مثل ATTiny Fuse doctor http://www.instructables.com/id/AVR-Attiny-fusebit-doctor-HVSP
171
الفصل السابع ” إن أهم يومين يمران على الإنسان هما يوم ولادته واليوم الذي يدرك فيه لماذا ولد ‟
مارك تواين – كاتب أمريكي
.7الممدقاطعة Interrupt … ..............................................................................................
.7الممدقاطعة Interrupt
سصصصنتعرف فصصصي هصصصذا الفصصصصل علصصصى كيفيصصصة تشصصصغيل المقاطعصصصات الخارجيصصصة External Interrupts وفائصصصدة هصصصذه الخادصصصصية الرائعصصصة الصصصتي تتيصصصح دصصصصناعة تطبيقصصصات ذات اسصصصتجابة عاليصصصة السصصصرعة
للحداث الخارجية. ✔
مقدمة عن مفهوم المقاطعة
✔
المثال الول :تشغيل المقاطعة INT0
✔
أنواع الشارات الرقمية Logic, Falling 7 Raising Edges
✔
173
المثال الثاني :تشغيل INT0مع INT1
.7الممدقاطعة Interrupt … ..............................................................................................
7.1مقدمة عن الممقاطعة
The interrupt
فصصي الكصصثير مصصن النظمصصة المدمجصصة نجصصد بعصصض الوظصصائف الصصتي تتطلصصب اسصصتجابة فائقصصة السصصرعة
لحصصدث معيصصن .لصصذا تمصصت مراعصصاة هصصذا المصصر فصصي معظصصم المعالجصصات والممتحككمصصات الدقيقصصة )حصصتى
القديمة منهصا( حيصث تصصم إضصصافة تقنيصة الممقاطعصصة interruptوهصي عبصصارة عصصن طصرف دخصل input pinأو حدث برمجي يتسبب في جعصل المعالصج يتوقنف عنن منا يفعلنه الن ويسنتجيب للحند ث
الممسبب للمقاطعة ويعالجه بسرعة ثم يعود مرة أخرى لما كان يفعله.
مث ا ل نجد أن النظام المدمج داخل وحدة تحكم السيارة يعمل على إدارة الوقصصود وعصصرض سصصرعة الحركة ومع ذلك في حالة حدوث ادصصصطدام بجسصصم مصا نجصد أن النظصصام يسصتجيب بسصصرعة عاليصة
) بصصالرغم أنصصه كصصان مشصصغول بمعالجصصة الوقصصود والسصصرعة( .تحصصدث هصصذه السصصتجابة فائقصصة السصصرعة بسصصصبب أن الحساسصصصات المسصصصؤولة عصصصن الدصصصصطدام يتصصصم تودصصصصيلها علصصصى أطصصصراف دخصصصل الممقاطعصصصة
وتسمى هذه الطراف .External interrupts الحقيقصصة أنصصه هنصصاك أنصصواع كصصثير للمقاطعصصة )بعضصصها داخلصصي وبعضصصها خصصارجي( سصصنتحدث فصصي هصصذا الفصل عن النوع الخارجي فقط External interruptوسيتم شرح بعصصض النصصواع الخصصرى علصصى
مصصدار الفصصصول التاليصصة مثصصل مقاطعصصة الصصص ) ADCفصصي الفصصصل التصصالي( ومقاطعصصة المؤقتصصات Timer
.interrupt
كيف تعمل الممقاطعة الخارجية
في جميع المعالجات والممتحككمات الدقيقة يتم تصميم الكود المسؤول عصصن معالجصصة المقاطعصصات
بصورة مستقلة تماماا عن البرنامج الرئيسي .main programفنجصصد دائمصصاا أن برنامصصج الممقاطعصصة
ويسصصمى ) Interrupt service routingميختصننر بكلمننة (ISRيكتصصب فصصي جصصزء بعيصصد عصصن دالصصة
()mainفمثلا يمكنك أن تكتب برنامج mainليقوم بعمل محدد إلى البصصد ثصصم تكتصصب برنامصصج ال ISRليقوم بوظيفة محددة وسريعة عند تشغيل حساس أو زر معين.
يمتلصصك الممتحككصصم الصصدقيق مصن فئصصة ATmega16/ATmega32عصدد 3أطصصراف للمقاطعصصة الخارجيصة يمكن تودصيلها بأي حساس أو مفتاح رقمي وهذه الطراف هي. )INT0 (pin 2 on port D )INT1 (pin 3 on port D )INT2 (pin 2 on port B
174
.7الممدقاطعة Interrupt … ..............................................................................................
أيضاا يمكن اعتبار الطرف RESETأحد أطراف الص .External interrupt ملحظة :الص RESETفي عالم الممتحككمات الدقيقة يختلف قليلا عن الحاسب اللي .فمثلا نجد في الحاسب اللي )أو الهاتف الجوال( الزر RESETأو Restartوالذي يعني إيقاف تشغيل
الطاقة عن الحاسب ثم إعادة تشغيله .أما في الممتحككمات الدقيقة الزر RESETهو مقاطعة خارجية تأمر المعالج أن يترك ما يفعله الن وينتقل إلى أول أمر في البرنامج المخزن
جلت ووحدات الذاكرة )وهذا يحاكي إعادة تشغيل الممتحككم بداخله مع تصفير جميع الممس ك الدقيق( ومع ذلك تظل الكهرباء متصله بالمتحكم ول يتم فصلها .والسر وراء تصميم الص
RESETبهذه الطريقة هو أن إعادة فصل وتودصيل الكهرباء بالمتحكم قد يستغرق 60مللي ثانية وهذا رقم كبير نسبياا في التطبيقات التي تحتاج استجابة سريعة بينما الممقاطعة يتم تشغيلها في أقل من 1ميكروثانية )يعني أسرع بنحو 60,000ضعف من فصل الكهرباء وإعادة تودصيلها(.
سنتعرف بالتفصيل على هذا اﻷمر في الفصل الخاص بإدارة الطاقة والفيوزات. عند إدخال إشارة رقمية علصصى هصذه الطصصراف تحصدث الممقاطعصة .وعنصصدها يصترك الممتحككصصم الصدقيق
البرنامج الرئيسي الذي ينفذه وينتقل إلى برنامج الص ISRليقوم بمعالجة الممقاطعصصة .الكصصود التصصالي
يمثل التركيب البسيط للص ISRمع ال .main program
175
.7الممدقاطعة Interrupt … .............................................................................................. )(int main { …........ }
)ISR(interrupt_type { …........ }
خطوات تفعيل الممقاطعة الخارجية يتم تفعيل الممقاطعة الخارجية بمجموعة من العدادات كالتالي: .1ضبط الطراف التي ستستخدم للمقاطعة مثل INT0أو INT1لتعمل كدخل input
.2ضصصبط نصصوع الشصصارة الكهربيصصة الصصتي ستسصصبب الممقاطعصصة علصصى حسصصب نصصوع الحسصصاس أو المفتاح الذي سيولد إشارة الممقاطعة) .انظر للشرح بالسفل(.
.3يتم تفعيل قبول استقبال الممقاطعة على الطرف المطلوب مثل INT0 .4تفعيل قبول استقبال الممقاطعة بشكل عام .5كتابة البرنامج الخاص بالممقاطعة ISR
7.2المثال الأول :تشغيل الممقاطعة
INT0
الصصصدائرة التاليصصصة عبصصصارة عصصصن 2دايصصصود ضصصصوئي +مفتصصصاح الصصصدايود المتصصصصل بصصصالطرف PA0سصصصنقوم بتشغيله بصصورة طبيعيصة ليقصوم بعمصل Blinkكصل مئصة مللصي ثانيصة .أمصصا الصدايود المتصصصل بصصالطرف
PC0سيتم تشغيله أو إطفاؤه فقط عند حدوث مقاطعة على الطرف .INT0
176
.7الممدقاطعة Interrupt … ..............................................................................................
الـكود
#define F_CPU 1000000UL >#include #include #include
;)DDRA |= (1 << PA0 ;)DDRB |= (1 << PB0 ضبط الطرف الخاص بالممقاطعة وتشغيل مقاومة الرفع //
;)DDRD &= ~(1 << PD2
البرنامج الرئيسي
;)PORTD |= (1 << PD2 ضبط نوع إشارة الممقاطعة وتفعيل // INT0
;)MCUCR |= (1 << ISC01 ;)GICR |= (1 << INT0 تفعيل قبول الممقاطعة العامة //
;)(sei )while(1 { ;)PORTA ^= (1 << PA0 ;)_delay_ms(100 } ;return 0 } 177
.7الممدقاطعة Interrupt … ..............................................................................................
برنامج المقاطعة
)ISR(INT0_vect { ;)PORTB ^= (1 << PB0 }
شرح الـكود في بداية الكود قمنا باستيراد المكتبة المسؤولة عن المقاطعات وذلك عن طريق المر
>#include
في الدالة mainالرئيسية بضبط الطراف التي سيتصل بها الدايودات الضصصوئية وهصصي الطرفيصصن PA0و PB0وذلك عن طريق المرين: ;)DDRA |= (1 << PA0 ;)DDRB |= (1 << PB0 الخطوة التالية كانت ضبط الطصرف PD2ليعمصل كصدخل وذلصك حصتى يتمكصن مصن اسصتقبال إشصارة
ال ممقاطعة من المفتاح المتصل به .كما قمنصا بتشصغيل مقاومصة الرفصع الداخليصة internal pull up وذلصصك حصصتى نسصصتخدم المفتصصاح دون الحاجصصة لتودصصصيل أي مقاومصصة إضصصافية وتصصم ذلصصك عصصن طريصصق
المرين: ;)DDRD &= ~(1 << PD2 ;)PORTD |= (1 << PD2 ثم تلى ذلك ضبط نوع الممقاطعة الخارجية ونوع الشارة الكهربية التي تسبب الممقاطعة .وقبصصل أن نبصصدأ فصصي شصصرح الوامصصر الخادصصصة بهصصذا المصصر علينصصا أن نتعصصرف علصصى بعصصض الشصصياء المتعلقصصة
بالشارات الكهربية الرقمية.
الإشارات الرقمية
تنقسم الشارات الكهربية الرقمية إلى نوعين وهما logic levelو falling or rising Edge النصصوع الول وهصصو المعصصروف لصصدى الجميصصع ويسصصمى HIGHأو LOWأو ويعصصبر عصصن القيصصم الرقميصصة
التقليدية .0 & 1وتكون كل إشارة سصواء 0أو 1لهصصا زمصصن محصدد يقصاس علصصى حسصب الصصص clock المستخدمة لتشغيل الممتحككم الدقيق.
178
.7الممدقاطعة Interrupt … .............................................................................................. فمثلا لصصو كصصان الممتحككصصم يعمصصل ب ) clock = 1 Mhzمليصصون هرتصصز( بصصان زمصصن النبضصصة الواحصصد = 1 ميكروثانية ويكون هذا الزمن هصو نفصصس الزمصصن المطلصصوب لعمصصل اشصصارة كهربيصصة بقيمصصة 1أو دصصصفر. الصصصور التاليصصة توضصصح شصصكل إشصصارة رقميصصة مقسصصمة إلصصى وحايصصد وأدصصصفار )حيصصث يمثصصل كصصل مربصصع
رمادي اللون زمن إشارة واحدة(.
النصصوع الثصصاني مصصن الشصصارات الرقميصصة يسصصمى "الحصصواف ”Edgesوالصصتي تنقسصصم إلصصى نصصوعين وهمصصا
الحافصصصة الصصصصاعدة Rising Edgeوالحافصصصة الهابطصصصة .Falling Edgeهصصصذا النصصصوع مصصصن الشصصصارات
الكهربية يتميز بأنه فائق السرعة ول يلتزم بزمن محدد وغالباا ما يحدث في زمصصن يقصصاس بالنصصانو
ثانية )جزء من مليار من الثانية(.
وتعتبر الحواف الصاعدة هي تحول الشارة الكهربية من LOW levelإلى HIGH levelفي زمن
دصغير جداا بينما الحواف الهابطة هي تحول الشارة الكهربية من HIGH levelإلى .LOW level
الصور السابقة تثير تساؤل هام وهو :أل يعني ذلك أن جميع الشارات الرقمية تحتوي علننى
fallingو rising edges؟
الجابة هي نعم .والحقيقة أن أي إشارة رقمية تحتوي على حصصواف عصصددها يسصصاوي ضصصعف عصصدد الدصفار والوحايد والصورة التالية توضح الحافة الهابط والصاعدة مع إشارة LOWثم HIGH
179
.7الممدقاطعة Interrupt … ..............................................................................................
1:Rising 2:Falling 3:High 4:Low الطصصراف التقليديصصة الصصتي تعمصصل كصصدخل للمتحكصصم الصصدقيق ل تسصصتطيع أن تستشصصعر هصصذه الحصصواف
سصصواء كصصانت الصصصاعدة أو الهابطصصة وذلصصك لنهصصا تتصصم فصصي زمصصن دصصصغير جصصداا .وهنصصا تظهصصر مشصصكلة
خطيرة .حيث نجد أن بعض الحساسات يكون الخرج الكهربي الخاص بها سريع جداا لدرجة أن
الشصصارات الكهربيصصة الناتجصصة منصصه تكصصون فصصي زمصصن يقصصاس بالنصصانو ثانيصصة )مثصصل الحصصواف الصصصاعدة
والهابطة( وتمسى هذه الشارات السريعة بالص Electric Impulseأو .Electric Edges لحصصل هصصذه المشصصكلة قصصام مصصصممو الممتحككمصصات الدقيقصصة بصصصناعة دائصصرة إلكترونيصصة خادصصصة تتصصصل بصصأطراف الصصصمقاطعات وتسصصمى بالصصص ) edge detectorمكتشصصف الحصصواف( .وتكصصون هصصذه الصصدوائر
مسصؤولة عصصن الحسصاس بالشصارات الكهربيصة فائقصة السصرعة وإبلغ الممتحككصم بصأنه هنصاك مقاطعصة
مطلوبة فوراا.
تمتلصصك ممتحككمصصات AVRهصصذه الصصدوائر الخادصصصة علصصى جميصصع أطصصراف المقاطعصصات وبصصذلك يمكننصصا أن
نجعصصل ال ممقاطعصصة تعمصصل علصصى جميصصع المفاتيصصح أو الحساسصصات فائقصصة السصصرعة .حيصصث يمكصصن ضصصبط
الممقاطعة أن تعمل إما بإشارة تقليدية 0 & 1أو عن طريق إشارة سريعة .Edge
جل MCUCRوالصذي يحتصوي علصى مجموعصصة مصصن البتصصات مسصصؤولة عصصن يتحكم في هذا المر الممسص ك تحديصصد نصصوع إشصصارة الممقاطعصصة وتسصصمى ) ISCxxيتصصم اسصصتبدال xxبرقمصصي 0و 1كمصصا سصصنرى فصصي
جل فصصي الصصصفحة رقصصم 68مصصن دليصصل البيانصصات الشصصرح التصصالي( .يمكنصصك الودصصصول لشصصرح هصصذا الممسصص ك
للمتحكم .ATmega16
180
.7الممدقاطعة Interrupt … .............................................................................................. • •
تتحكم البت ISC00و ISC01في إعدادات الشارة الخادصة بطرف الممقاطعة INT0 تتحكم البت ISC10و ISC11في إعدادات الشارة الخادصة بطرف الممقاطعة INT1
عنصصد تغيصصر قيصصم هصصذه البتصصات يمكننصصا تحديصصد نصصوع إشصصارة الممقاطعصصة المطلوبصصة وذلصصك تبعصصاا للجصصدول التالي )يمكنك أن تجده في الصفحة رقم 68من دليل بيانات (ATmega16
•
الخيار اﻷول :هو ترك قيمة ISC00و ISC01بصفر وهذا سيجعل الممقاطعة تعمصل عنصصد
إدخصصال إشصصارة مصصن نصصوع LOWعلصصى الطصصرف ) INT0معنصصى ذلصصك أنصصه طالمصصا الطصصرف INT0
يدخل إليه إشارة HIGHفلن تعمل الممقاطعة(. •
الخينننار الثننناني :جعصصصل قيمصصصة ISC00تسصصصاوي 1بينمصصصا قيمصصصة ISC01تسصصصاوي دصصصصفر وهصصصذا
سصصيجعل الممقاطعصصة تعمصصل عنصصد حصصدوث أي تغييصصر منطقصصي logic changeعلصصى الطصصرف
INT0ومعنصصى ذلصصك أنصصه إذا أدخلصت إشصصارة HIGHشصصرط أن تكصصون الشصصارة السصصابقة LOW
أو العكس ستعمل الممقاطعة. •
الخيار الثالث :جعل قيمة ISC00تساوي 0بينما قيمة ISC01تساوي 1وهذا سصصيجعل دائصصصصرة الصصصصص edge detectorتعمصصصصل علصصصصى التقصصصصاط أي إشصصصصارة كهربيصصصصة هابطصصصصة وتشصصصصغيل
الممقاطعة. •
الخيار الرابع :جعل قيمة ISC00وذلك ISC01تساوي 1وهصصذا سصصيجعل دائصصرة الصصص edge detectorتعمل على التقاط أي إشارة كهربية دصاعدة وتشغيل الممقاطعة.
والن نعود إلى الكود مرة أخرى سنجد نجد المر
;)MCUCR |= (1 << ISC01 والصصذي وضصصع الرقصصم 1داخصصل البصصت ISC01وبمصصا أن البصصت ISC00تسصصاوي دصصصفر بصصصورة افتراضصصية 181
.7الممدقاطعة Interrupt … .............................................................................................. فصصصإن هصصصذا المصصصر سصصصيجعل ال ممقاطعصصصة تعمصصصل عنصصصد الحافصصصة الهابطصصصة .ولقصصصد اخصصصترت هصصصذا النصصصوع مصصصن
الشارات لن المفتاح المتصل بالطرف INT0يعمل مع المقاومة الداخلية لهذا الطرف ممصا يعنصي أنه عند الضغط على المفتاح سيتحول الطرف INT0من الحالة HIGHإلى الحالة LOWوهصصو مصصا
يوازي الحافة الهابطة .أيضاا كان يمكن أن نصصترك كل ISC00و ISC01بقيمصصة دصصصفر وهصصذا سصصيجعل
الممقاطعة تعمل عند الضغط على المفتاح لفترة زمنية قصيرة ) 1ميكروثانية على القل(.
بعصد النتهصاء مصن ضصبط نصوع إشصارة الممقاطعصة علينصا أن نخصبر الممتحككصم الصدقيق بأننصا نريصد تفعيصل
استقبال إشصارات الممقاطعصة علصى الطصرف INT0ويتصم ذلصك عصصن طريصق التلعصب بالبتصات الخادصصة
جل في الصفحة 69بدليل البيانات .(ATmega16 بالمسجل ) GICRيمكنك الودصول لهذا الممس ك
جل 3بتات هامصصة جصداا وهصي INT0و INT1و INT2كصل بصت مصصن الثلثصة تتحكصم يمتلك هذا الممس ك
في تفعيل استقبال الممقاطعة على أحد الطراف فمثلا فعندما نضع القيمة 1داخل البصصت INT0
فهذا يعني أن الممتحككم سيبدأ استقبال إشارات الممقاطعة على الطرف INT0وهكذا .. لذا استخدمنا المر التالي لخبار الممتحككم أن يبدأ تفعيل الممقاطعة INT0
;)GICR |= (1 << INT0 والن يأتي المر
;)(sei هصصذا المصصر مسصصؤول عصصن تفعيصصل اسصصتقبال طلبصصات الممقاطعصصة بشصصكل عصصام للمتحكصصم الصصدقيق وبنندون كتابته فلنن تعمنل أي مقاطعنة مهمنا ك انت وذلصك حصتى وإن كنصت قصد كتبصت جميصع أوامصر ضصبط الممقاطعة .ويعتبر استخدام هذا المر مع المر cliأحد الوسائل فصصي التحكصصم فصصي سصصير البرامصصج الهامة التي ل يمكن مقاطعتها. وأخيراا نأتي لنهاية الدالة الرئيسية mainحيث سصصنقوم بجعصصل الممتحككصصم يشصصغل ويطفصصئ الصصدايود الضوئي المتصل على الطرف PA0كل 100مللي ثانية إلى البد.
182
.7الممدقاطعة Interrupt … .............................................................................................. )while(1 { ;)PORTA ^= (1 << PA0 ;)_delay_ms(100 } بعصصد النتهصصاء مصصن الدالصصة الرئيسصصية يصصأتي دور دالننة معالجننة الممقاطعننة ISRحيصصث نجصصد أن هصصذه
الدالة مكتوبة بالسلوب التالي:
)ISR(INT0_vect { ;)PORTB ^= (1 << PB0 } جميصصصع دوال الممقاطعصصصة المختلفصصصة يتصصصم كتابتهصصصا عصصصن طريصصصق التعريصصصف )ISR(interrupt_vector ويتصصصصم اسصصصصتبدال كلمصصصصة interrupt_vectorبنصصصصوع الممقاطعصصصصة المطلوبصصصصة وبالنسصصصصبة للصصصصص External interruptsهناك 3أنواع : INT0_vect INT1_vect INT2_vect فإذا أردنا أن نكتب البرنامج الخاص بالممقاطعة INT0فإننا نكتب )ISR(INT0_vect {
وإذا أردنا أن نكتب البرنامج الخاص بالممقاطعة INT1فإننا نكتب )ISR(INT1_vect {
مع وضع الوامر المطلوبة من الممقاطعة داخل القوسين }{ .وفصصي المثصصال السصصابق اسصصتخدام أمصصر يقوم بعكس حالة الطرف PB0وهذا ما سيجعل الدايود الضوئي يضيء أو ينطفئ عند كل مرة
يتم فيها تفعيل الممقاطعة .INT0
;)PORTB ^= (1 << PB0
183
.7الممدقاطعة Interrupt … ..............................................................................................
7.3المثال الثاني :تشغيل الممقاطعة INT0مع
INT1
فصصصي هصصصذا المثصصصال سصصصنقوم بتفعيصصصل كل المقصصصاطعتين INT0و INT1وسصصصنقوم ببنصصصاء دائصصصرة مشصصصابهة
للمثال السابق باختلف وجود 2مفتاح لتفعيل INT0و INT1ووجود دايود ضوئي إضافي كمصصا
في الصورة التالية:
الـكود #define F_CPU 1000000UL >#include #include #include
البرنامج الرئيسي
)int main(void { ضبط أطراف التودصيل بالدايودات الضوئية//
;)DDRA |= (1 << PA0 ;)DDRB |= (1 << PB0) | (1 << PB1
ضبط الطرف الخاص بالممقاطعة وتشغيل مقاومة الرفع // INT0 & INT1
;))DDRD &= ~((1 << PD2)|(1 << PD3 ;)PORTD |= (1 << PD2)|(1 << PD3
184
.7الممدقاطعة Interrupt … .............................................................................................. تفعيل ال ممقاطعة عند استقبال إشارة من نوع الحافة الهابطة لكل المقاطعتين // INT0 & INT1
;)MCUCR |= (1 << ISC01) | (1 << ISC11 ;)|= (1 << INT0) | (1 << INT1
GICR
)while(1 { ;)PORTA ^= (1 << PA0 ;)_delay_ms(100 } ;return 0
دوال المقاطعة
} دالة الممقاطعة الولى // )ISR(INT0_vect { ;)PORTB ^= (1 << PB0 } دالة الممقاطعة الثانية //
)ISR(INT1_vect { ;)PORTB ^= (1 << PB1
شرح الـكود
}
هصصذا المثصصال يعتصصبر مطصصابق للمثصصال السصصابق فصصي نفصصس الفكصصرة مصصع اختلف تشصصغيل كل المقصصاطعتين
INT0و INT1بحيصصصث تكصصصون كصصصل مقاطعصصصة مسصصصؤولة عصصصن تشصصصغيل وإطفصصصاء الصصصدايودات الضصصصوئية المتصلة على الطراف PB0و .PB1
وكما هو ملحظ سنجد في نهاية البرنامج دالتين ISRالولى مسصصؤولة عصصن أوامصصر معالجصصة INT0 و الثانية مسؤولة عن أوامر معالجة INT1
185
الفصل الثامن ”الرجل الذي يستخدم مهاراته وخياله البناء لمعرفة أقصى ما يمكن أن
يقدمه مقابل دولار واحد بدلا ا من التفكير في أقل ما يمكن أي يقدمه مقابل نفس الدولار ،حتما ا سينجح‟
هنري فورد – مؤسس شركة فورد للسيارات
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
.8التصال التسلسلي بروتوكول UART
في هذا الفصل سنتعرف على أحد أشهر طرق إرسال البيانات بصورة تسلسلية بين الممتحككمات الدقيقصصة والعصصالم الخصصارجي وذلصصك عصصبر بروتوكصصول UARTوالصصذي يعتصصبر أشصصهر بروتوكصصول معيصصاري
لتبادل البيانات. ✔
مقدمة عن التصال التسلسلي
✔
التصال التسلسلي الغير متزامن
✔
تهيئة الص UARTلمتحكمات AVR
✔
المثال الول :تهيئة AVRللعمل كمرسل عبر UART
✔
المثال الثاني :تهيئة AVRللعمل كمستقبل عبر UART
✔
المثال الثالث :الرسال و الستقبال في وقت واحد
✔
إرسال السلسل النصية Strings
✔
187
دوال إضافية
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
8.1مقدمة عن الاتصال التسلسلي
عندما يتوادصل الممتحككم مع العالم الخارجي ،فإن إرسصصال واسصصتقبال البيانصصات يكصصون بشصصكل حصصزم مكونصصة مصصن 8بصصت) 1بصصايت ( .بالنسصصبة لبعصصض الجهصصزة مثصصل الطابعصصات القديمصصة داخصصل كابصصل الصصص Parallel portيتم إرسال البيانات من ناقل البيانات 8بت ) ( bit data bus-8من الكمبيوتر
إلى ناقل البيانات 8بت في الطابعة. يعيصصب هصصذا السصصلوب فصصي نقصصل البيانصصات وجصصوب أن تكصصون المسصصافة بيصصن الجهصصازين قصصصيرة .لن
السلك تشوه شكل الشارات الكهربيصصة مصع طصول المسصافة ،كمصصا أن السصصلك المسصتخدمة لنقصل 8
بت في نفس الوقت يكون سعرها مرتفع. أيضصصصصصص اا تحصصصصصصدث مجموعصصصصصصة مصصصصصصن الظصصصصصصواهر كهربيصصصصصصة تسصصصصصصمى "المكثفصصصصصصات الطفيليصصصصصصة Parasitic ”Capacitanceو "الملفصصصصصات الطفيليصصصصصة ”Parasitic inductanceهصصصصصذه الظصصصصصواهر تحصصصصصدث للودصصصلت النحاسصصية المتقاربصصة مصصن بعضصصها البعصصض .وتتسصصبب فصصي تشصصويه كصصبير لشصصكل الشصصارة.
الصورة التالية توضح شكل إشارة كهربية على دصورة "نبضة ”pluseبعد التشويه.
شكل الشارة بعد التشويه الناتج من
شكل الشارة الدصلية
المكثفات والملفات الطفيلية لحل هذه المشكلة يتم استخدام التصال التسلسصلي Serial communicationلنقصل البيانصات بيصصن النظمصصة الصصتي تفصصصل بينهصصا مسصصافات كصصبيرة ،وفصصي وقتنصصا الحاضصصر ومصصع تطصصور التكنولوجيصصا
أدصبح التصال التسلسلي أسرع من ذي قبل ،فتم تعميمه واستخدامه حاليا فصي جميصصع الجهصزة
تقريباا بدءاا من الحساسات في النظمة المدمجة إلى الحواسصصيب الشخصصصية وشصصبكات الحاسصصب اللي.
188
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
مبدأ عمل الاتصال التسلسلي UART
تمتلك الممتحككمصات الدقيقصصة مجموعصصة مصصن الوسصصائل الصتي تمكنصصك مصصن تودصصيل البيانصات مصصن وإلصصى
الممتحككم باسلوب تسلسلي ومنها UART – SPI – i2cفي هذا الفصل سنتحدث عن الص .UART
تستخدم تقنية التصال التسلسلي طرف )سلك( واحد فقط لنقصصل البيانصصات مصصن جهصصاز لخصصر بصدلا
مصصصن 8أسصصصلك كمصصصا فصصصي حالصصصة التصصصصال المتصصصوازي Parallelولكصصصي يتصصصم إرسصصصال البيانصصصات بشصصصكل تسلسلي يتم أولا تحويل البيانات مصصن 8بصصت Parallelإلصصى 8بتصصات متسلسصصلة وذلصصك باسصصتخدام
شريحة إلكترونيصصة )متواجصدة داخصصل الممتحككصصم الصصدقيق( تسصصمى Parallel-in-Serial-out shift
جل إزاحصصصصة يكصصصصون دخلصصصصه 8بتصصصصات parallelوخرجصصصصه 8بتصصصصات registerوهصصصصو عبصصصصارة عصصصصن ممسصصصص ك
متسلسصصلة .وعلصصى الجصصانب الخصصر ،يجصصب أن يمتلصصك الممسصصتقبل شصصريحة أخصصرى تقصصوم بعكصصس هصصذه مم العملية وتسمى ،Serial-in-Parallel-out shift registerلتحويل البيانات مرة أخصصلرى إلصصى 8 بت متوازية.
ملحظة :كلمة بروتوكول Protocolتعني طريقة تنظيم إرسال واستقبال البيانات مثل سرعة البيانات وطريقة ترتيبها وترقيم البيانات المرسلة وكذلك الطراف المستخدمة لهذا الرسال
أنواع الإرسال التسلسلي
والستقبال
يمكن نقل البيانات تسلسلياا ببروتوكول UARTبطريقتين ،لكل منهما مميزات وعيوب وهما: •
التصال التسلسلي المتزامن.
•
التصال التسلسلي الغير متزامن.
189
Synchronous Asynchronous
.8التصال التسلسلي بروتوكول UART … .............................................................................................. ميسصصتخلدم التصصصال المصصتزامن لنقصصل كميصصة مصصن البيانصصات دفعصصة واحصصدة ) ،( Block of dataبينمصصا ميستخلدم التصال الغير متزامن لنقل بايت واحد في كل مرة.
ويمكصصن برمجصصة الممتحككصصم للعمصصل بإحصصدى الطريقصصتين ،ولكصصن البرنامصصج سصصيكون طصصويل .لصصذلك تصصم
دصناعة دوائر متكاملة يتم دمجها داخصصل الممتحككصصم مخصصصصة للتصصصال التسلسصصلي ،وأدصصصبح يرمصصز
إليهصصصا ب UARTأي .Universal Asynchronous Receiver Transmitterأو USARTأي Transmitter
Receiver
Synchronous-Asynchronous
ممتحككمات AVRعلي USARTداخلي.
.Universalو تحتصصصصصصصصصوي
هناك نوعان للرسال التسلسلي:
:Simplex .1عنصصصصدما يكصصصصون هنصصصصاك إرسصصصصال فقصصصصط أو اسصصصصتقبال فقصصصصط .مثصصصصل :الطابعصصصصة، فالكمبيوتر هو الوحيد الذي يرسل البيانات.
:Duplex .2عندما يكون هناك قابلية للرسال والستقبال ،وينقسم إلى نوعين:
:Half-duplex .3وذلك عندما تكون هناك القابلية للرسال والستقبال ولكن ليس فصصي آن واحصصصد ،مثصصصل :جهصصصاز اللسصصصلكي ،عنصصصدما تريصصصد التحصصصدث تضصصصغط علصصصى الصصصزر وتبصصصدأ فصصصي
التحصصدث ،والجهصصاز الخصصر يمكنصصه فقصصط السصصتماع ،وعنصصد إزالصصة يصصدك مصصن علصصى الصصزر يمكصصن للجهاز الخر إرسال الصوت وأنت يمكنك الستماع.
:Full-duplex .4عندما تكون هنصاك القابليصة لللرسصال والسصتقبال فصي آن واح د ،مثصل: الهاتف المحمول ،فبإمكانك التحدث والستماع لمن تخاطبه بنفس الوقت.
190
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
8.2التسلسلي الغير متزامن
Asynchronous
تسصصتقبل البيانصصات بجهصصة المسصصتقبل علصصي هيئصصة 0و .1ول يمكصصن معرفصصة ماهيصصة هصصذه البيانصصات إل عنصصدما يتفصصق المرسصصل والمسصصتقبل علصصى مجموعصصة مصصن القواعصصد والضصصوابط " بروتوكصصول" حصصول
كيفية إرسال البيانات ،وكم عدد البتات في كل مرة ،ومتى يبدأ الرسال ومتى ينتهي.
بتات بداية ونهاية الإرسال :
مم يتم إرسال البايت الواحد بين بت للبداية أخلرى للنهاية ،وهذا يدعى بصال " إط ار " .Frameبصت
البداية frst bitتكون عبارة عن نبضصة واحصدة وتكصون دائمصا ،LOWبينمصا بصت النهايصة يمكصن أن تكون نبضة واحدة أو 2بت وتكون دائما .HIGH
الصورة التالية تمثل مثال على إرسال كصصود ASCIIللحصصرف Aحيصصث يتصصم إرسصصال 10بتصصات لكصصل مم 1بايت 8 .بت للبيانات )حرف Aنفسه( وبت للبداية أخلرى للنهاية.
Courtesy of: AVR microcontroller and embedded systems using assembly and C by M.Ali Mazidi مم فصصصي بعصصصض النظمصصصة تضصصصاف بصصصت أخصصصلرى وتسصصصمى ،Parity bitوتسصصصتخدم لمعرفصصصة إذا مصصصا كصصصانت
البيانات المستلمة دصحيحة أم بها خطأ.
معدل إرسال البيانات Baud rate:
يقصاس معصدل إرسصال البيانصات فصي التصصصال التسلسصلي ب bpsأي .bits per secondبصت ف ي الثانية .وتعتمد سرعة إرسال البيانصات علصى النظصام المسصتخدم ،فقصد كصانت أجهصزة IBMالقديمصة
ترسصصل البيانصصات بسصصرعات تصصتراوح بيصصن 100إلصصى .bps 9600ومصصع التطصصور اسصصتطاعت أجهصصزة المودم إرسال البيانات بسرعة تصل إلى . 56kbps
191
.8التصال التسلسلي بروتوكول UART … .............................................................................................. في الوقت الحالي تدعم معظم الممتحككمات الدقيقة )بمصا ف ي ذلصك (AVRسصرعة أنظمصة الرسصال
التسلسلية من نوع Asynchronousبحد أقصى 115200بت في الثانية )نحو 100كيلصوبت في الثانية(.
أطراف الإرسال والاستقبال في الممتحكك م ATmega16/32
الطصصصصرف الصصصصتي تحمصصصصل الرمصصصصز RXDتسننننتخدم للسننننتقبال :ويتصصصصم تودصصصصصيلها بصصصصالطرف الخادصصصصصة
بالرسال في الممتحككم الخر.
الطرف التي تحمل الرمز TXDتستخدم للرسال :ويتم تودصيلها بصالطرف الخادصصة بالسصتقبال
في الممتحككم الخر.
192
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
8.3تهيئة الـ UARTالداخلي لمتحكامات
AVR
يتم تهيئة ال UARTللعمل عن طريق ضبط العصدادات الخادصصة ب :معصدل نقصل البيانصات – عصدد بتات الرسال – عدد بتات النهاية ...وغيره من العصدادات والصتي يتصم ضصبطها عصن طريصق تغييصر
جلت التي تتحكم في ال .UART قيم الممس ك
يتحكم في ال UART 5مسجلت وهي: -1
.UBRR [H: L]: USART Baud Rate Register
-2
.UCSRA: USART Control and Status Register A
-3
.UCSRB: USART Control and Status Register B
-4
.UCSRC: USART Control and Status Register C
-5
.UDR: USART I/O Data Register
جلات شرح الممس ك ]UBRR [H: L
وهصصو عبصصارة عصصن مسصصجلين 8بصصت UBRRLويحمصصل ال 8بصصت 1بصصت القيمصصة الصصصغرى مصصن قيمصصة ال ،baud rateوالمسجل الخر هو UBRRHويحتوى على القيمة العظمى من ال .baud rate
يتم وضع قيمة ال baud rateفي البتات من 0إلى .11
جلت سيكون الشرح متعلق بالبتات التي سنستخدامها فقط. ملحظة :بالنسبة لبعض الممس ك
UCSRA
•
193
البننت رقنم RXC :7هصذه البصت تصصصبح 1عنصصد اكتمصصال اسصتقبال البصصايت ،وتظصل 0أثنصاء
.8التصال التسلسلي بروتوكول UART … .............................................................................................. الستقبال. • •
البت رقم TXC :6هذه البت تصبح 1عند تمام الرسال ،وتظل 0أثناء الرسال.
البت رقم UDRE :5تكون قيمتها 0أثنصصاء انشصصغال الممتحككصصم وتصصصبح 1عنصصدما يكصصون مم جاهزاا لرسال بيانات أخلرى.
UCSRB
•
البننت رقننم RXCIE :7عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ، 1يتصصم تفعيصصل المقاطعصصة Interruptالخادصة باستقبال البيانات.
•
البننت رقننم TXCIE :6عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ، 1يتصصم تفعيصصل المقاطعصصة Interruptالخادصة بإرسال البيانات.
•
البننت رقننم UDRIE :5عنصصد جعصصل قيمصصة هصصذه البصصت تسصصاوي ، 1يتصصم تفعيصصل المقاطعصصة
•
البت رقم RXEN :4عند جعل قيمة هذه البت تساوي 1يتم تفعيل إمكانيصصة اسصصتقبال
Interruptالخادصة بجاهزية الممتحككم لرسال أو إستقبال البيانات.
البيانات. •
البت رقم TXEN :3عنصد جعصل قيمصة هصذه البصت تسصاوي 1يتصم تفعيصل إمكانيصة إرسصال
البيانات. •
البت رقم UCSZ2 :2برجاء مراجعة الجدول في الصفحة التالية
UCSRC
جل على 2بت لهما أهميصة قصصصوى وهمصصا البصصت رقصصم UCSZ1 :2وكصذلك البصصت يحتوي هذا الممس ك رقم UCSZ0 :1حيث يستخدمان في تحديد عدد بتات الرسال في حزمة البيانات الواحدة.
الجدول التالي يوضح كيفية ضصصبط حجصصم الحزمصصة الواحصصدة مصصن البيانصصات وذلصصك بتغيصصر قيصصم هصذه
البتات.
194
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
سنستخدم في المثلة التالية نظام الرسال بحجم 8بت ) 1بايت( .وهذا النظام يعتصصبر قياسصصي
في معظم الممتحككمات الدقيقة والجهزة اللكترونية المختلفة.
8.4المثال الأول :تهيئة الـ UARTللعمل كمرسل
نسترجع ما شرحناه سابقاا عصصن بروتوكصصول التصصصال التسلسصصلي ،وكمصصا أشصصرنا فصصإن هنصصاك مصصا يسصصمى بمعدل إرسال البيانات والذي يجب أن يتم تحديده للمتحكم ،وأيضاا يجصصب تحديصصد عصصدد البتصصات الصصصتي سنرسصصصلها فصصي المصصصرة الواحصصدة ،فصصالمتحكم قصصادر علصصى إرسصصال 5،7،8أو 9بتصصات فصصي المصصرة الواحدة ،هذا بخلف نبضة البداية ونبضة النهاية .ولكن اتفقنا على اتباع النظمة القياسية في
تحديد عدد 8بتات للرسال ،وهذا ما يجب تحديده للمتحكم.
نبدأ أول بتحديد معدل نقل البيانات baud rateويتم تخزين القيمة فصصي المسصصجلين UBRRH و .UBRRLلنأخصذ علصى سصبيل المثصال معصصدل إرسصال بيانصصات يسصاوي .bps 9600بمراجعصة دليصصل البيانصات للمتحكصم يتضصح أن تحديصد القيمصة الصتي يجصب تخزينهصا بالمسصجلين ] UBRR[H:Lيتصم
عن طريق العلقة:
195
.8التصال التسلسلي بروتوكول UART … .............................................................................................. •
Foscهو تردد المذبذب الدخلي أو الص " " Crystalوسصصنفترض أننصصا نشصصغل الممتحككصصم
•
BAUDهي قيمة معدل إرسال البيانات والتي حددناها سلفاا ب .bps 9600
بتردد 16ميجا هرتز.
ملحظة :في هذا المثال سيتم تشغيل الممتحككم بسرعة 16ميجا وذلك عبر تودصيل كريستالة خارجية 16ميجا +مكثفات 22بيكوفاراد ،يمكنك مراجعة فصل الطاقة وسرعة التشغيل
لتتعرف أكثر على خواص هذا النوع من المذبذبات وطريقة عمله .ول تنسى أن تضبط برنامج بروتس على محاكاة الممتحككم بسرعة تشغيل 16ميجا وذلك عبر الضغط على رمز شريحة ATmega16مرتين ثم تغير الكريستالة وقيمتها
بصصالتعويض عصصن هصصذه القيصصم فصصي المعادلصصة السصصابقة تكصصون قيمصصة UBRRتسصصاوي 103.16667أي
بصصالتقريب تسصصاوي .103ويتصصم وضصصع هصصذه القيمصصة كمصصا هصصو موضصصح فصصي الكصصود التصصالي )هصصذا الكصصود
يجعل الممتحككم يرسل قيمة الحرف Aبصيغة ASCIIكل ثانية(.
#define F_CPU 16000000 >#include #include
)int main(void { ;uint16_t UBRR_Value = 103 ;UBRRL = (uint8_t) UBRR_Value ;)UBRRH = (uint8_t) (UBRR_Value >> 8 ;)UCSRB = (1<
.8التصال التسلسلي بروتوكول UART … .............................................................................................. ;) ) )while( ! (UCSRA & (1<
شرح الـكود
بدايصصاة قمنصصا بتعريصصف متغيصر 16بصت اسصصمه UBRR_Valueلتخزيصصن القيمصة المطلصصوب كتابتهصصا فصصي
جل UBRRLولكصن المسصصجلين ] . UBRR[H:Lثصم أمرنصا الممتحككصم بتخزيصصن هصذه القيمصة فصي الممسص ك جل 8بصصت فقصصط .حيصصث سصصيتم تخزيصصن أول 8بصصت فقصصط مصصن القيمصصة .ثصصم قمنصصا بتخزيصصن هصصذا الممسصص ك جل UBRRHعن طريق المر باقي البتات في الممس ك
;)UBRRH = (unsigned char) (UBRR_Value >> 8 جل. وهذا المر يقوم بعمل إزاحة لليمين بمقدار 8بت .ويخزن باقي البتات في هذا الممس ك
محتوى المتغير :UBRR_Value 1
1
1
0
0
1
0
1
0
0
0
0
0
0
0
0
ما تم تخزينه بالمسجل :UBRRL 1
1
1
0
0
1
1
0
ما تم تخزينه بالمسجل UBRRHبعد عمل إزاحة لليمين بمقدار 8بت: 0
0
0
0
0
0
0
0
إلى هنا انتهينا من تحديد قيمة ال .baud rateنأتي الن لتفعيل إمكانية الرسال والستقبال
عن طريق المر التالي:
;)UCSRB = (1 << RXEN) | (1 << TXEN بعد هذا المر يتبقى شيئ واحد وهو تحديد عدد البتات المرسلة في المرة الواحدة. ; )UCSRC |= (3 << UCSZ0
وهذا المر يقوم بتعيين عددهم الى 8بتات.وهو مساوي للمر
;) )UCSRC |= ( (1 << UCSZ2) | (1 << UCSZ0 197
.8التصال التسلسلي بروتوكول UART … .............................................................................................. والذي يقوم بوضع القيمة 1في كل من . UCSZ0 & UCSZ2ولكصن للتسصهيل اسصتخدمت المصر
بصورته الولى.
بذلك نكون قد انتهينا من تهيئة ال UARTونستطيع أن نرسل البيانات.ولكن لكي نبدأ الرسصصال
جل UDRوكما ذكرنصصا سصصابقاا ،يجصصب أن ننتظصصر حصصتى يصصصبح يجب أن نضع هذه البيانات في الممس ك
الممتحككم جاهزاا لرسال البيانات لذلك استعنا بالمر التالي:
;)))While (! (UCSRA & (1 << UDRE ومعنصصاه أن ينتظصصر الممتحككصصم دون فعصصل أي شصصيئ طالمصصا البصصت
جل UCSRAل تسصصاوي .1كمصصا ذكرنصصا سصصابقاا رقصصم 5فصصي الممسصص ك
جلت أن وجصود 1فصي هصذه البصت يصدل علصصى عنصصد شصصرح الممسصص ك أن الممتحككم جاهز لرسال البيانات.
الصصصصورة التاليصصصة توضصصصح دائصصصرة محاكصصصاة الكصصصود علصصصى برنامصصصج
بروتصصس .مصصع العلصصم أنصصه يمكصصن محاكصصاة الصصص serial portوذلصصك
باستخدام الداة virtual terminal
وها هو ذا الحرف Aيتم إرساله كل ثانية عند تشغيل المحاكاة:
198
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
8.5المثال الثاني :تهيئة ال UARTللعمل كمستقبل
استقبال البيانات عن طريق ال UARTيتصم بنفصس الكصود مصع عمصل تغييصرات بس يطة فصي الصدائرة واضافة سطر جديد).لحظ أنه في الصدائرة الجديصدة يتصم تودص يل الطصرف TXDفصي ال virtual
terminalبالطرف RXDفي الممتحككم الدقيق(.
#define F_CPU 16000000 >#include #include > 8 ;)UCSRB = (1<
199
.8التصال التسلسلي بروتوكول UART … .............................................................................................. الختلف الوحيد في الكود نجده في المر التالي:
While (! (UCSRA & (1 << RXC))); // Waiting for Receiving buffer to be empty. وهصصذا معنصصاه النتظصصار حصصتى يصصصبح الممتحككصصم جصصاهزاا للسصصتقبال .والمصصر الصصذي يليصصه يقصصوم بعصصرض قيمة ما تمت طباعته في نافذة Virtual terminalعلى .PORTC
شكل التجربة أثناء استقبال الحرف aوكذلك إخراج قيمته ) (0b01100001على .PORTC
ملحظة :أثناء كتابة أي حرف على نافذة Virtual terminalل يتم طباعته على الشاشة ولكن يتصصم إرسصصاله ،وإذا أردت أن يتصصم طبصصاعته للتحقصصق ممصصا تضصصغط عليصصه ،فكصصل مصصا عليكصصم فعلصصه هصصو
الضغط بالزر اليمن للماوس على النافذة واختيار .Echo Typed Characters
200
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
8.6المثال الثالث :الإرسال والاستقبال في وقت واحد
والن ،ما رأيك أن ندمصصج المثصالين السصصابقين فصي برنامصصج واحصد .نرسصصل حصصرف مصن ممتحككصم لخصر،
وعند استقبال هذا الحرف يضئ الممتحككم الخر الدايود الضوئي المتصل به.
لحصصصظ تودصصصصيل الطصصصرف TXDفصصصي الممتحككصصصم بالجصصصانب اليسصصصر إلصصصى الطصصصرف RXDفصصصي الممتحككصصصم
الموجود بالجانب اليمن.
أيضصصصصاا سنسصصصصتخدم زريصصصصن ،الول ومكتصصصصوب بجصصصصانبه ONسصصصصيقوم بإرسصصصصال الحصصصصرف " ،" Nوعنصصصصد اسصصتقبال هصصذا الحصصرف مصصن قبصصل الممتحككصصم الثصصاني سصصيقوم بإضصصاءة الصصدايود الضصصوئي .أمصصا الثصصاني
ومكتوب بجانبه OFFفسيقوم بإرسصال الحصصرف " ،" Fوعنصد اسصتقباله مصن قبصصل الممتحككصصم الثصصاني سيقوم بإطفاء الدايود الضوئي.
هذا هو الكود الخاص بالمتحكم الول والذي يتولى مهمة إرسصصال الحصصرف عنصصد الضصصغط علصصى أى
من الزرين.
#define F_CPU 16000000 >#include #include
ضبط الطراف لتعمل كدخل // تفعيل مقاومة الرفع//
)int main(void { ;))DDRC &= ~((1<
201
UART التصال التسلسلي بروتوكول.8 .............................................................................................. … UBRRL = (uint8_t) UBRR_Value; UBRRH = (uint8_t) (UBRR_Value >> 8); UCSRB = (1<
202
.8التصال التسلسلي بروتوكول UART … .............................................................................................. جل .DDRCوالسصصطر الصصذي يليصصه يقصصوم بتفعيصصل مقاومصصة الرفصصع في البتات المناظرة لهما فصي الممسصص ك
الداخلية لكل منهما.
ثم نأتي للجملة الشرطية ))if(bit_is_clear(PINC،0
هذا السطر يقوم باختبار ما إذا تم الضغط على الزر المتصل ب PC0أم ل ،فإذا تم الضغط علصصى
الزر سيقوم الممتحككم بإرسال الحرف " ." Nوكذلك المر بالنسبة للزر المتصل ب PC3ولكصصن مصصع فارق أنه يقوم بإرسال الحرف " ." F
أما الكود الخاص بالمتحكم المسئول عصن اسصتقبال الحصرف وإضصاءة أو إطفصاء الصدايود الضصوئي
فهو كالتالي:
#define F_CPU 16000000 >#include #include > 8 ;)UCSRB = (1<
.8التصال التسلسلي بروتوكول UART … .............................................................................................. )'if(Received == 'F ;)PORTC &= ~(1<
شرح الـكود
في هذا البرنامصصج قمنصا بإنشصاء متغيصر مصصن نصوع Characterويصدعى Receivedوقمنصا بتخزيصصن مصصا يتصصم اسصصتقباله فصصي هصصذا المتغيصصر ،ثصصم يقصصوم الممتحككصصم باختبصصار محتصصوى هصصذا المتغيصصر بجملصصتين
شصصرطيتين ،فصصإذا كصصان محتصصواه مسصصاوياا للحصصرف " " Nقصصام بإضصصاءة الصصدايود الضصصوئي المتصصصل ب ،PC0وإذا كان محتواه مساوياا للحرف " " Fقام بإطفاء الدايود الضوئي.
8.7إرسال مجموعة بيانات مثل السلاسل النصية
قصصد يتبصصادر إلصصى ذهنصصك ،مصصاذا أفعصصل إذا أردت إرسصصال كلمصصة أو جملصصة؟ مصصاذا أفعصصل إذا أردت إرسصصال
قيمة متغير؟ وماذا أفعل لكي استطيع استقبال كلمة أو جملة؟ لنفترض أننا نحاول إرسال كلمة
" " UARTسنجد أنه هناك طريقتين لذلك.
الطريقة اﻷولى :إرسال حروف متتالية إرسال حرف // U إرسال حرف // A إرسال حرف // R إرسال حرف // T وسيتم إرسالها.
204
;)))while(!(UCSRA & (1<
.8التصال التسلسلي بروتوكول UART … ..............................................................................................
بصصالرغم أن هصصذه الطريقصصة تصصصلح بالتأكيصصد لكنهصصا ليسصصت فعالصصة وتتطلصصب كتابصصة الكصصثير مصصن الكصصواد
البرمجيصصة )ممصصا يعنصصي اسصصتهلك المزيصصد مصصن ذاكصصرة الصصص ROMللمتحكصصم الصصدقيق( كمصصا أنصصه فصصي حالصصة العبارات الطويلة سيؤدي ذلك لستهلك ضخم للذاكرة.
الطريقة الثانية :استخدام المؤشرات
مم ولكصصن هنصصاك طريقصصة أخصصلرى .وهصصى اسصصتخدام ال Pointerفالكلمصصة مكونصصة مصصن عصصدد مصصن الحصصرف بجانب بعضها .لذا يمكن استبدال الكود السابق بهذا الكود.
;"char *word = "UART )while(*word > 0 { ;)))while(!(UCSRA & (1<
شرح الـكود
}
في هصذا الكصود اسصتخدمنا مؤشصصر يشصصير إلصى بدايصصة الكلمصة .ومصن أساسصيات علصصم الكمصصبيوتر أن أي 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<
;)(UART_init كما هو موضح في الكود التالي )إعادة كتابة المثال الول ولكن بصورة أفضل(: #define F_CPU 16000000 >#include #include > 8 ;)UCSRB = (1<
.8التصال التسلسلي بروتوكول UART … .............................................................................................. } )int main(void { ; )(UART_init )while(1 { ;) ) )while( ! (UCSRA & (1<
السصصرعة يمكصن أن تتغيصر ،أليصس مصصن الفضصل جعصل الدالصة UART_initبإمكانهصا أن تحصصدد سصصرعة نقل البيانات عن طريق أن نمرر هذه السرعة إلى الدالة عند استدعائها؟
تذكر أنه يمكن تحديد هذه السرعة من العلقة السابق ذكرها،
جل :UBRR إذاا يمكننا كتابة المعادلة التالية ليجاد القيمة المراد تخزينها داخل الممس ك
;)uint16_t UBRR_Value = lrint ( (F_CPU / (16L * baud_rate) ) -1
حيث:
:F_CPUتردد المذبذب الذي يعمل عليه الممتحككم. :Baud_rateمتغير ندخل به قيمة سرعة إرسال البيانات مثل.9600 :
:Lrintهي دالة تقوم بتقريب الناتج إلى أقرب رقم دصحيح ،ولستدعاؤها لبد من تضمنيها باستخدام includeثم اسم الملف math.hفي بداية البرنامج.
207
.8التصال التسلسلي بروتوكول UART … .............................................................................................. فيصبح شكل الدالة كالتالي:
استدعاء مكتبة الحساب//
#define F_CPU 16000000 >#include #include #include
)(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<
)int main(void { ; )UART_init(9600 …...... …......
8.8دوال إضافية
مم أليس هذا أسصهل مصن ذي قبصل؟ إذاا هي ا لنفعصل المثصل ونكتصب دالصة خادص ة بإرسصال حصرف ،وأخصلرى مم خادصة بإرسال كلمة أو جملة وأخلرى خادصة باسصصتقبال حصرف وواحصدة خادصصة باسصتقبال كلمصصة أو
جملة.
الدالة الخاصة بإرسال حرف
)void UART_send_char(char data { ;) ) )while( ! (UCSRA & (1<
UART التصال التسلسلي بروتوكول.8 .............................................................................................. … الدالة الخاصة باستقبال حرف
سلسلة حروفString الدالة الخاصة بإرسال
char UART_receive_char() { while (! (UCSRA & (1 << RXC) ) ); return UDR; }
.()لحظ أن هذه الدالة تعتمد على دالة إرسال حرف واحد
void UART_send_string(char *data) { while(*data > 0) UART_send_char(*data++); UART_send_char('\0'); }
209
الفصل التاسع ” أن تتعثر فهذا يعني أنك تسير في الطر يق ،فلم أسمع
بأحد يتعثر وهو لا يتحرك ‟
تشارلز كيترينج -مهندس ومخخترع أمريكي
.9الممححول التناظري-الرقمي ADC … ..............................................................................................
.9الممححول التناظري-الرقمي ADC
في هذا الفصصصل سصصنتعرف علصصى كيفيصصة قصصراءة الجهصصود الكهربيصصة المتغيصصرة Analogوتحويلهصصا إلصصى قيصصم رقميصصة وذلصصك باسصصتخدام المحصصول التنصصاظري-الرقمصصي المدمصصج داخصصل ممتحككمصصات .AVRحيصصث يمكصصن اسصصتغلل هصصذا المحصصول فصي قصصراءة الحساسصصات التناظريصصة أو أي عنصصصر إلكصتروني لصصه خصرج
كهربي متغير. ✔
مقدمة عن المحول التناظري – الرقمي ADC
✔
طريقة عمل الص ADC
✔
تركيب الص ADCداخل الممتحككم ATmega16
✔
مثال :قراءة جهد متغير باستخدام مقاومة متغيرة
✔
211
الحسابات الرياضية الخادصة بالص ADC
.9الممححول التناظري-الرقمي ADC … ..............................................................................................
9.1مقدمة عن المرحول التناظري-الرقمي
ADC
الشارات الكهربية في العالم الخارجي ليست مقتصرة فقط على الشصارات الرقميصة Digitalبصل
على العكس العديد من الجهزة و الحساسات اللكترونية تصصصدر اشصصارت تماثليصصة Analogفمثلا نجصصد أن معظصصم الحساسصصات المتصصوفرة فصصي السصصواق يمكنهصصا تحويصصل كميصصة فيزيائصصة معينصصة مثصصل
)درجة الحرارة – الرطوبصة – ضصصغط – تركيصصز مصصادة كيميائيصة ..الصصخ( إلصى فصصرق جهصد كهربصصي يتغيصر بتغير هذه القيم الفيزيائية.
بصورة طبيعية ل تستطيع الحواسيب أو الممتحككمات الدقيقة أن تفهم الشارات التماثليصصة فكصصل ما تفهمه هذه الحواسيب هي الشارات الرقميصصة مثصصل 1و 0أو HIGHو .LOWلصصذا قصصام مصصصممو
اللكترونيصصات بصصصناعة شصصريحة خادصصصة تسصصمى بصصالمحول التنصصاظري الرقمصصي Analog to Digital
Converterوتختصصصر بكلمصصة ADCهصصذه الشصصريحة يمكصصن شصصرائها بصصصورة مسصصتقلة وتودصصصيلها مصصع
الممتحككم الدقيق.
لحسن حظنا نجد أن مصممي ممتحككمات AVRقامو بدمصصج هصذه الشصصريحة بصصورة جصاهزة للعمصل
علصصى معظصصم ممتحككمصصات عائلصصة mega AVRوبعصصض ممتحككمصصات عائلصصة .ATTinyوسصصيناقش هصصذا الفصل طريقة تشغيل الص ADCالمدمج بعائلت .AVR
كيف يعمل الم مرحول التناظري الرقمي
تحتوي معظم الممتحككمات الدقيقة )من مختلصصف الشصصركات( ومنهصصا AVR علصصى ADCمصصن نصصوع successive approximation adcهصصذا المحصصول يعمصصل بطريقصصة مشصصابهه "للميننزان القننديم" .تخيصصل معصصي أن لصصديك أحصصد
هصصصذه المصصصوازين القديمصصصة ذات الكفصصصتين .ولنفصصصترض أنصصصك أردت أن تعصصصرف
وزن ثمرة بطيخ .فما الذي ستفعله؟
في البداية ستضع ثمرة البطيخ في أحد كفوف الميزان ،ثم تدريجياا تبصدأ باضصافة وزن معصروف
مسصصبقاا فصصي الكفصصة الخصصرى فمثلا قصصد تضصصع مربصصع كيلصصو جصصرام ) 250جصصرام( ثصصم تنظصصر إلصصى الميصصزان وتقننارن ارتفنناع الكفننتين ،إذا لصصم تجصصد أن الكفصصتين قصصد تسصصاوياا ستضصصيف مربصصع كيلصصو جصصرام أخصصرى
وهكذا ..يتم التوقف عن وضع المزيد من الوزن عندما تقترب كفتي الميزان من بعضها.
212
.9الممححول التناظري-الرقمي ADC … .............................................................................................. بعصصد أن تتسصصاوى الكفتصصان الخطصصوة التاليصصة هصصي معرفصصة عنندد اﻷوزان الصصتي تصصم وضصصعها فصصي كفصصة
القياس )مثلا قد نجد أنصه هنصاك 3قطصع وزن مصن نصوع مربصع كيلصو جصرام( ومنهصا يمكننصا أن نحسصب وزن الثمرة والذي يساوي × 3مربع كيلوجرام = 750جرام. الخطصصوات السصصابقة تمثصصل نفصصس طريقصصة عمصصل الصصص . ADCحيصصصصصث نجصصصصصد أن الصصصصصص ADCيحتصصصصصوي علصصصصصى مجموعة مكونات تعمل مثل الميزان.
المملكوون الول يسمى دائرة التقطيصع )أخصذ العينصصة( وتسصصصمى .sample & hold (S/H) circuitهصصصذه
الصصصدائرة تأخصصصذ عينصصصة مصصصن فصصصرق الجهصصصد المطلصصصوب
تحصصويله للصصصورة الرقميصصة وتصصدخلها للجصصزء التصصالي من الص .ADC
المملكوون الثاني يسمى بص analog comparatorوهصو شصصريحة إلكترونيصصة تماثننل المينزان بالضننبط وتمتلك طرفان للمقارنة .حيث تقوم بالمقارنة بيصصن فصصرق جهصد مطبصق علصصى طرفهصصا الول )والصصذي
يتم الحصول عليه من دائرة الص (samplingوفرق جهد مطبق على طرفها الثاني.
المملكوون الثالث هو عصصداد رقمصصي تزايصصدي +محصصول رقمصصي -تمصصاثلي .DACهصصذان المكونصصان يعملن مثصصل الصصوزن المعصصروف مسصصبقاا .حيصصث نجصصد أن كل المكصصونين يقومصصان بتوليصصد جهصصد دصصصغير وارسصصالة
إلصصى الطصصرف الثصصاني لشصصريحة الصصص .comparatorوإذا لصصم يتسصصاوي كل الجهصصدين يقصصوم العصصداد والصصص
DACبزيادة الجهد مرة أخرى وهكذا ..وتظل هذه العملية إلى أن تقوم شريحة الص comparator بالتبليغ أن الجهد المطبق من العداد والص DACقد تساوى أو تفوق على الجهد المطبق مصصن عينصصة
القياس.
عندما يحدث هصذا التبليصصغ يتوقصف العصداد والصصص DACعصن العمصصل ويتصصم تسصصجيل الرقصم الصصذي توقصصف
عنده .ويتم حفظ هذا الرقم في ممسجلت خادصة تسمى ADCLو ADCHومن خلل هذا الرقصصم يمكننا معرفة قيمة الجهد الذي تم ادخالة للص .ADC
213
.9الممححول التناظري-الرقمي ADC … ..............................................................................................
9.2تركيب الـ ADCداخل الممتحكك م
ATmega16
الصورة التالية تمثل تركيب الص ADCللمتحكم ) ATmega16دصفحة 205دليل البيانات(.
يتميز الص ADCالموجود داخل ATmega16بعده امكانيات مفيدة. أولا :يمكصصن تشصصغيل هصصذا الصصص ADCفصصي وضصصعين .وهمصصا bit 8و bit 10الختلف الساسصصي بيصصن
الوضعين هصو "حساس ية القيصاس" للجهصد التن اظري وأقصل قيم ة جهصد يمكصن قياسصها .سصيتم تنصاول الدقة 8بت فقط في هذا الفصل.
214
.9الممححول التناظري-الرقمي ADC … .............................................................................................. ثانياا :يتصل دخل الص ADCبشريحة analog multiplixerوالتي تتصصصل اطرافهصصا بجميصصع أطصصراف
البورت .Aهذه الشريحة تعمل كبوابة تودصيل حيث يمكن ضبطها لتودصيل أي طرف في البورت
Aليعمصصصل كصصصدخل للصصصص ADCوهصصصذا يجعصصصل الممتحككصصصم ATmega16يمتلصصصك 7أطصصصراف كاملصصصة يمكصصصن استعمالها كدخل تماثلي ويسمى كصل طصرف “قنصصاة دخصل” .input channelمصصع مراعصصاة أنصه يمكصن تشغيل طرف واحد فقط في نفس الوقت )كما سنرى في الشرح لحقاا(.
أيضاا يحتوي الص ADCعلى شريحة op-ampتعمل كمكبر جهصصد )يمكصن تشصغيله بصصصورة اختياريصصة( ودائصصرة مقارنصصة comparatorتعمصصل علصصى الطصصراف الثلثصصة الولصصى ) .PA0, PA1, PA2لصصن يتنصصاول الكتاب شرح هذا الجزء ويمكنك الرجوع لدليل البيانات بدئاا من الصفحة .(205
جلات الممس ك جلت سنستخدم 3منهم لتشغيل وضع الص 8بت. يحتوي الص ADCعلى مجموعة من الممس ك
جل مسؤول عن اختيار الطرف الذي سيتم تودصيله بالص ADCلقياس الجهصصد :ADMUXهذا الممس ك كما يحتوي علصى مجموعصصة مصصن البتصات الهامصصة لضصصبط الصصص ) analog Refrenceانظصصر لشصصرح المثصصال
الول(.
جل المسؤول عن تشغيل وايقاف الص ADCوكذلك التحكم في سرعة تشغيله. :ADCSRAالممس ك
جلت المستخدمة في حفظ قيم القياس. :ADCL & ADCHالممس ك
خطوات تشغيل الـ ADC
لقراءة الجهد التناظري يجب أن نقوم بمجموعة من الخطوات لتفعيل الصصص ADCوضصصبطه بصصصورة
دصحيحة .هذه الخطوات هي كالتالي:
.1تفعيصصصل الصصصص ) ADCالوضصصصع الفتراضصصصي للصصصص ADCأنصصصه غيصصصر فعصصصال لصصصذا سصصصنقوم بتفعيلصصصه مصصصن المسجل .(ADCSRA
.2ضبط الص Clockوالتي تتحكم في سرعة تشغيل العصصداد الصصداخلي للصصص ADCوالصصذي بصصدورة يتحكم في سرعة قراءة الجهد.
.3اختيصصصصار الصصصصص channelالمطلوبصصصصة )طصصصصرف القيصصصصاس( وذلصصصصك مصصصصن خلل ضصصصصبط الصصصصص analog multiplixer .4بدء عملية القياس والتحويل ثم قراءة قيمة الجهد.
215
.9الممححول التناظري-الرقمي ADC … ..............................................................................................
9.3المثال اﻷول :قراءة جهد متغير باستخدم مقاومة متغيرة
فصصي هصصذا المثصصال سنسصصتخدم المقاومصصة المتغيصصر potentimeterكمصصصدر متغيصصر للجهصصد .تتواجصصد
هصصذه المقاومصصة فصصي برنامصصج بروتصصس باسصصم POT-HGأو Active potentiometerويتصصم تودصصصيل
الطرف العلوي لها بالص vccوالطرف السفلي بالص gndأمصصا الطصصرف الوسصصط فسصصيكون مصصصدر الجهصصد المتغير.
في هذا المثال سنقوم بتودصيل طرف الجهصد المتغيصصر بصصالطرف .PA1كمصصا سنسصخدم 8دايصصودات
ضوئية لعرض قراءة الص ADCعلى البورت Cكما هو موضح في الصورة التالية:
الـكود #define F_CPU 1000000UL >#include
;volatile uint8_t adcValue )int main(void { ضبط إعدادات البورتات //
;DDRA = 0x00 ;DDRC = 0xff
216
.9الممححول التناظري-الرقمي ADC … .............................................................................................. تشغيل ال // adc
;)ADCSRA |= (1 << ADEN اختيار معامل القسمة للص // clock
;)ADCSRA |= (1 << ADPS0) | (1 << ADPS1 تفعيل وضع الص 8بت //
;)ADMUX |= (1 << ADLAR اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه //
;)ADMUX |= (1 << MUX0 )while(1 { ابدء عملية التحويل //
;)ADCSRA |= (1 << ADSC انتظر حتى يتم النتهاء من تحويل الجهد //
;))while(ADCSRA & (1<
;adcValue = ADCH
قم بعرض القيمة على البورت // C
;PORTC = adcValue } ;return 0
شرح الـكود في بداية البرنامج قمنا بعمل متغير 8بت من نوع uint8_tباسم .adcValueسيستخدم هذا المتغير في حفظ القيمةالرقمية الناتجة من تحويل الجهد في الص .ADCلكن هناك كلمة غريبة
ظهرت لول مرة بجانب المتغير وهي volatileفما هي؟
217
}
.9الممححول التناظري-الرقمي ADC … .............................................................................................. قبل أن نتعرف على هذه الكلمة .عليك أن تتعرف على أحد الخواص الهامة للمترجمات وتصصدعى
.Code optimaizationكمصصا تتصصذكر مصصن الفصصصول السصصابقة إن جميصصع المترجمصصات مهمتمهصصا هصصي
تحويصصل اللغصصات عاليصصة المسصصتوى )مثصصل السصصي( إلصصى لغصصة التجميصصع Assemblyوالحقيقصصة أن المصصر
الواحصد مصصن لغصصة السصصي قصصد يتحصصول إلصصى 1أو 3أو حصتى 10أوامصصر مصصن لغصصة التجميصصع .المترجمصصات الذكية تستيطع اختصار عدد أوامر لغة التجميع وذلك لزيادة سرعة الكود )أوامر أقصصل = سصرعة
أكبر(.
هنصصا يصصأتي دور الصصص .code optimaizationوهصصي خادصصصية مدمجصصة فصصي معظصصم المترجمصصات سصصواء
المجانيصصة مثصصل gccأو المدفوعصصة مثصصل .IAR workbenchوتهصصدف إلصصى اختصصصار أكصصبر قصصدر ممكصصن من اوامر السمبلي .والن نعود للبرنامج السابق.
جل الصصذي يحفصصظ جل ) ADCHوهو الممسصص ك سنجد أن المتغير adcValueميستخلدم لنسخ قيمة الممس ك
فيه القيمة الرقمية لعملية التحويصصل( .ثصصم نجصد أن المتغيصصر سيسصتخدم فصصي نقصل هصذه القميصة إلصصى
البورت Cفي مجموعة الوامر التالية:
ضع قيمة التحويل داخل المتغير // adcValue
;adcValue = ADCH
قم بعرض القيمة على البورت // C
;PORTC = adcValue فصصصصي الحالصصصصة الطبيعيصصصصة إذا لصصصصم نكتصصصصب كلمصصصصة volatileسصصصصنجد أن المصصصصترجم قصصصصرر حصصصصذف المتغيصصصصر adcValueلنه بل فائدة .وذلك لنه من الممكن أن نستبدل كل المريين السابقين بأمر واحد
فقط وهو وضع قيمة ADCHمباشرة داخل PORTCدون الحاجة لنسخها لمتغير .adcValue
;PORTC = ADCH بالتأكيصصد يعصصد اختصصصار عصصدد الوامصصر أمصصر مفيصد جصداا وسصصيجعل الكصصود يعمصصل أسصصرع .لكننن فنني هننذه الحالة قد يكون كارثي .ﻷننا قد نحتاج هذا المتغيننر فنني اجننراء عمليننات حسننابية أخننرى )كمصصا
سصصصنرى فصصصي المثصصصال القصصصادم( .وإذا قصصصام المصصصترجم بحذفصصة سيتسصصصبب ذلصصصك المصصصر فصصي أخطصصصاء غيصصصر
معروفصصة .وهنصصا يصصأتي دور كلمصصة .volatileوالصصتي تخصصبر المصصترجم أن يصصترك المتغيصصر adcValueول
يقوم بحذفة.
ملحظة :اعتبرها قاعدة عامة ،إذا كان هناك أي متغير أنت متأكد من تغير قيمته أثناء عمل الممتحككم الدقيق ول تريد للمترجم أن يحذفة فيجب أن تكتب كلمة volatileقبل المتغير اثناء تعريفه.
218
.9الممححول التناظري-الرقمي ADC … .............................................................................................. بعد النتهاء من تعريف المتغير .نأتي للدالة الرئيسيه mainحيث بصدئناا بضصصبط البورتصات ليعمصصل
البورت Aكدخل ويعمل البورت Cكخرج )لتودصيل الدايودات الضوئية الثمانية(.
;DDRA = 0x00 ;DDRC = 0xff ثم تبدأ مرحلة ضبط الص ADCعصصبر سلسصلة مصن الوامصر .فصصي البدايصة يجصب أن نشصغل الصصص ADCلن
الوضصصع الفتراضصصي للصصص ADCداخصصل جميصصع ممتحككمصصات AVRأنصصه غيصصر ممفعصصل لتصصوفير الطاقصصة .ويتصصم
ذلصصصك عصصصبر تغييصصصر قيمصصصة البصصصت ADENوهصصصي اختصصصصار .ADC enableتتواجصصصد هصصصذه البصصصت داخصصصل ADCSRA
;)ADCSRA |= (1 << ADEN
المرحلة الثانية هي ضبط الص clockالخادصة بالص .ADCفكما تعرفنا فصصي بدايصصة الفصصصل .يحتصصوي الصصص ADCعلى عداد تزايدي ميسصصتخلدم لزيصصادة جهصد المقارنصصة )الشصصبيه بصصالوزن المعيصصاري فصي الميصصزان(. ويحتاج هذا العداد الرقمي لص Clockلتشغيله.
المشكلة لوحيدة لهصذا العصداد ه و أنصه يجنب أن يعمننل ببطينء مقارنصة بسصرعة الممتحككصم .فمثلا ل
يمكن أن ندخل الص clockالرئيسية للمتحكصم مباشصرة إلصى العصداد )لنهصصا تك ون 1ميجصا أو أعلصى(. لصصصذا نسصصصتخدم شصصصريحة تسصصصمى بالصصصص Prescaler Registerوهصصصي شصصصريحة تقصصصوم بقسصصصمة الصصصص clock الرئيسصصي علصصى رقصصم محصصدد )مصصن مضصصاعفات الرقصصم (2مثصصل – 64 – 32 – 16 – 8 – 4 – 2
.128يسصصمى هصصذا الرقصصم بممعامصصل القسصصمة Division Factorويتصصم تحديصصد هصصذا الرقصصم مصصن البصصت
جل ADCSRAمن خلل الجدول التالي ADPS0و ADPS1و ADPS2الموجدتان داخل الممس ك
219
.9الممححول التناظري-الرقمي ADC … .............................................................................................. بالتأكيد سيظهر سؤال هام .على أي أساس نختار معامل القسمة وما هو تأثيره؟
في البداية هناك قاعدة عامة لجميع الص ADCالموجودة داخل عائلة atmegaوهصصي أن الصصص Clock
الخادصصة بالصص ADCيجصب أن ل تزيصد عصن 128كيلصوهرتز )ويمكصن أن تكصون أقصل مصن ذلصك( .فمثلا
إذا كانت الص clockالرئيسية = 1ميجاهرتز إذا يجب أن نختار معامل قسمة = 8أو أكثر وذلصصك لن حادصل قسمة مليون \ 125 = 8ألف هرتز وهو رقم أقل 128كيلو. لنأخذ مثال آخنر .لنفنترض أن سنرعة الننن clockالرئيسنية كنانت 4ميجناهرتز .فمننا هنو معامننل القسمة المناسب؟
سنجد أن المعامل المناسب هو ) 32أو أكثر( وذلك لن حادصل قسمة 4مليون\ 125 = 32ألف هرتز .أو يمكن استخدام معامل قسمة 64أو 126فكلهمصصا سصصيجعل الصصص ADC clockأقصصل بكصثير
من 128كيلوهرتز.
إذاا ما الختلف بين أن اختار 32أو 64أو 128إذا كانت كل هذه الممعاكملت مناسبة؟ الختلف الساسصصي هصصو سننرعة تحويننل الجهنند إلننى قيمننة رقميننة .فكلمصصا زادت سصصرعة الصصص ADC clockكلما استطاع أن يحول الجهد إلى قيمة رقمية في زمن أقل. لنعصصد مصصرة أخصصرى لللمثصصال السصصابق حيصصث كصصانت سصصرعة الممتحككصصم الرئيسصصية 1ميجصصا لصصذا إسصصتخدمنا معامل قسمة = 8وذلك عبر وضع قيمة 1داخل كل من البت ADPS0و ADPS1
;)ADCSRA |= (1 << ADPS0) | (1 << ADPS1 الخطوة التالية هي اختيار وضع تشصصغيل الصصص 8) ADCأو 10بصصت( .فصي حالصصة الصصص 8بصصت يتصصم وضصصع
جل .ADMUXالوضصع الفتراضصي لهصذه البصت = الرقم 1داخل البت ADLARالموجصود فصي الممسصص ك دصفر )أي أي الص ADCيعمل في وضع 10بت(.
تفعيل وضع الص 8بت //
;)ADMUX |= (1 << ADLAR
جل عنصصدما يعمصصل الصصص ADCفصصي وضصصع الصصص 8بصصت فصصإن قيمصصة تحويصصل الجهصصد يتصصم تسصصجيلها فصصي الممسصص ك
ADCHوعندما يعمل في وضع الص 10بت فأن قيمة التحويل يتم تسصصجيلها فصي مسصصجيلن )لنهصصصا
220
.9الممححول التناظري-الرقمي ADC … .............................................................................................. جل واحصصد لحفصصظ قيمتهصصا( وهمصصا ADCLو ADCHويسصصمى هصصذا الوضصصع بالصصص 10بصصت ول يكفصصي ممسصص ك left adjustedحيث توضع أول 8بتات من النتيجة في ADCLويوضع أخر 2بت في ADCH
وأخيصصراا نقصصوم بضصصبط الطصصرف الصصذي سصصيكون ) Input channelالطصصرف الصصذي سصصنقيس مصصن خللصصه
الجهد الكهربصي المتغيصر( .فصي المثصال السصابق اسصتخدمنا الطصرف PA1لصذا وجصب أن يتصم وضصع 1
داخل البت MUX0
اختيار القناة )الطرف( الذي سيتم قراءة الجهد المتغير منه //
;)ADMUX |= (1 << MUX0
حيث تتحكم هذه البت مصصع البتصصات ) MUX(1,2,3,4فصي اختيصصار قنصصاة الصصدخل كمصصا هصو موضصصح فصصي الجدول التالي.
ملحظة :الطرف ADC0يتصل بالطرف PA0والطرف ADC1يتصل بالطرف PA1وهكذا إلى نهاية البورت A
بعد النتهاء من ضبط الص ADCيمكننا الن أن نبدء عملية التحويل وقراءة الجهصصد .وسصصيتم ذلصصك عصصبر اعطصصاء الصصص ADCالمصصر ببصصدء عمليصصة التحويصصل وذلصصك عصصبر وضصصع 1داخصصل البصصت ADSCوهصصي اختصار لكلمة ADC start conversion
ابدء عملية التحويل //
;)ADCSRA |= (1 << ADSC هنصصا سصصيبدأ الصصص ADCبقصصراءة الجهصصد وتحصصويله إلصصى قيمصصة رقميصصة .ولكصصن كمصصا نعصصرف مسصصبقاا الصصص ADC
يعتبر بطيء جداا مقارنة بالمتحكم الدقيق لذا ل يمكننا أن نحصل على النتيجة فوراا ويجب أن
221
.9الممححول التناظري-الرقمي ADC … .............................................................................................. ننتظر حتى ينتهي الص ADCمن عملية التحويل .ويتم ذلك عبر المر انتظر حتى يتم النتهاء من تحويل الجهد //
;))while(ADCSRA & (1<
ADSCقيمتها 0وبذلك تتوقف الص .while
جل ADCHحيصصث نسصصتطيع امصصا أن نسصصتخدمها وأخيصصراا يمكننصصا قصصراءة القيمصصة الرقميصصة مصصن الممسصص ك
مباشصرة أو ننسصصخها إلصصى أحصد المتغيصرات )فصي المثصصال السصصابق اسصتخدمنا البصصورت Cليعصصرض هصذه
القيمة وكذلك المتغير adcValueلنسخ هذه القيمة(.
ضع قيمة التحويل داخل المتغير // adcValue
;adcValue = ADCH
قم بعرض القيمة على البورت // C
;PORTC = adcValue قصصم بترجمصصة الكصصود السصصابق ثصصم ابصصدأ محاكصصاة المشصصروع علصصى برنامصصج بروتصصس .يمكنصصك أن تحصصرك المقاومة المتغيرة لعلى ولسفل لتشاهد ان الدايودات الثمانية تعصرض أرقصصام مصصن 00000000
إلى 11111111كما هو موضح في الصورة التالية.
222
.9الممححول التناظري-الرقمي ADC … ..............................................................................................
9.4حسابات الـ
ADC
في المثال السابق استطعنا أن نحول الجهد التنصصاظري المتغيصصر إلصصى أرقصام بيصصن 00000000إلصى
) 11111111ما بين 0إلى 255بالصيغة العشرية( .لكن هذه الرقام ل تمثل قيمة فرق الجهصد
بصورة مباشرة لذا سنتعرف على في هذا الجزء على بعض المعادلت البسيطة التي ستساعدنا
على حساب فرق الجهد وكذلك حساب قيم الحساسات التماثلية.
تحو يل القيمة الرقمية إلى فرق جهد
المعادلة التالية تقوم بتحويل القيمة الرقمية إلى فارق جهد.
DigitalValue∗Vref 2n
=Voltage
•
:Digital Valueالقيمة الرقمية الموجودة في ) ADCHبالصيغة العشرية(
•
:Vrefالجهد المرجعي للص ) ADCأنظر للشرح بالسفل(
•
:nوضع دقة التشغيل ) 8بت أو 10بت(
الص Vrefهو الجهد المرجعي الذي يعتمد عليه الص ADCلحساب الجهد المتغير .هذا الجهد يسصصاهم فصصي تحديصصد حساسصصية قيصصاس الصصص ) ADCكمصصا سصصنرى فصصي الجصصزء التصصالي( ويتصصم تحديصصدة مصصن خلل
البتصصات REFS0و .RFS1فصصي المثصصال السصصابق تركنصصا هصصذه البتصصات علصصى الوضصصع الفصصتراض )دصصصفر( والذي يعني أن الجهد المرجعي .Vref = Vcc = 5 volt
جل ADMUX الصورة التالية توضح طريقة تغير الص Vrefبالتغير قيمة RFS0 , RFS1في الممس ك
223
.9الممححول التناظري-الرقمي ADC … .............................................................................................. لنفترض أن القيمة الرقمية الصصتي حصصصلنا عليهصصا = 128وكصصان الصصص ADCيعمصصل علصصى الوضصصع 8بصصت. إذا بالتعويض في المعادلة السابقة نجد أن قيمة الجهد الذي تم قياسه يساوي
128∗5 128∗5 = =2.5 volts 256 28
مثصصال أخصصر :لنفصصترض أن القيمصصة الرقميصصة الصصتي حصصصلنا عليهصصا = .56إذا بصصالتعويض فصصي المعادلصصة
السابقة نجد أن قيمة فرق الجهد هي
حساسية القياس
56∗5 56∗5 = =1.09 volts 8 256 2
تعصصصرف حساسصصصية القيصصصاس بأنهصصصا أقصصصل جهصصصد يمكصصصن للصصصص ADCأن يقيسصصصه ويتعصصصرف عليصصصه بصصصصورة دصحيحة .وتعتمد حساسية القياس للص ADCعلى عاملين وهما وضصصع التشصصغيل ) 8أو 10بصصت( و
الجهد المرجعصي .Vrefكل العصاملين يصؤثران بشصكل كصبير جصداا فصي دقصة القيصاس .المعادلصة التالي ة تمثل حساسية القياس.
Vref 2n
=sensitivity
مجصدداا تمثصل nوضصع القيصاس ) 8أو 10بصت( .فمثلا لصو أن vref = vcc = 5 voltويعمصل الصصص adc بدقة 8بت فهذا يعني أن حساسية القياس تساوي
5 5 = =0.019 volt 8 2 256
مما يعني أن أقل جهد يمكن قياسه هو 0.019فولت )نحو 20مللي فولت(. يتحكم الص Vrefفي أقصى جهد يمكن قياسه فمثل لو كان Vref = 3فولت إذا أقصى جهد يمكن للص ADCأن يقيسه هو 3فولت
224
الفصل العاشر ” أحدهم يجلس في الظل اليوم ،لأن شخصا آخر قام بزرع شجرة في ذاك المكان منذ زمن بعيد ‟
وارين بافيت -رجل أعمال ومستثمر أمريكي
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
.10المعالج التمهيدي وصناعة المكتبات البرمجية
في هذا الفصل سنتحدث عن أكواد C preprocessorحيث سنتعرف علصى الفصارق بيصن الوامصصر التنفيذية والوامر التوجيهية وأهميتها بصورة مفصصصلة مثصصل المصصر include#وكصذلك define
وكذلك سصصنتعرف علصصى كيفيصصة دصصناعة المكتبصصات البرمجيصة .librariesمصع شصرح مثصال لعمصصل uart driverعلى دصورة مكتبة. ✔
الوامر التنفيذية والوامر التوجيهية
✔
بعض استخدامات الص C – Preprocessor
✔
قواعد دصياغة الوامر التوجيهية
✔
طرق كتابة Function-like macros
✔
تصميم المكتبات البرمجية
✔
مثال :تصميم مكتبة UART driver
226
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
10.1الأوامر التنفيذية والأوامر التوجيهية
اﻷوامننر التنفيذيننة هصصي أي أمصصر مباشصصر فصصي لغصصة السصصي مثصصل if – while – forوجميصصع الوامصصر الرياضصصية أو المنطقيصصة ،AND – OR – NOT – XORكصصل هصصذه الوامصصر تسصصتخدم "لتنفيصصذ" أمصصر
مطلوب .على العكس اﻷوامر التوجيهية ) Directiveتسمى أيضاا أوامر إرشادية( هي أوامصصر ل تصصدخل مباشصصرة فصصي تركيصصب الكصصود ولكصصن تسصصتخدم فصصي إرشصصاد المصصترجم compilerلداء بعصصض
المور.
المصترجم GCCيعصصرف مسصصبقاا جميصع أوامصر لغصصة السصصي المعياريصة لكنصصه ل يعصصرف الدالصصة delay_ms
والتي ل تتواجد إل في المكتبة البرمجية delay.hلذا نستخدم المر التوجيهي
>#include
بتحويلها إلى دصيغة الهيكس.
بعض استخدامات
C - preprocessor
الوامر التوجيهية ليست مقتصرة فقط على المر includeوإنما هناك العديد من الوامر منها:
– includeأمر لتضمين ملف أو مكتبة معينة.
– defineأمر لتعريف دللت لكلمات كأن نعرف أنه كلما وردت كلمة Piفي الكود فهصصو يعنصصصي 3.14وكصصصذلك لعطصصصاء معصصصررف)رمصصصز( لكتلصصصة أسصصصطر برمجيصصصة مصصصع إمكانيصصصة وجصصصود وسطاء argumentsوهذا ما يسمى .function-like macros
– pragmaأمر لتحديد بعض الوامر للمترجم compiler
الترجمنننة الشنننرطية – conditional compilationمجموعصصصة أوامصصصر تسصصصتخدم فصصصي الترجمصصة حسصصب شصصروط معينصصة ،مثصصال :نخصصبر المصصترجم أنصصه لصصو كنصصت فصصي نظصصام تشصصغيل ويندوز قم بتضمين المكتبة الفلنية أما لو كنت في نظام تشغيل لينكس فقم بتضمين مكتبة أخرى.
227
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
10.2قواعد الأوامر
التوجيهية C - preprocessor syntax
أي سطر برمجي يبدأ برمز المربع hash #فإن ما يليه هو أمر سيوجه إلى ال . preprocessor
#include يعتبر المر أكثر الستخدامات شصيوعاا مصصن أوامصصر الصصص C - preprocessorوهصو أمصصر تصصوجيهي مصصن أجل تضمين مكتبة )وهي عبارة عن مجموعة تعريفات( أو حتى ملفات مصدرية أخرى. مثال: بفرض الكود المصدري للملف main.cهو التالي:
>#include < والثاني بين إشصصارتين “” ،حيصصث أن السصصتخدام الول يكون عندما نريد أن يتم البحث عن الملف المحدد ضمن المسارات المتاحة في إعصصدادات
المصصصترجم .والسصصصتخدام الثصصصاني يكصصصون عنصصصدما نريصصصد البحصصصث عصصصن الملصصصف المحصصصدد ضصصصمن المجلصصصد المصدري نفسه.
228
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. أيضصصصاا نلحصصصظ وجصصصود بعصصصض الوامصصصر الغربيصصصة مثصصصل PORT_onو المصصصر .PORT_ofالحقيقصصصة أن تفسير هذه الوامر يقع في الملف device_confوالذي يحتوي على الكود التالي:
>#include
includeليصبح البرنامج السابق كالتالي: )للتبسيط لن نذكر نتائج تضمين مكتبة avr/delay.hأو مكتبة :( avr/io.h
نتيجة تنفيذ اﻷمر include
#define PORT_on PORTD=0xFF #define PORT_off PORTD=0x00 #define set_port_output DDRD=0xFF
)int main(void { ;set_port_output )while(1 { ;PORT_on ;)_delay_ms(1000 ;PORT_off ;)_delay_ms(1000 } ;return 0 }
#define ميستخلدم هذا المر التوجيهي directiveلتعريف كلمات كرموز )كلمات مفتاحية( ترد في الكود
ليتم استبدالها بالقيمة المحددة )أرقام أو حروف أو أسطر برمجية أخرى( مصصع أننصصا سصصنرى لحقصصاا
أن ال preprocessorل يستطيع التمييز بينها. ففي الكود السابق سيقوم ال preprocessorبالبحث عن أماكن ورود PORT_onو PORT_off
229
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. و set_port_outputويقصصصوم باسصصصتبدالها بمصصصا هصصصو مصصصذكور فصصصي تعريفهصصصا .أي أن الكصصصود سيصصصصبح كالتالي )بعد أن ينتهي المعالج من معالجة المر :(define
#define PORT_on PORTD=0xFF #define PORT_off PORTD=0x00 #define set_port_output DDRD=0xFF
)int main(void { ;set_port_output )while(1 {
نتيجة تنفيذ اﻷمر define
;PORTD=0xFF ;)_delay_ms(1000 ;PORTD=0x00 ;)_delay_ms(1000
} ;return 0 } ملحظة مهمة :إن ما يرد بعد المر التصوجيهي ل يتصم معصالجته أو تنقيصح أخطصائه ،مثلا لصو قمنصا بالتعديل التالي وهو إضافة تعليق //set portD off
#define PORT_on PORTD=0xFF #define PORT_off PORTD=0x00 #define set_port_output DDRD=0xFF
سيصبح الكود الرئيسي بعد الص Preprocessorكالتالي:
)while(1 {
خطأ
; //set portD off
;PORTD=0xFF ;)_delay_ms(1000 PORTD=0x00 ;)_delay_ms(1000
} نلحظ أن الكود أدصبح يحتصوي علصى خطصأ حي ث أدصصصبحت الفادصصلة المنقوط ة بع د التعليصق ،فصال
preprocessorليصصس مصصن مهمتصصه فهصصم مصصا بعصصد الوامصصر التوجيهيصصة وإنمصصا فقصصط اسصصتبدال الرمصصوز بقيمتها.
230
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
10.3
function-like macros
يمكننا من خلل ال C preprocessorإنجاز ما يشبه الدوال ولذلك تسمى function-likeمع اختلف جوهري بين الدوال و ،function-like macrosشصكل الشصلبه الوحي د هصو إمكانيصة إنجصاز macrosيمكنصصه أن يسصصتقبل بعصصض المتغيصصرات ،أمصصا مصصن الناحيصصة التنفيذيصصة فليصصس هنصصاك أي وجصصه
شبه: •
– functionكتلصصة مصصن الكصصود الصصبرمجي يمكصصن أن نسصصتدعيها بصصأي مكصصان مصصن البرنامصصج الساسصي لتقصصوم بالتنفيصذ واسصصتخدام المتغيصصرات فصي حصصال وجودهصا مصع إمكانيصة إرجصاع
قيمة بعد التنفيذ. •
– Function-like macrosمجموعصصة مصصن السصصطر البرمجيصصة المختصصصرة برمصصز ،و عنصصد إيصصراد هصصذا الرمصصز فصصي الكصصود فهصصو بمثابصصة إيصصراد هصصذه السصصطر البرمجيصصة كمصصا هصصي ،بخلف
مبدأ الدوال المعتمد على الستدعاء مع وجود الكود دون تكرار.
لبصصصد مصصصن التنصصصويه إلصصصى الجصصصانب السصصصلبي لسصصصتخدام ال C preprocessorوهصصصو حجصصصم البرنامصصصج النهائي ،إذا أن اسصصتخدام ال C preprocessorلنجصصاز مصصا يشصصبه الصصدوال function-like macros يصصؤدي إلصصى تضصصاعف حجصصم البرنامصصج ،وذلصصك لن اسصصتخدام ال C preprocessorل يتعصصدى فصصي
النهاية عن اختصار أسطر برمجية بكلمات مفتاحية.
10.4قواعد كتابة الماكرو
macros syntax
لصناعة macroيمكنه استقبال متغيرات يجب أن نتبصع اسصم المصايكرو )الرمصصز( بصأقواس تحصوي
أسصصصماء المتغيصصصرات مباشصصصرة ،دون تحديصصصد نوعهصصصا كمصصصا فصصصي الصصصدوال ،إذ ل يهصصصم ال function-like
macrosنوع المتغيرات التي يتم تمريرها إليها.
المجموعة التالية من الكواد تمثل أشهر الص macrosالتي يتم استخدامها عصصادة لتسصصهيل برمجصصة
الممتحككمصصات واختصصصار الكصصثير مصصن الصصوقت .مصصع العلصصم أن هصصذه الصصص macrosيمكصصن اسصصتخدامها مصصع
أنواع مختلفة من الممتحككمات الدقيقة عبر أي مترجم يدعم لغة السي المعياريصصة فيمكنصصك مثلا أن تستخدمها في برمجة ممتحككمات .ARM cortex
))#define BIT_SET(ADDRESS,BIT) (ADDRESS |= (1<
231
المعالج التمهيدي وصناعة المكتبات البرمجية.10 .............................................................................................. … كمثالfunction-like macros لنأخذ أحد ال
#define BIT_SET(ADDRESS,BIT) (ADDRESS |= (1<
:نستخدمه داخل البرنامج الرئيسي كالتالي
:جل مطلوب كالتالي داخل أي بت من أي ممس ك1 وهذا مكافئ تماماا للمر الذي يقوم بوضع
PORTB |= (1<<5);
:جل كالتالي داخل أي بت من أي ممس ك0 فهو مكافئ للمر الذي يضعBIT_CLEAR أما الماكرو
PORTB &= ~(1<<5);
مراجع إضافية10.5
( العربية )المصدر الدصلي للجزء المشروح بالعلىC – preprocessor سلسلة مقالت الص http://www.atadiat.com/c-preprocessor-part1 http://www.atadiat.com/c-preprocessor-part-2 http://www.atadiat.com/c-preprocessor-part-3 مراجع أجنبية إضافية http://www.mybitbox.com/2012/12/robust-c-code-part-3-wrapping-c/ http://www.mybitbox.com/2012/12/robust-c-code-part-2-advanced-cpreprecessor/ http://www.mybitbox.com/2012/11/robust-c-code-part-1-c-preprocessor/ http://www.cprogramming.com/tutorial/cpreprocessor.html http://www2.hh.se/staff/vero/embeddedProgramming/lectures/printL2.pdf http://www.phaedsys.com/principals/bytecraft/bytecraftdata/bcfirststeps.pdf http://en.wikipedia.org/wiki/C_preprocessor
232
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
10.6تصميم المكتبات الربرمجية في لغة السي
المكتبات البرمجية تعد من أفضل أساليب "تجزئة الكود" فهي تسمح للمبرمجين بصناعة نماذج
من الكواد البرمجيصصة الصتي يمكصن إعصادة اسصصتخدامها بسصهولة فصي أكصثر م ن تطصبيق .مثلا لنفصترض
أنصصك تريصصد تشصصغيل شاشصصة أو محصصرك أو حسصصاس خصصاص مصصع الممتحككصصم الصصدقيق ،يمكنصصك أن تكتصصب
الكواد الخادصصصة بتشصغيله )أو كمصا تسصمى (driver codeداخصل البرنامصج الرئيسصصي وينتهصي المصر
عند هذا الحد .لكن عندما تريد أن تسصتخدم نفصس الحسصصاس فصي مشصصروع آخصر سصيتوجب عليصصك
أن تعيد كتابة هذا الكود مرة أخرى.
المكتبات البرمجية توفر الوقت والمجهود لعادة كتابة هذه الوامر فكصصل مصصا عليصك فعلصصه هصو أن
تصصصصمم الصصصص driver codeمصصصرة واحصصصدة وتضصصصعها فصصصي libraryثصصصم تسصصصتخدم هصصصذه المكتبصصصة فصصصي أي مشروع ترغب به.
ملحظة :تسمى المكتبات التي تشغل أي جزء داخل الممتحككم الدقيق مثل ADC , UART, i2C, GPIOأو أي مكون إلكتروني خارجي .Software driver
أيضصصاا تسصصاعد المكتبصصات علصصى تسصصهيل العمصصل الجمصصاعي بيصصن الفصصراد .فمصصن الصصصعب علصصى مجموعصصة
مكونه من 10مبرمجين مثلا أن يكتبوا كل الكواد داخل ملف واحد فقط .وبصصدل مصصن ذلصصك يتصصم
تقسيم الكواد الكبيرة إلى مجموعة مصصن الصصص ) Modulesالوحصصدات( والصصتي عصصادة تكصصون مجموعصصة من المكتبات البرمجية ويتصولى كصل شصخص مصن فريصصق التطصصوير العمصل علصصى أحصد هصذه الوحصدات
بالتوازي مع باقي الفريق.
تركيب المكتبات في لغة السي تتكون المكتبات في لغة السي عادة من بناء نصوعين مصصن الملفصات ،الول يسصمى Header fileأو
كمصصا يحصصب البعصصض أن يسصصميه ) Definition fileملصصف التعريفصصات( ويكصصون علصصى هيئصصة المتصصداد
file.hوالثصصصصاني هصصصصو الملصصصصف التطصصصصبيقي Implementation fileوالصصصصذي يحتصصصصوي علصصصصى الوامصصصصر الحقيقية للمكتبة ويكون من نوع ملفات السي file.c
مثلا لنفصصصترض أننصصصا نريصصصد تصصصصميم مكتبصصصة لتشصصصغيل التصصصصال التسلسصصصلي UARTوذلصصصك لتسصصصهيل استخدام UARTدون الحاجة لعادة كتابة جميع الدوال في كل برنامج.
233
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
10.7خطوات صناعة المكتبة
تمر أي مكتبة برمجية بمجموعة مصن الخطصوات حصتى نضصمن أن نحصصصل علصى كصود فعصال ويعمصصل بصصورة جيصدة .ويستحسصن أن تتبصع هصذه الخطصوات ف ي أي مصن المكتبصات الصتي س تقوم بكتابتهصا
مستقبلا.
الخطوة الأولى :فهم الـكود والتجربة الأولية
فصصي البدايصصة عليصصك أن تفهصصم العنصصصر أو الجهصصاز الصصذي تريصصد أن تكتصصب لصصه هصذا الصصص driverوذلصصك عصصبر
اختبار بعض المثلة في البرنامج الساسي أولا ثم تحويل هذه المثلة لمكتبة .بما أننصا سصنكتب UART driverفهصصصذه الخطصصصوة قصصصد تمصصصت بالفعصصصل فصصصي الفصصصصل الخصصصاص بالصصصص UARTحيصصصث يمكنصصصك الرجوع إليه مرة أخرى لمراجعة الوامر والدوال التي سنستخدمها في الخطوات التالية.
الخطوة الثانية :تكوين ملف الهيدر uart.h
بعصصد القيصصام بجميصصع التجصصارب الصصتي تختصصبر الكصصواد الصصتي سصصنحتاجها سصصنقوم بعمصصل ملصصف الهيصصدر
Header fileوالذي يتكون من مجموعصة مصصن أوامصر الصصص C – preprocessorمضصاف إليهصا جميصع أسصصماء الثصصوابت والمتغيصصرات وكصصذلك الصصص ) function prototypesأسصصماء الصصدوال( .الكصصود التصصالي يمثصصل الهيكصصل الساسصصي لي ملصصف هيصصدر )سصصواء للغصصة السصصي أو السصصي .(++ويمكنصصك عمصصل هصصذا
الملف باستخدام أي محرر نصوص مثل ++notepad
__#ifndef __LIBRARYNAME_H __#define __LIBRARYNAME_H هنا تكتب جميع التعريفات للدوال والمتغيرات المختلفة #endif يتم استبدال LIBRARYNAMEباسم المكتبة المطلوب مصصع مراعصصاة أن تكصصون جميصصع الحصصرف مصصن
نوع ) upper-caseحروف كابيتال( فمثلا لو كان اسم المكتبة uartسنكتب داخصصل ملصصف الهيصصدر
الصيغة التالية )أيضاا ل تنسى كتابة _ __Hبعد اسم المكتبة(:
234
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. __#ifndef __UART_H __#define __UART_H …...... #endif لنأخذ مثال آخر .لنفترض أن اسم المكتبة هو uartDriverفسيكون شكل ملف الهيدر كالتالي: __#ifndef __UARTDRIVER_H __#define __UARTDRIVER_H …...... #endif الن يمكننصصصا أن نكتصصصب جميصصصع التعريفصصصات المطلوبصصصة والصصصتي تشصصصمل أسصصصماء المتغيصصصرات والثصصصوابت وكصصذلك أسصصماء الصصدوال الصصتي سنسصصتخدمها وأي C – preprocessorقصصد نحتاجهصصا لتشصصغيل أوامصصر
المكتبصصة .إذا كنصصت تتصصذكر مصصن الفصصصل الخصصاص بالصصص UARTسصصنجد أنهصصا هنصصاك مجموعصصة متغيصصرات ودوال أسماؤها كالتالي:
المتغيرات
المتغير المسئول عن تحديد سرعة السيريال //
uint16_t UBRR_Value الدوال
تشغيل وضبط // UART
)(void UART_init
إرسال حرف //
)void UART_send_char(char data
استقبال حرف //
)(char UART_receive_char
إرسال كلمة أو جملة نصية void UART_send_string(char *data) // الن كصصل مصصا عليصصك فعلصصه هصصو إضصصافة كصصل التعريفصصات السصصابقة إلصصى ملصصف الهيصصدر مصصع إضصصافة علمصصة الفادصلة المنقوطة );( بعد كل تعريف )سواء كان متغير أو دالة( .ليصبح شكل ملف الهيدر:
__#ifndef __UARTDRIVER_H __#define __UARTDRIVER_H ;uint16_t UBRR_Value ;)void UART_init(uint16_t baud_rate ;)void UART_send_char(char data ;)(char UART_receive_char ;)void UART_send_string(char *data #endif
235
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. تتبقصصصى خطصصصوة أخيصصصرة للنتهصصصاء مصصصن الملصصصف وهصصصي إضصصصافة المكتبصصصات الصصصتي قصصصد تحتاجهصصصا الصصصدوال
السابقة .إذا كنت تذكر الدالة ()UART_initكصصانت تسصصتخدم المكتبصصة البرمجيصصة math.hلحسصصاب الرقم المسؤول عن تحديصصد سصصرعة الصصص UARTوكصصذلك تسصصتخدم المكتبصصة avr/io.hفصصي ضصصبط قيصصم
جلت لصذا سنضصصيف كل المكتبصتين إلصى ملصف الهيصدر .أيضصصاا نحتصاج أن نكتصصب تعريصف سصرعة الممسصص ك الممتحككم لننا سنحتاج F_CPUداخل الدالة UART_init
كما يستحسن أن نضيف بعض التعليقات في بداية المكتبة لتوضح تاريخ دصناعة هذه المكتبصصة
والوظائف التي تحققها .الشكل النهائي يمثل الصورة النهائية من ملف الهيدر.
*/
UART driver v.0.1 Date: 9-2015 This library designed to make a simple and re useable UART driver for both
ATmega16 and ATmega32 */ __#ifndef __UARTDRIVER_H __#define __UARTDRIVER_H #define F_CPU 16000000UL >#include #include
;uint16_t UBRR_Value
;)void UART_init(uint16_t baud_rate // Initiate the UART ;)void UART_send_char(char data // Send singe character ;)(char UART_receive_char // Receive single character void UART_send_string(char *data); // Send array of characters #endif ملحظة :الملف uart.hو uart.cمرفقان مع الكتاب لتسهيل نسخ النصوص أو تعديلها
الخطوة الثالثة :تكوين ملف التطبيق uart.c
الخطصصوة الخيصصرة هصصي كتابصصة الوامصصر الحقيقيصصة لجميصصع الصصدوال داخصصل ملصصف جديصصد بنفصصس اسصصم
المكتبصصة ولكصصن بامتصصداد c.مثصصل أن نكتصصب uart.cمصصع ملحظصصة أنصصه ل يتصصم تعريصصف أي متغيصصرات جديدة داخل هذا الملف )لننا قد كتبنا تعريفات المتغيرات في ملف الهيدر(.
236
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. كما يجب أن يحتوي ملف التطبيق علصصى أمصصر التضصصمين includeوذلصصك لضصصافة ملصصف الهيصدر إلصصى ملف التطبيق كما هو موضح في الكود التالي )والذي يمثل محتوى الملف .(uart.c
”#include “uart.h )void UART_init(uint16_t baud_rate { ;)uint16_t UBRR_Value = lrint ( (F_CPU / (16L * baud_rate) ) -1 ;UBRRL = (uint8_t) UBRR_Value ;)UBRRH = (uint8_t) (UBRR_Value >> 8 ;)UCSRB = (1<
10.8تجربة المكتبة في برنامج
)void UART_send_string(char *data { )while(*data > 0 ;)UART_send_char(*data++ ;)'UART_send_char('\0 }
ATmel studio
والن بعصصد أن انتهينصصا مصصن كتابصصة الصصص UART driverلنقصصم باختبصصاره .فصصي البدايصصة سصصنقوم بإضصصافة ملفات المكتبة إلى مشروع جديد داخل برنامج ATmel studioويمكنك ذلك بطريقتين ،الولى
أن تنسصصخ ملصصف uart.cو uart.hإلصصى نفصصس مجلصصد المشصصروع C:/documents/atmelأو أن تقصصوم بذلك بسهولة من متصفح ملفات المشروع من داخل البرنامج نفسه.
237
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. في البداية توجه إلى Solution Explorerمن الجانب اليمن من البرنامج
ثم اضغط بالزر اليمن وأختر Addثم Existing item
238
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. والن اختر الملفين uart.cو uart.h
بعد إضافة الملفات ستلحظ ظهورها في قائمة الص Solution Explorer
والن لنكتصصب برنامصصج بسصصيط لرسصصال حصصرف Hباسصصتخدام الصصص .uart driverفصصي البدايصصة سصصنقوم بعمل includeللملف uart.hداخل البرنامج الساسي )لحظ أنه ل داعي لعصصادة كتابصصة define F_CPUول داعي لضافة المكتبة avr/io.hلن كلهما مضاف بالفعل داخل الملف .uart.h
239
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. ”#include “uart.h >#include
لحظ أن أمر تضمين المكتبة uart.hيكون مكتوب بين علمتي “” وذلك لن ملف المكتبة يكون موجود داخل نفس مجلد المشروع بينما المكتبات الخرى مثل delay.hتكتب بين علمتي >< لنها تكون موجودة داخل مجلد المكتبات العام التابع للص .toolchain
الصور التالية تمثل شكل الملف uart.hو uart.cداخل برنامج .ATmel Studio
240
.10المعالج التمهيدي وصناعة المكتبات البرمجية … ..............................................................................................
الملف uart.c
241
.10المعالج التمهيدي وصناعة المكتبات البرمجية … .............................................................................................. بعد النتهاء من كتابة الكصود قصم بصصترجمته واسصتخلص ملصف الهيكصس ثصصم قصصم بمحاكصصاة البرنامصصج
بنفس الدائرة المذكورة فصصي المثصصال الول فصصي الفصصصل الخصصاص بالصصص .UARTوالصصصورة التاليصصة تمثصصل نتيجة المحاكاة.
242
الفصل الحادي عشر
” المسافة بين أن تكون شخصا عاديا ا وبين أن تكون عبقر يا هي مدى النجاح الذي تحققه ‟
بروس فيرشتاين -مؤلف وكاتب أمريكي
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
.11أظنظمة الوقت الحدقيدقي RTOS
يشرح هذا الفصل استخدام أنظمصصة تشصصغيل الصصوقت الحقيقصصي Real Time OS
لتشصصغيل المهصصام المتعصصددة Multitaskingوأنظمصصة السصصتجابة السصصريعة .حيصصث
سيتم تنصصاول نظصام FreeRTOSفصصي هصذا الفصصصل باعتبصاره أفضصل نظصام RTOS
مجاني )ومفتوح المصدر(.
✔ مقدمة عن مفهوم الص RTOS ✔ كيف يتم تنفيذ أكثر من مهمة
✔ كيف تعمل نواة النظام FreeRTOS Kernel
✔ تشغيل FreeRTOSعلى أي ممتحككم System Porting to any AVR ✔ إعدادات النظام
✔ مثال :تشغيل 3مهمات مختلفة ✔ شرح طرق إدارة المهام
244
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.1مقدمة عن أنظمة الوقت الحقيقي
Real Time Systems
تعصصرف أنظمصصة الصصوقت الحقيقصصي بأنهصصا أنظمصصة الحوسصصبة أو النظمصصة المدمجصصة
الصتي تس تخدم فصي أداء مجموعصة مصن المهمصات تتطلصب كصل مهمصة اسصتجابة زمنية وسرعة تنفيذ محددة ،وتنقسم هذه النظمة إلى 3أنواع:
Soft Real Time Systemsوهي النظمة التي تسمح ببعض التأخير المحصصدود فصي التنفيصذ أو السصصصتجابة للمهمصصات المطلصصوب تنفيصصذها .أمثلصصة علصصى ذلصصك ،الهواتصصف النقالصصة ،مشصصغلت اللعصصصاب،
أجهزة عرض الفيديو .كل ما سبق أنظمة يمكن التغاضصصي عصصن حصدوث تصأخير زمنصصي بسصيط أثنصصاء
تشصصصغيلها .فمثلا لصصصن تحصصصدث مشصصصكلة إذا تصصصأخرت شاشصصصة الهصصصاتف النقصصصال بضصصصعة مللصصصي ثانيصصصة فصصصي الستجابة لوامر المستخدم.
Hard Real Time Systemsوهصصي النظمصصة الصصتي دائمنناا مننا يجننب أن تنجننح فصصي تنفيصصذ جميصصع المهمات الخادصة بها في الزمن المطلوب وبدون أي تاخير في الستجابة مهما كان .وحدوث أي تصصأخير يعنصصي فشصصل النظصصام ككصصل وقصصد يصصؤدي إلصصى كارثصصة .مصصن المثلصصة علصصى هصصذه النظمصصة وحصصدات
التحكم في المفاعلت النووية ،الصواريخ ،الطائرات الحربية ،بعض الجهزة الطبية مثل أجهصصزة تنظيم ضربات القلب. Firm Real Time Systemsتعتصصبر مماثلصصة للصصص Hard Real Time systemsمصصن ناحيصصة سصصرعة الستجابة والتنفيذ لكن الختلف هو أنه في حالة الفشل بضع مرات للستجابة المطلوبة فلصصن
يؤدي ذلك إل ى فشصل النظصام ككصل .ومثصال علصى ذلصك جهصاز الراوتصر اللسصلكي Wireless Router
)الذي يبث النترنت بصورة لسلكية للهواتف أو الجهزة المحمولة( يحتوي على شصريحة تعمصصل على إستقبال وإرسال حزم البيانات Data packetsباستجابة عاليصصة ومثاليصصة لكصصن إذا حصصدث أن فقصصدت بعصصض الحصصزم أو لصصم يسصصتطع الراوتصصر التعامصصل معهصصا فصصإن ذلننك ل يعننني فشننل للنظننام ككننل
فهذا يعتبر خطأ مقبول طالماا أنه ليس متكرر بكثرة.
245
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.2طرق تصميم الـ
Real Time Embedded systems
هناك العديد من الطرق لتصميم نظم مدمجة عالية الستجابة بعضها يتسم بالبسصصاطة والبعصصض
الخر ممصمم ليعالج الوظائف المعقدة والمتداخلة .من هذه الطرق هناك نوعين أساسين:
الطريقة اﻷولى :كتابصة الوظصائف الصتي ل تحتصاج اسصتجابة سصريعة داخصل الدالصة الرئيسصية Main functionبينما المهمات التي تتطلب استجابة لحصدث خصارجي معيصن أو تحصصدث بصصورة دوريصة
يتم وضعها داخل دوال مقاطعات .interrupts
"#include "library1 "#include "library2 )(int main { some_data )while(1 { هنا تكتب المهمات ذات الهمية التقليدية // } ;return 0 } )ISR(type_of_ISR { كود معالجة سريع لحد المهمات عند حدوث مقاطعة // }
)ISR(type_of_ISR { كود معالجة سريع لحد المهمات عند حدوث مقاطعة // }
يعيب هذه الطريقة أنها ل تصلح إل لعدد محدود جداا من المهمات كما أن كتابة الكود البرمجي ﻷكثر من مهمة داخل الدالة الرئيسية يجعل الكود معقد.
246
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. الطريقة الثانية :استخدام أنظمصة تشصغيل الصوقت الحقيقصي Real Time Operating Systems
والصصتي تختصصصر بكلمصصة ،RTOSهصصذه النظمصصة مشصصابه فصصي نظريصصة عملهصصا بنظصصام التشصصغيل التقليصصدي الذي تستخدمة الن على الحاسب اللي مثل Windowsأو .Linux تهدف أنظمة التشغيل إلى توفير مجموعة من الخدمات أهمها "تعدد المهام "Multi-tasking
بفضصصل هصصذه النظمصصة تسصصتطيع أن تتصصصفح الصصويب وفصصي نفصصس الصصوقت سصصماع ملصصف دصصصوتي وقصصد
تستخدم برنامج معالجة النصوص بجانب كل ما سبق.
بالنسصصبة لصصك أنصصت تسصصتطيع أن تقصصوم بكصصل هصصذه الشصصياء فصصي نفصصس الصصوقت لكصصن الحقيقصصة أن هصصذه
المهام تتصم بالتتبصاع ،أمصا سصرعة تنفي ذها فيرجصع الفضصل فصي ذلصك إلصى مهصارة نظصام التشصغيل فصي معالجة كل هذه المهام بسرعة واستجابة عالية.
كيف تعمل أنظمة التشغيل بشكل عام؟
يعمل نظام التشغيل بصورة مشابهة للطباخ المحترف ،عادة يطلب من الطباخ أن يعد أكصصثر مصصن وجبصصه فصصي نفصصس الصصوقت وقصصد تختلصصف هصصذه الوجبصصات أو تتشصصابه لكصصن فصصي النهايصصة يتصصوجب عليصصه
إعدادها جميعاا في وقت محدد.
247
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. عادة ما يلجأ الطباخ لحيلة ذكيصة لتنظيصصم الصصوقت فهصصو ل يقصصوم بإنهصصاء كصل جصزء مصصن الصوجبه علصى
حصصصدة ثصصصم البصصصدأ فصصصي جصصصزء أخصصصر ولكنصصصه بصصصدلا مصصصن ذلصصصك يقصصصوم بعمليصصصة التبصصصديل بيصصصن المهصصصام Task .switching ل إذا كصصان المطلصصوب هصصو إعصصداد طبصصق المعكرونصصة مصصع اللحصصم المشصصوي فصصأن الطبصصاخ سصصيبدأ أولا فمث ا بغلي الماء ويتركه على النار )المهمة اﻷولى( ثم قد يضع اللحم على الشوايه )المهمننة الثانيننة(
ثم يبدأ في تجهيصصز الطمصصاطم مصصن أجصل الصلصصصة)المهمنة الثالثننة( ،عنصدما يستشصعر أن المصصاء بصدء
يغلي بدرجة حرارة مناسبة سيترك الصلصة ثم يعود إلى الماء ليضيف إليه المعكرونصصة ويتركهصصا
حتى تنضج ،ثم يعود مرة أخرى للطماطم و في ذلصك الصوقت فصإنه سصيحاول كصل فصترة زمني ة أن
يطمئن على درجة نضوج اللحم وتستمر هذه العملية حتى تنتهي كل مكونات الوجبة … نظام التشغيل يعمل بصورة مشابهه ،في البداية يقوم بتجهيز قائمة بالمهمات الصصتي يجصصب عليصصه
أن ينجزها ثم يبصدأ بصإدارة المهصصام مثصل الطبصاخ المحصترف ،ويق وم بصذلك بعصدة طصرق منهصصا مثلا أن
يعطي كل مهمصصة فصترة معالجصصة زمنيصصة قصصيرة تسصمى ) time sliceشصريحة زمنيصة( وعنصد انتهصصاء الشريحة الزمنية يقوم بالتبديل بين المهمات .ويعرف هصذا السصصلوب لجدولصصة المهصصام بالصصص Round Robin scheduling أيضصصاا قصد يقصصوم نظصصام التشصصغيل بمعالجصصة المهمصصات علصصى حسصب أولويصصة إنهائهصصا فمثلا قصصد يبصصدأ فصي معالجة أهم مهمة متوفرة لفترة طويلة حتى تصله رسالة أو طلب مقاطعة بوجود مهمصصة أخصصرى
أعلى أهمية و تحتاج لمعالجة فوريصة فيصترك المهمصة الولصى ويصذهب للثانيصة مؤقتصاا ح تى ينهيهصا
ثصم يعصود للولصى .وعنصدما ينتهصي مصن المهمصة الولصى بالكامصل يتركهصا ويصذهب إلصى المهمصة الثصالثه
وهكذا … ويعرف هذا السلوب في التبديل بين المهمات بالص .Priotiry based scheduling وقبل أن نكمل هناك بعض المسميات النجليزية الواجب معرفتها:
يسصصمى الجصصزء الصصذي يصصدير عمليصصه التبيصصدل بيصصن المهمصصات بالصصص ) RTOS schedulerمجصصدول نظصصام التشغيل( وهو جزء من نواة النظام والتي تسمى RTOS kernelكما تسمى عمليصة التب ديل بيصن
المهمات )بغض النظر عن أسلوب جدولة التبديل( بإسم Context switching
وتسمى المهمة التي يتم معالجتها الن بالص Running taskبينما المهمة الصصتي تنتظصصر دورهصصا فصصي
المعالجة .Waiting taskالصورة التالية طريق عمل الص RTOSبأسلوب مبسط
248
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.3كيف تعمل النواة
RTOS Kernel
المعالجصصصصات الموجصصصصودة داخصصصصل الممتحككمصصصصات الدقيقصصصصة تسصصصصتطيع أن تنفصصصصذ مجموعصصصصة مصصصصن الوامصصصصر
المتتالية ول تعرف تحديداا إذا كانت هصذه الوامصصر جصزء مصصن نظصصام التشصصغيل أو أنهصصا مهمصصة معينصصة وهصصذا يصصؤدي إلصصى سصصؤال هصصام ،كيننف يفهننم المعالننج أنننه يجننب أن يننترك المهمننة الحاليننة ويننذهب
لتنفيذ مهمة أخرى؟ هنا تأتي وظيفة نصصواة النظصصام . Kernelهصصذه النصصواة تعمصصل داخصصل دالصصة مقاطعصة زمنيصة Interrupt service routinويتصصم تكصصرار تشصصغيلها مصصن مئصصات إلصصى آلف المصصرات فصصي الثانيصصة الواحصصدة )يسصصمى
عدد مرات تشغيل النواة بالص .(System tickفي كل مرة يتصصم تشصصغيل النصصواة يبصصدأ جصزء مصصن هصصذه النواة يسمى "برنامج الجدولة ”Schedulerبمراجعة قائمة المهام الموجودة ويحصصدد مصصا الصصذي سيتم معالجته الن.
قصصد يختصصار برنامصصج الجدولصصة أن يكمصصل المهمصصة الحاليصصة أو ينتقصصل إلصصى مهمصصة أخصصرى علصصى حسصصب
خوارزميصصة التحويصصل )الصصص Round-Robinأو (Priority-basedوبعصصد أن يقصصرر المهمصصة ييقصصوم بنقصصل جلت البيانصصصات الخادصصصصة بمعالجصصصة هصصصذه المهمصصصة إلصصصى المعالصصصج وتتضصصصمن البيانصصصات محتصصصوى الممسصصص ك
جلت العامة والخادصة(. المختلفة )كل من الممس ك
249
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.4مقدمة عن نظام
FreeRTOS
تتوفر العديد من أنظمة تشغيل الوقت الفعلي المجانية والتي تختلف فيما بينها بمصصا تقدمصصة مصصن
إمكانيات ووظائف إضافية ،مصصن هصذه النظمصة نجصصد FreeRTOSوالصصذي يعصصد أشصصهر أنظمصة الصصوقت الحقيقي مفتوحة المصدر المتوفرة للستخدام المجاني سواء بصورة تعليمية أو تجارية.
يصصصصدعم هصصصصذا النظصصصصام مختلصصصصف الممتحككمصصصصات الدقيقصصصصة فيمكنصصصصك
تشغيله على PIC – ARM – AVR – 8051 – PowerPC – x86 والعديد من المعماريات الخرى. كمصصصصا يوجصصصصد منصصصصه نسصصصصخة مخصصصصصصة للنظمصصصصة ذات الموثوقيصصصصصصصة العاليصصصصصصصة )مثصصصصصصصل الجهصصصصصصصزة الطبيصصصصصصصة أو
التطبيقصصصصات العسصصصصكرية( ويسصصصصمى SAFE-RTOSمصصصصع العلم أن هذه النسخة مدفوعة وليست مجانية.
يمتلك هذا النظام العديد من المميزات الرائعة منها: •
حجصصم دصصصغير يسصصتهلك أقصصل مصصن 4إلصصى 9كيلصصو بصصايت مصصن ذاكصصرة الصصصص ROMممصصا يجعلصصه
مناسصصب لمعظصصم الممتحككمصصات الدقيقصصة )تصصذكر أن ATmega16يمتلصصك 16كيلوبصصايت مصصن الذاكرة بينما يمتلك ATmega32نحو 32كيلوبايت(. •
تصصوفير مجموعصصة مصصن المكتبصصات البرمجيصة الجصصاهزة للتعامصل مصصع أنظمصصة الملفصصات FATوالصصص
storage mediaمثل بطاقات الذاكرة •
مدمج معه مكتبات خادصة لتسهيل معالجة البيانات القادمة من وإلى شبكات الحاسصصب
اللصصصي عصصصبر بروتوكصصصول TCP/IPأو UDPممصصصا يجعلصصصه نظصصصام مناسصصصب لتطبيقصصصات إنصصصترنت
الشياء IoTوالتحكم عن بعد
250
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.5الهيكل الربرمجي
للـ RTOS
بصورة افتراضية تكتب جميع أوامر برامج النظم المدمجة في الدالة الرئيسصصية علصصى عكصس أنظمصصة
الص RTOSحيث نجد أن كل مهمة taskتماثل دالة رئيسية مستقله وتكون مهمة الص Main Function هي تعريف عدد وخصائص المهمات فقط.
الهيكل التالي شكل التقليدي للبرامج المكتوبة باستخدام RTOSحيصث تصصم إنشصصاء 3مهصام مختلفصصة
وتمتلك كل مهمة مجموعة الوامر الخادصة بها.
”#include “RTOS.h
إنشاء المهمة اﻷولى // إنشاء المهمة الثانية // إنشاء المهمة الثالثة //
)(int main { ;)createTask( task1, task1_parameters ;)createTask( task2, task2_parameters ;)createTask( task3, task3_parameters
إبدء إدارة المهمات بإستخدام // RTOS
;)(startRTOS_scheduler
ل تفعل أي شيء أخر داخل الدالة الرئيسية إلى ما ل نهاية //
; )while(1 ;return 0
}
{ ) (void task1 هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة اﻷولى //
{ )while(1 }
}
{ ) (void task2 هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثانية //
{ )while(1 }
}
{ ) (void task3 هنا تكتب مجموعة اﻷوامر الخاصة بالمهمة الثالثة //
{ )while(1 }
251
}
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.6تشغيل FreeRTOSعلى جميع ممتحككامات
AVR
عند تحميل نظام FreeRTOSمن الموقع الرسمي سنجد أنصه مهيصأ للعمصل علصى الممتحككصم الصدقيق atmega323فقصط.لصذا سصنقوم بعمصل مصصا يسصصمى " تصندير النظنام" ) system portingالبعصض يسميها تهيئة النظام( ،والتي تعني ضبط النظام ليعمل مع مختلصصف الممتحككمصصات الصصدقيق الخصصرى
من عائلة .AVRوسنأخذ الممتحككمات atmega 16/ 32 /328/ 644/1284مثال على ذلك.
في البداية قم بتحميل أحدث إدصدار متوفر من نظام ) FreeRTOSوقت كتابة هذا الفصصصل كصصان الدصدار رقم (8.2.1من الموقع الرسمي http://www.freertos.org
اضغط على Downloadمن الجانب اليسر للموقع للنتقال لصفحة التحميل ثم اختر "تحميل الدصدار الخير من موقع ”sourceforge.comكما في الصورة التالية
عنصصد النتهصصاء مصصن التحميصصل قصصم بفصك ضصغط الملصف لتجصد المجلصد الرئيسصي باسصم FreeRTOSوبصصه جميع المجلد والملفات الخادصة بنظام التشغيل لمختلف الممتحككمات الدقيقة
252
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. تنقسم الملفات إلى مجلدين أساسين وهما sourceو .Demoالول يحتوي على جميع الملفات المصدرية لنظام التشغيل التشغيل نفسه بينما الخر يحتوي على أمثلة لختبار نظام التشغيل. ملحظة :الملفات تشمل نسخة من النظام +أمثلة لجميع الممتحككمات من جميع العائلت التي يدعمها نظام FreeRTOSبما في ذلك ممتحككمات PIC, AVR, ARM cortexما يهمنا من هذه الملفات ما هو متعلق بالص AVRفقط باعتباره موضوع الكتاب.
أيضاا يدعم نظام FreeRTOSالعديد من المترجمات المختلفة مثل GCC – IAR – Keilولكننا سنستخدم GCCفقط باعتباره المترجم المرفق مع الص toolchainالمجانية. تعتمد عملية تصدير النظام على التلعب بإعدادات FreeRTOSمن خلل 3ملفات رئيسية:
port.c FreeRTOSConfig.h makefile main.c تتواجد هذه الملفات في المسارات التالية:
FreeRTOS/Source/portable/GCC/ATMega323/port.c FreeRTOS/Demo/AVR_ATMega323_WinAVR/FreeRTOSConfig.h FreeRTOS/Demo/AVR_ATMega323_WinAVR/makefile
ا :تعديل port.c أول ا
سصصصصمي هصصصصذا الملصصصصف port.cباعتبصصصصاره الملصصصصف الساسصصصصي فصصصصي عمليصصصصة الصصصصص portingحيصصصصث يتحكصصصصم بالخصائص الساسية لعملية الص ) context switchingالتبديل بين المهمات .(tasksويتم ضبط إعدادات المؤقت والمقاطعات الدورية من داخل الملف.
يعتمد نظام FreeRTOSعلصى المصؤقت رقصم 1فصي جميصع عصائلت AVRوبالتحديصد يقصوم بالتنقصل
بين المهمات عندما يحدث مقاطعة نتيجة تطابق عداد المؤقت 1والمسصصجل OCRA1xوهصصو مصصا
يعرف باسم .timer 1 COMPARE A match interrupt
في البداية توجه إلى الملف المتواجد داخل المسار التالي
FreeRTOS/Source/portable/GCC/ATMega323/port.c افتح الملف بأي محرر نصوص متوفر لديك وتوجه إلى السطر الذي يحتوى العبارة التالية ) #define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10
253
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
أول مصصا يجصصب ضصصبطة هصصو قيمصصة الصصص maskالصصذي سصصيفعل خادصصصية المقاطعصصة timer 1 compare جل TIMSKفصي ممتحككمصصات AVRالقديمصة match Aويتم حساب هصذا الصصص maskبصصالنظر إلصصى الممسصص ك
جل علصى البصصت المطلصوب تفعيلهصا نسبياا أو TIMSK0في الممتحككمات الحصدث ،يحتصوي هصذا الممسصص ك OCIE1Aوالمسؤولة عن تفعيل المقاطعة Timer1 Compare A Match interrupt
القيمة 0x10تمثل قيمة الص maskالممتحككم في تفعيل المقاطعة ويتم حساب هذه القيمة كالتالي: •
توجه إلى ملف البيانات الخادصة بالمتحكم الذي ستضع عليه نظام التشغيل )على
سبيل المثال الممتحككم – ATmega32دصفحة دليل البيانات رقم .(82سنجد أن البت OCIE1Aهي البت رقم 4
•
الن سنقوم بحساب الص maskوذلك عن طرق وضع الرقم 1مكان هذه البت وباقي
البتات = 0وهو ما يعني الرقم 00010000بالصيغة الثنائية وهو ما يساوي 0x10 بصيغة الهيكس) .هذه القيمة هي الفتراضية بالفعل( فصصي حالصصة الممتحككصصم atmega168أو ) atmega328ومعظننم الممتحككمننات الحديثننة( سصصنجد أن
مكصصصان البصصصت OCIE1Aمختلصصصف .فمثل افصصصي حالصصصة الممتحككصصصم atmega328سصصصنجد الوضصصصع التصصصالي
)دصفحة 135من دليل البيانات للممتحككم .(atmega328
254
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
في حالة الممتحككم atmega644أو الممتحككم atmega1284دصفحة 134من دليل البيانات
إذا قمنا بوضع الرقم 1مكان هذه البت وباقي البتات = دصفر سنجد أن قيمة الص maskتساوي 00000010وهو ما يساوي 0x02بصيغة الهيكس .إذا يجب استبدال القيمة 0x10بالقيمة
0x02كالتالي:
جل TIMSK لحظ أن الممتحككمات الحديثة نسبياا من عائلة AVR – 8bitل تمتلك الممس ك وإنما يكون باسم TIMSK0أو TIMSK1كما في حالة atmega328و atmega1284
جلت في نفس الملف وبالتحديد بعد تعديل قيمة الص maskسنقوم بتعديل بعض أسماء الممس ك
في الدالة ) prvSetupTimerInterrupt( voidوالتي ستجدها في أخر الملف port.cكما في الصورة التالية:
255
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
جل المسنننؤول عنننن المقاطعنننة يسنننمى TIMSKفلنننن تغينننر أي شنننيء بهنننا )مثنننل إذا كنننان الممسننن ك
الممتحككنننم (ATmega32/16أمصصصا إذا كنصصصت ستسصصصتخدم أي ممتحككصصصم حصصصديث مثصصصل atmega328أو atmega1284يجصصصصب أن تسصصصصتبدل TIMSKبالسصصصصم المناسصصصصب مثصصصصل TIMSK0أو ) TIMSK1علصصصصى حسب ما هو مذكور في دليل البيانات كما شاهدنا في الخطوة السابقة(. مثال :تعديل الدالة لتتناسب مع الممتحككم atmega1284/644/328/168/....etc
الجصصصزء الخيصصصر مصصصن تعصصصديل ملصصصف port.cهصصصو إعصصصادة تسصصصمية الصصصص ISRالخادصصصصة بمقاطعصصصة Timer1 Compare A Matchوهصصصذا الجصصصزء يجصصصب تغييصصصره لمعظصصصم ممتحككمصصصات ) AVRسصصصواء القديمصصصة أو
الحديثة( .هذا الجزء ستجده في نهاية ملف port.cكما في الصورة التالية.
256
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
قم بتغير كل الدوال باسم SIG_OUTPUT_COMPARE1A
إلى السم
TIMER1_COMPA_vect
ليصبح الملف كالتالي:
بذلك نكون قد انتهينا من تعديل الملف port.c
257
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
ثانيا :تعديل FreeRTOSConfig.h يتحكصصصم هصصصذا الملصصصف فصصصي إعصصصدادات نظصصصام التشصصصغيل عنصصصدما يبصصصدأ العمصصصل علصصصى الممتحككصصصم الصصصدقيق، وبالتحديصد هصو المسصؤول عصن التلعصب بخصصائص الصصص kernelوبعصض خصصائص تنظيصم الصصص .tasks يمكنصصك اسصصتخدام الملصصف كمصصا هصصو بالوضصصع الفتراضصصي لكصصن سصصتحتاج أن تغيصصر بعصصض العصصدادات
الهامصصة لتناسصصب الممتحككصصم الصصدقيق المسصصتخدم .وبعصصض العصصدادات الخصصرى والصصتي سصصتجعل نظصصام التشصصغيل أكصصثر كفصصاءة فصصي إدارة المهمصصات ) tasks (threadsخادصصصة مصصع الممتحككمصصات ذات الصصذاكرة
الصغيرة. يتواجد الملف في نفس مجلد Demoبجانب الملف main.cوبالتحديد في المسار التالي
FreeRTOS/Demo/AVR_ATMega323_WinAVR/FreeRTOSConfig.h
العدادات الواجب ضبطها #define configCPU_CLOCK_HZ ) ( ( unsigned long ) 8000000 يتحكصصم هصذا الخيصصار فصصي ضصصبط التصصوقيت داخصصل نظصصام التشصصغيل ،يجصصب أن تغيصصر قيمتصصه إلصصى نفصس
التردد الذي يعمل به المعالج )القيمة الفتراضية هي 8ميجاهرتز(.
#define configTICK_RATE_HZ ) ( ( TickType_t ) 1000 ا عدد المرات التي تعمل بها الص kernelوذلك التبديل بين المهمصصات المختلفصصة .فمثل بصصافتراض أن
لديك 10مهمات فهذا يعني أن الص Kernelسصتقوم بالتبصديل بينهصم 1000مصرة وهصو مصا يعنصي أن كل مهمة سيتم زيارتها 100مرة في الثانية في الواحد. زيصصادة هصذا الرقصم سصتؤدي إلصى نقصص الصوقت المخصصصص للمعالجصصة لكصصل مهمصة فصي مقابصصل تحسصين الستجابة للمهمات ككل ،ولكن هناك عيصب واحصد وهصصو أن الصصص kernelسصصيزداد معصدل اسصصتهلكها
للصصوقت والمصصوارد بزيصصادة هصصذا الرقصصم .فمثل إذا كصصان معصصدل الصصص tick = 3000 Hzفهصصذا يعنصصي أن الصصص
kernelسصصصتعمل 3000مصصصرة فصصصي الثانيصصصة وفصصصي كصصصل مصصصرة قصصصد تختصصصار أحصصصد المهمصصصات لتشصصصغيلها أو
التبديل مع مهمة أخرى .context switch
مصصن المفيصد زيصصادة هصذا الرقصصم فصي حالصصة أن المهمصصات تحتصصاج لسصتجابة سصريعة لكصن يستحسصن أن
يكون الممتحككم يعمل بسصصرعة 16أو 20ميجصصاهرتز علصصى القصصل .مصع العلصصم أنصه بزيصصادة هصذا الرقصم
258
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. سصصصيتم اسصصصتهلك المزيصصصد مصصصن الطاقصصصة .لصصصذا إن كصصصان مشصصصروعك يجصصصب تصصصصميمه باسصصصتهلك طاقصصصة
منخفض فيستحسن تقليل الرقم إلى ) 500سصيخفض سصرعة السصصتجابة للمهمصصات( وإذا كنصصت ل تهتصصصصم بزيصصصصادة اسصصصصتهلك الطاقصصصصة فيمكنصصصصك أن تضصصصصع القيمصصصصة بيصصصصن 1000و 3000وفصصصصي حالصصصصة
الممتحككمات من عائلة AVR Xmegaأو AVR – 32 bitيمكن زيادة الرقم إلى .5000
#define configMAX_PRIORITIES )(4 هذا الخيار يتحكصم بأقصصى عصدد مصن الولويصصات المسصصموح بهصا فصي نظصصام التشصغيل .يتصصم تحديصده
بنصصاء علصصى عصصدد المهمصصات المتوقصصع تشصصغيلها علصصى النظصصام ومصصدى أهميصصة كصصل منهصصا .إذا كصصانت معظصصم المهمات لها نفس الولوية فيمكنك أن تضع الرقم ب 2فقط.
#define configMINIMAL_STACK_SIZE ) ( ( unsigned short ) 85 الرقم المسؤول عصن تحديصصد أقصصل حجصصم للصصص stackلكصصل مهمصصة تعمصصل ،يجصب أن يتناسصصب الرقصم مصصع حجصصم الصصذاكرة العشصصوائية SRAMللممتحككصصم الصصدقيق .فمثلا إذا كصصانت ال SRAMتسصصاوى 1كيلصصو
فمن الفضل أن يصبح الرقصصم 50فقصط أمصصا إذا كصصانت الصذاكرة 2كيلصو فيمكنصك أن تصتركه كمصا هصو أما إذا كانت الذاكرة 4كيلو أو أكثر فمن الممكن زيادتها إلى .150 أيضصصصاا يجصصصب زيصصصادة هصصصذا الرقصصصم إذا كصصصانت المهمصصصات الصصصتي سصصصيتم تشصصصغيلها سصصصتتعامل مصصصع دوال أو عمليات حسابية كبيرة )أو أي عملية تحتاج أن تستخدم الص Stackلجرائها( .ولحظ أن معظم
العمليصصات الحسصصابية المركبصصة مثصصل ) x = y+5/z*(x+1تسصصتخدم الصصص stackلصصذا يجصصب أن تضصصع هصصذه
العوامصصصل بالحسصصصبان عنصصصد اختيصصصار هصصصذا الرقصصصم .أيضصصصاا يتصصصم اسصصصتخدام الصصصص stackفصصصي حفصصصظ قيصصصم
جلت التي تتعامل معها المهمة. الممس ك
يجب النتباه إلى أمر هام وهو أن حجم الص stackلكل مهمة يقاس بالص wordوليس بالص byteلذا
عندما نقول أن حجم الص stack = 150فهذا يعني أن الحجم الحقيقي في الذاكرة
stack size= 150 word = 150 * (4 byte “1 Word”) = 600 byte
) ) ( (size_t ) ( 1500
#define configTOTAL_HEAP_SIZE
الص Heapهي تقنيصة data-typeتسصصتخدم أنظمصصة RTOSلتخصصيص ذاكصصرة مرنصصة )قابلصصة للزيصصادة( لكل مهمة تعمل في نظصام التشصصغيل .يتصم اسصصتخدام هصذه التقنيصصة فصي حفصظ جميصصع المتغيصرات أو
الثوابت المستخدمة في كل مهمة.
259
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. يتصصم تحديصصد هصصذا الرقصصم بصصصورة أساسصصية علصصى حسصصب حجصصم الصصذاكرة العشصصوائية الكليصصة للممتحككصصم
الصصصدقيق ويجصصب النتبصصاه أن الرقصصصم 1500يسصصصاوي قيمصصة الصصذاكرة بالبصصصايت byteوهصصذا يعنصصصي أن
ذاكرة الص heapهنا تساوى الخامس كيلو بايت تقريباا.
يمكن تحديد هذا الرقم بما هو إجمالي الذاكرة العشوائية للممتحككصم الصدقيق مصع مراعصصاة أن نظصام freeRTOSيحتصصاج نحصصو 300إلصصى 400بصصايت لتشصصغيل الصصص kernelبينمصصا يمكصصن تخصصصيص بصصاقي
الذاكرة للمهمات المختلفة.
المثلة التالية هي لقيم الص heapللمتحكمات المختلفة • •
الممتحككم ATmega16يمتلك SRAM = 1 Kbyte مساحة الص heapيفضل أن تكون 0.8كيلوبايت ).(800
•
الممتحككمات ATmega32/328تمتلك SRAM = 2 Kbyte
•
مساحة الص heapيفضل أن تكون واحد ونصف كيلوبايت )(1500
•
الممتحككم atmega644يمتلك SRAM = 4 Kbyte
•
مساحة الص heapيفضل أن تكون 3.5كيلوبايت )(3584
•
الممتحككم atmega1284يمتلك SRAM = 16 Kbyte
•
مساحة الص heapيفضل أن تكون 15.5كيلوبايت )(15360 بذلك نكون قد انتهينا من أهم العدادات للنظام
يمكنك أن تتعلم حول باقي العدادات من المرجع المفصل لملف FreeRTOSCOnfig.hعلى الرابط التالي http://www.freertos.org/a0019.html
ثالثاا :تعديل ) serial.cاختياري – غير مطلوب( يصصصوفر نظصصصام FreeRTOSملصصصف serial.cوهصصصو driverلتشصصصغيل الصصصص UARTداخصصصل نظصصصام التشصصصغيل ويعتصبر متوافصق مصع معظصم ممتحككمصات AVR 8 bitلكصن يحتصاج بعصض التعصديلت البسصيطة وه ي
260
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. جلت الداخليصصة المسصصتخدمة فصصي الملصصف )أيضصصاا بسصصبب اختلف الممتحككمصصات تغييصصر أسصصماء الممسصص ك جلت مثل UCSRBأدصبح UCSR0Bأو .(UCSR1B الحديثة عن القديمة في تسمية الممس ك
التعديلت المقترحة )على حسب الممتحككم المستخدم( – يجب مراجعة دليل البيانات الجزء
جلت الخاص بالص USARTلمعرفة أسماء الممس ك
جلت مثصال :تعصديل الصص driverليتوافصق مصع الممتحككصم ) atmega328يجصب اسصتبدال جميصع الممسص ك بالسماء الصحيحة لها(.
UCSRB -> UCSR0B UCSRC -> UCSR0C UBRRL -> UBRR0L UBRRH -> UBRR0H UDR -> UDR0 ملحظة :لن يتم استخدام هذا الملف في جميع المثلة الموجودة في الكتاب والتعديلت المذكورة بالعلى اختيارية في حالة أنك تريد استخدام الص UARTفي مشاريعك الخادصة
رابعاا :تعديل makefile
التعصصصصديلت فصصصصي هصصصصذا الملصصصصف مرتبطصصصصة بمسصصصصتخدمي نظصصصصام Linuxأو أي شصصصصخص ميسصصصصتخلدم الصصصصص toolchainمباشصصرة دون اسصصتخدام بيئصصة برمجصصة متكاملصصة مثصصل ) ،IDE (ATmel studioيمكنصصك
قراءة الملحق الخاص بعملية compiling using makefileلتتعرف أكثر على هذه التقنية.
يوجد الملف makefileفي نفس مجلد Demoويحتوي على بيانات الممتحككم والمبرمجة الصصتي سيتم استخدامها ،حيث يجب ضبط هذه العدادات لتتوافق مع الممتحككم المستخدم.
تغيير الممتحككم فصصي بدايصصة الملصصف سصصتجد السصصطر الصصبرمجي MCU = atmega323قصصم بتغييصصره لسصصم الممتحككصصم المطلوب مثل ATmega16أو ATmega32أو atmega1284كما في الصورة التالية
261
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
تعديل المكتبات الممضافة فصصي الجصصزء الخادصصصة بالصصص compilingسصصنجد أن ملصصف makefileالفتراضصصي يتضصصمن العديصصد مصصن المجلصصدات الصصتي تحتصصوي جميصصع المكتبصصات المطلوبصصة لتشصصغيل نظصصام ،FreeRTOSيمكنصصك إضصصافة
مكتباتك الخادصة أو مسح المكتبات التي ل تحتاجها من هذا الجزء.
فصصصي المثلصصصة المصصصذكورة فصصصي الكتصصصاب ل داعصصصي لضصصصافة كصصصل هصصصذه المكتبصصصات لصصصذا سصصصنقوم بمسصصصحها
واستبدالها بالقائمة التالية فقط
المكتبات الممضافة بعد التعديل
262
SRC \= \ main.c \ $(SOURCE_DIR)/tasks.c \ $(SOURCE_DIR)/queue.c \ $(SOURCE_DIR)/list.c \ $(SOURCE_DIR)/croutine.c \ $(SOURCE_DIR)/timers.c \ $(SOURCE_DIR)/portable/MemMang/heap_1.c $(PORT_DIR)/port.c
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
تعديل الممبرمجة هنا سنقوم باختيار الممبرمجة المستخدمة في حرق ملف الهيكس ،ابحث عن العبارة التالية AVRDUDE_PROGRAMMER = stk500 شخصصصصصياا أسصصصصتخدم usbaspلصصصصذا سصصصصأقوم باسصصصصتبدال stk500بكلمصصصصة ) usbaspاسصصصصتبدلها باسصصصصم
الممبرمجة التي لديك إذا كانت مختلفة عن (usbaspكما في الصورة التالية
ملحظة :في حالة أنك ستستخدم usbaspيجب أن تمسح الخيار )-P $(AVRDUDE_PORT أمصصا فصصي حالصصة اسصصتخدام أي مبرمجصصة أخصصرى تمتلصصك بصصورت علصصى نظصصام وينصصدوز أو لينكصصس مثصصل usbTiny ISPأو AVRISP mkIIفيجصصصصصصب أن تحصصصصصصدد رقصصصصصصم البصصصصصصورت فصصصصصصي الخيصصصصصصار المسصصصصصصمى AVRDUDE_PORT
263
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
11.7المثال اﻷول :
Blinking 3 leds with 3 tasks
يأتي نظام FreeRTOSبمثال برمجي جاهز لختبصار تعصصدد المهصصام لكنصصه معقصد قليلا لصذا أفضصصل أن
نبصصدأ مصصع مثصصال أبسصصط و أكصصثر وضصصوحاا وهصصو عبصصارة عصصن تشصصغيل 3ليصصدات مختلفصصة كصصل منهصصا تعمصصل بتوقيت مختلف عن الخصرى .اللي دات متصصلة بصالترتيب علصى PB0, PB1, PB2كمصا هصو موضصح
فصصي الصصصورة التاليصصة )المثصصال تصصم باسصصتخدام ATmega16ويمكصصن اسصصتخدام ATmega32بنفصصس
التودصيلت أيضاا(.
مخطط الدائرة
قصصم بفتصصح الملصصف main.cفصصي مجلصصد Demoوامسصصح الكصصواد البرمجيصصة الموجصصودة بصصه واسصصتبدلها
بالكواد التالية
ملحظة :الكواد مرفقة في الملف FreeRTOS Examples/blinking_3_leds.c
أيضاا يمكنك استبدال الملف مباشرة بالملف blinking_3_leds.cمع تغير اسمه إلى main.cليصبح هو الملف الرئيسي الذي سيتم ترجمته
264
RTOS أظنظمة الوقت الحدقيدقي.11 .............................................................................................. …
الـكود
#define F_CPU 8000000UL #include #include /* FreeRTOS files. */ #include "FreeRTOS.h" #include "task.h" #include "croutine.h" /* Define all the tasks */ static void ledBlinkingtask1(void* pvParameters); static void ledBlinkingtask2(void* pvParameters); static void ledBlinkingtask3(void* pvParameters); int main(void) { /* Call FreeRTOS APIs to create tasks, all tasks has the same priority "1" with the same stack size*/ xTaskCreate( ledBlinkingtask1, ( signed char * ) "LED1", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( ledBlinkingtask2, ( signed char * ) "LED2", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( ledBlinkingtask3, ( signed char * ) "LED3", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); // Start the RTOS kernel vTaskStartScheduler(); /* Do nothing here and just run infinte loop */ while(1){}; return 0; }
265
RTOS أظنظمة الوقت الحدقيدقي.11 .............................................................................................. … static void ledBlinkingtask1(void* pvParameters){ /* Define all variables related to ledBlinkingtask1*/ const uint8_t blinkDelay = 50 ; /* make PB0 work as output*/ DDRB |= (1<
//toggle PB0
vTaskDelay(blinkDelay); //wait some time } } static void ledBlinkingtask2(void* pvParameters){ /* Define all variables related to ledBlinkingtask2*/ const uint8_t blinkDelay = 150; /* make PB1 work as output*/ DDRB |= (1<
//toggle PB0
vTaskDelay(blinkDelay); //wait some time } }
266
.11أظنظمة الوقت الحدقيدقي RTOS … .............................................................................................. {)static void ledBlinkingtask3(void* pvParameters /* Define all variables related to ledBlinkingtask3*/ ;const uint16_t blinkDelay = 600 /* make PB2 work as output*/ ;)DDRB |= (1<
;)PORTB ^= (1<
vTaskDelay(blinkDelay); //wait some time } } دصورة للملف main.cبعد تعديل الكواد
بعصصد النتهصصاء مصصن جميصصع التعصصديلت احفصصظ الملصصف ثصصم قصصم بفتصصح سصصطر الوامصصر فصصي نفصصس المجلصصد واكتصصصب المصصصر makeلتبصصصدأ عمليصصصة الترجمصصصة ،إذا تمصصصت بنجصصصاح سصصصتظهر نتائصصصج مشصصصابهه للصصصصورة
التالية:
267
.11أظنظمة الوقت الحدقيدقي RTOS … ..............................................................................................
الن يمكنك استخدام ملف الهيكس الناتج من عملية الترجمة سواء فصصي تجربصصة الصصص simulation
على برنامج بروتس أو تجربة الملف مباشرة على الممتحككم الدقيق .ATmega16
في حالة استخدام ممتحككم أخر مثل ATmega32أو atmega328ل تنسى أن تغير العدادات الخادصة بالملف – makefileكما هو مذكور في الخطوات في بداية الفصل ملحظة :بالرغم من إمكانية تصميم النظمة الص Hard Real timeأو Firm Real time
بإستخدام الممتحككمات الدقيقة مع RTOSإل أنه عادة ما يتم استخدام تقنية الص FPGAأو الص ASICلتصميم هذه النظمة حيث تتمتع هذه التقنيات بالقدرة على معالجة العديد من
المهمات المختلفة والستجابة الفائقة لها جميعاا في نفس الوقت .بينما الممتحككمات الدقيقة ل تستطيع أن تشغل أكثر من مهمة في نفس اللحظة حتى وإن كان باستطاعتها التبديل بين
المهمات بإستخدام الص RTOSوهذا لن أغلب الممتحككمات الدقيقة تمتلك نواة معالجة واحدة Single CPU core
268
الملحقات
” االتعليم أقوى سلاح يمكنك استخدامه لتغيير العالم ‟
نيلسون مانديلا
.12المملحدقات اﻹاضافية … ..............................................................................................
.12المملحدقات اﻹاضافية
✔
تنصيب واستخدام برنامج CodeBlocksكبديل للص ATmel Studio
✔
ترجمة الملفات باستخدام MakeFile
✔
رفع ملف الص Hexعلى المتحكم الدقيق
✔
كيف تستخدم لوحة آردوينو لتعلم برمجة الص AVR
270
.12المملحدقات اﻹاضافية … ..............................................................................................
مملحق :تنصيب برنامج CodeBlocksعلى نظام ويندوز
يعتصصبر برنامصصج CodeBlocksمصصن أفضصصل بيئصصات البرمجصصة المخصصصصة للمشصصاريع الصصتي تكتصصب بلغصصة السصصصي أو السصصصي ++كمصصصا أنصصصه مجصصصاني ومتصصصوفر لجميصصصع أنظمصصصة التشصصصغيل )وينصصصدوز – لينكصصصس –
مصصاك(،ويعتصصبر بصصديل أخصصف وأسصصرع بكصصثير مصصن ATmel Studioومناسصصب لكصصل مصصن يريصصد أن يكتصصب برامج بلغة السي عامة سواء للمتحكمات الدقيقة أو للحواسيب. يعتمصصصد البرنامصصصج بصصصصورة أساسصصصية علصصصى المصصصترجم الشصصصهير GCCوالصصصذي سنسصصصتخدم الدصصصصدارة المشتقة منه وهصي avr-gccكمصا سصنرى فصي الخطصوات القادمصة .فصي البدايصة قصم بتحميصل ملفصات
التنصصصيب الخادصصصة بالبرنامصصج عصصبر التصصوجه إلصصى موقصصع CodeBlocksالرسصصمي مصصن خلل الرابصصط
التالي: http://www.codeblocks.org/downloads
اضصصغط علصصى زر تحميصصل ملفصصات التشصصغيل لتظهصصر لصصك دصصصفحة تحتصصوي 3خيصصارات للتحميصصل ،قصصم بتنزيصصصل الخيصصصار الصصصذي يحمصصصل اسصصصم codeblocks-13.12mingw-setupوالصصصذي يعنصصصي أن برنامصصصج
CodeBlocksمضصصاف إليصصه جميصصع ملفصصات المصصترجم ) gcc-compilerقصصد يختلصصف الرقصصم 12-13
الموجود في اسم البرنامج إذا تم إدصدار نسخة جديدة(.
271
.12المملحدقات اﻹاضافية … .............................................................................................. بعد النتهاء من التحميل ابدأ بتنصيب الملف وتأكد من وضع علمة "دصح" على جميع خيارات
التنصيب الخادصة بالبرنامج )هذه الخيارات تعني تنصيب جميع ملحقات برنامج CodeBlocks كما في الصور التالية:
272
.12المملحدقات اﻹاضافية … ..............................................................................................
تنصيب برنامج WinAVR
بعصصد النتهصصاء مصصن تنصصصيب برنامصصج CodeBlocksسصصنقوم بتنزيصصل الصصص WinAVR Toolchainالصصتي تحتصصوي علصصى المصصترجم مفتصصوح المصصصدر AVR-GCCبالضصصافة إلصصى جميصصع المكتبصصات البرمجيصصة +
برنامج avrdude
http://sourceforge.net/projects/winavr/fles اضغط على رابط التحميل الموجود بأعلى الصفحة كما في الصورة التالية:
بعد النتهاء من التحميل قم بتنصيب البرنامج كما في الخطوات السصابقة .والن سصنقوم بتنصزل
برنامج الواجهة الرسصصومية ) AVRDUDESSإذا لصصم تكصصن قمصصت بتحميلهصصا مسصصبقاا( تصصذكر أن برنامصصج يعمل avrdudeل يعمل إل من خلل سطر الوامر فقط لذا سنحتاج . AVRDUDESS http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude/ ملحظة :تتوفر العديد من البرامج الخرى التي تعمل كواجهة رسومية غير AVRdudess
مثل avrdude-gui :أو BitBurnnerأو AVR8 Burn-O-Matأيضاا هناك العديد من البرامج الخرى غير avrdudeمتوفرة لنظام ويندوز لكني فضلت avrdudeلنه يأتي مع الص toolchainويعمل على جميع أنظمة التشغيل
273
.12المملحدقات اﻹاضافية … .............................................................................................. الن يمكنك البدء في كتابة البرامج لمتحكمات الص ، AVRلنأخذ الص Blinking Ledكمثال
قم بتشغيل برنامج CodeBlocksواختر New Projectومن الصفحة التي سصصتظهر اخصصتر AVR
projectكما في الصور التالية:
قصصم بكتابصصة اسصصم المشصصروع ATmega16_blinking_ledواخصصتر المكصصان الصصذي تريصصد أن تحفصصظ بصصه ملفات المشروع كما في الصورة التالية.
274
.12المملحدقات اﻹاضافية … .............................................................................................. في الصفحة التالية قم بالتأشصير علصى خيصصار Create Releaseفقصط وألصغ التأشصصير علصصى Create “Debug” configuration سصصصتظهر دصصصصفحة جديصصصدة خادصصصصة بإعصصصدادات الممتحككصصصم الصصصدقيق ،مصصصن القائمصصصة العلويصصصة اخصصصتر نصصصوع
الممتحككصصم ATmega16ثصصم قصصم بتغيصصر سصصرعة تشصصغيل المعالصصج إلصصى الصصتردد المطلصصوب مثصصل 8ميجصصا هرتز بدل من 16ميجا وذلك عبر كتابة الرقم 8000000
الن أدصصصصصبح كصصصصل شصصصصيء جصصصصاهز لنكتصصصصب أول برنامصصصصصصصصصصصصج،حيصصصصصصصصصصصصث سصصصصصصصصصصصصنجد أن برنامصصصصصصصصصصصصج
CodeBlocksقام بعمل ملفيصصن الول يسصصمى main.cو الثاني هو – fuses.cسنتعامل مصصع الملف الول فقصصط وهصو الملصصف الصصذي سصصنكتب
فيه البرامج الخادصة بالتحكم ،أمصصا الفيصصوزات فيمكنصصك أن تقصصوم باعصصدادها مباشصصرة كمصصا هصصو
مذكور في فصل الفيوزات. للبصصدء قصصم بالضصصغط مرتيصصن علصصى ملصصف main.cمصصن القائمصصة الجانبيصصة للبرنامصصج لتظهصصر الصصصفحة
275
.12المملحدقات اﻹاضافية … .............................................................................................. الخادصة بكتابة الكود البرمجي وبعد النتهاء من كتابة الكود اضغط على زر Buildمن الشريط
العلوي للبرنامج )الزر الذي يمتلك رمز الترس( كما في الصورة التالية:
ستظهر في القائمة السفلية للبرنامج عبارة تدل على نجاح عملية التجميع Compilationبصصدون
أخطاء . errorsالن يصبح لدينا ملف الصصص hexالصصذي يمكننصصا اسصصتخدامه إمصصا لبرمجصصة الممتحككصصم أو يمكننا استخدامه مع برنامج المحاكاة بروتس Protuesلعمل محاكاة للممتحككم ATmega16
276
.12المملحدقات اﻹاضافية … ..............................................................................................
مملحق :ترجمة الملفات باستخدام
makefile
متعد هذه الطريقة هي أسرع اسلوب لترجمة الملفات المكتوبصة بلغصة السصي وتحويلهصصا إلصى الصصيغ
التنفيذية مثل ملفات ) hexأو حتى ترجمة البرامج التقليدية الخادصة بالحاسب اللي(. تعتمصصصد هصصصذه الطريقصصصة علصصصى اسصصصتخدام المصصصترجم avr-gccمباشصصصرة دون الحاجصصصة لوجصصصود أي بيئصصصة تطصصصوير مثصصصل Atmel studioأو .Codeblocksكمصصصا تمتصصصاز بأنهصصصا معيارينننة ودصصصصالحة للعمصصصل علصصصى جميصصع نظصصم التشصصغيل windows, linux, macوبسصصبب عصصدم الحاجصصة لوجصصود IDEنجصصد أن هصصذه الطريقصصة هصصي الخصصف علصصى الطلق لصصذا ل تسصصتعجب إذا وجصصدت أن معظصصم المشصصاريع الموجصصودة
على النترنت تستخدم هذه الطريقة في الترجمة.
شخصصصي اا أسصصتخدم هصصذ السصصلوب فصصي جميصصع المشصصاريع الصصتي أعمصصل عليهصصا حيصصث اسصصتخدم محصصرر
النصصصصوص ++NotePadأو sublimeلكتابصصصة الملفصصصات بلغصصصة السصصصي ثصصصم أحولهصصصا إلصصصى ملفصصصات hex باستخدام الص ) makefileسواء على ويندوز أو لينكس(.
التجربة الأولى فصصي البدايصصة تأكصصد مصصن وجصصود الصصص toolchainعلصصى جهصصازك )علصصى نظصصام وينصصدوز تسصصمى WinAVR
(toolchainويمكن تحميلها من الرابط التالي
http://sourceforge.net/projects/winavr/files لختبار تنصيب الص toolchainبصورة دصحيحة ،قم بفتح سطر اﻷوامر واكتب المر make
• سطر الوامر على نظام ويندوز يسمى command promptويتم تشغيله بكتابصصة بالمر cmdمن قائمة start
• سطر الوامر على نظام لينكس يسمى ) terminalالطرفية( إذا كانت الص toolchainمنصبة بصورة دصحيحة يفترض أن تظهر الرسالة التالية
make: *** No targets specified and no makefile found. Stop.
277
.12المملحدقات اﻹاضافية … ..............................................................................................
والن لنقصصم بتجربصصة الملصصف الول وهصصو المثصصال ،blinking ledقصصم بفتصصح المجلصصد المسصصمى compile with make fileلتجد بداخله ملفين وهما
main.c makefile الملف main.cيحتوي على المثال الول في الكتاب blinking ledأما الملف makefileفيحتصصوي علصصصى جميصصصع العصصصدادات الخادصصصصة بتحويصصصل الملصصصف main.cإلصصصى ملصصصف الهيكصصصس .قصصصم بفتصصصح الملصصصف
باستخدام أي محرر نصوص مثل ++notepad
يمتلك هذا الملف الكثير من العدادات وأهمها هي المجموعة التالية:
278
MCU=ATmega16
.12المملحدقات اﻹاضافية … .............................................................................................. هنا يتم وضصع اسصصم الممتحككصم الصدقيق المسصتخدم والصذي سصيتم تولي د ملصف الهيكصس خصيصصاا لصه
)مع ملحظة أن ملفات الهيكس تختلف من ممتحككم لخر(.
PROGRAMMER_MCU=m16 هذا الخيار يحصدد اسصم الممتحككصم الصذي سصيرفع عليصه ملصف الهيكصس باسصتخدام برنامصصج avrdude
ويجب تسميته بالحرف mثم رقم الممتحككم فمثل
ATmega16 = m16 ATmega32 = m32 atmega328p = m328p
• • •
PROJECTNAME=blinkingled هذا هو اسم المشروع وسيكون اسم ملف الهيكس الذي سيتم توليده
PRJSRC=main.c اكتب هنا اسم الملف الذي يحتوي على الكود البرمجي المراد تحويله إلى ملف هيكس. احفصصظ الملصصف ثصم تصصوجه إلصصى سصصطر الوامصصر وحصصول مسصصار المجلصصد الحصصالي إلصصى نفصصس مكصصان الملفيصصن
main.cو makefileفمثلا -المسار الذي استخدمه هو
C:\Users\Abdallah\Documents\Blinking Led Example
قصصصم بكتابصصصة المصصصر ”cd “pathواسصصصتبدل كلمصصصة pathبالمسصصصار ثصصصم اضصصصغط Enterلتجصصصد أن سصصصطر الوامر انتقل إلى المجلد المطلوب كما في الصورة التالية
279
.12المملحدقات اﻹاضافية … ..............................................................................................
والن اكتصصب المصصر make hexلتجصصد أن المصصترجم بصصدأ عمليصصة تحويصصل الملصصف main.cإلصصى الملصصف blinkingled.hexكما في الصورة التالية
شكل المجلد بعد أن تم توليد الملف blinkingled.hex
مسح الملفات من خلال make بافتراض أنصك تريصصد مسصح جميصع الملفصصات الصصتي نتجصت مصن عمليصصة الترجمصة فيمكنصك ذلصك بسصهولة باستخدام المر make clean ملحظة:ملف makefileالمرفق مع الكتاب هو نسخة مبسطة من هذا النوع من الملفات وقد تجد في مشاريع أخرى نفس الملف ولكن بإعدادات أكثر كما سنرى في الفصل الخاص بص Real Time Operating system يستحسن أن تعتاد وتتقن ترجمة الملفات بهذه الطريقة لنها تعتبر الطريقة المعتمدة في مجتمعات المطورين وستجد الكثير من المشاريع على النترنت تستخدم هذه الطريقة.
280
.12المملحدقات اﻹاضافية … ..............................................................................................
مملحق :رفع ملف الـ Hexعلى الممتحكك م الدقيق كيف توصل المربرمجة بالمتحك م
تمتلصصصك أغلصصب مبرمجصصات الصصصص AVRإمصصا 6أو 10أطصصراف)تسصصصمى هصصذه الطصصرف (ISP connector وتكون مرتبه كما هو موضح بالصورة التالية
مثال على ذلك المبرمجة USBasp
لبرمجة الممتحككم الدقيق كل ما عليك فعلصصه هصصو تودصيل كل طرف في المبرمجة بما يوازية في
الممتحككصصم الصصدقيق وهصصذا يشصصمل الطصصراف MOSI )– MISO – SCK – RST(RESET والطصرف 5Vفصي المبرمجصة يتصصل بالصصص VCCمصع
AVCCوكصصصصذلك يتصصصصم تودصصصصصيل كصصصصل اطصصصصراف الصصصصص GNDببعضها )الممتحككم والمبرمجة(.
281
.12المملحدقات اﻹاضافية … .............................................................................................. بعد النتهصاء مصن تودصصيل دائصرة الممتحككصم علصى لوحصة التجصارب Breadboardسصنقوم برفصع ملصف
الهيكصصس باسصصتخدام برنامصصج avrdudeوذلصصك مصصن خلل الواجهصصة الرسصصومية .AVRdudessفصصي البداية قم بفتح البرنامج AVRdudess
اختر نوع الممبرمجة المتوفرة لديك مثل USBaspكما هو موضح في الصورة التالية:
بعصصد اختيصصار الممبرمجصصة قصصم باختيصصار نصصوع الممتحككصصم الصصدقيق )مصصن القائمصصة الموجصصود علصصى الجصصانب
اليمصصن مصصن البرنامصصج( وفصصي حالصصة أن الممتحككصصم يعمصصل بصصدائرة المذبصصذب الصصداخلي بسصصرعة 1ميجننا
يجب أن تغير سرعة رفع البرنامج لتصبح 93كيلوبايت في الثانية أما إذا كان الممتحككم يعمصصل
282
.12المملحدقات اﻹاضافية … .............................................................................................. باستخدام دائرة مذبذب خارجي مثل الكريستالة 16ميجا فيمكنك أن تترك خيار سصصرعة الرفصصع يساوي الخامس ميجا كما هو موضح في الصورة التالية.
ملحظة :يستطيع برنامج AVRdudessأن يتعرف على الممتحككم بصورة تلقائية وذلك عبر الضغط على زر Detectالموجود على جانب الشاشة اليسر. والن اختر ملف الهيكس الذي يحتوي على البرنامج المطلوب رفعة إلى الممتحككم الدقيق
وأخيراا قم بالضغط على زر Programالموجود بأسفل شاشة البرنامج
283
.12المملحدقات اﻹاضافية … ..............................................................................................
استخدام برنامج avrdudeبدون واجهة رسومية بالرغم من وجود العديد من الواجهصات الرسصومية لبرنامصج avrdudeإل أنصه بالسصصاس يعمصل مصصن خلل سطر الوامر )سواء cmdعلى ويندوز أو الص shellعلى نظام لينكس(. قصصد يبصصدو اسصصتخدام avrdudeمزعجصصاا أو مخيفصصاا لمصصن ل ميسصصتخلدم نظصصام لينكصصس و ليصصس علصصى احتكاك بسطر الوامر إل أنه سنكتشف سوية مدى سهولة استخدامه.
284
.12المملحدقات اﻹاضافية … ..............................................................................................
أهم الخيارات المتاحة
اسنننم المبرمجنننة :بكتابصصصة -cكخيصصصار فصصصي سصصصطر المصصصر avrdudeلتحديصصصد نصصصوع المبرمجصصصة مثلا : ..– arduino – avrisp – usbaspإلخ. الممتحككم المنراد برمجت ه :بكتابصة -pكخيصار فصي سصطر المصر avrdudeلتحديصد اسصصم الممتحككصم. سننرعة التصننال :بكتابصصة -bكخيصصار فصصي سصصطر المصصر ،و هصصذا الخيصصار مهصصم لتأكيصصد كصصون سصصرعة
السصصتقبال فصصي الكصصود المنفصصذ علصصى ممتحككصصم ” الممبرمجصصة” يسصصاوي سصصرعة avrdudeلنصصه اختلف السرعتين سيؤدي إلى أخطاء في التزامن.
المنفذ التسلسلي :بكتابة -Pكخيار في سطر المر .اسم المنفذ يتخلف من نظام تشغيل لخصر
فغالباا ما يكون من نمط dev/ttyACMبالنسبة للينكس و COMبالنسبة للويندوز .
اﻷمننر التنفيننذي :بكتابصصة -Uكخيصصار فصصي سصصطر المصصر ،و مصصن ثصصم تحديصصد المصصر بالصصصياغة التاليصصة : memtype:op:filename:formatو يقصصصصد بصصصص formatنصصصوع الملصصصف المسصصصتخدم حيصصصث يمكصصصن
اسصصتخدام الملفصصات مصصن نصصوع hexأو .binأمصصا filenameفيتصصم اسصصتبدالها بأسصصم الملصصف ،وكلمصصة op
تعني operationوهي العملية المطلوب تنفيذها مثل ) readاقرأ الذاكرة( أو ) writeأكتب فصصي الصصذاكرة( أو verifyوالصصتي تعنصصي التأكصصد مصصن أن محتصصوى الصصذاكرة يطصصابق ملصصف الهيكصصس الصصذي يتصصم تحديد أسمه في نفس المر.
خيارات مختلفة :من الظلم إختصار خيارات avrdudeبهذه السطر القليلة و لكل خيصصار حالصصة استخدام خادصة و هي مشروحة بوضوح في كصتيب البرنامصصج و يمكصصن الطلع عليهصا مصن خلل
كتابة man avrdudeعلى سطر الوامر في لينكس . المقال السابق عن استخدام برنامج avrdudeمن سطر الوامر منقول من موقع عتاديات تحت رخصة المشاع البداعي CC-BY-SA-NC
285
.12المملحدقات اﻹاضافية … ..............................................................................................
مملحق :كيف تستخدم لوحات آردوينو لتعلم برمجة
AVR
تعصصد لوحصصات آردوينصصو Arduinoمصصن أرخصصص اللوحصصات التطويريصصة فصصي العصصالم حيصصث تبصصدأ أسصصعارها من 5دولر فحسب مثل لوحة .Arduino nanoومصا يميصز ه ذه اللوحصات أنهصا تعمصل بمتحكمصات AVRوبالتحديد عائلة ) Atmegaهناك لوحات آردوينو تعمل بعائلة ATTinyأيضاا(.
الحقيقة أن برنامج Arduino IDEماهو إل المترجم الشهير AVR-GCCالذي نستخدمه في هذا الكتصصاب+الواجهصصة الرسصصومية الخادصصصة ببرنامصصج Processingومضصصاف إليصصه العديصصد مصصن المكتبصصات
البرمجية من مشروع + Wiringبعض التعديلت البسيطة على برنامج .avrdudeوهذا يجعل برنامج آردوينو متوافق تماماا مع البرامج المكتوبة بلغة الص .ANSI – C
هناك أمر واحد يجب النتباه له عند التعامل مع لوحات آردوينو وهو "ترقيم اﻷطراف" ،حيصث
نجصصد أن مصصصممي لوحصصات آردوينصصو لصصديهم أسصصلوب مختلصصف لصصترقيم أطصصراف ممتحككمصصات Atmega
الموجصصودة علصصى اللوحصصات ول يتصصم اسصصتخدام أسصصماء البورتصصات مثصصل port A, port Bوإنمصصا يتصصم استخدام ترقيم بسيط مثل 0,1,2,3
على أي حال هذا المر ل يمثل مشكلة فكل ما عليك معرفته هو أسماء الطراف عنصد برمجتهصا. لنأخذ لوحة آردوينو Unoكمثال )باعتبارها أشهر لوحات آردوينو( .الصورة التالية تمثصصل ترقيصصم
أطراف الممتحككم ATmega328بكل من السلوب الدصلي )مثل ما هو مذكور فصصي دليصل البيانصصات +ترقيم آردوينو(.
286
.12المملحدقات اﻹاضافية … ..............................................................................................
كمصا نصرى فصي الصصورة السصابقة نجصد أن الصترقيم المكتصوب فصي المربعصات البرتقاليصة والحمصراء ه و
ترقم آردوينو بينما الترقيم المكتوب بالحروف الزرقاء هو الترقيم الدصلي للطراف ويعصصبر عصصن اسم البورت مثل D0تعني .port D pin 0 والن لنقم بكتابة برنامج Blinking Ledعلى طريقة الن ANSI – C ملحظة :تحتوي معظم لوحات آردوينو على دايود ضوئي متصل بالطرف رقم 13وهو في الحقيقة الطرف ) PB5البورت – Bالطرف الخامس(.
قصصم بفتصصح برنامصصج Arduino IDEوأكتصصب برنامصصج الصصص Blinking ledكمصصا هصصو مشصصروح فصصي المثصصال الول فصصي الفصصصل الثصصالث مصصن الكتصصاب .مصصع تغييصصر بسصصيطة وهصصو تعريصصف سصصرعة المعالصصج برقصصم 16
ميجا
#define F_CPU 16000000UL بعصصد النتهصصاء مصصن كتصصاب البرنامصصج قصصم بالضصصغط علصصى زر Uploadلتجصصد أن برنامصصج Arduinoقصصام 287
.12المملحدقات اﻹاضافية … .............................................................................................. بترجمة الملف وتحويله إلى Hex fileكما هو موضح بالصورة التالية
إذا لصصم تكصصن تفضصصل اسصصتخدام برنامصصج آردوينصصو فصصي كتابصصة الكصصود فيمكنصصك أن تسصصتخدم برنامصصج Atmel Studioمصصصصصع إضصصصصصافة الصصصصصدعم المباشصصصصصر للوحصصصصصات آردوينصصصصصو بسصصصصصهولة مصصصصصن خلل إضصصصصصافة
visualmicroوالتي تجعل برنامج Atmel studioيتعامل مع لوحات آردوينو مباشرة
http://www.visualmicro.com/page/Arduino-for-Atmel-Studio.aspx
288
.12المملحدقات اﻹاضافية … .............................................................................................. أيضصصصاا يمكنصصصك اسصصصتخدام ملفصصصات makefileفصصي ترجمصصة الكصصصواد البرمجيصصصة وتحويلهصصصا إلصصصى ملصصصف
هيكصس )راجصع ملحصصق شصرح (makefileثصم اسصتخدام برنامصصج ARVdudessلرفعهصا علصى لوحصات
آردوينو
أيضاا بامكانك استخدام لوحات آردوينو كمبرمجصصة Programmerلي ممتحككصصم AVRوذلصصك عصصبر برنامج ArduinoISP + AVRdudess
ملحظة :بامكانك أيضاا كتابة برامج بلغة السمبلي داخل برنامج
Arduino IDEو التجربة التالية تشرح برنامج Blinking Ledبلغة السمبلي https://ucexperiment.wordpress.com/2013/05/31/arduino-blink-using-gcc-inline/assembly
289
قائمة المراجع .............................................................................................. …
قائمة المراجع
مراجع تعليمية عربية
( وليد عيسى )أساسيات اللكترونيات من الصفر.دورة اللكترونيات العملية د https://www.youtube.com/playlist?list=PLww54WQ2wa5rOJ7FcXxi-CMNgmpybv7ei --------------------------------------------------Bascom بإستخدام لغةAVR دورة المهندس وليد بليد في شرح برمجة ممتحككمات https://www.youtube.com/playlist? list=PLww54WQ2wa5qWSTU7MYqjN0jHNaWuoXUk -------------------------------------------------- وتحتوي على العديد من الدورات العربية عن النظم المدمجة ويتضصصمنENG Unity قناة شركة Digital Circuits والتصميم الرقميAltium و برنامجAVR ذلك https://www.youtube.com/user/ENGUnity/playlists --------------------------------------------------قناة عربية تحتوي على دورات فيديو مبسطة عن النظم المدمجة وتتضمن C for Embedded System Micrcontroller Architectre https://www.youtube.com/channel/UCbZ7PLd5LAnje1hpyoiRW0A/playlists --------------------------------------------------CodeVision بإستخدام برنامجAVR دورة تعلم برمجة http://www.qariya.info/vb/showthread.php?t=81782 --------------------------------------------------موقع "عتادايات" يحتوي على مجموعة من المقالت المبسطة http://www.atadiat.com/%D8%A7%D9%84%D9%82%D8%B3%D9%85%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D9%8A/
290
قائمة المراجع .............................................................................................. …
مراجع تعليمية إنجليز ية
( العملق )يعد من أفضل المراجع في العالم للنظم المدمجةAVR مرجع AVR Microcontroller and Embedded Systems: Using Assembly and C (Pearson Custom Electronics Technology) - Muhammad Ali Mazidi http://www.amazon.com/AVR-Microcontroller-Embedded-SystemsElectronics/dp/0138003319 --------------------------------------------------من أفضل المراجع التي تعلمك "كيفية تحويل متطلبات العميل إلى أفضل تصميم برنامج علصصى
"النظم المدمجة
An Embedded Software Primer http://www.amazon.com/Embedded-Software-Primer-David-Simon/dp/020161569X -------------------------------------------------- وتعتصصبر مصصن أفضصصل الصصدورات المبسصصطة، درس مفصصصل55 فصصيAVR لتعلصصمNewBieHack دورة والممتعة https://www.youtube.com/playlist?list=PLE72E4CFE73BD1DE1 --------------------------------------------------FreeRTOS المرجع الرسمي لنظام Using the FreeRTOS Real Time Kernel - Standard Edition http://www.amazon.com/Using-FreeRTOS-Real-Time-Kernel/dp/1446169146/ ---------------------------------------------------
291