Smart Street Lighting Systems Using Solar Energy [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

‫فكرة املشروع ‪:‬‬ ‫تحسين فعالية وآلية عمل أنظمة الطاقة الشمسية المستخدمة إلنارة الشوارع من خالل اإلدارة األفضل‬ ‫لعملية اإلنارة ‪.‬‬

‫هدف املشروع ‪:‬‬ ‫• إطالة عمر البطاريات واأللواح الشمسية في حال األنظمة التي تركب بشكل منفصل‬ ‫(كل عامود يركب عليه لوح شمسي و بطاريات)‪.‬‬ ‫• توفير فرصة لالستفادة من الطاقة الفائضة وذلك في األنظمة التي تركب بشكل مجمع‬ ‫( بنك بطاريات و مجموعة ألواح تركب مجمعة في موقع واحد و يستخدم انفرتر و كابالت‬ ‫نقل لنقل القدرة لألعمدة ) مما سيساهم باسترداد قيمة المصروفات على المشروع بشكل أسرع‬ ‫و تأمين محطة توليد احتياطية تؤمن الكهرباء في حالة االنقطاعات الطويلة للمنشآت الحيوية‬ ‫حيث يمكن االستفادة من الطاقة الموفرة ليالا عن طريق استجرارها من األلواح صباح ا دون‬ ‫اإلضرار بالبطاريات ‪.‬‬ ‫• تحسين شروط اإلضاءة للمشاة و السيا ارت عند تضعيف اإلضاءة ليالا مما يمكن من تخفيض‬ ‫اإلضاءة في وقت مبكر ‪.‬‬ ‫• القيام بدراسة للكلفة اإلجمالية لمشروع عملي ينفذ على الطريق الواصل بين دوار تدمر و دوار‬ ‫السيد الرئيس و تحديد التجهيزات الالزمة و زمن استرداد الكلفة ‪.‬‬

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

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

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

‫‪ LED‬المستخدمة في اإلنارة باستخدام مفهوم‬

‫تعديل عرض النبضة حسب حركة السيارات على الطريق ‪ ,‬فعند خلو الشارع من السيارات والمشاة‬

‫يتم تشغيل مصباح ‪ LED‬باستطاعة أقل ‪ ،‬حيث يتم نشر حساسات في الشوارع و التي ممكن أن‬ ‫تكون حساسات أشعة تحت الحمراء ‪ IR‬أو حساسات حركة لتحسس حركة السيارات والمشاة في‬ ‫الشوارع‪ .‬فعند مرور إحدى السيارات يتم إضاءة مجموعة من األعمدة أمام السائق ولمسافة مناسبة‬ ‫له بحيث يستطيع القيادة بشكل مريح و آمن له و للمشاة ‪.‬‬ ‫تم تنفيذ النموذج الخاص بهذا المشروع باستخدام متحكم ‪ ATmega‬و حساسات من نوع ‪Reed‬‬ ‫‪ Switch‬المغناطيسية لكي يكون النموذج مناسبا للعرض و توضيح الفكرة و لكي ال يتأثر بحركة‬ ‫الحضور أو أي مصدر إضاءة خارجي ممكن أن يشكل مصد ار للتشويش أو الضجيج ‪.‬‬ ‫و تم تنفيذ التعديالت على دارة القيادة باستخدام ‪ Attiny13‬و حساس ‪ PIR‬و لغة أردوينو سي‬ ‫و موديول إرسال و استقبال ‪. ASK‬‬ ‫و تم تقديم دراسة مفصلة للطريق بين دوار تدمر و دوار السيد الرئيس من حيث عدد األعمدة‬ ‫و توزيعها و تفاصيل التجهيزات المستخدمة و تم تقديم تصميم لدارة التحكم مناسبة للتطبيق العملي‬ ‫من حيث الكفاءة و الكلفة ‪.‬‬ ‫آملين أن يكون هذا المشروع خطوة إلى األمام في مسيرة بالدنا إلى التقدم و التطور ‪.‬‬

‫الفهرس‬ ‫القسم النظري‬ ‫‪ .1‬المتحكمات الصغرية‬ ‫مقدمة إلى المتحكمات الصغرية ……………………………………………‪1 .….….‬‬ ‫مقدمة إلى متحكمات ‪2 ………….…………………………………………… AVR‬‬ ‫عائالت متحكمات ‪3 …..…….……………………………………………… AVR‬‬ ‫مقارنة بين أشهر عائالت المتحكمات ………………………………‪5 …..………….‬‬ ‫قراءة تكويد معالجات العائلة ‪6 ……..………………………………………… AVR‬‬ ‫نواة معالجات ‪8 ……………..……………………………………………… AVR‬‬ ‫وحدة الحساب والمنطق ‪9 ……………….…………………………………… ALU‬‬ ‫الذواكر في متحكمات ‪10 ………………….………………………………… AVR‬‬ ‫المميزات األساسية للمتحكم ‪12 ............................................. Atmega16‬‬ ‫البنية الخارجية للمتحكم ‪14 …….……………………………………… Atmega16‬‬ ‫بوابات الدخل والخرج في متحكمات ‪15 …….…………….…………………… AVR‬‬ ‫مسجالت بوابات الدخل والخرج في متحكمات ‪17 …….………………………… AVR‬‬ ‫طرق توصيل األحمال مع أقطاب المتحكم ………………………………………… ‪18‬‬ ‫حساب قيمة واستطاعة مقاومة تحديد التيار …………………………‪19 ……………..‬‬

‫مفاتيح التحكم الترانزستورية …………………………………‪21 …………………….‬‬ ‫استخدام مفاتيح التحكم الترانزستورية ثنائية القطبية ……………‪22 ……………………..‬‬

‫‪ .2‬مبادئ الربجمة بلغة ‪ C‬املدجمة (املضمنة) ‪Embedded C‬‬ ‫الهيكل الرئيسي للبرنامج ………………………………‪24 …..……………………..‬‬ ‫إعدادات الدخل والخرج الرقمي – المسجالت ……………‪25 ………..………………..‬‬ ‫مقاومات الرفع والخفض …………………………………‪28 ………………..……..‬‬ ‫العمليات الحسابية …………………………………………‪30 …………………….‬‬ ‫العمليات المنطقية …………………………………………‪30 …………………….‬‬ ‫عمليات اإلزاحة ………………………………………………………………… ‪32‬‬ ‫التحكم على مستوى البت ………………………………………………………… ‪33‬‬

‫‪ .3‬املقاطعة ‪Interrupt‬‬ ‫مقدمة عن المقاطعة …………………………………………‪35 ………………….‬‬ ‫كيف تعمل المقاطعة الخارجية …………………………………………………… ‪35‬‬ ‫خطوات تفعيل المقاطعة الخارجية ……………………………………‪37 …………..‬‬ ‫تشغيل المقاطعة ‪37 ………………………………………………………… INT0‬‬ ‫اإلشارات الرقمية ………………………………………………‪40 ……………….‬‬

‫‪ .4‬املبدل التشابهي الرقمي ‪ADC‬‬ ‫مقدمة عن المبدل التشابهي الرقمي ……………………………………………… ‪45‬‬ ‫طريقة عمل الـ ‪46 …………………….…………………………………… ADC‬‬ ‫تركيب الـ ‪ ADC‬داخل متحكمات ‪47 ………………………………… Atmega16‬‬ ‫المسجالت داخل الـ ‪48 …………………...……………………………… ADC‬‬ ‫خطوات تشغيل الـ ‪48 ……………………..……………………………… ADC‬‬ ‫قراءة جهد متغير باستخدام مقاومة متغيرة ……………………………………… ‪49‬‬ ‫تحويل القيمة الرقمية إلى فرق جهد ………………………‪56 …………………….‬‬ ‫حساسية القياس ……………………………………………………………… ‪57‬‬

‫‪ .5‬تعديل عرض النبضة ‪PWM‬‬ ‫توليد ‪58 …………………..…………………………………………… PWM‬‬ ‫ثابت الملئ ‪59 …………………………………………………… Duty Cycle‬‬ ‫أنماط عمل الـ ‪ PWM‬باستخدام المؤقتات في متحكمات ‪60 …….………… Atmega‬‬ ‫توليد إشارة ‪ PWM‬باستخدام ‪61 ……….…….………………………… Timer0‬‬ ‫المسجل ‪63 ……………….…………………………………………… OCR0‬‬ ‫مقاطعة المؤقتات ………………………………………………‪64 …………….‬‬

‫‪ .6‬احلساسات‬ ‫المقاومة الضوئية ‪65 ………………..…………………………………… LDR‬‬ ‫حساس ‪68 ……………………..………………………………………… PIR‬‬ ‫‪70 ……………….…………………………………………… Reed Switch‬‬

‫‪ .7‬تقنيات االتصال املمكن استخدامها لتحقيق الربط بني األعمدة‬ ‫تقنية الـ ‪72 …………..……………………………………………… ZigBee‬‬ ‫تقنية تعديل ‪74 ………….……………………………………………… ASK‬‬

‫قسم الطاقة الشمسية‬ ‫إنتاجية نظام شمسي ‪ 1‬كيلو وات ‪75 .................................................‬‬ ‫حجم النظام الشمسي إلضاءة الشوارع والممرات …………………‪77 ……………..‬‬ ‫موديل و مواصفات اللوح الشمسي …………………………………………… ‪82‬‬ ‫موديل و مواصفات منظم الشحن …………………………………‪83 ………….‬‬ ‫التصميم باستخدام أعمدة اإلنارة المدمجة ……………………………………… ‪85‬‬ ‫مكونات أعمدة اإلنارة الشمسية ………………………………‪86 ……………….‬‬ ‫أعمدة اإلنارة الشمسية المدمجة ……………………………………………… ‪91‬‬

‫مميزات وعيوب أعمدة اإلنارة الشمسية ……………………………‪92 …………..‬‬ ‫الحسابات المطبقة على الطريق المدروس من دوار تدمر إلى دوار السيد الرئيس ‪93 ....‬‬ ‫زوايا ميل األلواح الشمسية ………………………………………‪99 …………..‬‬ ‫توجيه األلواح الشمسية …………………………………………‪101 ………….‬‬ ‫حساب مساحة اللوح الشمسي ……………………………………………… ‪108‬‬ ‫تأثير الح اررة على األلواح الشمسية ……………………………………‪108 …….‬‬ ‫مقارنة بين إنتاجية هياكل تثبيت األلواح الشمسية ………………………‪109 …….‬‬ ‫توضيح بعض المصطلحات و الواحدات في علم قياس الضوئي ‪111 .................‬‬

‫القسم العملي‬ ‫متطلبات النظام ……………………………………………‪113 …….……….‬‬ ‫مقارنة بين النظام المستخدم حالي ا والنظام الجديد المدروس …………………‪117 ….‬‬ ‫جدوى اقتصادية وكشف تقديري للنظام الجديد …………………………‪118 ……..‬‬ ‫الدارة العملية للمشروع والتي سوف يتم إضافتها ألعمدة اإلنارة الجديدة ……‪119 …….‬‬ ‫دارة النموذج التوضيحي المنفذ …………………………………‪132 …….…….‬‬ ‫املراجع العلمية‪140 .......................................................................‬‬

‫المتحكمات الصغرية‬ ‫مقدمة إلى المتحكمات الصغرية ‪:‬‬ ‫تمتلك المتحكمات العديد من المميزات األس ـ ــاس ـ ــية و المميزات المحيطية الوظيفية وإن الهدف من‬ ‫هذا التنوع هو تقليل عدد العناصر الخارجية على الدارة المطبوعة وذلك بهدف ‪:‬‬ ‫• تخفيض استهالك الطاقة ‪.‬‬ ‫• تخفيض كلفة تطوير النظام من خالل تصغير زمن التصميم‪.‬‬ ‫• الحصول على أداء أعلى ‪.‬‬ ‫• الحصول على وثوقية أعلى‪.‬‬ ‫إض ـ ـ ــافة إلى المميزات األس ـ ـ ــاس ـ ـ ــية التي تش ـ ـ ــترك بها جميع المتحكمات المص ـ ـ ــغرة فإن العديد من‬ ‫المميزات ظهرت مؤخ ار وأدت لــدفع عجلــة المتحكمــات الصـ ـ ـ ـ ـ ـ ــغريــة لتكون بــديال عن اسـ ـ ـ ـ ـ ـ ــتخــدام‬ ‫المعالجات الصغرية في العديد من مشاريع األنظمة المدمجة‪.‬‬ ‫تمتلك معظم المتحكمات المصغرة الوحدات الرئيسية التالية ‪:‬‬ ‫• وحدة المعالجة المركزية ‪. CPU‬‬ ‫• ذاكرة برنامج ‪. ROM‬‬ ‫• ذاكرة معطيات دائمة ‪. EPROM‬‬ ‫• ذاكرة عشوائية ‪. RAM‬‬ ‫• أقطاب الدخل و الخرج ‪. I/O‬‬ ‫• وحدة التوقيت و العد ‪. T/C‬‬ ‫• وحدات االتصال التسلسلي ‪. UART , SPI , I2C‬‬ ‫• كما أن بعض المتحكمات تمتلك نوافذ اتصـال تسـلسـلي عالية السـرعة مثل ‪CAN,Ethernet‬‬ ‫‪. USB‬‬ ‫و يبين الجدول التالي بعض أوجه االختالف العامة بين خصائص المتحكمات الصغرية واألنظمة‬ ‫المدمجة بصورة عامة و الحواسيب الشخصية ‪:‬‬ ‫‪1‬‬

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

‫العالي و بالطاقة المنخفضة و احتوت قائمة التعليمات في متحكمات ‪ AVR‬على ‪ 132‬تعليمة‬ ‫ينفذ معظمها خالل دورة آلة واحدة وبالتالي عند وصل هزاز ‪ 16MHz‬إلى المتحكم فإنه سينفذ‬ ‫حوالي ‪ 16MIPS‬كما زودت المتحكمات بذاكرة قابلة للمسح و الكتابة ألكثر من ‪ 100000‬مرة‬ ‫و ضمنت الشركة أن يبقى البرنامج داخل المتحكم بشكل صحيح حتى ‪ 25‬سنة ‪ ,‬كما تملك‬ ‫متحكمات ‪ AVR‬وحدات محيطية مدمجة متعددة الوظائف األمر الذي يوفر استخدام دارات‬ ‫متكاملة خارجية ‪ ,‬كذلك زودت معظم متحكمات ‪AVR‬بمبدل رقمي تشابهي متعدد األقنية مدمج‬ ‫داخل المتحكم ‪ ,‬إضافة إلى إمكانية البرمجة دون فصله من النظام‬

‫‪In-System‬‬

‫‪ , Programming‬و كذلك تتوفر في األسواق بكميات كبيرة و سعر منخفض مقارنة مع مميزاتها‪.‬‬ ‫عائالت متحكمات ‪: AVR‬‬ ‫تنقسم عائالت متحكمات ‪ AVR‬ذات عرض ناقل ‪ 8-bit‬إلى أربع مجموعات أساسية إضافة‬ ‫إلى مجموعات أخرى ذات وظائف خاصة ‪ ,‬تمتلك جميعها نفس البنية و تختلف في المواصفات‬ ‫و الخصائص الموجودة في كل نوع ‪:‬‬ ‫* العائلة ‪ : AT90xxxx‬العائلة الكالسيكية الني كان منها االنطالقة األولى لمتحكمات ‪AVR‬‬ ‫في عام ‪ 1997‬و قد توقف تصنيعها ‪.‬‬ ‫* العائلة ‪ : ATinyxx‬و هي العائلة الصغرى لمتحكمات ‪ AVR‬المطورة والتي ظهرت في أوائل‬ ‫عام ‪ 2000‬و هي تمتلك عدد أقطاب قليل نسبيا و حجم ذاكرة برنامج صغير نسبي ا و موارد‬ ‫محدودة على الشريحة األمر الذي يجعل سعرها منخفض بالمقارنة مع متحكمات ‪. Atmega‬‬

‫‪3‬‬

‫* العائلة ‪ :ATmegaxxxx‬و هي العائلة الكبرى لمتحكمات ‪ AVR‬المطورة و التي ظهرت في‬ ‫أوائل العام ‪ 2000‬و هي تمتلك عدد أقطاب كبير و حجم ذاكرة برنامج كبير نسبيا وموارد متنوعة‬ ‫على الشريحة ‪.‬‬

‫* العائلة ‪ : ATxmegaxxxx‬و هي العائلة المتطورة و األحدث لمتحكمات ‪ AVR‬والتي ظهرت‬ ‫في عام ‪ 2008‬و هي تمتلك مميزات متنوعة و سعة معالجة كبيرة و تعمل بترددات أعلى من‬ ‫سابقاتها ‪ 32MHz‬كما أنها تمتلك عدد أقطاب كبير و حجم ذاكرة برنامج كبيرة إضافة إلى‬ ‫ميزات جديدة ال تتوفر في سابقاتها‪.‬‬

‫‪4‬‬

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

‫مقارنة بين أشهر عائالت المتحكمات ‪:‬‬ ‫يبين الجدول التالي مقارنة بين أشهر عائالت متحكمات ‪: 8-bit‬‬

‫من خالل الجدول نستنتج أفضلية متحكمات ‪ AVR‬لألسباب التالية‪:‬‬ ‫• متحكمات ‪ AVR‬أسرع من متحكمات ‪ PIC‬بأربع مرات و أسرع من متحكمات ‪ 8051‬بثمانية‬ ‫مرات ‪.‬‬ ‫• متحكمات ‪ AVR‬تمتلك ذاكرة برنامج ذات حجم أكبر من باقي العائالت مما يمكن من كتابة‬ ‫برامج ضخمة‪.‬‬ ‫‪5‬‬

‫• متحكمات ‪ AVR‬مبنية على تقنية ‪ Harvard‬التي تقوم على الفصل بين ذاكرة البيانات‬ ‫و ذاكرة التعليمات بحيث يكون لكل من الذاكرتين خطوط عنونة منفصلة و كذلك األمر بالنسبة‬ ‫لخطوط التحكم و ممر المعطيات ‪ ,‬األمر الذي يمكن من أن تحدث عملية قراءة التعليمات‬ ‫مع قراءة أو كتابة‬

‫البيانات‬

‫في نفس اللحظة بسبب عدم اشتراك البيانات‬

‫و التعليمات في نفس الذاكرة ‪ .‬بالمقارنة مع البنية فون‪-‬نيومان فإن هذه األخيرة منظمة بحيث‬ ‫ال يوجد فصل بين ذاكرة التعليمات و ذاكرة البيانات و لهما نفس خطوط العنونة‬ ‫و ممر المعطيات ‪ ,‬و بالتالي فإن الفائدتين اللتان تم ذكرهما سابقا ال توفرهما بنية فون‪-‬نيومان‬ ‫مما يجعل بنية هارفارد ذات أداء أعلى من حيث سرعة المعالجة و تنفيذ البرنامج‪.‬‬ ‫• متحكمات ‪ AVR‬تملك نواة من نوع ‪ RISC‬التي تمكن من إنجاز تعليمة خالل دورة هزاز‬ ‫واحدة بخالف تقنية ‪ CISC‬التي تحتاج عدة دورات هزاز لتنفيذ تعليمة واحدة ‪,‬كذلك فإن بنية‬ ‫‪ RISC‬أٌل كلفة من بنية ‪.CISC‬‬

‫قراءة تكويد معالجات العائلة ‪: AVR‬‬ ‫بشكل عام تزود الشرائح المتكاملة و العناصر اإللكترونية برقم أو تكويد خاص بكل صنف يمكننا‬ ‫معرفة الكثير عن الشريحة الخاصة بعائلة ‪ AVR‬من خالل التكويد الموجود على غالفها الخارجي‬ ‫‪ ،‬لنأخذ على سبيل المثال المتحكم المصغر ‪ ATmega8‬الموضح بالشكل ‪ ,‬نالحظ أن الغالف‬ ‫يحوي رمز الشركة الصانعة ‪ Atmel‬و رقم تصنيع تسلسلي ‪ 0619I‬خاص برقم الدفعة و بيئة‬ ‫عمل المعالج و من ثم تكويد المعالج و هو ‪: ATmega8-16PU‬‬

‫‪6‬‬

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

‫‪ C‬أو صناعيا ‪ I‬أو عسكريا ‪ M‬و االختالف في ذلك في قدرة‬

‫المتحكم على تحمل الح اررة و الضجيج العالي ‪:‬‬

‫بالنسبة للكود فهو على الشكل التالي‪:‬‬

‫من الجدير ذكره أن شركة ‪ Atmel‬قامت بدمج المعالج ذو الالحقة ‪( ATmegaxxxl_8xx‬يعمل‬ ‫عند جهد منخفض ‪ 2.7V‬و تردد منخفض ‪ ) 8MHz‬مع المعالج ‪( ATmegaxxx_16xx‬يعمل‬ ‫عند الجهد ‪ 4.5V‬و تردد ‪ ) 16MHz‬في معالج جديد متطور ‪ ATmegaxxxA-xx‬بجمع‬ ‫‪7‬‬

‫خصائص كال المعالجين هذا األخير يعمل عند جهود ‪ 2.5V-5.5V‬وتردد ‪ 1-16MHz‬و قد‬ ‫صدر عام ‪ 2010‬ليحل محل هذه االصدارات‪.‬‬ ‫يبين الشكل مقارنة بين الحاالت الثالث لتكويد المتحكم ‪: ATmega128‬‬ ‫‪ ATmega128L-8AU‬قديم لم يعد في طور التصنيع ‪.‬‬ ‫‪ ATmega128-16AU‬قديم لم يعد في طور التصنيع ‪.‬‬ ‫‪ ATmega128A-AU‬الجيل الجديد و هو موافق تماما لسابقيه‪.‬‬

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

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

‫‪8‬‬

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

‫‪9‬‬

‫الذواكر في متحكمات ‪: AVR‬‬ ‫تمتلك متحكمات ‪ AVR‬ثالث أنواع من الذواكر المدمجة على الشريحة و هي ‪:‬‬ ‫• ذاكرة البرنامج ‪.‬‬ ‫• ذاكرة البيانات ‪.‬‬ ‫• ذاكرة المعطيات ‪.‬‬

‫‪ .1‬ذاكرة البرنامج ‪:‬‬ ‫يملك المتحكم ‪ ATmega32a‬ذاكرة ومضية ‪ Flash‬مدمجة ذمن الشريحة بحجم ‪32KB‬‬ ‫مخصصة لتخزين البرنامج ‪ ,‬و بما أن جميع تعليمات ‪ AVR‬هي ذات شيفرة وحيدة وبطول كلمة‬ ‫واحدة ‪ 16bit‬أو كلمتين ‪ 32bit‬فقد تم تنظيم ذاكرة البرنامج لتشكل ‪ 16K*16‬كما تم تقسيمها‬ ‫لقسمين منفصلين قسم لإلقالع و قسم للتطبيق و ذلك بهدف الحماية من سرقة البرنامج ‪ ،‬تتميز‬ ‫ذاكرة البرنامج في متحكمات ‪ AVR‬بديمومة ‪ 10000‬دورة مسح – كتابة على األقل كما أنها قابلة‬ ‫إلعادة البرمجة في النظام دون الحاجة إلى نقل المتحكم لمبرمجة خاصة و هو ما يدعى ‪in‬‬ ‫‪ ، system programming‬كذلك يملك متحكم ‪ ATmega32a‬عداد ‪ pc‬بطول ‪16-bit‬‬ ‫و بذلك يستطيع عنونة كامل مجال الذاكرة الذي هو بطول ‪. 16KBx16bit‬‬

‫‪10‬‬

‫‪ .2‬ذاكرة البيانات ‪: SRAM‬‬ ‫و هي عبارة عن ذاكرة وصول عشوائي ‪ static random access memory‬مؤقتة يتم فيها‬ ‫إجراء العمليات على المتحوالت ‪,‬يملك المتحكم ‪ ATmega32A‬ذاكرة بيانات من النوع‬ ‫‪ SRAM‬بطول ‪. 2KB‬‬

‫‪ .3‬ذاكرة المعطيات ‪: EEPROM‬‬ ‫يملك المتحكم ‪ ATmega32A‬ذاكرة معطيات من النوع ‪ EEPROM‬بطول ‪ 1KB‬و هي منظمة‬ ‫بشكل مستقل لتخزين البيانات ‪ ,‬و يمكن القراءة أو الكتابة من أي بايت من بايتات هذه الذاكرة‬ ‫بشكل مستقل ‪ ,‬كما تسمح ديمومة الذاكرة ‪ EEPROM‬بأكثر من ‪ 100000‬عملية كتابة و مسح‪.‬‬

‫‪11‬‬

‫المميزات األساسية للمتحكم ‪( Atmega16‬المرجع ‪ DATA SHEET‬المتحكم) ‪:‬‬ ‫‪ .1‬أداء ٍ‬ ‫عال مع استهالك منخفض للطاقة ‪.‬‬ ‫‪ .2‬بنية ‪ RISC‬عالية األداء و التي تؤمن ‪:‬‬ ‫• تنفيذ واحدة من ‪ 131‬تعليمة خالل دورة ساعة واحدة ‪.‬‬ ‫•‬

‫‪ 32‬سجل عمل عام سعة ‪ 8‬بت ( وهي السجالت المستخدمة لتناقل البيانات آني ا أثناء تطبيق‬ ‫البرنامج ) ‪.‬‬

‫•‬

‫سرعة في تنفيذ التعليمات تصل إلى مليون تعليمة في الثانية في حال كان تردد العمل ‪1‬ميغا‬ ‫هرتز ( وتقبل تردد عمل حتى ‪ 8‬ميغا هرتز و ذلك باستخدام المهتز الداخلي ‪.)RC‬‬

‫‪ .3‬الذواكر غير المتطايرة ‪( Non Volatile‬ويقصد بها تلك الذواكر التي ال تفقد البيانات بانقطاع‬ ‫التيار)‪.‬‬ ‫• ذاكرة البرنامج بسعة ‪ 16‬كيلوبايت قابلة إلعادة البرمجة ‪ ,‬قابلة للمحو والكتابة لعدد من المرات‬ ‫يصل إلى ‪ 10000‬دورة ( محو ‪ /‬كتابة ) ‪.‬‬ ‫• ذاكرة ‪ EEPROM‬بسعة ‪ 512‬بايت ( ‪ 100000‬دورة محو ‪ /‬كتابة )‬ ‫•‬

‫ذاكرة ‪ SRAM‬داخلية بسعة ‪ 1‬كيلوبايت ‪.‬‬

‫‪ .4‬إمكانية إقفال برمجيا وذلك لحماية البرنامج المحمل على المتحكم ‪.‬‬ ‫‪ .5‬واجهة ‪ ( JTAG‬موافقة لمعايير ‪ ) IEEE std. 1149.1‬وهي الواجهة التي يمكن من خاللها‬ ‫التخاطب مع المتحكم أثناء عمله بشكل مباشر وتصحيح أعطاله بعمليات ‪ debug‬فورية وآلية‬ ‫وتتضمن ‪:‬‬ ‫• فحوصات كلية للبرنامج وعمليات مقارنة للنتائج وتصحيحها وفق ا للحاجة ‪.‬‬ ‫• إمكانية إعادة برمجة خارجية لذاكرة البرنامج وذاكرة ‪ EEPROM‬وبتات الحماية والقفل ‪.‬‬ ‫‪ .6‬ميزات الطرفيات ‪:‬‬ ‫• عدادان‪/‬مؤقتان ( ‪ ) Timer / Counter‬بسعة ‪ 8‬بت ‪.‬‬ ‫‪12‬‬

‫•‬

‫عداد‪/‬مؤقت بسعة ‪ 16‬بت ‪.‬‬

‫•‬

‫عداد زمن حقيقي مع مهتز خاص به ‪.‬‬

‫•‬

‫‪ 4‬قنوات ‪. PWM‬‬

‫•‬

‫‪ 8‬قنوات للمبدل التمثيلي الرقمي ‪. ADC‬‬

‫•‬

‫واجهة اتصاالت تسلسلية ‪ SPI‬للتخاطب مع متحكمات أخرى ‪.‬‬

‫•‬

‫واجهة اتصاالت تسلسلية ‪ USART‬للتخاطب مع الحاسوب ‪.‬‬

‫•‬

‫مؤقت مراقبة قابل للبرمجة مع مهتز خاص به متوضع على الرقاقة ‪.‬‬

‫•‬

‫مقارن تمثيلي ‪.‬‬

‫‪ .7‬ميزات خاصة بالمتحكم ‪:‬‬ ‫• قابلية إلعادة الضبط ‪ Reset‬أثناء وقت التشغيل وأنماط حماية للعمل قابلة للبرمجة ‪.‬‬ ‫• هزاز ( مقاومة – مكثفة ) داخلي معاير ‪.‬‬ ‫• مصادر مقاطعة داخلية وخارجية ‪.‬‬ ‫• ستة أنماط لحفظ الطاقة ‪.‬‬ ‫‪ .8‬بوابات الدخل ‪ /‬الخرج والحزم ‪:‬‬ ‫• ‪ 32‬خط ( ‪ 4*8‬بوابات ) دخل ‪ /‬خرج قابل للبرمجة ‪.‬‬ ‫• ‪ 40‬رجالا ‪ PIN‬موزعة في بنية من النمط ‪. PDIP‬‬ ‫‪ .9‬جهد التغذية ‪:‬‬ ‫• ‪ 5.5 – 2.7‬للنوع ‪. Atmega16L‬‬ ‫• ‪ 5.5 – 4.5‬للنوع ‪. Atmega16‬‬ ‫‪ .10‬تردد العمل ‪:‬‬ ‫• ‪ 8 – 0‬ميغا هرتز للنوع ‪.Atmega16L‬‬ ‫• ‪ 16 – 0‬ميغا هرتز للنوع ‪. Atmega16‬‬

‫‪13‬‬

‫‪ .11‬استهالك الطاقة عند تردد العمل ‪ 1‬ميغا هرتز و الجهد ‪ 3‬فولت للنوع ‪: Atmega16L‬‬ ‫• في حالة العمل ‪ 1.1 :‬ميلي أمبير ‪.‬‬ ‫• في نمط السبات ‪ 0.35 :‬ميلي أمبير ‪.‬‬ ‫• في نمط حفظ الطاقة ‪ :‬أقل من ‪ 1‬ميكرو أمبير ‪.‬‬

‫البنية الخارجية للمتحكم ‪: Atmega16‬‬ ‫يمتلك المتحكم ‪ 40 Atmega16‬رجالا مرقمة و قد وضعت عليها المسميات ‪ ،‬أما ما بين قوسين‬ ‫فهي الوظيفة األخرى‪ ،‬ويدل نصف الدائرة المفرغ على الجهة األمامية للمتحكم وهو ظاهر على‬ ‫الصورة ‪ ،‬أما توزيع االطراف فهو كالتالي ‪:‬‬ ‫• البوابة ‪ :Port A‬تتألف من األرجل (‪. )PA0….PA7‬‬ ‫• البوابة ‪ :Port B‬تتألف من األرجل (‪. )PB0….PB7‬‬ ‫• البوابة ‪ :Port C‬تتألف من األرجل (‪. )PC0….PC7‬‬ ‫• البوابة ‪ :Port D‬تتألف من األرجل (‪. )PD0….PD7‬‬ ‫• ‪ : RESET‬مدخل إعادة التشغيل ‪.‬‬ ‫• ‪ : VCC‬مدخل التغذية ( ‪ ) 5.5 – 4.5‬فولت من أجل ‪ Atmega16‬و ( ‪) 5.5 – 2.7‬‬ ‫فولت من أجل ‪Atmega16l‬‬ ‫• ‪ : GND‬األرضي ‪.‬‬ ‫• ‪ : XTAL1‬مدخل الكريستالة الخارجية ‪.‬‬ ‫• ‪ : XTAL2‬خرج الكريستالة الخارجية‪.‬‬

‫‪14‬‬

‫بوابات الدخل و الخرج في متحكمات ‪: (GPIOs in AVR MCUs) AVR‬‬ ‫تتمتع جميع أقطاب بوابات متحكمات العائلة ‪ AVR‬بأنها أقطاب ثنائية االتجاه وظائف قراءة وكتابة‬ ‫وتعديل عند استخدامها كأقطاب دخل‪/‬خرج لألغراض العامة (‪ , )GPIOs‬كمت يمكن تغيير اتجاه‬ ‫أحد أقطاب بوابة بشكل منفصل – خالفا لمتحكمات ‪ - 8051‬فيمكن تعريف كل قطب من‬ ‫األقطاب على حدى كقطب دخل أو خرج ‪ .‬كذلك تمتلك األقطاب عند تعريفها كأقطاب دخل‬ ‫مقاومات رفع داخلية – إلى التغذية ‪ -‬يمكن تفعيلها أو إلغاء تفعيلها لكل قطب بشكل منفصل ‪.‬‬ ‫إن بنية األقطاب هي من النوع ‪ push-pull‬أي أنها قادرة على قيادة الخرج على المستوى المنطقي‬ ‫"‪ "0‬والمستوى "‪ "1‬حيث أن التيار الذي يمكن أن يزوده القطب قادر على قيادة ثنائي ضوئي‬ ‫(‪ )LED‬بشكل مباشر دون الحاجة إلى دارة مفتاح ترانزستوري ‪ .‬كما أن جميع األقطاب مزودة‬ ‫بدارة حماية من تفريغ الشحنات الستاتيكية (‪ )ESD‬مؤلفة من ثنائيين شوتكي أحدهما موصل إلى‬ ‫التغذية ( للحماية من شحنات التفريغ الموجبة ) واآلخر موصل إلى النقطة األرضية ( للحماية من‬ ‫شحنات التفريغ السالبة ) كما هو مبين في الشكل التالي ‪:‬‬

‫‪15‬‬

‫يتم تصنيف أقطاب الدخل‪/‬الخرج العامة (‪ )GPIOs‬في مجموعات تسمى بوابات ‪ ports‬كل بوابة‬ ‫تتألف من ثمانية أقطاب ‪ Pins‬ويختلف عدد البوابات باختالف عدد أقطاب المتحكم حيث يمكن‬ ‫أن يصل عدد البوابات في المتحكمات ‪ AVR‬المتقدمة إلى أحد عشر بوابة ويشار إليها باألحرف‬ ‫‪. PORT A,B,C,D,E,F,G,H,J,K,L‬‬

‫‪16‬‬

‫مسجالت بوابات الدخل والخرج في متحكمات ‪)AVR MCUs GPIO Registers ( AVR‬‬ ‫تمتلك كل بوابة من بوابات المتحكم ثالث مسجالت تحكم ‪ ,‬حيث يمثل الرمز ‪ X‬رمز البوابة‬ ‫(‪ )A,B,C,C,D,E,F,G,H,K,L‬والرمز ‪ y‬قطب البوابة (‪. )0:7‬‬ ‫‪ -1‬مسجل التحكم باتجاه المعطيات للبوابة ‪: )Data Direction Register( DDRx‬‬ ‫يتم من خالله تحديد وظيفة كل قطب – دخل أو خرج ‪ .‬تمثل كل خانة من خانات مسجل‬ ‫اتجاه المعطيات الثمانية قطباُ من أقطاب البوابة الموافقة ( المسجالت أدناه هي للبوابة ‪) A‬‬ ‫حيث أنه عند وضع القيمة "‪ "1‬في خانة المسجل ‪ DDRx.y‬فإن القطب الموافق لهذه الخانة‬ ‫يصبح قطب خرج ‪ ,‬أما عند وضع القيمة "‪ "0‬في خانة المسجل ‪ DDRx.y‬فإن القطب الموافق‬ ‫لهذه الخانة يصبح قطب دخل ‪.‬‬

‫‪ -2‬مسجل الخرج للمعطيات ‪ :)Data Output Register( PORTx‬يوجد له وظيفتان ‪:‬‬ ‫• في حال كان القطب معرف ا في مسجل ‪ DDRx‬كقطب خرج ("‪ ,)DDRx.y="1‬فإن مسجل‬ ‫خرج المعطيات سيحدد الحالة المنطقية المطبقة على القطب بحيث إما أن يكون منبع للتيار‬ ‫("‪ ,)"1‬أو مصرف للتيار("‪.)"0‬‬ ‫• في حال كان القطب معرف ا في مسجل ‪ DDRx‬كقطب دخل ("‪ ,)DDRx.y="0‬فإن مسجل‬ ‫خرج المعطيات سيتحكم بوصل ("‪ )"1‬أو فصل ("‪ )"0‬مقاومة الرفع الداخلية للقطب المعني ‪.‬‬

‫‪ -3‬مسجل الدخل للمعطيات ‪ : )Data Input Register( PINx‬يستخدم لقراءة الحالة‬ ‫الخارجية المطبقة على القطب المعني ("‪ )"1"/ "0‬عند تعريف القطب في مسجل اتجاه‬ ‫المعطيات كقطب دخل ( "‪) DDRx.y ="0‬‬ ‫‪17‬‬

‫طرق توصيل األحمال مع أقطاب المتحكم (‪:)Interfacing Loads with MCU‬‬ ‫إن بنية األقطاب في متحكمات ‪ AVR‬ومتحكمات ‪ PIC‬هي من النوع ‪ , Push-Pull‬أي أنها‬ ‫قادرة على قيادة الخرج على المستوى المنطقي "‪ "0‬والمستوى "‪ "1‬حيث أن التيار الذي يمكن أن‬ ‫يزوده القطب قادر على قيادة ثنائي ضوئي ‪ LED‬بشكل مباشر دون الحاجة إلى دارة مفتاح‬ ‫ترانزستوري ‪ ،‬وبالتالي يمكن وصل األحمال مع أقطاب المتحكم بطريقتين ‪:‬‬ ‫ القطب يعمل كمنبع لتيار تشغيل الحمل ‪ source‬الشكل (‪. )A‬‬‫ القطب يعمل كمصرف لتيار تشغيل الحمل ‪ SINK‬الشكل (‪. )B‬‬‫في الحالة األولى – القطب يعمل كمنبع لتيار تشغيل الحمل – يتم تزويد التغذية للحمل عن طريق‬ ‫التغذية الداخلية للمتحكم والتصريف يكون من خالل النقطة األرضية مباشرة أما في الحالة الثانية‬ ‫– القطب يعمل كمصرف لتيار تشغيل الحمل – فإنه يتم تزويد التغذية للحمل مباشرة من التغذية‬ ‫الرئيسية ويتم التصريف من خالل المتحكم والنقطة األرضية له ‪ .‬في كال الحالتين سيكون األداء‬ ‫للمتحكم واحدا إال أنه يوصى عادة بالطريقة الثانية وذلك لتخفيض ضجيج التغذية ‪ VCC‬داخل‬ ‫المتحكم ‪ ,‬كما توزع مسارات النقطة األرضية ‪ GND‬داخل المتحكم أكبر وبالتالي التصريف سيكون‬ ‫موثوقا ومناعته للضجيج أكبر ‪.‬‬

‫‪18‬‬

‫إن مبدأ سير التيار في الحالة األولى (المسار باللون األحمر على اليسار) والثانية‬ ‫( المسار باللون األخضر على اليمين ) داخل البنية الداخلية ألقطاب المتحكم مبين على الشكل‪:‬‬

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

‫‪19‬‬

‫‪ : IF max‬التيار األعظمي المار في الثنائي‪.‬‬ ‫‪ : VF typ‬الجهد األمامي النموذجي من أجل تشغيل الثنائي ‪.‬‬ ‫‪ : VF max‬الجهد األمامي األعظمي الني يمكن للثنائي أن يتحمله ‪.‬‬ ‫‪ : VR max‬الجهد العكسي األعظمي الني يمكن للثنائي أن يتحمله ‪.‬‬ ‫‪ : Luminous intensity‬شدة السطوع للثنائي ‪.‬‬ ‫‪ : Viewing angle‬زاوية انعكاس الرؤية لإلضاءة ‪.‬‬ ‫‪ : Wavelength‬طول موجة الضوء الصادر ‪.‬‬ ‫وبالتالي من أجل ثنائي ضوئي ذو لون أحمر فإن جهد وتيار العمل ‪ 2V/20m A‬وبالتالي يمكن‬ ‫حساب مقاومة تحديد التيار من العالقة ‪:‬‬

‫وبالتالي فإن الذي نحتاجه هو مقاومة ‪ Ω150‬ذات استطاعة ‪. 1/4 Watt‬‬

‫‪20‬‬

‫مفاتيح التحكم الترانزستورية (‪: )Transistors as Control Switches‬‬ ‫من أجل التحكم بأحمال ذات تيارات كبيرة ( محركات ‪ ,‬ريليه ‪ ,‬سخانات ) فإن تيار الخرج لقطب‬ ‫المتحكم ‪ 20m A‬ال يمكنه قيادة هذه األحمال ‪ ,‬لذا يتم استخدام الترانزستورات كمفاتيح إلكترونية‬ ‫() للتحكم بهذه األحمال ‪ .‬بشكل عام يوجد نوعين من الترانزستورات‪:‬‬ ‫ الترانزستورات ثنائية القطبية ‪. BJT‬‬‫ الترانزستورات أحادية القطبية ‪. FET‬‬‫عملياُ إن االستخدام لكل منها يختلف بحسب طبيعة الحمل المقاد ‪ ,‬الجدول التالي يبين الفرق يبين‬ ‫النوعين ‪:‬‬

‫يتم استخدام الترانزستورات ثنائية القطبية من أجل التحكم باألحمال ذات التيارات الصغيرة ‪ .‬بينما‬ ‫الترانزستورات الحلقية من أجل التحكم بأحمال ذات تيارات وجهود متوسطة وكبيرة ‪.‬‬ ‫إن مجال استخدام الترانزستورات في أنظمة التحكم الرقمي يقتصر على استخدام هذه الترانزستورات‬ ‫كمفاتيح إلكترونية تحكمية (‪ )on/off‬يعمل في منطقتي القطع واإلشباع ‪ ,‬وبالتالي فإن اختيار‬ ‫الت ارنزستور نسبة إلى الحمل سيعتمد على ثالث عوامل أساسية ‪:‬‬ ‫ التيار المار في الترانزستور ‪.‬‬‫ االستطاعة المبددة في الترانزستور‪.‬‬‫ سرعة الفتح واإلغالق للترانزستور ‪.‬‬‫‪21‬‬

‫في حالة القطع (‪ : )offset‬يكون تيار القاعدة ‪. IB=0‬‬ ‫في الحالة الفعالة (‪ : )On active state‬يكون فيها تيار المجمع ‪ Ic=IB*h FE‬وهي الحالة‬ ‫التي يستخدم فيها الترانزستور كمضخم فغال – أي زيادة في تيار القاعدة ينتج عنها زيادة في تيار‬ ‫المجمع‪.‬‬ ‫في حالة اإلشباع (‪ : )On saturate state‬في هذه الحالة يمرر الترانزستور كامل التيار ‪.‬‬

‫استخدام مفاتيح التحكم الترانزستورية ثنائية القطبية ‪:‬‬ ‫يمكن توصيل المفاتيح الترانزستورية بطريقتين ‪:‬‬ ‫‪ -1‬متحكم بها لتكون فعالة عند المنطق العالي "‪ "1‬وبالتالي فإن الترانزستور سوف يعمل كمفتاح‬ ‫لوصل‪ /‬فصل النقطة األرضية ‪ GND‬وفي هذه الحالة سوف يستخدم الترانزستور من نوع‬ ‫‪ NPN‬الشكل ‪. A‬‬ ‫‪ -2‬متحكم بها لتكون فعالة عند المنطق المنخفض"‪ "0‬وبالتالي فإن الترانزستور سوف يعمل‬ ‫كمفتاح لوصل‪ /‬فصل نقطة التغذية ‪ VCC‬وفي هذه الحالة سوف يستخدم الترانزستور من‬ ‫نوع ‪ PNP‬الشكل ‪. B‬‬

‫‪22‬‬

‫‪ -3‬في بعض األحيان يحصل خطأ في تصميم دارة المفتاح اإللكتروني باستخدام الترانزستور‬ ‫ثنائي القطبية وهو من خالل استخدام الترانزستورات من نوع ‪ NPN‬كمفتاح لوصل‪/‬فصل‬ ‫نقطة التغذية ‪ VCC‬للحمل كما في الشكل ‪. C‬‬ ‫أو استخدام الترانزستور من نوع ‪ PNP‬كمفتاح لوصل‪/‬فصل النقطة األرضية ‪ GND‬للحمل‬ ‫كما في الشكل ‪. D‬‬

‫‪23‬‬

‫مبادئ البرمجة بلغة ‪ C‬المدمجة (المضمنة) ‪Embedded C‬‬ ‫لماذا نستخدم لغة ‪ ANSI-C‬بدال من اللغات و معايير البرمجة األخرى مثل ‪Bascom‬‬ ‫و ‪ Flow Code‬بالرغم من أن هذه الطرق قد تكون أسهل في البرمجة ؟‬ ‫لكي نفهم اإلجابة علينا أوال أن نتعرف على كلمة ‪ ANSI‬و التي تعني " المعهد الوطني األمريكي‬ ‫للمعايير" ‪ ،‬هذا المعهد قام بوضع معيار موحد للغة السي و ذلك حتى تصبح البرامج المكتوبة بها‬ ‫صالحة و قابلة للتطبيق على منصات مختلفة (حتى وإن تطلبت تعديالت بسيطة ) فمثال يمكنك‬ ‫كتابة نفس البرنامج بلغة ال ‪ C‬على نظام ويندوز و من ثم تقوم بعمل ترجمة له دون تعديل ليعمل‬ ‫على نظام لينوكس أو العكس و باستخدام نفس المترجم ‪. Compiler‬‬ ‫إن تعلم لغة السي المعيارية و التدرب على تقنيات كتابة األكواد يمكن من التعامل مع أنواع كثيرة‬ ‫من المتحكمات الدقيقة ‪,‬فمثال يمكن قراءة البرامج المكتوبة لمتحكمات ‪ ARM‬بدون مجهود كبير‬ ‫و قد تتواجد العديد من األوامر المتشابهة في الكثير من الحاالت (باختالف أسماء المسجالت )‪.‬‬ ‫حيث أن برمجة أي نوع آخر من المتحكمات تصبح عملية سهلة طالما أن المترجم يدعم لغة ‪C‬‬ ‫المعيارية ‪.‬‬ ‫الهيكل الرئيسي للبرنامج‪:‬‬ ‫عادة ما تنقسم البرامج البسيطة للمتحكمات إلى ‪ 3‬أجزاء رئيسية هي ‪:‬‬ ‫• استدعاء المكتبات و تعريف الثوابت‪.‬‬ ‫• الدالة الرئيسية للبرنامج‪.‬‬ ‫• الدوال اإلضافية إن وجدت‪.‬‬ ‫هيكل البرنامج ‪:‬‬ ‫يتم في البداية استدعاء المكتبات كما في األمثلة التالية‪:‬‬

‫‪24‬‬

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

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

‫إعدادات الدخل و الخرج الرقمي ‪:‬‬ ‫تمتلك متحكمات ‪ 3 AVR‬مسجالت أساسية للتحكم في أي بورت و التي يتم ضبطها في الدالة‬ ‫الرئيسية ‪.‬‬ ‫و أشهر هذه المسجالت هي ‪:‬‬

‫‪25‬‬

‫المسجل ‪: DDRx register‬‬ ‫‪ DDRx‬هو مسجل ‪ 8‬بت يتحكم في اتجاه البيانات و يعتبر المسؤول عن التحكم في أطراف أي‬ ‫بورت لتعمل إما كدخل أو خرج ‪ input‬أو خرج ‪ . output‬الحرف ‪ x‬في نهاية اسم المسجل يعبر‬ ‫عن أحد الرموز ‪ A,B,C,D‬و هي أسماء البورتات ‪ .‬فمثال ‪ DDRC‬هو مسجل اتجاه بيانات‬ ‫البورت ‪ c‬و المسجل ‪ DDRA‬هو الخاص بالبورت ‪ .... A‬كل بت من هذا المسجل يتحكم في‬ ‫أحد األطراف الخاصة بالبورت حيث يعبر الرقم ‪ 1‬عن أن الطرف يعمل مخرج أما الرقم ‪ 0‬يعبر‬ ‫عن أن الطرف يعمل كمدخل‪.‬‬ ‫و كما نرى في الجدول التالي الخاص بالمسجل ‪ DDRA‬صفحة ‪ 66‬من دليل بيانات‬ ‫‪ ATmega16‬نجد أنه يتكون من ‪ 8‬بت بدءا من البت رقم ‪ 0‬حتى ‪: 7‬‬

‫يتم التحكم في هذه البتات عبر وضع القيمة المطلوبة بها مباشرة مثل أن نكتب األمر ‪:‬‬ ‫و هذا يعني أن نضع القيمة ‪ 00000001‬داخل المسجل ‪ DDRA‬و التي تعني أن البت األولى‬ ‫فقط واحد و الباقي أصفار مما يعني أن ‪ PA0‬يعمل كخرج بينما يعمل الباقي كدخل كما في‬ ‫الصورة اآلتية‪:‬‬

‫‪26‬‬

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

‫يصبح لدينا‪:‬‬

‫و الحالة االبتدائية ‪ initial‬هي أن تعمل جميع البورتات كدخل ‪.‬‬ ‫المسجل ‪: PORTX register‬‬ ‫يتحكم المسجل ‪ PORTX‬في الخرج الرقمي ألي طرف ‪ .‬و الصورة التالية تمثل المسجل‬ ‫‪ PORTA‬في دليل البيانات ‪:‬‬

‫مثال‪:‬‬

‫‪27‬‬

‫يقوم هذا البرنامج بإخراج ‪ 1‬منطقي على الرجل ‪ PB0‬لمدة ثانية واحدة ثم يقوم بإخراج ‪ 0‬منطقي‬ ‫على نفس الرجل لمدة ثانية واحدة و ذلك ضمن حلقة النهائية ‪.‬‬ ‫المسجل ‪: PINX register‬‬ ‫يقوم المتحكم الدقيق بقراءة محتويات جميع األطراف بصورة تلقائية و يخزنها في المسجل ‪PINX‬‬ ‫فمثال المسجل ‪ PINB‬يقوم بتسجيل قيمة الجهد على جميع أطراف البورت ‪ B‬بصورة مستمرة و‬ ‫يتم تحديث هذا المسجل بنفس سرعة عمل المتحكم فمثال إذا كان المتحكم الدقيق يعمل بسرعة ‪1‬‬ ‫ميجا هرتز فهذا يعني أن المسجل ‪ PINB‬يتم تحديثه مليون مرة في الثانية و في كل مرة يقوم‬ ‫بقراءة جميع أطراف البورت ‪. B‬‬ ‫يحتوي المسجل ‪ PINX‬على ‪ 8‬بتات و كل بت تمثل قراءة الجهد على أحد أطراف البورت فمثال‬ ‫المسجل ‪ PINB‬نجد أنه يتكون من البتات التالية ‪:‬‬

‫البت رقم صفر يمثل قراءة الجهد على الطرف ‪ PB0‬و البت رقم ‪ 1‬يمثل قراءة الجهد على الطرف‬ ‫‪ PB1‬و هكذا‪....‬‬ ‫المسجالت ‪ PINX‬من النوع ‪ read only‬مما يعني أنه يمكن أن نق أر منها فقط و ال يمكن أن نقوم‬ ‫بتغيير محتواها و يتم تحديث محتوى المسجالت بشكل تلقائي‪.‬‬

‫مقاومات الرفع و الخفض ‪: pull up and pull down resistors‬‬ ‫من أشهر الكلمات في عالم اإللكترونيات الرقمية كلمة المقاومة الرافعة أو الخافضة للجهد و هذه‬ ‫المقاومات التي تتراوح قيمتها بين ‪ 2.2‬و ‪ 10‬كيلو أوم تستخدم بصورة أساسية في دخل األنظمة‬ ‫انتهاء بالمتحكمات الدقيقة ‪،‬‬ ‫الرقمية ‪ digital inputs‬بداية من البوابات المنطقية البسيطة و‬ ‫ا‬ ‫استخداماتها هي ‪:‬‬ ‫‪28‬‬

‫‪ .1‬إلغاء الدخل العائم ‪:‬‬ ‫حيث جميع اإللكترونيات الرقمية التي تتعامل بالصفر والواحد تعاني من مشكاة خطيرة جدا تسمى‬ ‫المنطقة العائمة ‪ floating area‬أو ‪ noise margin‬هذه المنطقة هي فارق الجهد بين الصفر‬ ‫و الواحد المنطقي و تستخدم مقاومات ‪ pull-up‬أو ‪ pull down‬لحل هذه المشكلة‪.‬‬

‫‪ .2‬عكس الجهد الداخل ‪:‬‬ ‫في بعض الحاالت يكون مطلوب عكس الجهد الداخل من المفتاح مثال ‪:‬‬ ‫في حال استخدام المقاومة ‪: pull-up‬‬

‫وفي حال استخدام مقاومة ‪: pull-down‬‬

‫كما هو موضح باألشكال التالية ‪:‬‬

‫‪29‬‬

‫‪ .3‬محول جهد إلى تيار‪:‬‬ ‫بعض الحساسات الشهيرة مثل الميكروفون أو المقاومة الضوئية ‪ LDR‬أو الح اررية ‪ NTC‬تقوم‬ ‫بتحويل الح اررة والضوء إلى تغير في التيار الكهربائي و ليس إلى جهد مما يمثل مشكلة في فهم‬ ‫هذه الحساسات ‪.‬‬ ‫حيث نجد أن جميع المتحكمات الدقيقة التي تحتوي على ‪ ADC‬يمكنها قراءة تغير الجهد وال‬ ‫تستطيع التعرف على التيار الكهربائي المتغير لذلك يتم استخدام مقاومة ‪pull-down or pull-‬‬ ‫‪ up‬لتحويل التيار المتغير إلى جهد ‪.‬‬ ‫من الممكن استخدام خاصية ال ‪ internal pull-up‬من خالل جعل الرجل تعمل كمدخل‬ ‫و كتابة واحد منطقي في المسجل ‪ PORTX‬للرجل الموافقة‪.‬‬

‫العمليات الحسابية ‪:‬‬ ‫تماثل العمليات الحسابية في لغة ‪ c‬التقليدية‪:‬‬

‫العمليات المنطقية ‪:‬‬ ‫هي مجموعة من األوامر التي تساعدنا على القيام ببعض التحكم المتقدم سواء على المتغيرات أو‬ ‫إعدادات المتحكم أو أطراف المتحكم ( الدخل و الخرج ) ‪.‬‬ ‫‪30‬‬

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

‫أمثلة ‪:‬‬ ‫استخدام ‪: NOT‬‬

‫استخدام ‪: OR‬‬

‫‪31‬‬

‫استخدام التعليمة ‪: AND‬‬

‫مالحظة ‪ :‬في المثال السابق تم استخدام الصيغة المختصرة للتعليمة حيث القيمة االبتدائية‬ ‫لـ ‪ xNumber‬هي‪. xNumber=0b01110011 :‬‬

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

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

‫‪32‬‬

‫ليكن لدينا العدد ‪ 0b01100000‬و لنقم بتطبيق عملية اإلزاحة نحو اليمين ‪.‬‬

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

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

‫كتابة ‪ 1‬داخل أي بت ‪: Set Bit‬‬ ‫تعرف الصيغة البرمجية ‪ set bit‬بأنها وضع ‪ 1‬داخل قيمة أي بت ‪ .‬بفرض أننا نريد أن‬ ‫نضبط الطرف ‪ PA0‬ليعمل كخرج بغض النظر عن باقي أطراف البورت ‪ A‬و يمكن ذلك عن‬ ‫طريق دمج األمر ‪ or‬مع ‪ left shift‬و تكون الصيغة العامة‪:‬‬

‫‪33‬‬

‫يتم استبدال الكلمة ‪ register‬بالمسجل المطلوب و يتم استبدال كلمة ‪ bitName‬باسم البت‬ ‫المطلوب تغيير قيمته ‪.‬‬ ‫مثال ‪ ( : 1‬تطبيق هذه الصيغة على المسجل ‪ DDRA‬والطرف ‪) PA0‬‬

‫مثال ‪ ( : 2‬وضع ‪ set‬البتين ‪ PA1,PA2‬بأمر مختصر واحد )‬

‫كتابة صفر داخل أي بت ‪: Reset Bit‬‬ ‫عملية ال ‪ Reset Bit‬هي عكس عملية ال ‪ Set Bit‬وتعني وضع صفر داخل البت‬ ‫المطلوب وتتم عبر دمج ‪ 3‬أوامر ‪ AND – Left Shift – Invert‬و الشكل العام لها ‪:‬‬

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

‫تعد مجموعة الصيغ البرمجية السابقة من أهم األوامر التي تستخدم في برمجة النظم المدمجة‬ ‫خاص اة أنها مكتوبة بلغة الـ ‪ C‬المعيارية مما يجعلها طريقة " معيارية " لعمل ‪ set‬أو ‪ reset‬ألي‬ ‫بت مهما اختلف المتحكم الدقيق أو الشركة المنتجة ( طالما أن المترجم الخاص بهذا المتحكم يدعم‬ ‫لغة الـ ‪ C‬المعيارية ‪.‬‬

‫‪34‬‬

‫المقاطعة ‪Interrupt‬‬

‫مقدمة عن المقاطعة ‪: The interrupt‬‬ ‫في الكثير من األنظمة المدمجة نجـد بعض الوظائف التي تتطلب استجابة فائقة السرعة لحدث‬ ‫معين ‪ ،‬لذا تمت مراعاة هذا األمر في معظم المعالجات والمتحكمات الدقيقة (حتى القديمة منها)‬ ‫حيـث تم إضافة تقنية المقاطعة ‪ interrupt‬وهي عبارة عن طرف دخل ‪ input pin‬أو حدث‬ ‫برمجي يتسبب في جعل المعالج يتوقف عن ما يفعله اآلن ويستجيب للحدث المسبب للمقاطعة‬ ‫ويعالجه بسرعة ثم يعود مرة أخرى لما كان يفعله‪ .‬مثالا نجد أن النظام المدمج داخل وحدة تحكم‬ ‫السيارة يعمل على إدارة الوقود وعرض سرعة الحركة ومع ذلك في حالة حدوث اصطدام بجسم ما‬ ‫نجد أن النظام يستجيب بسرعة عالية ( بالرغم أنه كان مشغول بمعالجة الوقود والسرعة )‪ .‬تحدث‬ ‫هـذه االستجابة فائقة السرعة بسبب أن الحساسات المسؤولة عـن االصـطدام يتم توصيلها على‬ ‫أطراف دخل المقاطعة وتسمى هذه األطراف ‪. External interrupts‬‬ ‫الحقيقة أنه هناك أنواع كثير للمقاطعة ( بعضها داخلي وبعضها خارجي ) سنتحدث في هذا الفصل‬ ‫عن النوع الخارجي فقط ‪ External interrupt‬وسيتم شرح بعض األنواع األخرى على مدار‬ ‫الفصـول التالية مثل مقاطعة الـ ‪ ( ADC‬في الفصل التالي ) ومقاطعة المؤقتات ‪.Timer interrupt‬‬ ‫كيف تعمل المقاطعة الخارجية ‪:‬‬ ‫في جميع المعالجات والمتحكمات الدقيقة يتم تصميم الكود المسؤول عن معالجة المقاطعات بصورة‬ ‫مستقلة تماما عن البرنامج الرئيسي ‪ . main program‬فنجد دائما أن برنامج المقاطعة ويسمى‬ ‫‪ ( Interrupt service routing‬يختصر بكلمة ‪ ) ISR‬يكتب في جزء بعيد عن دالة ( )‪main‬‬ ‫‪35‬‬

‫فمثالا مكنك أن تكتب برنامج ‪ main‬ليقوم بعمل محدد إلى األبد ثم تكتب برنامج الـ ‪ ISR‬ليقوم‬ ‫بوظيفة محددة وسريعة عند تشغيل حساس أو زر معين‪ .‬يمتلك المتحكم الدقيق من فئة‬ ‫‪ ATmega16/ATmega32‬عدد ‪ 3‬أطراف للمقاطعة الخارجية يمكن توصيلها بأي حساس أو‬ ‫مفتاح رقمي وهذه األط ارف هي ‪:‬‬ ‫)‪INT0 (pin 2 on port D‬‬ ‫)‪INT1 (pin 3 on port D‬‬ ‫)‪INT2 (pin 2 on port B‬‬

‫أيضا يمكن اعتبار الطرف ‪ RESET‬أحد أطراف الـ ‪. External interrupt‬‬ ‫مالحظة‪ :‬الـ ‪ RESET‬في عالم المتحكمات الدقيقة يختلف قليالا عن الحاسب اآللي ‪ .‬فمثالا نجد‬ ‫في الحاسب اآللي ( أو الهاتف الجوال ) الزر ‪ RESET‬أو ‪ Restart‬والذي يعني إيقاف تشغيل‬ ‫الطاقة عن الحاسب ثم إعادة تشغيله‪ .‬أما في المتحكمات الدقيقة الزر ‪ RESET‬هو مقاطعة‬ ‫خارجية تأمر المعالج أن يترك ما يفعله اآلن وينتقل إلى أول أمر في البرنامج المخزن بداخله مع‬ ‫تصفير جميع المسجالت ووحدات الذاكرة ( وهذا يحاكي إعادة تشغيل المتحكم الدقيق ) ومع ذلك‬ ‫تظل الكهرباء متصلة بالمتحكم وال يتم فصلها‪ .‬والسر وراء تصميم الـ ‪ RESET‬بهذه الطريقة هو‬ ‫أن إعادة فصل وتوصيل الكهرباء بالمتحكم قد يستغرق ‪ 60‬مللي ثانية وهذا رقم كبير نسبيا في‬ ‫التطبيقات التي تحتاج استجابة سريعة بينما المقاطعة يتم تشغيلها في أقل من ‪ 1‬ميكرو ثانية‬ ‫‪36‬‬

‫( يعني أسرع بنحو ‪ 60,000‬ضعف من فصل الكهرباء وإعادة توصيلها ) ‪ ،‬عند إدخال إشارة‬ ‫رقمية على هذه األطراف تحدث المقاطعة ‪ .‬وعندها يترك المتحكم الدقيق البرنامج الرئيسي الذي‬ ‫ينفذه وينتقل إلى برنامج الـ ‪ ISR‬ليقوم بمعالجة المقاطعة الكود التالي يمثل التركيب البسيط للـ ‪ISR‬‬ ‫مع الـ ‪main program‬‬

‫خطوات تفعيل المقاطعة الخارجية ‪:‬‬ ‫يتم تفعيل المقاطعة الخارجية بمجموعة من اإلعدادات كالتالي ‪:‬‬ ‫‪ .1‬ضبط األطراف التي ستستخدم للمقاطعة مثل ‪ INT0‬أو ‪ INT1‬لتعمل كدخل ‪. input‬‬ ‫‪ .2‬ضبط نوع اإلشارة الكهربائية التي ستسبب المقاطعة على حسب نوع الحساس أو المفتاح‬ ‫الذي سيولد إشارة المقاطعة (انظر للشرح باألسفل) ‪.‬‬ ‫‪ .3‬يتم تفعيل قبول استقبال المقاطعة على الطرف المطلوب مثل ‪. INT0‬‬ ‫‪ .4‬تفعيل قبول استقبال المقاطعة بشكل عام ‪.‬‬ ‫‪ .5‬كتابة البرنامج الخاص بالمقاطعة ‪. ISR‬‬ ‫مثال ‪ :‬تشغيل المقاطعة ‪INT0‬‬ ‫الدائرة التالية عبارة عـن ‪ 2‬دايـود ضوئي ‪ +‬مفتاح الـدايود المتصـل بالطرف ‪ PA0‬سنقوم بتشغيله‬ ‫بصورة طبيعية ليقوم بعمل ‪ Blink‬كل مئة مللي ثانية ‪ .‬أما الدايود المتصل بالطرف ‪ PC0‬سيتم‬ ‫تشغيله أو إطفاؤه فقط عند حدوث مقاطعة على الطرف ‪.INT0‬‬

‫‪37‬‬

‫الكود ‪:‬‬

‫‪38‬‬

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

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

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

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

‫‪39‬‬

‫❖ اإلشارات الرقمية ‪:‬‬ ‫تنقسم اإلشارات الكهربائية الرقمية إلى نوعين وهما ‪ Logic Level‬و ‪Falling or Rising Edge‬‬ ‫النوع األول وهو المعروف لدى الجميع ويسمى ‪ HIGH‬أو ‪ LOW‬أو يعبر عن القيم الرقمية‬ ‫التقليدية ‪ 0 & 1‬وتكون كل إشارة سواء ‪ 0‬أو ‪ 1‬لها زمن محدد يقاس على حسب الـ ‪clock‬‬ ‫المستخدمة لتشغيل المتحكم الدقيق ‪ ،‬فمثالا لو كان المتحكم يعمل بـ ‪( clock = 1 MHz‬مليون‬ ‫هرتز) بأن زمن النبضة الواحد = ‪ 1‬ميكرو ثانية ويكون هذا الزمن هو نفس الزمن المطلوب لعمل‬ ‫إشارة كهربائية بقيمة ‪ 1‬أو صفر ‪ ،‬الصور التالية توضح شكل إشارة رقمية مقسمة إلى واحدات‬ ‫و أصفار ( حيث يمثل كل مربع رمادي اللون زمن إشارة واحدة ) ‪.‬‬

‫النوع الثاني من اإلشارات الرقمية يسمى " الحواف ‪ " Edges‬والتي تنقسم إلى نوعين وهما الحافة‬ ‫الصاعدة ‪ Rising Edge‬والحافة الهابطة ‪ . Falling Edge‬هذا النوع من اإلشارات الكهربائية‬ ‫يتميز بأنه فائق السرعة وال يلتزم بزمن محدد وغالب ا ما يحدث في زمن يقاس بالنانو ثانية (جزء‬ ‫من مليار من الثانية) ‪ .‬وتعتبر الحواف الصاعدة هي تحول اإلشارة الكهربائية من ‪LOW level‬‬ ‫إلى ‪ HIGH level‬في زمن صغير جدا بينما الحواف الهابطة هي تحول اإلشارة الكهربائية من‬ ‫‪ HIGH level‬إلى ‪. LOW level‬‬

‫إن أي إشارة رقمية تحتوي على حواف عددها يساوي ضعف عدد األصفار و الواحدات والصورة‬ ‫التالية توضح الحافة الهابطة الصاعدة مع إشارة ‪ LOW‬ثم ‪: HIGH‬‬

‫‪40‬‬

‫األطراف التقليدية التي تعمل كدخل للمتحكم الدقيق ال تستطيع أن تستشعر هذه الحواف سواء‬ ‫كانت الصاعدة أو الهابطـة وذلك ألنها تتم فـي زمن صغير جدا‪ .‬وهنا تظهر مشكلة خطيرة حيث‬ ‫نجد أن بعض الحساسات يكون الخرج الكهربائي الخاص بها سريع جدا لدرجة أن اإلشارات‬ ‫الكهربائية الناتجة منه تكون في زمن يقاس بالنانو ثانية (مثل الحواف الصاعدة والهابطة) وتمسى‬ ‫هذه اإلشارات السريعة بالـ ‪ Electric Impulse‬أو‪ Electric Edges‬لحل هذه المشكلة قام‬ ‫مصممو المتحكمات الدقيقة بصناعة دائرة إلكترونية خاصة تتصل بأطراف المقاطعات وتسمى بالـ‬ ‫‪( Edge Detector‬مكتشف الحواف)‪ .‬وتكون هذه الدوائر مسؤولة عن اإلحساس باإلشارات‬ ‫الكهربائية فائقة السرعة وإبالغ المتحكم بأنه هناك مقاطعة مطلوبة فو ار ‪ ،‬تمتلك متحكمات ‪AVR‬‬ ‫هذه الدوائر الخاصة على جميع أطراف المقاطعات وبذلك يمكننا أن نجعل المقاطعـة تعمل على‬ ‫جميع المفاتيح أو الحساسات فائقة السرعة ‪،‬حيث يمكن ضبط المقاطعة أن تعمل إما بإشارة تقليدية‬ ‫‪ 0 & 1‬أو عن طريق إشارة سريعة ‪ . Edge‬يتحكم في هذا األمر المسجل ‪ MCUCR‬والذي‬ ‫يحتوي على مجموعة من البتات مسؤولة عن تحديد نوع إشارة المقاطعة وتسمى ‪ ( ISCxx‬يتم‬ ‫استبدال ‪ xx‬برقمي ‪ 0‬و ‪ 1‬كما سنرى في الشرح التالي ) ‪.‬‬

‫• تتحكم البت ‪ ISC00‬و ‪ ISC01‬في إعدادات اإلشارة الخاصة بطرف المقاطعة ‪INT0‬‬ ‫• تتحكم البت ‪ ISC10‬و ‪ ISC11‬في إعدادات اإلشارة الخاصة بطرف المقاطعة ‪INT1‬‬ ‫عند تغير قيم هذه البتات يمكننا تحديد نوع إشارة المقاطعة المطلوبة وذلك تبعا للجدول التالي ‪:‬‬ ‫‪41‬‬

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

‫والذي وضع رقم ‪ 1‬داخل البت ‪ ISC01‬وبما أن البت ‪ ISC00‬تساوي صفر بصورة افتراضية‬ ‫فإن هذا األمر سيجعل المقاطعة تعمل عند الحافة الهابطة ‪ .‬ولقد اخترت هذا النوع من اإلشارات‬ ‫ألن المفتاح المتصل بالطرف ‪ INT0‬يعمل مع المقاومة الداخلية لهذا الطرف مما يعني أنه عند‬ ‫الضغط على المفتاح سيتحول الطرف ‪ INT0‬من الحالة ‪ HIGH‬إلى الحالة ‪ LOW‬وهو ما يوازي‬ ‫الحافة الهابطة ‪ .‬أيضا كان يمكن أن نترك كال ‪ ISC00‬و ‪ ISC01‬بقيمة صفر وهذا سيجعل‬ ‫المقاطعة تعمل عند الضغط على المفتاح لفترة زمنية قصيرة (‪ 1‬ميكرو ثانية على األقل) ‪ ،‬بعد‬ ‫االنتهاء من ضبط نوع إشارة المقاطعة علينا أن نخبر المتحكم الدقيق بأننا نريد تفعيل استقبال‬

‫‪42‬‬

‫إشارات المقاطعة على الطرف ‪ INT0‬ويتم ذلك عن طريق التالعب بالبتات الخاصة بالمسجل‬ ‫‪. GICR‬‬

‫يمتلك هذا المسجل ‪ 3‬بتات هامة جدا وهي ‪ INT0‬و ‪ INT1‬و ‪ INT2‬كل بت من الثالثة تتحكم‬ ‫في تفعيل استقبال المقاطعة على أحد األطراف مثالا فعندما نضع القيمة ‪ 1‬داخل البت ‪INT0‬‬ ‫فهذا يعني أن المتحكم سيبدأ استقبال إشارات المقاطعة على الطرف ‪ INT0‬وهكذا ‪ ..‬لذا استخدمنا‬ ‫األمر التالي ألخبار المتحكم أن يبدأ تفعيل المقاطعة ‪: INT0‬‬

‫واآلن يأتي األمر ‪:‬‬

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

‫‪43‬‬

‫بعد االنتهاء من الدالة الرئيسية يأتي دور دالة معالجة المقاطعة ‪ ISR‬حيث نجد أن هذه الدالة‬ ‫مكتوبة باألسلوب التالي ‪:‬‬

‫جميع دوال المقاطعة المختلفة يتم كتابتها عن طريق التعريف )‪ ISR(interrupt_vector‬ويتم‬ ‫استبدال كلمة ‪ interrupt_vector‬بنوع المقاطعة المطلوبة وبالنسبة للـ ‪External interrupts‬‬ ‫هناك ‪ 3‬أنواع وهي ‪:‬‬ ‫‪INT0_vect‬‬ ‫‪INT1_vect‬‬ ‫‪INT2_vect‬‬ ‫فإذا أردنا أن نكتب البرنامج الخاص بالمقاطعة ‪ INT0‬فإننا نكتب ‪:‬‬

‫فإذا أردنا أن نكتب البرنامج الخاص بالمقاطعة ‪ INT1‬فإننا نكتب ‪:‬‬

‫مع وضع األوامر المطلوبة من المقاطعة داخل القوسين } { ‪.‬في المثال السابق استخدام أمر يقوم‬ ‫بعكس حالة الطرف ‪ PB0‬وهذا ما سيجعل الدايود الضوئي يضيئ أو ينطفئ عند كل مرة يتم فيها‬ ‫تفعيل المقاطعة ‪. INT0‬‬

‫‪44‬‬

‫المبدل التشابهي ‪ -‬الرقمي ‪ADC‬‬

‫مقدمة عن المبدل التشابهي ‪ -‬الرقمي ‪: ADC‬‬ ‫اإلشارات الكهربائية في العالم الخارجي ليست مقتصرة فقط على اإلشارات الرقمية ‪ Digital‬بل‬ ‫على العكس فإن العديد من األجهزة و الحساسات اإللكترونية تصدر إشارات تماثلية ‪Analog‬‬ ‫فمثالا نجد أن معظم الحساسات المتوفرة في األسواق يمكنها تحويل كمية فيزيائية معينة مثل (درجة‬ ‫الح اررة – رطوبة – ضغط – تركيز مادة كيميائية ‪ ...‬الخ ) على فرق جهد كهربائي يتغير بتغير‬ ‫هذه القيمة الفيزيائية ‪ .‬بصورة طبيعية ال تستطيع الحواسيب أو المتحكمات الدقيقة أن تفهم اإلشارات‬ ‫التماثلية فكل ما تفهمه هذه الحواسيب هي اإلشارات الرقيمة مثل ‪ 1‬و ‪ 0‬أو ‪ HIGH‬و ‪ LOW‬لذا‬ ‫قام مصممو اإللكترونيات بصناعة شريحة خاصة تسمى بالمبدل التشابهي الرقمي ‪Analog to‬‬ ‫‪ Digital Converter‬و تُختصر بكلمة ‪ ADC‬هذه الشريحة ُيمكن شراؤها بصورة مستقلة‬

‫و توصيلها مع المتحكم الدقيق ‪ .‬إن مصممي متحكمات ‪ AVR‬قاموا بدمج هذه الشريحة بصورة‬

‫جاهزة للعمل على معظم متحكمات عائلة ‪ mega AVR‬وبعض متحكمات عائلة ‪ATTiny‬‬ ‫و سيناقش هذا الفصل طريقة تشغيل الـ ‪ ADC‬المدمج بعائالت ‪. AVR‬‬ ‫كيف يعمل المبدل التشابهي الرقمي ‪:‬‬ ‫تحتوي معظم المتحكمات الدقيقة ( من مختلف الشركات ) و منها ‪ AVR‬على ‪ ADC‬من نوع‬ ‫‪ Successive Approximation ADC‬هذا المبدل يعمل بطريقة مشابهة "للميزان القديم"‬

‫‪45‬‬

‫طريقة عمل الـ ‪: ADC‬‬ ‫نجد أن الـ ‪ ADC‬يحتوي على مجموعة مكونات تعمل مثل الميزان ‪.‬‬

‫المكون األول ُيسمى دائرة التقطيع ( أخذ العينة ) و تُسمى ‪Sample & Hold ( S/H ) Circuit‬‬

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

‫المكون الثاني ُيسمى بـ ‪ Analog Comparator‬و هو شريحة إلكترونية تُماثل‬ ‫الـ ‪ . ADC‬و ُ‬ ‫طبق على طرفها‬ ‫الميزان بالضبط و تمتلك طرفان للمقارنة حيث تقوم بالمقارنة بين فرق جهد ُم ا‬ ‫األول ( و الذي يتم الحصول عليه من دائرة الـ ‪ ) Sampling‬و فرق جهد مطبق على طرفها‬ ‫المكونان‬ ‫المكون الثالث فهو عداد رقمي تزايدي ‪ +‬مبدل رقمي تشابهي ‪ ، DAC‬هذان ُ‬ ‫الثاني ‪ .‬أما ُ‬ ‫يعمالن مثل الوزن حيث نجد أن كال المكونين يقومان بتوليد جهد صغير و إرساله إلى الطرف‬

‫الثاني لشريحة الـ ‪ Comparator‬و إذا لم يتساوى كال الجهدين يقوم العداد و الـ ‪ DAC‬بزيادة‬ ‫الجهد مرة أخرى و هكذا ‪ ...‬وتظل هذه العملية على أن تقوم شريحة الـ ‪ Comparator‬بالتبليغ‬ ‫المطبق من العداد و الـ ‪ DAC‬قد تساوى أو تفوق على الجهد المطبق من عينة القياس‬ ‫أن الجهد ُ‬ ‫‪ .‬عندما يحدث التبليغ يتوقف العداد و الـ ‪ DAC‬عن العمل و يتم تسجيل الرقم الذي توقف عنده‬ ‫و يتم حفظ هذا الرقم في مسجالت خاصة تُسمى ‪ ADCL‬و ‪ ADCH‬و من خالل هذا الرقم يمكننا‬ ‫معرفة قيمة الجهد الذ تم إدخاله للـ ‪. ADC‬‬

‫‪46‬‬

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

‫الصورة السابقة تمثل تركيب الـ ‪ ADC‬للمتحكم ‪ ATmega16‬حيث يتميز الـ ‪ ADC‬الموجود داخل‬ ‫‪ ATmega16‬بعدة إمكانيات مفيدة ‪:‬‬ ‫أوالً ‪ُ :‬يمكن تشغيل هذا الـ ‪ ADC‬في وضعين و هما ‪ 8 bit‬و ‪ 10 bit‬االختالف األساسي بين‬ ‫الوضعين هو " حساسية القياس " للجهد التناظري و أقل قيمة جهد ُيمكن قياسها ‪ .‬سيتم تناول‬

‫الدقة ‪ 8 bit‬في هذا الفصل ‪.‬‬

‫ثانياً ‪ :‬يتصل دخل الـ ‪ ADC‬بشريحة ‪ Analog Multiplixer‬و التي تتصل أطرافها بجميع‬ ‫أطراف الـ ‪ port A‬هذه الشريحة تعمل كبوابة توصيل حيث ُيمكن ضبطها لتوصيل أي طرف في‬

‫الـ ‪ port A‬كدخل للـ ‪ ADC‬و هذا يجعل المتحكم ‪ ATmega16‬يمتلك ‪ 7‬أطراف كاملة ُيمكن‬ ‫استعمالها كدخل تماثلي و ُيسمى كل طرف " قناة دخل " ‪ Input Channel‬مع مراعاة أنه ُيمكن‬

‫تشغيل طرف واحد فقط في نفس الوقت ‪ .‬أيضا يحتوي الـ ‪ ADC‬على شريحة ‪ op-amp‬تعمل‬

‫كمكبر جهد ( ُيمكن تشغيله بصورة اختيارية ) و دائرة مقارنة ‪ Comparator‬تعمل على األطراف‬

‫الثالثة األولى ‪. PA0,PA1,PA2‬‬

‫‪47‬‬

‫المسجالت ‪:‬‬ ‫المسجالت سنستخدم ‪ 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‬بدء عملية القياس و التحويل ثم قراءة قيمة الجهد ‪.‬‬

‫‪48‬‬

‫مثال ‪ :‬قراءة جهد ُمتغير باستخدام مقاومة متغيرة‬ ‫في هذا المثال سنستخدم المقاومة المتغيرة ‪ Potentimeter‬كمصدر متغير للجهد ‪ .‬تتواجد هذه‬ ‫المقاومة في برنامج ‪ Proteus‬باسم ‪ POT-HG‬أو ‪ Active Potentimeter‬ويتم توصيل‬ ‫السفلي بالـ ‪ GND‬أما الطرف األوسط فسيكون مصدر‬ ‫الطرف العلوي لها بالـ ‪ Vcc‬و الطرف ُ‬ ‫الجهد المتغير ‪.‬‬

‫في هذا المثال سنقوم بتوصيل طرف الجهد المتغير بالطرف ‪ PA1‬كما سنستخدم ‪ 8‬دايودات‬ ‫ضوئية لعرض قراءة الـ ‪ ADC‬على الـ ‪ PORT C‬كما هو موضح في الصورة التالية‪:‬‬

‫‪49‬‬

‫الكود ‪:‬‬

‫‪50‬‬

‫شرح الكود ‪:‬‬ ‫في بداية البرامج قمنا بعمل متغير ‪ 8‬بت من نوع ‪ unit8 _ t‬باسم ‪ adcValue‬سيستخدم هذا‬ ‫المتغير في حفظ القيمة الرقمية الناتجة من تحويل الجهد في الـ ‪ ADC‬لكن هناك كلمة غريبة‬ ‫ظهرت ألول مرة بجانب المتغير و هي ‪ volatile‬فما هي ؟‬ ‫قبل أن نتعرف على هذه الكلمة علينا أن نتعرف على أحد الخواص الهامة للمترجمات و تُدعى‬

‫‪ Code Optimization‬و كما نعلم أن جميع المترجمات مهمتها هي تحويل اللغات عالية المستوى‬ ‫( مثل الـ ‪ ) C‬إلى لغة التجميع ‪ Assembly‬و الحقيقة أن األمر الواحد من لغة الـ ‪ C‬قد يتحول‬ ‫إلى ‪ 1‬أو ‪ 3‬أو حتى ‪ 10‬أوامر من لغة التجميع ‪.‬‬ ‫المترجمات الذكية تستطيع اختصار عدد أوامر لغة التجميع و ذلك لزيادة سرعة الـ ‪ ( Code‬أوامر‬ ‫أقل = سرعة أكبر ) هنا يأتي دور الـ ‪ Code Optimization‬و هي خاصية مدمجة في معظم‬ ‫المترجمات سواء المجانية مثل ‪ gcc‬أو المدفوعة مثل ‪ IAR Workbench‬وتهدف إلى اختصار‬ ‫أكبر قدر ممكن من أوامر الـ ‪ ، Assembly‬و اآلن نعود إلى البرنامج السابق سنجد أن المتغير‬ ‫المسجل الذي ُيحفظ فيه القيمة الرقمية‬ ‫المسجل ‪ ( ADCH‬و هو ٌ‬ ‫‪ُ adcValue‬يستخدم لنسخ قيمة ُ‬

‫سيستخدم في نقل هذه القيمة إلى الـ ‪ PORT C‬في مجموعة‬ ‫لعملية التحويل ) ثم نجد أن المتغير ُ‬ ‫األوامر التالية ‪:‬‬

‫في الحالة الطبيعية إذا لم نكتب كلمة ‪ volatile‬سنجد أن المترجم قرر حذف المتغير ‪adcValue‬‬ ‫ألنه بال فائدة و ذلك ألنه من الممكن أن نستبدل كال األمرين السابقين بأمر واحد فقط و هو وضع‬ ‫قيمة ‪ ADCH‬مباشرة داخل الـ ‪ PORT C‬دون الحاجة لنسخها لمتغير ‪. adcValue‬‬

‫بالتأكيد بعد اختصار عدد األوامر أمر مفيد جدا و سيجعل الـ ‪ Code‬يعمل أسرع لكن في هذه‬ ‫الحالة قد يكون كارثي ألننا قد نحتاج هذا المتغير في إجراء عمليات حسابية أخرى ( كما سنرى‬ ‫‪51‬‬

‫المترجم بحذفه سيتسبب ذلك األمر في أخطاء غير معروفة و هنا‬ ‫في المثال القادم ) و إذا قام ُ‬ ‫المترجم أن يترك المتغير ‪ adcValue‬و ال يقوم بحذفه ‪.‬‬ ‫يأتي دور كلمة ‪ volatile‬و التي تُخبر ُ‬

‫المتغير نأتي للدالة الرئيسية ‪main‬حيث بدأنا بضبط البورتات ليعمل الـ‬ ‫بعد االنتهاء من تعريف ُ‬ ‫‪ PORT A‬كدخل و يعمل الـ ‪ PORT C‬كخرج ( لتوصيل الدايودات الضوئية الثمانية ) ‪.‬‬

‫ثم تبدأ مرحلة ضبط الـ ‪ ADC‬عبر سلسلة من األوامر ‪ .‬في البداية يجب أن ُنشغل الـ ‪ ADC‬ألن‬

‫فعل لتوفير الطاقة و يتم ذلك‬ ‫الوصع االفتراضي للـ ‪ ADC‬داخل جميع متحكمات ‪ AVR‬أنه غير ُم ّ‬ ‫عبر تغيير قيمة البت ‪ ADEN‬و هي اختصار ‪ ، ADC enable‬تتواجد هذا البت داخل الـ‬

‫‪. ADCSRA‬‬

‫المرحلة الثانية هي ضبط الـ ‪ Clock‬الخاصة بالـ ‪ ADC‬و كما علمنا في بداية الفصل أن الـ ‪ADC‬‬ ‫يحتوي على عداد تزايدي ُيستخدم لزيادة جهد المقارنة و يحتاج هذا العداد الرقمي لـ ‪Clock‬‬

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

‫نستخدم شريحة تُسمى بالـ ‪ Prescaler Register‬و هي شريحة تقوم بقسمة الـ ‪ Clock‬الرئيسي‬ ‫على رقم محدد ( من مضاعفات الرقم ‪ ) 2‬مثل ‪128 – 64 – 32 – 16 – 8 – 4 – 2‬‬ ‫و ُيسمى هذا الرقم بمعامل القسمة ‪ Division Factor‬و يتم تحديد هذا الرقم من البت ‪ADPS0‬‬

‫المسجل ‪ ADCSRA‬من خالل الجدول التالي ‪:‬‬ ‫و ‪ ADPS1‬و ‪ ADPS2‬الموجودة داخل ٌ‬

‫‪52‬‬

‫بالتأكيد سيظهر سؤال هام على أي أساس نختار معامل القسمة و ما هو تأثيره ؟‬ ‫في البداية هناك قاعدة عامة لجميع الـ ‪ ADC‬الموجودة داخل عائلة ‪ ATmega‬و هي أن‬ ‫الـ ‪ Clock‬الخاصة بالـ ‪ ADC‬يجب أن ال تزيد عن ‪ 128‬كيلو هرتز ( و يمكن أن تكون أقل من‬ ‫ذلك ) فمثالا إذا كانت الـ ‪ Clock‬الرئيسية = ‪ 1‬ميجا هرتز إذا يجب أن نختار معامل القسمة =‬ ‫‪ 8‬أو أكثر وذلك ألن حاصل قسمة مليون ‪ 125 = 8 /‬ألف هرتز وهو رقم أقل من ‪ 128‬كيلو ‪.‬‬ ‫لنأخذ مثال آخر ‪:‬‬ ‫لنفترض أن سرعة الـ ‪ Clock‬الرئيسية كانت ‪ 4‬ميغا هرتز فما هو معامل القمة المناسب ؟‬ ‫سنجد أن المعامل المناسب هو ‪( 32‬أو أكثر) و ذلك ألن حاصل قسمة‪ 4‬مليون ‪125 =32 /‬‬ ‫ألف هرتز أو ُيمكن استخدام معامل قسمة ‪ 64‬أو ‪ 128‬فكالهما سيجعل الـ ‪ ADC Clock‬أقل‬ ‫بكثير من ‪ 128‬كيلو هرتز ‪.‬‬

‫أذاً ما االختالف بين أن نختار ‪ 32‬أو ‪ 64‬أو ‪ 128‬إذا كانت كل هذه المعامالت مناسبة ؟‬ ‫االختالف الرئيسي هو سرعة تحويل الجهد إلى قيمة رقمية فكلما زادت سرعة الـ ‪ADC Clock‬‬ ‫كلما استطاع أن ُيحول الجهد إلى قيمة رقمية في زمن أقل ‪.‬‬ ‫لنعد مرة أخرى إلى المثال السابق حيث كانت سرعة المتحكم الرئيسية ‪ 1‬ميغا لذا استخدمنا معامل‬ ‫ُ‬

‫قسمة = ‪ 8‬وذلك عبر وضع قيمة ‪ 1‬داخل كل من البت ‪ ADPS0‬و ‪ADPS1‬‬

‫‪53‬‬

‫الخطوة التالية هي اختيار وضع تشغيل الـ ‪ 8 ( ADC‬أو ‪ 10‬بت ) في حالة الـ ‪ 8‬بت يتم وضع‬ ‫المسجل ‪ . ADMUX‬الوضع االفتراضي لهذا البت =‬ ‫الرقم ‪ 1‬داخل البت ‪ ADLAR‬الموجود في ُ‬ ‫‪ ( 0‬أي أن الـ ‪ ADC‬يعمل في وضع ‪ 10‬بت ) ‪.‬‬

‫المسجل ‪ADCH‬‬ ‫عدما يعمل الـ ‪ ADC‬في وضع الـ ‪ 8‬بت فإن قيمة تحويل الجهد يتم تسجيلها في ُ‬

‫و عندما يعمل في وضع الـ ‪ 10‬بت فإن قيمة التحويل يتم تسجيلها في ُمسجلين‬

‫( ألنها ‪ 10‬بت و ال يكفي ٌمسجل واحد لحفظ قيمتها ) و هما ‪ ADCL‬و ‪ ADCH‬و ُيسمى هذا‬ ‫الوضع بالـ ‪ Left Adjusted‬حيث تُوضع أول ‪ 8‬بتات من النتيجة في الـ ‪ ADCL‬ويوضع آخر‬ ‫‪ 2‬بت في الـ ‪ ، ADCH‬و أخي ار نقوم بضبط الطرف الذي سيكون ‪Input Channel‬‬

‫( الطرف الذي سنقيس من خالله الجهد الكهربائي المتغير ) ‪.‬‬ ‫في المثال السابق استخدمنا الطرف ‪ PA1‬لذا وجب أن يتم وضع ‪ 1‬داخل البت ‪MUX0‬‬

‫حيث تتحكم هذه البت مع البتات )‪ MUX(1,2,3,4‬في اختيار قناة الدخل كما هو موضح في‬ ‫الجدول التالي ‪:‬‬

‫‪54‬‬

‫مالحظة ‪ :‬الطرف ‪ ADC0‬يتصل بالطرف ‪ PA0‬و الطرف ‪ ADC1‬يتصل بالطرف ‪PA1‬‬ ‫وهكذا‪ ..‬إلى نهاية الـ ‪. PORT A‬‬ ‫بعد االنتهاء من ضبط الـ ‪ ADC‬يمكننا اآلن أن نبدأ عملية التحويل و قراءة الجهد و سيتم ذلك‬ ‫عبر إعطاء الـ ‪ ADC‬األمر ببدء عملية التحويل و ذلك عبر وضع ‪ 1‬داخل البت ‪ ADSC‬وهي‬ ‫اختصار لكلمة ‪. ADC Start Conversion‬‬

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

‫عبد بدء عملية التحويل تظل البت ‪ ADSC‬قيمتها = ‪ 1‬و ال تتحول إلى صفر إال عند انتهاء‬ ‫عملية التحويل بنجاح لذا استخدمنا األمر السابق و الذي يعني انتظر حتى تصبح البت ‪ADSC‬‬ ‫المسجل ‪ADCH‬‬ ‫قيمتها ‪ 0‬و بذلك تتوقف الـ ‪ . While‬و أخي ار يمكننا قراءة القيمة الرقمية من ُ‬ ‫حيث نستطيع إما أن نستخدمها مباشرةا أو ننسخها إلى أحد المتغيرات ( في المثال السابق استخدمنا‬

‫الـ ‪ PORT C‬ليعرض هذه القيمة و كذلك المتغير ‪ adcValue‬لنسخ هذه القيمة ) ‪.‬‬

‫قم بترجمة الكود السابق ثم ابدأ محاكاة المشروع على برنامج ‪ . Proteus‬يمكنك أن تحرك المقاومة‬ ‫المتغيرة ألعلى و ألسفل لتشاهد أن الدايودات الثمانية تعرض أرقام من ‪ 00000000‬إلى‬ ‫‪ 11111111‬كما هو موضح في الصورة التالية ‪:‬‬

‫‪55‬‬

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

‫‪ : Digital Value‬القيمة الرقمية الموجودة في ‪ ( ADCH‬بالصيغة العشرية ) ‪.‬‬ ‫‪ : Vref‬الجهد المرجعي للـ ‪. ADC‬‬ ‫‪ : n‬وضع دقة التشغيل ( ‪ 8‬بت أو ‪ 10‬بت ) ‪.‬‬ ‫الـ ‪ Vref‬هو الجهد المرجعي الذي يعتمد عليه الـ ‪ ADC‬لحساب الجهد المتغير ‪ ،‬هذا القسم يساهم‬ ‫في تحديد حساسية قياس الـ ‪ ADC‬ويتم تحديده من خالل البتات ‪ REFS0‬و ‪ REFS1‬في‬ ‫المثال السابق تركنا هذه البتات على الوضع االفتراضي ( صفر ) والذي يعني أن الجهد المرجعي‬ ‫‪ ، Vref = Vcc = 5 volt‬والصورة التالية توضح طريقة تغير الـ ‪ Vref‬بالتغير في قيمة‬ ‫‪ REFS0,REFS1‬في المسجل ‪ADMUX‬‬ ‫‪56‬‬

‫لنفترض أن القيمة الرقمية التي حصلنا عليها = ‪ 128‬وكان الـ ‪ ADC‬يعمل على الوضع ‪ 8‬بت‬ ‫إذا بالتعويض في المعادلة السابقة نجد أن قيمة الجهد الذي تم قياسه يساوي ‪:‬‬

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

‫حساسية القياس ‪:‬‬ ‫تعرف حساسية القياس بأنها أقل جهد يمكن للـ ‪ ADC‬أن يقيسه ويتعرف عليه بصورة صحيحة‬ ‫وتعتمد حساسية القياس للـ ‪ ADC‬على عاملين وهما وضع التشغيل ( ‪ 8‬أو ‪ 10‬بت ) والجهد‬ ‫المرجعي ‪ ، Vref‬كال العاملين يؤثران بشكل كبير جداّ في دقة القياس والمعادلة التالية تمثل‬ ‫حساسية القياس ‪:‬‬

‫مجددا تمثل ‪ n‬وضع القياس ( ‪ 8‬أو ‪ 10‬بت ) ‪ .‬فمثالا لو أن ‪ Vref = Vcc = 5 volt‬ويعمل‬ ‫الـ ‪ ADC‬بدقة ‪ 8‬بت فهذا يعني أن حساسية القياس تساوي ‪:‬‬

‫مما يعني أن أقل جهد يمكن قياسه هو ‪ 0.019‬فولت ( نحو ‪ 20‬مللي فولت ) ‪.‬‬ ‫‪57‬‬

‫تعديل عرض النبضة ‪: ) Pulse Width Modulation ( PWM‬‬ ‫إن تقنية تعديل عرض النبضة هي تقنية تعديل يتم فيها تغيير عرض نبضة الحامل بما يتناسب‬ ‫مع إشارة المعلومات (اإلشارة التشابهية ) ‪.‬‬ ‫يمكن استخدام تقنية ‪ PWM‬للتحكم بالطاقة المغذاة إلى جهاز كهربائي مثل المحرك الكهربائي‬ ‫(محرك تيار مستمر ) ‪ ,‬مكبر الصوت ‪. .... speaker‬‬ ‫توليد ‪:)PWM Generation( PWM‬‬ ‫الطريقة األبسط لتوليد إشارة ‪ PWM‬هي بواسطة مقارنة إشارة معروفة مسبق ا مع قيمة جهد مرجعية‬ ‫ثابتة كما هو مبين في الشكل ‪.‬‬

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

‫‪58‬‬

‫‪ -1‬النمط المعكوس ‪ : Inverted‬في هذا النمط إذا كانت قيمة اإلشارة المحددة مسبق ا أكبر من‬ ‫القيمة التي نقارنها معها عندها يكون الخرج له قيمة مرتفعة ‪ high‬وخالف ذلك يكون الخرج‬ ‫له قيمة منخفضة كما في الشكل ‪ B‬باألعلى ‪.‬‬ ‫‪ -2‬النمط غير المعكوس ‪ : None-Inverted‬يبقى الخرج في الحالة المرتفعة طالما أن‬ ‫القيمة التي نقارن اإلشارة المحددة مسبقا معها أكبر من هذه اإلشارة ويكون الخرج منخفضا‬ ‫خالف ذلك ‪.‬‬ ‫‪ -3‬نمط التبديل ‪ : Toggle‬في هذا النمط الخرج يتبدل وذلك عند حدوث تطابق في المقارنة‬ ‫أي أن إذا كان الخرج مرتفع يصبح منخفض والعكس بالعكس ‪.‬‬ ‫ويمكن أال تكون القيمة التي نقارن معها قيمة ثابتة حيث يمكن أن تكون هذه القيمة متغيرة بشكل‬ ‫جيبي أو بأي شكل أخر كما هو مبين بالشكل ‪.‬‬

‫ثابت الملئ ‪: Duty Cycle‬‬ ‫يعطى ثابت الملئ بالعالقة التالية ‪:‬‬

‫‪x 100 %‬‬

‫𝑛𝑜𝑇‬ ‫𝑓𝑓𝑜𝑇‪𝑇𝑜𝑛+‬‬

‫‪59‬‬

‫= 𝑒𝑙𝑐𝑦𝐶 𝑦𝑡𝑢𝐷‬

‫أنماط عمل ‪ PWM‬باستخدام المؤقتات في متحكمات ‪: ATmega‬‬ ‫بشكل عام يوجد ‪ 3‬أنماط عمل لمؤقتات ‪ PWM‬في متحكمات ‪ ATmega‬وهي ‪:‬‬ ‫ ‪ PWM‬السريع (‪. )Fast PWM‬‬‫ نمط تصحيح الطور (‪. )Phase Correct PWM‬‬‫ نمط تصحيح التردد والطور (‪. )Frequency and Phase Correct PWM‬‬‫• نمط ‪ PWM‬السريع ‪:‬‬

‫‪60‬‬

‫يكون لدينا إشارة محددة مسبقاُ (مرجعية) هي إشارة سن المنشار وتكون لدينا قيمة جهد ولتكن‪A‬‬ ‫يكون لدينا الخرج كما هو مبين في الشكل(‪ )A‬لنقم بزيادة قيمة المقارنة إلى القيمة ‪ B‬عندها‬ ‫سينقص عرض النبضة كما هو مبين بالشكل(‪ )B‬وبالتالي ينقص ثابت الملئ‪.‬‬ ‫يمكن استخدام أي مؤقت في تعديل عرض النبضة حيث يعتمد اختيار المؤقت على نوع التطبيق‬ ‫فمثالا ‪ TIMER0 ,TIMER2‬يملكان دقة ‪ 8 bit‬بينما في ‪ TIMER1‬تكون الدقة ‪. 16 bit‬‬ ‫فمثالا للتحكم بسرعة محرك ‪ DC‬يمكن اختيار ‪ TIMER0‬الذي يملك دقة ‪. 8 bit‬‬ ‫أما في محركات ‪ servo‬فتحتاج لدقة أعلى فنستخدم ‪. TIMER1‬‬ ‫اختيار نمط العمل ‪:‬‬ ‫يمكن اختيار أي من األنماط الثالثة المعكوس وغير المعكوس ونمط التبديل ولكن المستخدم بكثرة‬ ‫هو النمط غير المعكوس ‪. None-Inverted‬‬ ‫توليد إشارة ‪ PWM‬باستخدام ‪: TIMER0‬‬ ‫سنقوم اآلن بإعداد ‪ TIMER0‬ليعمل بنمط تعديل عرض نبضة سريع ‪ fast PWM‬وذلك لتوليد‬ ‫إشارات ‪ PWM‬بثابت ملئ متغير ويمكن بذلك تغيير نصوع الثنائي الباعث للضوء ‪. LED‬‬ ‫إن تشغيل المؤقت ‪ TIMER0‬في وضع ‪ fast PWM‬يحتاج للتعامل مع مسجل واحد يدعى‬ ‫‪ TCCR0‬أي ‪. Timer Counter Control Register for Timer0‬‬ ‫كما هو مبين بالشكل التالي ‪:‬‬ ‫‪1‬‬

‫‪1‬‬

‫‪CS00‬‬ ‫‪0‬‬

‫‪2‬‬

‫‪3‬‬

‫‪CS02‬‬ ‫‪CS01‬‬ ‫‪0‬‬

‫‪4‬‬ ‫‪COM00‬‬

‫‪Name FOCO WGM00 COM01‬‬

‫‪WGM01‬‬ ‫‪0‬‬

‫‪0‬‬

‫‪5‬‬

‫‪6‬‬

‫‪7‬‬

‫‪Bit No‬‬

‫‪1‬‬

‫‪0‬‬

‫‪61‬‬

‫‪0‬‬

‫‪0‬‬

‫‪Initial‬‬ ‫‪Val‬‬

: WGM – Wave Form Generation Mode fast PWM ‫ ويهمنا منها نمط‬TIMER0 ‫الشكل التالي يبين األنماط المختلفة المدعومة من قبل‬ . WGM00=1 ,WGM01=1 ‫ومن الجدول يجب‬ Mode

WGM00

WGM01

Mode Of

0

0

0

Normal

1

0

1

PWM Phase

Operation

Correct 2

1

0

CTC

3

1

1

Fast PWM

: COM – Compare Output Mode ‫ بوضع‬fast PWM ‫ ونختار منها نمط‬TIMER0 ‫يبين الجدول أنماط الخرج المستخدمة في‬ . GOM00=1 , GOM01=0 COM01

COM00

0

0

Output Mode Normal Port Operation (OCO disconnected)

1

0

RESERVED

0

1

Non Inverted PWM

1

1

Inverted PWM

: ‫ بالعالقة‬fast PWM ‫ الخاص بالمتحكم في حالة العمل بنمط‬PWM ‫يعطى تردد خرج مخرج‬ 𝑓𝑜𝑐𝑛(𝑃𝑊𝑀) =

𝑓𝐶𝐿𝐾−𝐼/𝑂 𝑁×256

62

‫𝑂‪ :𝑓𝐶𝐿𝐾 − 𝐼/‬هي سرعة التردد األساسي للنظام ( تردد الكريستالة ) أو تردد مصدر‬ ‫الساعة الرئيسي ‪.‬‬ ‫‪ : N‬هو رقم الـ ‪ prescalar‬أي المقسم األولي ‪.‬‬ ‫الجدول ‪ 14-6‬من الـ ‪ data sheet‬للمتحكم ‪ Atmega16‬يبين قيمة الـ ‪prescalar‬‬

‫المسجل ‪: )Output Compare Register( OCR0‬‬ ‫يمكن تغيير قيمة ثابت الملئ عن طريق تغيير القيمة الموضوعة في المسجل ‪. OCR0‬‬ ‫مالحظة ‪:‬‬ ‫يجب تعيين البت الثالث ( خرج ‪ ) PWM‬في الـ ‪ Port B‬في متحكم ‪ Atmega16‬كخرج لكي‬ ‫نحصل منه على خرج ‪. PWM‬‬ ‫مثال ‪:‬‬ ‫التابع التالي يقوم بعمل تهيئة للمؤقت ‪ Timer0‬ليعمل بتردد المعالج ‪ no prescalaling‬والنمط‬ ‫هو ‪ Fast PWM‬وخرج ‪ PWM‬غير معكوس ‪.‬‬ ‫ويقوم بجعل الـ ‪ OCO Pin‬تعمل كخرج ‪.‬‬

‫‪63‬‬

‫) (‪Void InitPWM‬‬ ‫{‬ ‫;)‪TCCR0l=(1