البرمجة ذات المستوى المنخفض للمتحكمات الدقيقة. برمجة AVR

15.08.2019


لحام شريحة أخرى على لوحة أخرى أو قطع المسار على اللوحة للمرة العاشرة لإجراء التغييرات التالية (ولكن ليست الأخيرة) على جهاز جديد، تبدأ في التفكير: "ألا يجب أن أترك هذه المهمة الشاقة؟!" لن يعمل جهازك الجديد بالطريقة التي تريدها، لكنك سئمت بالفعل من تغيير الدائرة وإعادة كل شيء على اللوحة.
من خلال تصفح مجلات الإلكترونيات، تصادف بشكل متزايد الكلمات: المعالج، وحدة التحكم الدقيقة، البرامج الثابتة، البرمجة. لكن هذه الكلمات ليس لها معنى محدد بالنسبة لك. لقد سمعت في مكان ما، وربما حملت بين يديك شيئًا تفكر فيه برهبة... المتحكمات الدقيقة! شيء يقلل من حجم الأجهزة، ويمنحها إمكانيات بعيدة المنال بالنسبة لك... لا، أنت كمهندس إلكترونيات تفهم الأفكار العامة لكيفية عمل هذه الأجهزة، لكن استخدامها العملي في منتجاتك غير وارد! لقد حاولت بالفعل إتقان وحدات التحكم الدقيقة عدة مرات، حتى أنك اشتريت كتابين من سلسلة "... للدمى" وقمت بتنزيل العديد من البرامج التعليمية الشائعة من الإنترنت. مر بعض الوقت، وتوقف كل شيء عند النقطة الأكثر إثارة للاهتمام: كانت المخططات الموضحة في الكتب واضحة لك، لكن طرق إنشاء البرنامج ظلت لغزا بالنسبة لك. إن كتابة بضعة أحرف باللغة الإنجليزية (أو لغة أخرى) في البرنامج المحدد في الكتاب لا يمثل مشكلة بالنسبة لك. لكن جوهر وطرق استخدام هذه الرموز الغامضة، التي أطلق على تسلسلها في الكتاب اسم البرنامج، ليست واضحة. لقد ألقيت اللوم على نفسك لكونك غبيًا ووضعت فكرة إتقان وحدات التحكم الدقيقة جانبًا. و لماذا؟ لقد قمت بالفعل بعمل رائع: لديك العديد والعديد من الرقائق التي تقوم بتطوير أجهزتك عليها... الأجهزة الموجودة على اللوحات الكبيرة التي تقوم بتصحيح أخطائها وإعادة صياغتها لفترة طويلة جدًا...
لكن قابل الرجل المجاور: فهو يكتب البرامج، ويحملها في وحدة التحكم الدقيقة، وما يتعين عليك تصحيحه لعدة أشهر، يفعله في غضون أيام قليلة. تشعر بالذعر، وتبدأ بالبحث عن الكتب المهجورة، وتتذكر كل ما قرأته من قبل... هو يستطيع، لكنك لا تستطيع. تتعرف على هذا الرجل بشكل أفضل، وتحت ستار محادثة جانبية، تبدأ في سؤاله عن وحدات التحكم الدقيقة وقدراتها. ويقول بهدوء أن وحدات التحكم هي هواية بالنسبة له. تطلب منه أن يخبرك عن أجهزته. إجاباته بسيطة ومتواضعة.

المتحكمات الدقيقة. ما هو المتحكم الدقيق؟
المتحكم الدقيق هو جهاز كمبيوتر صغير متخصص، باللغة الروسية. علاوة على ذلك، فإن هذا الكمبيوتر الصغير مصنوع من شريحة واحدة، على بلورة واحدة. ومن هنا الاسم الكامل: "الكمبيوتر الصغير ذو الشريحة الواحدة". مثل الكمبيوتر، المتحكم الدقيق هو جهاز إلكتروني يتم التحكم في تشغيله بواسطة برنامج - سلسلة من الأوامر المحملة مسبقًا في الذاكرة. يتم تنفيذ هذه الأوامر بواسطة المعالج: نوع من "الدماغ الضخم" الذي يتضمن ALU - وحدة حسابية منطقية. أي أن المعالج "يستطيع" إجراء عمليات حسابية وإجراء عمليات منطقية على البيانات.

سعة المعالج. طرق تقديم المعلومات.
كل من المعالج والذاكرة عبارة عن أجهزة رقمية "تفهم" الإشارات ذات المستويين فقط: يوجد جهد/تيار، ولا يوجد جهد/تيار على الخط. عادة ما يتم كتابة هاتين الحالتين على النحو التالي: الحالة المنطقية - "1"، والصفر المنطقي - "0". الأوامر والبيانات عبارة عن مجموعة من الآحاد والأصفار. يمكن لخط واحد (يسمى التفريغ) في حالتيه أن ينقل قيمتين فقط. ولكن مع زيادة عدد الأرقام، يزيد عدد القيم أيضًا: رقمان هما بالفعل أربعة، وثمانية أرقام هي بالفعل 256 قيمة. عادة ما يسمى الرقم بت: الرقم الواحد هو بت واحد. ومجموعة من ثماني بتات هي بايت: ثمانية بتات هي بايت واحد. لكن البايت الواحد يحتوي على 256 قيمة فقط. لنقل المزيد من المعلومات، يتم استخدام عدة بايتات موجودة بشكل تسلسلي في الذاكرة. بايتان ينقلان بالفعل قيم 65536. ثلاث بايت - 16777216 قيمة! وما إلى ذلك وهلم جرا. المعالجات الأكثر شيوعًا هي تلك التي يمكنها معالجة ثمانية بتات في عملية واحدة، ولهذا السبب تسمى هذه المعالجات بثمانية بتات.

نظام أوامر المعالج
عندما يتم تطوير المعالج، فهو مدمج في القدرة على تنفيذ أوامر معينة. تسمى التعليمات التي يستطيع المعالج تنفيذها مجموعة التعليمات. ما هي هذه الأوامر؟ الأوامر الحسابية والمنطقية الأكثر شيوعًا وكذلك أوامر العمل مع المنافذ هي خطوط الاتصال بين المعالج والعالم الخارجي. يمكن للمعالج، بعد قراءة القيمة من خلية الذاكرة أو حالة المنفذ في ذاكرته الخاصة - السجل، إجراء عمليات رياضية أو منطقية عليها. رياضياً، العمليات واضحة لنا: الجمع والطرح وغيرها. الإجراءات المنطقية تعني الإجراءات التالية: المقارنة - أكثر، أقل، متساوية؛ العمل على بتات خلية الذاكرة أو السجل: تصفيرها أو ضبطها، وكذلك عمليات نقل البتات إلى اليسار أو اليمين.

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

الموانئ. أوضاع تشغيل المنفذ.
يمكن أيضًا استلام البيانات من الأجهزة الخارجية من خلال خطوط الاتصال - دبابيس المتحكم الدقيق. وتسمى خطوط الاتصال هذه بالمنافذ، أو علميا: أجهزة إدخال وإخراج البيانات. يمكن أن تكون دبابيس المنفذ مدخلات، يستخدمها المعالج لتلقي المعلومات من الخارج من أجهزة استشعار مختلفة، أو تكون مخرجات، وإرسال إشارات يمكن التحكم في الأجهزة الخارجية إليها. في وحدات التحكم الدقيقة الحديثة، تكون منافذ جميع المنافذ تقريبًا ثنائية الاتجاه، أي أنها يمكن أن تكون مدخلات ومخرجات معًا. يجب تكوين المنافذ العامة - اضبط وضع التشغيل على الإدخال أو الإخراج. لهذا الغرض، توجد خلية ذاكرة خاصة - سجل للتحكم في أوضاع تشغيل المنفذ. على سبيل المثال، من أجل جعل الإخراج (البت) المطلوب للمنفذ مدخلاً، يتم كتابة 1 أو 0 إلى بتة تسجيل التحكم، اعتمادًا على طراز المتحكم الدقيق.

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

عائلات المتحكمات الدقيقة.
ليس من الضروري وجود كافة الأجهزة المذكورة في المتحكم الدقيق. في أغلب الأحيان، تنتج الشركة المصنعة العديد من نماذج المنتجات التي تحتوي على أجهزة طرفية مختلفة. تنتمي وحدات التحكم الدقيقة التي تحتوي على نوع واحد من المعالجات (ومجموعة من رموز الآلة القابلة للتنفيذ)، ولكن مع أجهزة طرفية مختلفة، إلى نفس العائلة. هذا ما يقولونه: وحدات التحكم الدقيقة من عائلة ATtiny.

متعددة الوظائف من دبابيس متحكم.
قد يطرح السؤال التالي: كيف "تتواصل" كل هذه الأجهزة مع العالم الخارجي، إذا كانت معظم الرقائق الموجودة في حزمة DIP لا تحتوي على أكثر من 40 طرفًا؟ لحل مشكلة نقص الدبوس، يتم استخدام طريقة لدمج وظائف عدة أجهزة باستخدام دبوس واحد. على سبيل المثال، تُستخدم منافذ أحد المنافذ (8 بت - 8 دبابيس) أيضًا لتشغيل محول تناظري إلى رقمي، وتستخدم منافذ منفذ آخر كمدخلات لمقارنات تناظرية، أو منفذ تسلسلي، أو ربط العقد المدمجة الأخرى. للتحكم في أوضاع تشغيل المنافذ، يتم استخدام سجل خاص للتحكم في وضع تشغيل المنفذ (تمت مناقشته مسبقًا عند شرح مبادئ تشغيل المنفذ). في معظم وحدات التحكم الدقيقة، يكون للدبابيس وظائف متعددة. إذا قمت بالرجوع إلى الوثائق الفنية لوحدة التحكم، عند وصف وظيفة الإخراج، سيتم تدوين ملاحظة حول الوظائف الرئيسية والبديلة لهذا الإخراج. على سبيل المثال: PD0/RX - البتة الصفرية للمنفذ D هي أيضًا مدخلات المنفذ التسلسلي، PB1/Ain0 - البتة الأولى للمنفذ B هي أيضًا مدخلات المقارنة التناظرية.

الخوارزميات. البرامج.
يتم إعطاء الأوامر للمعالج بترتيب معين، وفقًا لخوارزمية تم تطويرها مسبقًا. الخوارزمية هي تسلسل التنفيذ بواسطة المعالج. علاوة على ذلك، يجب أن تكون الأوامر مفهومة للمعالج، وفي نفس الوقت يكون لها تفسير لا لبس فيه، دون أي استقلالية في تنفيذها. يمكن كتابة الخوارزمية شفهيًا. على سبيل المثال: بداية البرنامج؛ جعل البت الصفري للمنفذ مدخلاً ؛ جعل البت السابع من المنفذ مخرجًا؛ قراءة قيمة البت الصفري للمنفذ؛ إذا كان يساوي منطقيا، فقم بتنفيذ الإجراءات التالية: قم بتحميل منطقي في البت السابع للمنفذ؛ العودة إلى بداية البرنامج. هذه هي الطريقة التي وصفنا بها خوارزمية تشغيل دائرة تتكون من مفتاح ومصباح كهربائي (أو أي حمل آخر) ومصدر طاقة. ستكون نتيجة التنفيذ على النحو التالي: عند الضغط على الزر، يتم توفير الجهد لمدخل المنفذ، ويقوم المعالج بتنفيذ البرنامج - فهو يوفر الجهد لإخراج المنفذ. وبينما تكون جهات الاتصال مغلقة، سيكون هناك جهد عند مخرج المنفذ.
لكن مثل هذه الكتابة يصعب إدراكها. ولذلك، تم تطوير طرق لوصف الخوارزمية بيانياً. فيما يلي مثال للتسجيل الرسومي للخوارزمية المذكورة أعلاه.
أرز. الخوارزمية-1. طريقة رسومية لوصف الخوارزمية

أوامر الفرع: الفروع المشروطة وغير المشروطة.
تتضمن تعليمات المعالج الخاصة تعليمات القفز المشروطة وغير المشروطة. لفهم ذلك، لا بد من شرح مفهوم “مؤشر عنوان الأمر الذي يتم تنفيذه”. يحتوي المعالج على سجل خاص يقوم بتخزين عنوان التعليمات المنفذة حاليًا. عند توصيل الطاقة، تتم إعادة تعيين هذا السجل ويتم كتابة صفر عليه. بعد ذلك، يبدأ المعالج في تنفيذ الأوامر المخزنة في الذاكرة، بدءًا من العنوان صفر - بعد كل شيء، يحتوي سجل مؤشر العنوان للأمر المنفذ على صفر. وبعد تنفيذ الأمر يتم تجريم هذا المؤشر، أي تزداد قيمته. يقرأ المعالج التعليمات التالية من الذاكرة على العنوان المحدد في المؤشر. أي أن الأوامر يتم تنفيذها بالتسلسل. يمكنك كسر تسلسل تنفيذ البرنامج باستخدام أوامر القفز المشروطة وغير المشروطة. للقيام بذلك، يتم تخزين أمر في إحدى خلايا الذاكرة، لتوجيه المعالج لتغيير قيمة سجل مؤشر العنوان للتعليمات التي يتم تنفيذها. ترشد تعليمات الانتقال غير المشروط المعالج إلى تغيير الترتيب التسلسلي لتنفيذ البرنامج والبدء في تنفيذ التعليمات المخزنة في الذاكرة بدءًا من العنوان المحدد مسبقًا.
يعد أمر الانتقال الشرطي أكثر تعقيدًا: عند تنفيذه، فإنه يتحقق من استيفاء بعض الشروط. على سبيل المثال، تحتاج إلى مقارنة قيمة خليتين من الذاكرة. إذا كانت قيمة الخلية الأولى أكبر، فاستمر في تنفيذ البرنامج على العنوان A، وإلا (أي قيمة الخلية الأولى أقل) - انتقل إلى العنوان C.

المقاطعات وأنواعها. أولويات المقاطعة.
هناك طريقة أخرى "لإجبار" المعالج على إيقاف التنفيذ المتسلسل للبرنامج والبدء في تنفيذ البرنامج على عنوان محدد - استدعاء "المقاطعة". ظهر مفهوم الانقطاع مع المعالجات الأولى. المشكلة هي أن المعالج يتحكم في الأجهزة الأبطأ منه. على سبيل المثال، يجب على المعالج معالجة البيانات حتى تظهر إشارة معينة. لنعطي مثالا بسيطا: يقوم المعالج بتشغيل برنامج لحساب عدد النبضات المستلمة في أحد منافذه. عند الضغط على الزر، يجب على المعالج مقاطعة تنفيذ هذا البرنامج وتنفيذ برنامج آخر: قم بتشغيل بعض الأجهزة (أي، قم بتطبيق جهاز منطقي على إحدى بتات المنفذ - "1"). كيفية حل هذه المشكلة؟ في البرنامج نفسه، يمكنك استطلاع الرقم المطلوب للمنفذ الذي يتصل به الزر باستمرار. ولكن في الوقت نفسه، سيتم إنفاق جزء من موارد المعالج (السرعة) عمليا على استطلاع المنفذ. الطريقة الثانية هي استخدام المقاطعات. يحتوي المعالج (وبالتالي المتحكم الدقيق) على دبوس خاص. يُشار إليه عادةً باسم "Int" (بالإنجليزية: "Interrupt"). عند تطبيق إشارة على طرف "Int"، تحدث الإجراءات التالية:
- إيقاف تنفيذ البرنامج الرئيسي،
- يتم تخزين قيمة سجل مؤشر العنوان للأمر المنفذ في ذاكرة الوصول العشوائي (المكان الذي يتم فيه مقاطعة تنفيذ البرنامج)،
- وبعد ذلك يتم تحميل عنوان جديد في نفس السجل (حسب رغبة الشركة المصنعة للمعالج)،
- في خلية الذاكرة ذات العنوان المحدد يوجد أمر انتقال غير مشروط: "انتقل إلى العنوان xx"،
- في الذاكرة، بدءًا من الخلية ذات العنوان xx، يوجد برنامج آخر، دعنا نسميه برنامجًا مساعدًا.

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

نحن نتحكم في المعالج. لغات البرمجة. المترجمين.
رموز الآلة. المجمع.
أوامر المعالج هي تسلسلات من الآحاد والأصفار. في كثير من الأحيان، تسمى أوامر المعالج رموز الجهاز، مع التركيز على أن هذه الأوامر تم تصميمها في الأصل لأداء معين - آلة، ولكن ليس شخصا. إن تذكر الأوامر من الأرقام (رموز الآلة) أمر صعب للغاية. لذلك، لتبسيط العمل، تم اختراع طريقة لاستبدال التسلسلات الرقمية باختصارات رمزية أكثر قابلية للفهم لدى الإنسان. على سبيل المثال، بالنسبة للأمر "تحميل البيانات" فقد توصلوا إلى اختصار واضح "ld" (الإنجليزية "تحميل" - تحميل)، للأمر "مقارنة" - "cp" (الإنجليزية "مقارنة" - مقارنة)، وهكذا على. تسمى هذه الطريقة لتسجيل أوامر المعالج بشكل رمزي "المجمع". إذا قام المبرمج، عند العمل مع رموز الآلة، بإدخال أوامر التحكم بالمعالج مباشرة في ذاكرة الجهاز، فعند العمل مع المجمع، يوجد نوع من الوسيط بين البرنامج والمعالج الذي يحول الرموز الرمزية إلى رموز الآلة. ويسمى البرنامج الذي يعمل كوسيط مترجم، أي مترجم. ولكن هناك فارق بسيط: يشير المجمع ليس فقط إلى طريقة التعيين الرمزي للتعليمات الرقمية (رموز الآلة)، ولكن أيضًا إلى برنامج مترجم يساعد المبرمج على ترجمة التعيينات الرمزية للأوامر مباشرة إلى أوامر الآلة. لذلك، غالبا ما يتم استخدام التقنية التالية: عندما يتحدثون عن اللغة، يكتبون المجمع، عندما يتحدثون عن البرنامج، يكتبون ببساطة المجمع.
يتمتع المجمع بميزة كبيرة: البرامج المكتوبة في التجميع يتم تنفيذها بسرعة كبيرة بواسطة المعالج. الحقيقة هي أن المجمّع هو في الواقع أمر آلي. لكن المجمع له عيوب أيضًا: العيب الرئيسي هو صعوبة كتابة البرامج، والثاني هو أنه حتى البرامج البسيطة نسبيًا تحتوي على كمية كبيرة من النص المصدر، مما يجعل من الصعب تحليل البرنامج.

نمطية البرامج. المهام المتكررة بشكل متكرر.
قام كل مبرمج بتجميع عدد معين من البرامج خلال عمله. لكن العديد من البرامج تحتوي على نفس الإجراءات. على سبيل المثال، تقوم العديد من البرامج باستقصاء لوحة المفاتيح وتحليل الزر المضغوط. وهذا يعني أنه يمكن نقل هذا الجزء من كود البرنامج من برنامج إلى آخر. تم تشكيل مكتبات البرامج تدريجياً من هذه القطع (الوحدات). بدأ المبرمجون في "نحت" برنامج من الوحدات: أي أنهم أدخلوا الوحدة المطلوبة في المكان المطلوب في البرنامج. أدى هذا الأسلوب إلى تسريع عملية كتابة البرنامج وزيادة موثوقية البرنامج ككل بسبب استخدام الوحدات التي تم تصحيح أخطائها بالفعل. ولكن منذ الأيام الأولى، نشأت مشكلة مشاركة الوحدات: بعد كل شيء، كتب كل مبرمج وحدات وفقًا لـ "المعيار" الخاص به - لأنه كان أكثر ملاءمة له في وقت أو آخر. لذلك، تم تطوير معيار (بتعبير أدق، عدة بدايات) لكتابة هذه الوحدات تدريجيًا. لقد وصفوا هيكل الوحدات من أجل "الالتصاق" الأكثر ملاءمة في برنامج واحد.

لغات البرمجة وتقسيمها الوظيفي.
وتدريجيًا، شكلت هذه المعايير المتباينة لاستخدام الوحدات ما أطلق عليه لاحقًا "لغات البرمجة". مثل اللغات البشرية، تحتوي لغة البرمجة على عدة مستويات فرعية تحدد كتابة الكلمات الفردية (الوحدات) وطرق كتابتها، بالإضافة إلى قواعد استخدامها. مع مرور الوقت، تطورت لغات البرمجة وتغيرت. وتدريجياً تم تقسيم جميع لغات البرمجة إلى عدة مجموعات حسب “توجهها المهني”:
- لغات البرمجة التطبيقية (FORTRAN لعلماء الرياضيات، FoxPro للعاملين الماليين)؛
- عالمي (باسكال وأساسي)؛
- نظام (المجمع وC).

بدأت تسمى كلمات النظام باللغات ذات المستوى المنخفض، أي أن المبرمج يعمل على المستوى الأدنى، الأقرب إلى المعالج. واللغات، عند العمل التي لا يتعين على المبرمج التحكم فيها بشكل مباشر في تشغيل المعالج، بدأت تسمى اللغات عالية المستوى (يشار إليها غالبًا باسم لغات جافا). لا تخلط بين هذا الاختصار واسم لغة Java - "Java".

بث البرنامج. طرق بث البرنامج.
كما هو الحال مع المجمع، يجب تحويل البرنامج المكتوب بأي لغة عالية المستوى إلى تعليمات يمكن للمعالج فهمها. في البداية، تم ذلك يدويًا: تم العثور على أمر في المجمّع في جدول وتم كتابته في كود الجهاز. لتسريع عملية تحويل (ترجمة) البرنامج، تم كتابة برامج خاصة - المترجمين. هناك طريقتان لترجمة البرنامج: التفسير والتجميع. وبناء على ذلك، يسمى المترجم إما مترجما أو مترجما. عند استخدام مترجم، يتم تحليل النص المصدر للبرنامج ويتم تنفيذه بواسطة المترجم بشكل تسلسلي، أمرًا تلو الآخر. يحتوي المترجم على وحدات لجميع الإجراءات القابلة للاستخدام. هذا التحويل لكل تعليمات بطيء جدًا. لكن هذه الطريقة لها ميزة كبيرة: يمكنك إيقاف البرنامج وتغيير الكود الخاص به ومواصلة تنفيذه. يعد هذا مناسبًا عند تصحيح أخطاء البرنامج. وفي هذه الحالة أيضًا، لدينا النص المصدر للبرنامج ويمكننا تعديله عدة مرات.
عند استخدام المترجم، يتم تحليل نص البرنامج ويتم إنشاء ملف يحتوي على تعليمات الآلة، يسمى الملف القابل للتنفيذ. وهذا يضمن سرعة تنفيذ عالية جدًا للبرنامج المترجم - فبعد كل شيء، يحدث تحويل نص البرنامج إلى رموز الجهاز مرة واحدة فقط أثناء تجميعه. لكنك لن تتمكن من تغيير البرنامج بسرعة: تحتاج إلى تغيير نص البرنامج وتجميعه مرة أخرى. إذا كان كود المصدر مفقودًا لسبب ما، فمن المستحيل إعادة ترجمة البرنامج، ويكون تغيير الملف القابل للتنفيذ أمرًا صعبًا للغاية.

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

بيئة تطوير البرمجيات المتكاملة.
في الآونة الأخيرة، ظهر نهج جديد: "بيئة التطوير المتكاملة" (IDE). يشير التكامل إلى تنفيذ عملية إنشاء البرنامج بأكملها في برنامج واحد: بعد كتابة نص البرنامج، يبدأ المبرمج بنقرة ماوس ترجمة نص البرنامج إلى رموز الجهاز، وبعد ذلك يتم تحميل الملف القابل للتنفيذ الناتج تلقائيًا إلى ذاكرة الجهاز المعالج. أي أن كل شيء يتم في برنامج واحد. يعمل هذا الأسلوب على تسريع عمل المبرمج.

الصعوبات الأولى.
كانت جميع الفصول السابقة بمثابة دورة تمهيدية، لإعدادك لفهم المعلومات الجديدة. لدينا العديد من المشاكل على طول الطريق.
1. كمية كبيرة من المعلومات المتنوعة: الإلكترونيات، تصميم المتحكمات الدقيقة، الخوارزميات، بناء جملة لغات البرمجة، أوصاف العمل باستخدام الأدوات البرمجية. وكيف تكتب؟ أحد القراء مهندس إلكترونيات جيد، لكنه لم يكتب برنامجًا قط، وآخر مبرمج، لكن الإلكترونيات على مستوى دائرة الراديو، والثالث شيء بينهما...

2. اختيار عضو الكنيست: إذا كانت جميع وحدات التحكم الدقيقة جيدة، فعلى أساس أي منتج وأي شركة مصنعة يجب أن نبني عملية التدريب الإضافي والتطبيق العملي لوحدات التحكم الدقيقة؟
من أجل اختيار متحكم دقيق للتدريب، نحتاج إلى استيفاء الشروط التالية:
أ) يجب أن يكون المتحكم الدقيق المختار للتدريب سهل الوصول إليه وغير مكلف.
ب) يجب أن يكون منتجًا حديثًا، ولكن ليس الأحدث.

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

3. يجب عليك تحديد لغة البرمجة، والتي نخطط لكتابة برامج لـ MK.
يعد اختيار لغة البرمجة مهمة حساسة للغاية. لتدريس برمجة المتحكمات الدقيقة، أود استخدام لغة برمجة ذات بناء جملة بسيط: يجب على المبرمج أن يتعامل مع البرنامج، ولكن ليس تصميمه!
من الضروري هنا تقديم توضيح مقدمًا: حاليًا، هناك ثلاث "عائلات" من اللغات تحظى بشعبية كبيرة بين مطوري البرامج والأجهزة على وحدات التحكم الدقيقة: C (مكتوبة كـ "C")، وباسكال (باسكال) وبيسيك (BASIC). . تم تطوير باسكال في الأصل كأداة لتعلم البرمجة. BASIC نفسها تشبه لغة Pascal من حيث البنية، ولكن كتابة الأوامر مبسطة ومتطلبات تصميم البرنامج أقل بكثير. تعتبر لغة C لغة للمحترفين. يشبه شي الفلسفة الصينية: ليس الرمز (الأمر) هو المهم فحسب، بل أيضًا أسلوبه ولونه. بغض النظر عن النكات، لكن رأيي هو: C كابوس. استخدامه له ما يبرره فقط في بعض المهام المتخصصة بشكل ضيق للغاية. لكن مهمتنا هي تجربة نقاط قوتنا وإنفاقها بأقل قدر ممكن على المهام التي ليس لها صلة مباشرة بالهدف الرئيسي.

4. نحن بحاجة إلى بيئة تطوير برامج للمتحكمات الدقيقة. يعتمد اختياره بشكل مباشر على نوع MK المستخدم ولغة البرمجة.
تعد بيئة تطوير البرنامج مهمة جدًا لإتقان برمجة المتحكمات الدقيقة بنجاح. من الممكن كتابة برامج في محرر نصوص مثل Notepad، لكنه غير مريح (تم اختباره!). ويعد استدعاء المترجم على سطر الأوامر مهمة ناكر للجميل في عصرنا القائم على النوافذ الرسومية.
يعتمد اختيار بيئة التطوير بشكل مباشر على المتحكم الدقيق الذي سنبني عليه الجزء العملي من التدريب. وفوق كل شيء آخر، نحتاج إلى أدوات مجانية. ولكن، كما أظهر اختبار مثل هذه البرامج، فإن البرامج المجانية غالبًا ما تكون ذات جودة متواضعة من وجهة نظر الاستخدام ومن وجهة نظر تعلم برمجة MK: وجود أخطاء أو عيوب في المترجمين أنفسهم يخلق صعوبات إضافية وحرمان المرء من الثقة بالنفس.
ستكون النسخة التجريبية مناسبة أيضًا إذا كان بها الحد الأدنى من القيود وعملت لمدة نصف عام على الأقل - وهذه هي بالضبط الفترة اللازمة لاكتساب مهارات العمل مع وحدات التحكم الدقيقة في المنزل.

5. مبرمج سيتم استخدامه لتحميل البرامج المكتوبة في ذاكرة عضو الكنيست. يعتمد اختيار المبرمج أيضًا على نوع MK المستخدم. هناك، بالطبع، مبرمجون "عالميون" يسمحون لك بالعمل مع وحدات تحكم دقيقة وشرائح ذاكرة مختلفة، لكنها باهظة الثمن. نعم، وغير مطلوب في معظم الحالات. ولذلك، فمن الأسهل إنتاج شيء متخصص للغاية لهذه العائلة من أعضاء الكنيست.
لكن النقطة المهمة ليست تعقيد دوائر المبرمج بقدر ما تتعلق بطريقة توصيل هذا المبرمج بالكمبيوتر. من الضروري هنا التوضيح: المبرمج عبارة عن محول إلكتروني يحول الإشارات من واجهات الكمبيوتر (منافذ COM و LPT و USB) إلى إشارات يتم توفيرها لمخرجات MK لتحميل البرنامج في ذاكرته. يتم التحكم في المحول الإلكتروني بواسطة برنامج كمبيوتر، والذي "يجبر" المحول على إصدار التسلسلات اللازمة من الإشارات إلى دبابيس MK.
إذا كان من الممكن صنع محول مبرمج متصل بجهاز كمبيوتر عبر منافذ COM و LPT في المنزل - "على الركبة"، فإن صنع مثل هذا المحول، ولكنه متصل بمنفذ USB، يمثل بالفعل مشكلة إلى حد ما: قلب مثل هذا المحول هو في كثير من الأحيان... متحكم دقيق. تنشأ هنا مفارقة: من أجل برمجة MK، نحتاج إلى برمجة MK.
يطرح سؤال منطقي: لماذا تصنع محولًا معقدًا يتصل بـ USB بينما يمكنك إنشاء محول بسيط وتوصيله بمنفذ LPT أو COM. الشيء هو أن العديد من أجهزة الكمبيوتر الحديثة (جميعها تقريبًا) لا تحتوي على هذه المنافذ. لذلك، سيتعين عليك إنشاء محول أكثر تعقيدا لبرمجة MK.

مارس 2010

لقد طرحت هذه الأسئلة على نفسي في شهر مارس، والآن وصلنا بالفعل إلى نهاية شهر نوفمبر. لكن هذه المرة لم تذهب سدى: لقد وجدت طريقة للخروج من المواقف الموضحة أعلاه ووجدت إجابات لجميع الأسئلة التي عذبتني. والآن أول الأشياء أولاً.

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

إجابة السؤال رقم 2
متحكم دقيق تم تصنيعه بواسطة ATMEL ATMEGA48. تم وصفه بشكل جيد، وقد ظل قيد الإنتاج لعدة سنوات، وليس من المخطط إيقافه لمدة 3 سنوات أخرى على الأقل، ويتمتع بمعايير فنية مثالية.

أجوبة السؤالين 3 و 4
بيئة البرمجة هي BASCOM (تم تصنيعها بواسطة MCS Electronics، المؤلف مارك ألبرتس). لغة البرمجة مشابهة في الأسلوب ومتطلبات تصميم نص البرنامج لباسكال، ولكن بناء جملة الأمر مأخوذ من BASIC.
أسباب الاختيار:
- نسخة تجريبية كاملة الوظائف من المترجم (القيد الوحيد: يقتصر حجم الكود الذي أنشأه المترجم على 4 كيلو بايت)
- رغبة مؤلف البرنامج في التعاون (لقد قمت بترجمة رسائل الواجهة ونظام المساعدة إلى اللغة الروسية، وقام بإضافة اللغة الروسية إلى هذا البرنامج)
- وجود منتدى باللغة الروسية لمستخدمي هذا المترجم

إجابة السؤال رقم 5
لم يكن من الممكن الجمع بين بساطة الدائرة وUSB. تقرر وصف نموذجين من المبرمجين: أحدهما يتصل بمنفذ LPT للكمبيوتر، والثاني بمنفذ COM. إذا كانت هذه المنافذ مفقودة، فيمكن توصيل الإصدار الثاني من المبرمج بجهاز كمبيوتر باستخدام محول USB-COM. هذه هي الطريقة التي نحصل بها على مجموعة USB-COM-programmer-microcontroller.
يُعرف النموذج الأول للمبرمج باسم STK-200/300، ويحتوي على شريحة عازلة للحالة الثالثة والعديد من المقاومات. النموذج الثاني هو مبرمج USBasp المعروف.

برمجة المتحكمات الدقيقة

مقدمة

القسم 2. بيئات البرمجة. مخططات اتصال متحكم صغير

القسم 3. التنفيذ العملي للبرنامج على المتحكم الدقيق

قائمة المصادر المستخدمة

مقدمة

أهمية الموضوع.تستخدم المتحكمات الدقيقة في كافة مجالات حياة الإنسان وفي الأجهزة المحيطة به. سهولة الاتصال ووظائف رائعة. من خلال برمجة وحدة التحكم الدقيقة، يمكنك حل العديد من مشاكل الأجهزة العملية.

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

يمكننا أن نعتبر أن المتحكم الدقيق (MCU) هو جهاز كمبيوتر موجود في شريحة واحدة. ومن هنا صفاتها الجذابة الرئيسية: الأبعاد الصغيرة؛ الأداء العالي والموثوقية والقدرة على التكيف لأداء مجموعة واسعة من المهام.

بالإضافة إلى وحدة المعالجة المركزية (CPU)، يحتوي المتحكم الدقيق على ذاكرة والعديد من أجهزة الإدخال / الإخراج: المحولات التناظرية إلى الرقمية، وقنوات نقل المعلومات التسلسلية والمتوازية، وأجهزة ضبط الوقت في الوقت الحقيقي، ومعدلات عرض النبض (PWM)، والقابلة للبرمجة. مولدات النبض، الخ. والغرض الرئيسي منه هو استخدامه في أنظمة التحكم الآلي المدمجة في مجموعة واسعة من الأجهزة: بطاقات الائتمان، والكاميرات، والهواتف المحمولة، وأجهزة الاستريو، وأجهزة التلفزيون، وأجهزة الفيديو وكاميرات الفيديو، والغسالات، وأفران الميكروويف، وأنظمة الإنذار الأمني، وأنظمة الإشعال لمحركات البنزين. ومحركات القاطرات الكهربائية والمفاعلات النووية وغير ذلك الكثير. لقد أصبحت أنظمة التحكم المدمجة ظاهرة واسعة الانتشار لدرجة أن فرعًا جديدًا من الاقتصاد ظهر بالفعل، يسمى الأنظمة المدمجة.

أعضاء الكنيست من ATMEL، التي تتمتع بوظائف رائعة، منتشرة على نطاق واسع.

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

في الوقت نفسه، تم إيلاء القليل من الاهتمام في الأدبيات لقضايا تدريس برمجة بعض وحدات التحكم الدقيقة غير المكلفة بالاشتراك مع المحركات الحقيقية.

يصبح تطوير تخطيط مبرمج، يتميز بالبساطة والوضوح والتكلفة المنخفضة، ضروريًا لبرمجة البلورات نفسها ولتعليم مجموعة واسعة من المستخدمين بصريًا أساسيات برمجة MK.

القسم 1. الغرض والنطاق، وبنيتها

المتحكم الدقيق هو جهاز كمبيوتر على شريحة واحدة. مصمم للتحكم في الأجهزة الإلكترونية المختلفة والتفاعل فيما بينها وفق البرنامج المدمج في المتحكم الدقيق. على عكس المعالجات الدقيقة المستخدمة في أجهزة الكمبيوتر الشخصية، تحتوي وحدات التحكم الدقيقة على أجهزة إضافية مدمجة. تؤدي هذه الأجهزة مهامها تحت سيطرة قلب المعالج الدقيق لوحدة التحكم الدقيقة.

تتضمن الأجهزة المدمجة الأكثر شيوعًا أجهزة الذاكرة ومنافذ الإدخال/الإخراج (I/O)، وواجهات الاتصال، والمؤقتات، وساعات النظام. تشتمل أجهزة الذاكرة على ذاكرة الوصول العشوائي (RAM)، وذاكرة القراءة فقط (ROM)، وذاكرة القراءة فقط (ROM) القابلة للبرمجة (EPROM)، وذاكرة القراءة فقط (ROM) القابلة للبرمجة كهربائيًا (EEPROM). تشتمل أجهزة ضبط الوقت على ساعات الوقت الفعلي ومؤقتات المقاطعة. تشتمل مرافق الإدخال/الإخراج على منافذ اتصال تسلسلية، ومنافذ متوازية (خطوط الإدخال/الإخراج)، والمحولات التناظرية إلى الرقمية (A/D)، والمحولات الرقمية إلى التناظرية (D/A)، وبرامج تشغيل شاشات الكريستال السائل (LCD)، أو برامج تشغيل شاشات الفلورسنت الفراغية (VFD). تتمتع الأجهزة المدمجة بموثوقية متزايدة لأنها لا تتطلب أي دوائر كهربائية خارجية.

على النقيض من وحدة التحكم الدقيقة، تسمى وحدة التحكم عادةً لوحة مبنية على أساس وحدة تحكم دقيقة، ولكن في كثير من الأحيان عند استخدام مصطلح "وحدة تحكم دقيقة"، يتم استخدام الاسم المختصر لهذا الجهاز، مع التخلص من البادئة "micro" من أجل البساطة. أيضًا، عند ذكر وحدات التحكم الدقيقة، يمكنك العثور على الكلمات "رقاقة" أو "رقاقة صغيرة"، "كريستال" (معظم وحدات التحكم الدقيقة مصنوعة على شريحة سيليكون واحدة)، أو الاختصارات MK أو من وحدة التحكم الدقيقة الإنجليزية - MC.

برنامج متحكم دقيق رقاقة إلكترونية

يمكن العثور على وحدات التحكم الدقيقة في عدد كبير من الأجهزة الصناعية والمنزلية الحديثة: الآلات والسيارات والهواتف وأجهزة التلفزيون والثلاجات والغسالات. وحتى صانعي القهوة. تشمل الشركات المصنعة لوحدات التحكم الدقيقة Intel وMotorola وHitachi وMicrochip وAtmel وPhilips وTexas Instruments وInfineon Technologies (مجموعة Siemens Semiconductor Group سابقًا) وغيرها الكثير. يتطلب تصنيع الرقائق الحديثة غرفًا فائقة النظافة.

ميزة التصنيف الرئيسية لوحدات التحكم الدقيقة هي عمق البت للبيانات التي تتم معالجتها بواسطة وحدة المنطق الحسابي (ALU). بناءً على هذه الميزة، تم تقسيمها إلى 4 و8 و16 و32 و64 بت. اليوم، الحصة الأكبر من سوق المتحكمات الدقيقة العالمية تنتمي إلى أجهزة ذات ثمانية بتات (حوالي 50% من حيث القيمة). تليها وحدات التحكم الدقيقة 16 بت وDSP (DSP - معالج الإشارات الرقمية)، والتي تهدف إلى استخدامها في أنظمة معالجة الإشارات (تحتل كل مجموعة حوالي 20٪ من السوق). داخل كل مجموعة، يتم تقسيم وحدات التحكم الدقيقة إلى أجهزة CISC و RISC. أكبر مجموعة هي وحدات التحكم الدقيقة CISC، ولكن في السنوات الأخيرة كان هناك اتجاه تصاعدي واضح في حصة بنية RISC بين الرقائق الجديدة.

تحدد سرعة الساعة، أو بشكل أكثر دقة سرعة الناقل، عدد العمليات الحسابية التي يمكن إجراؤها لكل وحدة زمنية. بشكل أساسي، أداء المتحكم الدقيق واستهلاكه للطاقة يزداد مع زيادة سرعة الساعة. يتم قياس أداء المتحكم الدقيق بـ MIPS (مليون تعليمات في الثانية - مليون تعليمات في الثانية).

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

اعتمادا على تكلفة وأبعاد الجهاز الذي يحتاج إلى التحكم، يتم تحديد متطلبات جهاز التحكم. إذا كان كائن التحكم يشغل مساحة تبلغ عشرات الأمتار، مثل بدالات الهاتف الأوتوماتيكية أو المحطات الأساسية لأنظمة الاتصالات الخلوية أو خطوط اتصالات مرحل الراديو، فيمكن استخدام أجهزة الكمبيوتر العالمية كوحدات تحكم. يمكن إجراء التحكم عبر منافذ الكمبيوتر المدمجة (LPT أو COM أو USB أو Ethernet). عند تشغيل الطاقة، يتم تحميل أجهزة الكمبيوتر هذه ببرنامج تحكم، والذي يحول الكمبيوتر العالمي إلى وحدة تحكم.

يتيح لك استخدام جهاز كمبيوتر عالمي كوحدة تحكم تطوير أنظمة اتصالات جديدة في أقصر وقت ممكن، وتحديثها بسهولة (ببساطة عن طريق تغيير البرنامج) وكذلك استخدام الكتل الجاهزة المنتجة بكميات كبيرة (وبالتالي الرخيصة).

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

الآن بعد أن أصبحنا على دراية ببعض قدرات ووظائف المتحكمات الدقيقة، فمن الطبيعي أن يطرح سؤال منطقي: ما هو المطلوب لبرمجة المتحكمات الدقيقة؟ ما هي البرامج والأجهزة المطلوبة وأين يمكنني الحصول عليها؟

لكي يتمكن المتحكم الدقيق من حل المشكلات وأداء وظائف معينة، يجب برمجته، أي أنه يجب كتابة برنامج أو كود برمجي فيه.

هيكل وترتيب كتابة البرنامج

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

الخطوة التالية بعد تجميع الخوارزمية هي كتابة كود البرنامج مباشرة. برامج المتحكمات الدقيقة مكتوبة باللغة سي أو المجمع . التجميع فقط عبارة عن مجموعة من التعليمات أكثر من كونها لغة برمجة وهي لغة منخفضة المستوى.


سنكتب البرامج بلغة C، وهي لغة عالية المستوى. تتم كتابة البرامج في لغة C بشكل أسرع بكثير مقارنة بالبرامج المماثلة في لغة التجميع. بالإضافة إلى ذلك، تتم كتابة كافة البرامج المعقدة في المقام الأول في C.

هنا لن نقارن مزايا وعيوب برامج الكتابة في Assembly و C. بمرور الوقت، بعد أن اكتسبت بعض الخبرة في برمجة MK، سترسم استنتاجات مفيدة لنفسك.

يمكن كتابة رمز البرنامج نفسه في أي محرر نص قياسي، على سبيل المثال، المفكرة. ومع ذلك، في الممارسة العملية، يستخدمون محررين أكثر ملاءمة، والتي سيتم مناقشتها أدناه.

تجميع البرنامج

كود C الذي كتبناه ليس مفهومًا بعد للمتحكم الدقيق، نظرًا لأن MK يفهم الأوامر فقط في النظام الثنائي (أو السداسي العشري)، وهو عبارة عن مجموعة من الأصفار والواحدات. لذلك، يجب تحويل رمز C إلى أصفار وواحدات. ولهذا الغرض يتم استخدام برنامج خاص يسمى مترجم، والعملية نفسها تحويل التعليمات البرمجية يسمى التجميع.

لفلاش البرامج الثابتة MK، يتم استدعاء جهاز مبرمج. اعتمادًا على نوع المبرمج، يتم توصيل مدخلاته بمنفذ COM أو USB، ويتم توصيل مخرجاته بدبابيس معينة من وحدة التحكم الدقيقة.


هناك مجموعة واسعة من المبرمجين ولوحات التطوير، لكننا سعداء جدًا بأبسطها مبرمج، والتي لا تكلف في الصين أكثر من 3 دولارات.


بعد وميض وحدة التحكم الدقيقة، يتم تصحيح أخطاء البرنامج واختباره على جهاز حقيقي أو، كما يقولون أيضًا، على الأجهزة.

الآن دعونا نلخص خطوات برمجة المتحكمات الدقيقة.


عند كتابة برامج بسيطة، يمكنك الاستغناء عن النقطة الثانية، أي دون وضع خوارزمية على الورق، يكفي الاحتفاظ بها في رأسك.

تجدر الإشارة إلى أنه يتم إجراء تصحيح أخطاء البرنامج واختباره أيضًا قبل وميض البرنامج الثابت MK.

مجموعة البرامج المطلوبة

هناك العديد من البرامج المفيدة والمريحة لبرمجة MK. كلاهما مدفوع ومجاني. من بينها ثلاثة رئيسية:

1) استوديو اتميل

2) كود فيجن AVR

3) وينافر

كل هذه البرامج مرتبطة بيئة تطوير متكاملةأنامدمج دتطوير ه nvironment – ​​بيئة التطوير المتكاملة. يمكنك كتابة التعليمات البرمجية فيها، وتجميعها وتصحيحها.

يجب عليك الانتباه إلى Code Vision AVR. يجعل هذا IDE كتابة التعليمات البرمجية أسهل وأسرع. ومع ذلك، يتم دفع البرنامج.

في المرحلة الأولى من البرمجة، من الأفضل كتابة كافة البرامج يدويا، دون أي تبسيط. سيساعدك هذا على اكتساب المهارات اللازمة بسرعة، ويمكنك في المستقبل فهم وتحرير الرموز التي كتبها شخص آخر لتناسب احتياجاتك. لذلك، أوصي باستخدام Atmel Studio. أولاً، إنه مجاني تمامًا ويتم تحديثه باستمرار، وثانيًا، تم تطويره من قبل شركة تصنع وحدات التحكم الدقيقة والتي سنتعلم البرمجة عليها.

تصحيح البرامج الثابتة والبرامج

سنقوم بفلاش وحدات التحكم الدقيقة باستخدام برنامج إضافي.

إذا لم يكن المتحكم الدقيق متاحًا، فيمكن محاكاة تشغيله باستخدام البرنامج. إنه يبسط إلى حد كبير عملية تصحيح أخطاء البرنامج حتى لو كان لديك متحكم دقيق، لذلك لا يتعين عليك إعادة تحميله كثيرًا، لأن أي متحكم دقيق لديه عدد محدود من عمليات إعادة الكتابة، على الرغم من أن هذا العدد كبير جدًا.

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

يتم استخدام الدوائر الدقيقة لأغراض مختلفة كجزء من الإلكترونيات الحديثة. يتم استكمال مجموعة كبيرة ومتنوعة من هذه المكونات برقائق الذاكرة. غالبًا ما يُطلق على هذا النوع من مكونات الراديو (بين مهندسي الإلكترونيات والناس) اسم الرقائق. الغرض الرئيسي من شرائح الذاكرة هو تخزين معلومات معينة مع إمكانية إدخالها (الكتابة) أو تغييرها (الكتابة فوقها) أو حذفها بالكامل (المسح) بواسطة البرنامج. الاهتمام العام برقائق الذاكرة أمر مفهوم. بالنسبة للسادة الذين يعرفون كيفية برمجة شرائح الذاكرة، تفتح فرص واسعة في مجال إصلاح وتكوين الأجهزة الإلكترونية الحديثة.

شريحة الذاكرة عبارة عن مكون إلكتروني، هيكله الداخلي قادر على تخزين (تذكر) البرامج المدخلة، أو أي بيانات، أو كليهما في نفس الوقت.

في الأساس، المعلومات المحملة في الشريحة عبارة عن سلسلة من الأوامر تتكون من مجموعة من وحدات الحوسبة للمعالج الدقيق.

تجدر الإشارة إلى أن رقائق الذاكرة تعد دائمًا إضافة متكاملة للمعالجات الدقيقة - رقائق التحكم. بدوره، المعالج الدقيق هو أساس الإلكترونيات لأي تقنية حديثة.

مجموعة من المكونات الإلكترونية على لوحة جهاز إلكتروني حديث. في مكان ما بين هذه الكتلة من مكونات الراديو يوجد مكون قادر على تخزين المعلومات.

وهكذا يتحكم المعالج الدقيق، وتقوم شريحة الذاكرة بتخزين المعلومات التي يحتاجها المعالج الدقيق.

يتم تخزين البرامج أو البيانات على شريحة الذاكرة كسلسلة من الأرقام - الأصفار والآحاد (البتات). يمكن تمثيل البت الواحد بصفر منطقي (0) أو منطقي (1).

في نموذج واحد، تبدو معالجة البتات معقدة. ولذلك، يتم دمج البتات في مجموعات. ستة عشر بت تشكل مجموعة من "الكلمات"، وثماني بتات تشكل بايت - "جزء من الكلمة"، وأربع بتات - "قطعة من الكلمة".

المصطلح البرنامجي الأكثر استخدامًا للرقائق هو البايت. هذه مجموعة من ثمانية بتات يمكن أن تأخذ من 2 إلى 8 اختلافات رقمية، مما يعطي إجمالي 256 قيمة مختلفة.

لتمثيل البايت، يتم استخدام نظام الأرقام الست عشري، والذي ينص على استخدام 16 قيمة من مجموعتين:

  1. رقمي (من 0 إلى 9).
  2. رمزي (من أ إلى واو).

لذلك، تحتوي أيضًا مجموعات من حرفين سداسي عشري على 256 قيمة (من 00h إلى FFh). يشير الحرف "h" الزائد إلى أرقام ست عشرية.

تنظيم شرائح الذاكرة

بالنسبة لشرائح الذاكرة ذات 8 بت (النوع الأكثر شيوعًا)، يتم دمج البتات في بايت (8 بتات) وتخزينها في "عنوان" محدد.

العنوان المخصص يسمح بالوصول إلى البايتات. يتم إخراج بتات عنوان الوصول الثمانية من خلال ثمانية منافذ بيانات.


تنظيم هيكل جهاز التخزين. للوهلة الأولى، تبدو الخوارزمية معقدة وغير مفهومة. ولكن إذا أردت أن تفهم، فالفهم يأتي بسرعة

مرحبا عزيزي هابرازيتل!

أريد في هذه المقالة أن أتحدث عن كيف قررت ذات مرة أن أبدأ في برمجة وحدات التحكم الدقيقة، وما هو المطلوب لهذا الغرض وما الذي حدث في النهاية.

كان موضوع وحدات التحكم الدقيقة مهتمًا بي منذ وقت طويل، في عام 2001. ولكن بعد ذلك كان الحصول على مبرمج في مكان إقامتي يمثل مشكلة، ولم يكن هناك شك في شرائه عبر الإنترنت. اضطررت إلى تأجيل هذا الأمر حتى أوقات أفضل. وبعد ذلك، في أحد الأيام الجميلة، اكتشفت أن الأوقات الأفضل قد جاءت دون مغادرة المنزل، وأصبح بإمكاني شراء كل ما أحتاجه. قررت أن تحاول ذلك. إذن ما نحتاجه:

1. مبرمج
هناك العديد من الخيارات في السوق - بدءًا من أرخص مبرمجي ISP (البرمجة داخل النظام) مقابل بضعة دولارات، إلى مصححي الأخطاء الأقوياء مقابل بضع مئات. نظرًا لعدم وجود خبرة كبيرة في هذا الشأن، قررت أولاً تجربة واحدة من أبسط وأرخص الطرق - USBasp. لقد اشتريته مرة واحدة من موقع eBay مقابل 12 دولارًا، والآن يمكنك العثور عليه مقابل 3-4 دولارات. هذه في الواقع نسخة صينية من المبرمج من توماس فيشل. ماذا يمكنني أن أقول عنه؟ شيء واحد فقط - أنه يعمل. بالإضافة إلى ذلك، فهو يدعم عددًا لا بأس به من وحدات تحكم AVR من سلسلة ATmega وATtiny. في نظام التشغيل Linux لا يتطلب وجود سائق.

لفلاش البرنامج الثابت، تحتاج إلى توصيل مخرجات المبرمج VCC وGND وRESET وSCK وMOSI وMISO مع المخرجات المقابلة لوحدة التحكم الدقيقة. للتبسيط، قمت بتجميع الدائرة المساعدة مباشرة على اللوح:

على اليسار على اللوحة يوجد نفس المتحكم الدقيق الذي سنقوم بفلاشه.

2. المتحكم الدقيق
لم أزعجني كثيرًا باختيار وحدة التحكم الدقيقة وأخذت ATmega8 من Atmel - 23 منفذ إدخال / إخراج، ومؤقتان 8 بت، وواحد 16 بت، وتردد يصل إلى 16 ميجاهرتز، واستهلاك منخفض (1-3.6 مللي أمبير) ، رخيصة (2 دولار). بشكل عام، لبداية - أكثر من كافية.

في نظام التشغيل Linux، تعمل مجموعة avr-gcc + avrdude بشكل جيد لتجميع البرامج الثابتة وتحميلها على وحدة التحكم. التثبيت تافه. باتباع التعليمات، يمكنك تثبيت كافة البرامج الضرورية في بضع دقائق. الفارق الدقيق الوحيد الذي يجب الانتباه إليه هو أن avrdude (برنامج التسجيل على وحدة التحكم) قد يتطلب حقوق مستخدم متميز للوصول إلى المبرمج. الحل هو تشغيله عبر sudo (ليست فكرة جيدة جدًا)، أو تسجيل حقوق udev خاصة. قد يختلف بناء الجملة بين إصدارات نظام التشغيل، ولكن في حالتي (Linux Mint 15) عملت إضافة القاعدة التالية إلى الملف /etc/udev/rules.d/41-atmega.rules:

# مبرمج USBasp SUBSYSTEM = = "usb"، ATTR (idVendor) = = "16c0"، ATTR (idProduct) = = "05dc"، GROUP = "plugdev"، MODE = "0666"

بعد ذلك، بالطبع، تحتاج إلى إعادة تشغيل الخدمة
إعادة تشغيل خدمة udev
يمكنك التجميع والفلاش مباشرة من سطر الأوامر (من قد يشك في ذلك) دون مشاكل، ولكن إذا كان هناك الكثير من المشاريع، فمن الملائم أكثر تثبيت البرنامج المساعد والقيام بكل شيء مباشرة من بيئة Eclipse.

بالنسبة لنظام التشغيل Windows، سيتعين عليك تثبيت برنامج التشغيل. خلاف ذلك لا توجد مشاكل. من أجل الفائدة العلمية، قمت بتجربة مجموعة AVR Studio + eXtreme Burner على نظام التشغيل Windows. مرة أخرى، كل شيء يعمل بشكل رائع.

لنبدأ بالبرمجة

يمكن برمجة وحدات التحكم AVR في المجمع (مجمع AVR) وفي لغة C. هنا، أعتقد أنه يجب على الجميع اتخاذ قرارهم الخاص اعتمادًا على المهمة المحددة وتفضيلاتهم. أنا شخصياً بدأت في العبث بالمجمّع لأول مرة. عند البرمجة باستخدام المجمع، تصبح بنية الجهاز أكثر وضوحًا وستشعر بأنك تتعمق مباشرة في الأجزاء الداخلية لوحدة التحكم. بالإضافة إلى ذلك، أعتقد أنه في البرامج ذات الأهمية الخاصة من حيث الحجم والأداء، يمكن أن تكون المعرفة بالمجمع مفيدة جدًا. بعد التعرف على مجمع AVR، قمت بالزحف إلى C.

بعد التعرف على الهندسة المعمارية والمبادئ الأساسية، قررت تجميع شيء مفيد ومثير للاهتمام. هنا ساعدتني ابنتي، فهي تلعب الشطرنج، وفي إحدى الأمسيات الجميلة قالت إنها تريد أن يكون لديها جهاز توقيت للمباريات المحددة بوقت. بام! ومن هنا - فكرة المشروع الأول! يمكنك بالطبع طلبها من موقع eBay، لكنني أردت أن أصنع ساعتي الخاصة، ذات مؤشرات وأزرار سوداء...آه. لا قال في وقت أقرب مما فعله!

تقرر استخدام مؤشري الصمام الثنائي المكون من 7 أجزاء كشاشة عرض. للتحكم، كانت 5 أزرار كافية - "المشغل 1"، "المشغل 2"، "إعادة الضبط"، "الإعدادات" و "الإيقاف المؤقت". حسنًا، لا تنس الإشارة الصوتية لنهاية اللعبة. تبدو وكأنها كل شيء. يوضح الشكل أدناه مخططًا عامًا لتوصيل المتحكم الدقيق بالمؤشرات والأزرار. سنحتاجها عند تحليل الكود المصدري للبرنامج:

استخلاص المعلومات

لنبدأ، كما هو متوقع، من نقطة الدخول للبرنامج - الوظيفة الرئيسية. في الواقع، لا يوجد شيء رائع في هذا الأمر - إعداد المنافذ، وتهيئة البيانات، وحلقة لا نهاية لها من الضغط على أزرار المعالجة. حسنًا، استدعاء sei() - تمكين معالجة المقاطعة، المزيد عنها بعد قليل.

Int main(void) ( init_io(); init_data(); sound_off(); sei(); while(1) ( Handle_buttons(); ) إرجاع 0; )
دعونا نلقي نظرة على كل وظيفة على حدة.

Void init_io() ( // ضبط الإخراج DDRB = 0xFF؛ DDRD = 0xFF؛ // ضبط الإدخال DDRC = 0b11100000؛ // مقاومات السحب PORTC |= 0b00011111؛ // يقاطع المؤقت TIMSK = (1)<

يعد إعداد منافذ الإدخال/الإخراج أمرًا بسيطًا للغاية - حيث يتم كتابة رقم في سجل DDRx (حيث x هو الحرف الذي يشير إلى المنفذ)، وكل بت منه يعني ما إذا كان الطرف المقابل سيكون جهاز إدخال (يتوافق مع 0) أو جهاز الإخراج (يتوافق مع 1). وبالتالي، من خلال إرسال الرقم 0xFF إلى DDRB وDDRD، قمنا بإنشاء منافذ إخراج B وD. وبناء على ذلك، فإن أمر DDRC = 0b11100000؛ يحول أول 5 دبابيس من المنفذ C إلى أطراف إدخال والباقي منها إلى أطراف إخراج. أمر PORTC |= 0b00011111; يتضمن مقاومات سحب داخلية على 5 مدخلات للتحكم. وفقا للرسم التخطيطي، يتم توصيل الأزرار بهذه المدخلات، والتي عند الضغط عليها، تقصرها على الأرض. بهذه الطريقة تفهم وحدة التحكم أنه تم الضغط على الزر.

بعد ذلك يأتي إعداد مؤقتين، Timer0 وTimer1. نستخدم الأول لتحديث المؤشرات، والثاني للعد التنازلي للوقت، بعد أن قمنا بتكوينه مسبقًا لإطلاق النار كل ثانية. يمكن العثور على وصف تفصيلي لجميع الثوابت وطريقة ضبط المؤقت على فترة زمنية محددة في وثائق ATmega8.

معالجة المقاطعة

ISR (TIMER0_OVF_vect) (display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0)process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0)process_timeoff(); ) )

عند تشغيل المؤقت، يتم نقل التحكم إلى معالج المقاطعة المناسب. في حالتنا، هذا هو معالج TIMER0_OVF_vect، الذي يستدعي إجراء عرض الوقت على المؤشرات، وTIMER1_COMPA_vect، الذي يعالج العد التنازلي.

الإخراج إلى المؤشرات

عرض باطل () (display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25);display_number((Timer1/60)%10, 0b00000100);_delay_ms(0.25);display_number((Timer1%60)/10 , 0b000010); 0.25); 60)%10, 0b01000000); _delay_ms(0.25); Display_number((Timer2%60)/10, 0b00100000); (رقم)؛

تستخدم وظيفة العرض طريقة عرض ديناميكية. الحقيقة هي أن كل مؤشر فردي لديه 9 جهات اتصال (7 للتحكم في المقطع، و1 للنقطة و1 للطاقة). للتحكم في 4 أرقام، ستكون هناك حاجة إلى 36 جهة اتصال. الإسراف جدا. لذلك، يتم تنظيم إخراج الأرقام إلى مؤشر متعدد الأرقام وفقًا للمبدأ التالي:

يتم توفير الجهد بالتناوب لكل جهة من جهات الاتصال المشتركة، مما يسمح لك بتسليط الضوء على الرقم المطلوب على المؤشر المقابل باستخدام نفس جهات اتصال التحكم الثمانية. عند تردد الإخراج العالي بما فيه الكفاية، يبدو وكأنه صورة ثابتة للعين. هذا هو السبب في أن جميع جهات اتصال الطاقة الثمانية لكلا المؤشرين في الرسم التخطيطي متصلة بـ 8 مخرجات للمنفذ D، ويتم توصيل 16 جهة اتصال للتحكم في القطاع في أزواج ومتصلة بـ 8 مخرجات للمنفذ B. وبالتالي، فإن وظيفة العرض مع تأخير قدره 0.25 مللي ثانية يعرض بالتناوب الرقم المطلوب على كل من المؤشرات. أخيرًا، يتم إيقاف تشغيل جميع المخارج التي تزود المؤشرات بالجهد (الأمر PORTD = 0;). إذا لم يتم ذلك، فسيستمر إضاءة آخر رقم معروض حتى الاستدعاء التالي لوظيفة العرض، مما سيؤدي إلى توهج أكثر سطوعًا مقارنة بالباقي.

التعامل مع النقرات

مقبض باطلة () (handle_button (KEY_SETUP)؛ Handle_button (KEY_RESET)؛ Handle_button (KEY_PAUSE)؛ Handle_button (KEY_PLAYER1)؛ Handle_button (KEY_PLAYER2)؛) Handle_button (مفتاح int) (بت int؛ التبديل (مفتاح) (الحالة KEY_SETUP: بت = SETUP_BIT; / مفتاح الإجراء الرئيسي (المفتاح) (الحالة KEY_SETUP: معالجة_setup(); استراحة; الحالة KEY_RESET(); استراحة; الحالة KEY_pause(); استراحة; الحالة KEY_PLAYER2: استراحة; sound_on(15); &= ~key; ) )

تقوم هذه الوظيفة باستقصاء جميع الأزرار الخمسة بدورها ومعالجة النقرة، إن وجدت. يتم تسجيل النقرة عن طريق تحديد bit_is_clear(BUTTON_PIN, bit) ، أي. يتم الضغط على الزر إذا كان الإدخال المقابل متصلاً بالأرض، وهو ما سيحدث، وفقًا للرسم التخطيطي، عند الضغط على الزر. هناك حاجة إلى تأخير لمدة DEBOUNCE_TIME والتحقق المتكرر لتجنب العمليات المتعددة غير الضرورية بسبب ارتداد جهات الاتصال. يتم استخدام حفظ حالة الضغط في البتات المقابلة للمتغير _pressed لمنع التشغيل المتكرر عند الضغط على الزر لفترة طويلة.
وظائف معالجة النقرات تافهة للغاية وأعتقد أنها لا تحتاج إلى تعليقات إضافية.

النص الكامل للبرنامج

#تعريف F_CPU 4000000UL #تتضمن #يشمل #يشمل #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b00000001 #define KEY_RESET 0b00000010 #def ine KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; المتغير المؤقت 1 = 0؛ المتغير int Timer2 = 0; متقلبة int _buzzer = 0؛ كثافة العمليات المتقلبة _pressed = 0؛ // إعلانات الوظائف void init_io(); باطلة init_data(); int number_mask(int num); Handle_buttons(); مقبض باطلة (مفتاح int) ؛ عملية الإعداد باطلة () ؛ عملية باطلة_reset(); عملية باطلة_pause(); عملية باطلة_timeoff(); عملية باطلة_player1(); عملية باطلة_player2(); عرض باطل () ؛ عرض رقم الفراغ (قناع كثافة العمليات، رقم كثافة العمليات)؛ باطلة sound_on (الفاصل الزمني)؛ باطلة sound_off(); // يقاطع ISR (TIMER0_OVF_vect) (display(); if (_buzzer > 0) ( _buzzer--; if (_buzzer == 0) sound_off(); ) ) ISR(TIMER1_COMPA_vect) ( if (ActiveTimer == 1 && Timer1 > 0) ( Timer1--; if (Timer1 == 0)process_timeoff(); ) if (ActiveTimer == 2 && Timer2 > 0) ( Timer2--; if (Timer2 == 0)process_timeoff(); ) ) int main (باطل) ( init_io(); init_data(); sound_off(); sei(); while(1) ( Handle_buttons(); ) return 0; ) void init_io() ( // تعيين الإخراج DDRB = 0xFF; DDRD = 0xFF // ضبط الإدخال DDRC = 0b11100000؛ // مقاومات السحب PORTC |= 0b00011111؛ // مقاطعات المؤقت TIMSK = (1<5940 || Timer2> 5940) ( Timer1 = 0; Timer2 = 0; ) ) باطلة Process_reset() ( init_data(); ) باطلة Process_timeoff() ( init_data(); sound_on(30); ) باطلةprocess_pause() ( ActiveTimer = 0; ) باطلة Process_player1 () ( ActiveTimer = 2؛ ) باطلة Process_player2 () ( ActiveTimer = 1؛ ) باطلة Handle_button (مفتاح int) ( بت int؛ التبديل (مفتاح) ( حالة KEY_SETUP: بت = SETUP_BIT؛ استراحة؛ حالة KEY_RESET: بت = RESET_BIT استراحة؛ حالة KEY_PAUSE: استراحة؛ الحالة KEY_PLAYER1: استراحة؛ الحالة الافتراضية: return 0) (_delay_ms(DEBOUNCE_TIME); (مفتاح) ( الحالة KEY_SETUP: معالجة_setup(); استراحة; الحالة KEY_RESET: معالجة_reset(); استراحة; الحالة KEY_PAUSE(); استراحة; الحالة KEY_PLAYER1(); استراحة; الحالة KEY_PLAYER2(); sound_on(15) ) آخر ( _pressed & = ~مفتاح; ) ) باطلة Handle_buttons() ( Handle_button(KEY_SETUP); Handle_button(KEY_RESET); Handle_button(KEY_PAUSE); Handle_button(KEY_PLAYER1); Handle_button(KEY_PLAYER2); ) عرض باطلة () (display_number((Timer1/60)/10, 0b00001000) _delay_ms(0.25); Display_number((Timer2/60)%10, 0b01000000); 0b00100000; _delay_ms(0.25); الرقم، قناع int) ( PORTB = number_mask (number)؛ PORTD = قناع؛ ) void sound_on(int الفاصل الزمني) ( _buzzer = الفاصل الزمني؛ // وضع دبوس الجرس عاليًا PORTC |= 0b00100000؛) void sound_off() ( // ضع الجرس دبوس منخفض PORTC &= ~0b00100000)

تم تجميع النموذج الأولي على اللوح.