تم استكشاف أساسيات المتحكم الدقيق

تم استكشاف أساسيات المتحكم الدقيق

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



مقدمة

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

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





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

تم تخصيص هذا الجهاز لتنفيذ سلسلة من الأوامر لتشكيل برنامج.



لغة البرنامج التي ستراها هنا هي C ++. سوف تتعلم هذه اللغة في أعماق أكبر في الدورة هنا.

عندما يتعلق الأمر بوحدات MCU ، يمكنك الحصول على إمكانية التحكم في جميع نقاط التثبيت وتكوينها.

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

في شريحة MCU ، يمكن تخصيص جميع المسامير باستثناء Vdd و Vss وهما دبابيس الطاقة للرقاقة ، بتسميات حصرية.

تفاصيل Pinout

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

بدءًا من هذا الدبوس ، ستجد 20 دبوسًا حتى الجزء السفلي من هذا الجانب (يسارًا) ، و 20 دبوسًا آخر على الجانب الآخر (يمينًا) ، تابعًا من أسفل إلى أعلى على الجانب الأيمن.

أول 8 دبابيس تبدأ من الشق هي PBO-7 التي تشكل دبابيس الفهرس في IC حيث تبدأ كل البرامج هنا بالفهرس صفر.

يُطلق على سلسلة pinouts أعلاه اسم PORT B ​​، بينما توجد مجموعات متطابقة أخرى من المنافذ المعينة من A إلى D.

يمكن تعيين هذه المنافذ لقبول البيانات التي تم تغذيتها والتعرف عليها والتي تسمى INPUT ، وكذلك لنقل البيانات في شكل محدد يسمى OUTPUT.

اثنان من المسامير التي تأتي في الفئة العامة هما (+) / (-) المسامير التي يشار إليها أيضًا باسم Vdd و GND.

يمكن رؤية دبوس واحد من PORT D (PDO-6) يقع على الجانب الأيسر من الشريحة في المنطقة السفلية.

يمكن تتبع PD7 وهو رقم التعريف الشخصي رقم 7 للمنفذ D قائمًا بمفرده ويبدأ سلسلة الجانب الأيمن من pinouts.

الآن بالانتقال من الجانب الأيمن للرقاقة حيث ينتهي PORT D ، يبدأ PORT C العد التصاعدي بالترتيب.

تساهم هذه في العديد من الدبابيس المثيرة للاهتمام في MCU من التناظرية إلى الرقمية.

تتميز هذه المسامير بأنها مدخلات استشعار لاكتشاف العديد من المعلمات من خلال مراحل الدوائر التناظرية المكونة خارجيًا.

الدبابيس أعلاه تشكل PORT A.

يمكن فهم التحويل التناظري إلى الرقمي عبر المسامير أعلاه بمساعدة مثال حيث يتم تطبيق مستوى درجة الحرارة التناظرية المكتشفة باستخدام مستشعر عادي مثل مقياس الحرارة على أحد دبابيس PORT A التي يتم قبولها بسهولة والمحول بواسطة MCU لإنتاج قراءات رقمية من صفر إلى 255 درجة فهرنهايت (رقم 8 بت يمكن ترقيته لتحقيق إخراج 10 بت).

ميزة أخرى يمكن مشاهدتها في MCU هي مساحة البرمجة المتاحة أو الذاكرة التي تحدد مساحة المتغيرات والبرنامج المحدد للميكروكونترولر.

علاوة على ذلك ، تحتوي وحدات MCU على ساعة مدمجة مخصصة لحساب المعلمات ذات الصلة.

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

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

كيفية إنشاء رابط SPI من المبرمج إلى وحدة التحكم الدقيقة

حان الوقت الآن للتعمق في الموضوع واستكشاف عالم البرمجة.

بعد قولي هذا ، قبل الانغماس في إجراء تحميل البرنامج في الشريحة ، نحتاج إلى إيجاد طريقة مناسبة لدمج موصل SPI (الواجهة المحيطية التسلسلية) مع MCU.

ومع ذلك ، حتى بعد ذلك ، لا يمكننا فقط دفع مؤشر SPI في pinouts MCU ، هل يمكننا ذلك؟ كما لا يمكننا السماح بإدخال الأسلاك الممتدة من SPI مباشرة في لوح الخبز. قد يتسبب هذا أيضًا في إعداد أسلاك غير صحيحة متصلة بالدبابيس غير الصحيحة التي تؤدي إلى توصيلات سيئة.

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

وبالتالي فإن التجميع أعلاه يشكل الآن منصة توصيل وسيطة مريحة وموثوقة لـ SPI إلى MCU.

Uptil الآن يبدو كل شيء رائعًا ومثاليًا للإعلان ، لذا دعنا ننتقل لكسب ما يتعلق بالمبرمج المطلوب بين جهاز الكمبيوتر الخاص بك و MCU.

قد يكون هناك مجموعة كبيرة من الشركات التي تصنع وتبيع وحدات المبرمجين هذه ، لذا لا ينبغي أن يكون شراءها مشكلة بالنسبة لك ، مثل Adafruit Industries أو USBtinyISP أو Sparkfun وما إلى ذلك.

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

ومع ذلك ، تأكد من التفكير ، إذا كنت تستخدم بعض MCU الأخرى وليس AVR Atmega32 ، فقد تضطر إلى البحث عن مبرمج متوافق مع شريحة MCU المحددة.

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

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

إن جعل لوحة واجهة SPI الموضحة أعلاه ليس بالأمر الصعب ، فالأمر كله يتعلق بجعل مكواة اللحام تعمل من خلال جميع التوصيلات عبر صفين رأسيين موضحين على لوحة صغيرة للأغراض العامة.

يوضح الشكل أعلاه تفاصيل الاتصال التي يجب عليك اتباعها أثناء توصيل الأسلاك بين الرؤوس.

لتبسيط الأمور ، دعنا ننتقل إلى تفاصيل الاتصال التالية لنفسها من خلال الرجوع إلى الصورة أعلاه:

دبوس SPI يبدأ من أعلى اليسار وينتقل إلى 'Master IN، Slave OUT' (MISO)

دبوس SPI من الوسط الأيسر يتصل بدبوس الساعة (SCK)

دبوس SPI في أسفل اليسار يربط مع إعادة التعيين. (سنتعلم بالتفصيل عن هذا الدبوس في البرامج التعليمية التالية)

SPI ذات الصلة بالسنانير اليمنى السفلية مع دبوس GND الخاص بـ MCU ، يشير GND إلى الدبوس الذي يشكل خط الإمداد الصفري أو السكة السلبية (النسبية) للإمداد.

ينتهي SPI من الرأس الأيمن الأوسط مع 'Master Out، Slave IN' (MOSI) pin من MCU.

يتم توصيل SPI الخارج من الرأس الأيمن العلوي بـ (+) من MCU والذي من الواضح تمامًا أن Vdd أو دبوس الإمداد الموجب لـ MCU.

هذا هو.

قم بتوصيل الموصلين كما هو موضح وستكون لوحة واجهة SPI جاهزة للإجراءات المطلوبة.

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

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

عمل كود برمجة بسيط لوحدة MCU

نأخذ وحدة USBTinyISP متوفرة من Sparkfun ، لربط الكمبيوتر بالميكروكونترولر.

نحن نعلم أن أي نظام تشغيل للكمبيوتر مثل Windows سيتطلب برامج تشغيل والتي بدونها سيكون من غير المجدي تحميل أي شيء على الكمبيوتر ، وبالتالي سيحتاج مبرمجنا إلى برامج تشغيل من أجل تحميل جهاز الكمبيوتر الخاص بك.

دعونا نلقي نظرة خاطفة على الإجراءات المطلوبة لتثبيت برامج التشغيل في نظام تشغيل جهاز الكمبيوتر الخاص بك ، وهنا نأخذ مثالاً لنظام التشغيل Windows 7 بمواصفات 32 بت أو 64 بت.

افتح sparkfun.com وانقر على 'صفحة مبرمج الجيب AVR'. يمكن تصور الارتباط بسهولة داخل الصفحة.

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

سيوفر لك هذا ملف pocketprog-driver.zip في جهاز الكمبيوتر الخاص بك.

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

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

للحصول على 64 بت اتبع هذه ، 32 بت ببساطة تجاهل:

جوجل 'libusb sourceforge' وانقر على هذا الإصدار من الروابط.

قد تصادف بعض الملفات الإضافية ، ولكنك ستكون مهتمًا بالعثور على ملف bib ، وهو: libusb-win32-bin - #. #. #. #. zip

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

في هذا المجلد ، انتقل عبر مجلد bin ، وانتقل إلى مجلد amd64.

سترى مجلدين هنا على النحو التالي: ghcalled libusb0.dll و libusb0.sys.

قد ترغب في إعادة تسميتها كـ: libusb0_x64.dll و libusb0_x64.sys.

الآن ستحتاج إلى نسخ الملفات المذكورة أعلاه إلى مجلد pocketprog-driver ، ما عليك سوى الكتابة فوق الملفات الموجودة في الإصدار الحالي.

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

إنه وضع 'إضافة أجهزة قديمة'.

انقر فوق 'قائمة ابدأ'

ثم تابع بالنقر بزر الماوس الأيمن على 'الكمبيوتر'

انقر فوق 'إدارة' ، ثم انقر في النهاية على 'مدير الجهاز'

بعد ذلك ، داخل القائمة ، اختر 'إضافة أجهزة قديمة'

استمر في الضغط على 'التالي' ، حتى يتم إدراج المعالج

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

الآن ببساطة انقر فوق 'التالي'

سيظهر لك هذا قائمة 'إظهار جميع الأجهزة' التي ستحتاج إلى النقر فوقها.

بعد ذلك قم بالضغط على أيقونة 'Have Disk'.

بمساعدة أيقونة 'Browse' ، انتقل إلى موقع مجلد pocketprog-driver. إذا تم التحديد بشكل صحيح بواسطتك ، فيمكنك تصور ملف pocketprog.inf الموجود في هذا المجلد المحدد.

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

حول وانتهى!! دعنا ننتقل إلى البرنامج التعليمي التالي في الصفحة التالية.

الآن ربما تكون قد قمت بتثبيت البرنامج المطلوب وبناء واجهة SPI.

كيفية تحويل برنامج إلى شريحة متحكم

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

في هذا القسم سنتعرف على طريقة اختبار المبرمج ونؤكد تثبيت برامج التشغيل والبرامج ذات الصلة.

من أجل التحقق مما إذا تم تثبيت برامج التشغيل والبرامج بشكل صحيح ، سنقوم بتنفيذ برنامج بسيط يُعرف باسم avrdude.

AVRdude هو برنامج مرتبط بآخر تثبيت WinAVR والذي بدونه لا يمكن نقل الملف الفعلي إلى MCU.

هذا البرنامج هو تنسيق ملف .hex الذي يصبح مفهومًا بشكل أساسي لـ MCU لعمليات التنفيذ المطلوبة.

في حالة عدم نجاح التحقق ، لن يكون المبرمج قادرًا على القيام بنقل الملف.

دعنا نرى بسرعة كيف يمكننا تنفيذ إجراء الاختبار بمساعدة الإرشادات التالية:

افتح موجه DOS (نظام تشغيل القرص) بالنقر فوق 'قائمة ابدأ' وكتابة cmd.exe في مربع البحث المحدد.

الآن يمكن تنفيذ AVRdude ببساطة عن طريق كتابة avrdude –c usbtiny p m32 عبر موجه DOS. بمجرد تنفيذ ذلك ، سوف تقر DOS على الفور ما إذا كان الاتصال ناجحًا.

في الأمر أعلاه ، تعد '-c' علامة إعلام تتضمن مواصفات معلمة مبرمج 'usbtiny' ، بينما تحدد العلامة '-p' جهاز وحدة التحكم الدقيقة ('m32 تشير إلى Atmega32).

في حالة استخدامك MCU مختلف ، ستحتاج إلى تضمين البادئات ذات الصلة للتنفيذ.

بمجرد الانتهاء من الإجراء أعلاه ، يمكنك كتابة 'الخروج' فوق موجه DOS ، وهذا سوف ينقلك من النافذة.

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

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

يمكن حساب قيمة المقاوم باستخدام الصيغة البسيطة التالية:

R = (Ub - LEDfwd) / أنا

عندما يكون Ub هو جهد الإمداد ، فإن LEDfwd هو جهد التشغيل الأمثل لمصباح LED المستخدم ، وأنا هو أمبيره الأمثل.

لنفترض أننا نستخدم مصباح LED أحمر له جهد أمامي LED = 2.5V والتيار I = 20mA ، يمكن حل المعادلة أعلاه على النحو التالي:

نظرًا لأن الجهد من MCU سيكون 5 فولت ، فيمكن التعبير عنه على النحو التالي:

R = (5 - 2.5) /. 02 = 125 أوم ، ¼ واط ، أقرب قيمة هي 120 أوم ستفعل.

الآن لدينا LED ، مقاوم 120 أوم وفيروبورد ، ببساطة قم بتوصيل المكونات المذكورة أعلاه كما هو موضح في الرسم التخطيطي بالمتحكم الدقيق.

بمجرد الانتهاء من ذلك ، يمكن برمجة MCU للاستجابة المقصودة على إعداد LED أعلاه.

بعد ذلك ، برمجة MCU.

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

كيفية تثبيت بيئة البرمجة والتحقيق في WinAVR

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

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

في النهاية سيتم دعم هذا بواسطة WinAVR ونقله إلى شريحة MCU المعنية.

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

سوف تكون دورة تثبيت WinAVR سريعة للغاية وسريعة. دعنا نتعمق في التفاصيل بالنقاط التالية:

ستحتاج إلى تنزيل أحدث الإصدارات من مجلد ملفات WinAVR source forge. ستصادف بعض المعلومات المفيدة المتعلقة بهذا التنزيل من موقعه الرسمي على الويب.

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

قم بتنزيل الملف وابدأ عملية التنفيذ بالضغط عليه. دع التثبيت يبدأ.

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

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

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

تتمثل المهمة الأساسية لمفكرة المبرمج أعلاه في تحويل رمز يمكن قراءته بواسطة الإنسان والذي ستكتبه إلى سلسلة من الإرشادات التي يمكن فهمها فقط لـ MCU.

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

كيفية برمجة MCU لتشغيل مصباح LED

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

بالطبع نحن الآن جاهزون لتنفيذ برنامجنا الأول داخل MCU ، ولكن قبل ذلك سيكون من المثير للاهتمام أن نلخص بسرعة ما فعلناه في سياق دروسنا السابقة:

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

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

بعد ذلك ، أكدنا ما إذا تم تثبيت برامج التشغيل بشكل صحيح في الكمبيوتر لنظام 32 بت وكذلك نظام تشغيل 64.

بعد ذلك ، قمنا بتثبيت بيئة البرمجة المسماة Win AVR لتسهيل كتابة الإعلان ونقل الرموز إلى وحدة التحكم الدقيقة ، متبوعًا بتنفيذ avrdude للتحقق من المبرمج مع جهاز الكمبيوتر الخاص بك والمتحكم الدقيق المترابط.

أخيرًا في الفصل السابق ، انتهينا من بناء دائرة LED / المقاوم وربطناها بمخرجات MCU ذات الصلة.

هذا كثير من العمل ولكن حان الوقت للتوجه على الفور إلى بعض عناصر البرمجة الحقيقية!

بادئ ذي بدء ، نريد تقسيم المتحكم الدقيق إلى ثلاث فئات ، وهذا من شأنه تبسيط فهمنا كثيرًا:

التحكم والكشف والاتصال

سيكون من المثير للاهتمام معرفة أنه يمكن برمجة الوظائف المذكورة أعلاه بعدة طرق مختلفة.

في برنامجنا الأول ، سنحاول أن نطلب من المتحكم الدقيق 'التحكم' في معلمة خارجية ، نعم أنت محق في أنه سيكون LED الذي أنشأناه مؤخرًا.

لكي نكون دقيقين ، سنطلب من MCU تشغيل مصباح LED المتصل ، نعم أعلم أن هذا يبدو بدائيًا تمامًا ، ولكن يجب أن تكون مرحلة البداية سهلة دائمًا.

المضي قدمًا في الوظيفة الحالية ، جعل التحكم في MCU في مؤشر LED بسيطًا جدًا:

لهذا نطلب من الدبوس رقم 0 في المنفذ B إنتاج 5V المطلوبة لمصباح LED.

أذكر من البرنامج التعليمي السابق ، لقد قمنا بتوصيل أنود LED بالدبوس المذكور أعلاه من MCU.

هناك شيئان أساسيان مطلوب معالجتهما لهذا الطرف من MCU: 1) الإخراج و 2) 5 فولت

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

بمجرد تعيينها لتكون ناتج الشريحة ، قد نوجهها لتكون إما 'عالية' (5 فولت) أو 'منخفضة' (0 فولت) كما هو مطلوب للتطبيق.

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

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

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

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

لتعيين دبوس كمخرج ، نحتاج إلى استخدام سجل اتجاه البيانات (DDR). إذا كنت تتساءل عما يعنيه التسجيل هنا ، فهو ببساطة مساحة في MCU تمكن المتحكم الدقيق من الاستجابة بطريقة محددة.

باستخدام DDR ، يمكننا تعيين الدبوس إما لإرسال بيانات تشبه 'الإخراج' ، أو قبول البيانات الموجودة في شكل 'إدخال'.

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

إحدى طرق تعيين pin0 كإخراج هي كتابة الكود التالي:

DDRB = 0b00000001

في البرنامج أعلاه ، يشير DDRB إلى سجل اتجاه البيانات لـ PORT B ​​0b يوجه المترجم فيما يتعلق بالتعبير الثنائي التالي للرقم بينما يشير الرقم '1' في نهاية التعبير إلى موضع pin0 ، أي موقعه في النموذج من أول دبوس من PORT B.

إذا كنت تتذكر أننا علمنا أن PORT B ​​يربط 8 دبابيس به (من 0 إلى pin7) ، وإذا لاحظت أن الكود أعلاه يحتوي أيضًا على 8 أرقام ، مما يعني أن كل رقم يشير إلى دبابيس PORT B ​​الثمانية.

سيكون الإجراء التالي الآن هو تعيين 5 فولت لهذا الدبوس (pin0). مرة أخرى ، يتطابق مبدأ العملية مع DDR كما هو موضح أعلاه من خلال الكود الثنائي التالي:

بورتب = 0b00000001

كما يتضح ، فإن الاختلاف الوحيد بين الكود أعلاه والرمز السابق هو أننا في هذا الرمز استخدمنا سجل PORT. يتعامل هذا السجل على وجه التحديد مع تعيينات رقم التعريف الشخصي لهذا المنفذ المعين الذي تم وضعه داخل te MCU. وبالتالي فإنه يمكننا من تعيين منطق البيانات الحقيقية (0 أو 1) لتلك pinouts.

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

الوظيفة 'main' هنا هي المكان الذي يبدأ فيه كل برنامج من برامج C / C ++ التنفيذ. لذلك يمكن إنشاء الرئيسي على النحو التالي:

int main (باطل)
{
}

ومع ذلك ، لتمكين البرنامج من تفسير تفاصيل تسجيل DDR و PORT وعملهما داخل شريحة MCU ، يجب تضمين بيان إضافي قد يتكون من جميع البيانات المتعلقة بـ AVR MCU. ربما نود إضافة هذا التضمين في جميع برامجنا.

#يشمل
int main (باطل)
{
}

بمجرد بدء التجميع ، يركز قسم ما قبل المعالج في المترجم على دليل AVR لتحديد ملف 'io.h'. يشير الامتداد '.h' هنا إلى أنه ملف رأس ، وأن هذا الرمز الموجود داخل الملف سيتم تقديمه في بداية (رأس) الملف المصدر الذي يتم إنشاؤه ، ومن هنا جاء اسم 'header'.

هنا يمكننا تقديم عبارات DDR و PORT في الكود الخاص بنا ، لأن إضافة ملف الرأس io.h كان سيوجه المترجم بخصوصها.

#يشمل

int main (باطل)

{

DDRB = 0b00000001 // إعداد تسجيل اتجاه البيانات pin0 للإخراج والدبابيس المتبقية كمدخلات

PORTB = 0b00000001 // ضبط pin0 إلى 5 فولت

}

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

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

#يشمل

int main (باطل)

{

DDRB = 0b00000001 // إعداد تسجيل اتجاه البيانات pin0 للإخراج والدبابيس المتبقية كمدخلات

PORTB = 0b00000001 // ضبط pin0 إلى 5 فولت

بينما (1)

{

// سيكون الكود هنا إذا احتاج إلى التنفيذ مرارًا وتكرارًا ... إلى ما لا نهاية

}

}

قد ترغب في ملاحظة أننا استخدمنا هنا '1' في شكل وسيطة للحلقة 'while' ، حيث يمكن اعتبار كل شيء باستثناء '0' منطقيًا 'صحيحًا'.

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

يمكن رؤية مؤشر LED قيد التشغيل عبر الدبوس المخصص بشكل دائم طالما أن MCU تتلقى الطاقة عبر Vdd و Vss.

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

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

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

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

كيفية عمل وميض LED باستخدام متحكم AVR

في المناقشة الأخيرة ، تعلمنا كيفية تشغيل مفتاح LED من خلال متحكم دقيق ، كان رائعًا ، أليس كذلك؟ قد لا يكون كثيرا!

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

دعونا نلقي نظرة على هذا:

#يشمل

#يشمل

int main (باطل)

{

DDRB | = 1<< PINB0

بينما (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

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

يتضمن العديد من الخوارزميات المنطقية القياسية مثل AND و OR و NOT و XOR والتي تُستخدم عادةً مع الكود أعلاه.

تقارن هذه الوظائف المنطقية على وجه التحديد بين البتتين '1' و '0' وفقًا لجداول الحقيقة المخصصة لها.

سنحصل على فكرة من خلال تحليل ترتيب البت التالي:

01001011 &
10001101
يساوي
00001001

في الكود أعلاه & يشير إلى AND كما هو مستخدم في برمجة C.

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

إذا قمنا بتقييم الجدول التالي ، فإنه يشير إلى الرمز '|' للدلالة على استخدام وظيفة 'OR' ، '|' يمكن العثور عليها على يسار 'مسافة للخلف' في لوحة مفاتيح الكمبيوتر:

01001011 |
10001101
يساوي
11001111

بشكل مماثل ، يشير جدول الحقيقة هذا لوظيفة منطقية OR إلى أن البتات 0 أو 1 تساوي 1 أو 1 أو 0 تساوي أيضًا 1 أو 0 أو 0 يساوي 0 ، بينما 1 أو 1 يساوي 1.

تركيبة البت التالية مخصصة لعامل التشغيل المنطقي XOR الذي يُشار إليه بالرمز ^ ويمكن دراسته تمامًا كما فعلنا مع جداول الحقيقة AND و OR:

01001011 ^
10001101
يساوي
11000110

دعنا الآن نتابع البرنامج الأول ونتعرف على ما يشير إليه السطر التالي فيه:

#يشمل

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

في هذا 'تضمين' ، يسمح لـ delay.h ببعض الطرق السهلة للتنفيذ.

كما يوحي الاسم ، يتيح لنا delay.h إحداث تأخير في برنامج معين.

يمكن حذف التعبير التالي int main (void) من المناقشة الجارية لأننا قمنا بالفعل بتغطية هذا في مشاركاتنا السابقة.

بعد ذلك يأتي DDRB المتغير.

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

DDRB = 0b00000001

نحن نرغب بدلاً من ذلك في التأثير على بت واحد فقط ، قبعة pin0 bit ، بإلقاء نظرة خاطفة على وظيفة 'OR' التي يمكن تنفيذها من خلال إخفاء ثنائي.

DDRB = DDRB | 0b00000001

هنا محجوب بقناع 'OR': 0b00000001 ، على الرغم من أنه يبدو رقمًا ثنائيًا حقيقيًا ، في حالة DDRB السابقة على سبيل المثال: 0b01001010 ، فإن تطبيق OR على هذا من خلال التقنيع يمكن أن يعطي: 0b01001010 | 0b00000001 = 0b01001011.

الفرق الناتج كما يمكن رؤيته هو فقط مع pin0 ، الذي تغيرت بتات!

يؤدي ضغط العبارة أعلاه بشكل أكبر عبر C ++ إلى:

DDRB | = 0b00000001

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

لذلك إذا كان “DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

لذا نبدأ بالرقم 0b00000000 ، ونضع '1' لإنتاج 0b0000001 ثم ننقله إلى 0 موضعًا على اليسار ، مما يعطي 0b00000001 مطابقًا تمامًا كما هو مذكور أعلاه.

الآن ، إذا افترضنا أنه كان PINB4 ، يمكن التعبير عن البيان كـ 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

احذر من استخدام مؤشر الصفر مما يعني وجود أربعة أصفار بعد '1'.

ننتقل الآن إلى الحلقة 'while' التي لاحظناها عبر 'الحلقة اللانهائية' سابقًا. لكن ربما نريد الآن أن يقوم المتحكم الدقيق بتنفيذ بعض عمليات الإعدام المطلوبة. قد يكون هذا ممكنًا فقط داخل الحلقة المحددة. إنها الحلقة التي يتكرر فيها التسلسل المحدد مرارًا وتكرارًا.

في حالة تنفيذ التنفيذ قبل الحلقة ، فسيتم تنفيذه مرة واحدة فقط.

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

نحن ندرك إجراء الإعداد لبت معين في الرقم الثنائي ، لكننا غير متأكدين من طريقة تطبيق بت معين '0' في حال كان '1' حتى الآن.

يمكن رؤية البرنامج التالي وهو يقوم بذلك ولكننا سنجد أيضًا أنه قد لا يكون مرئيًا في البرنامج.

تقوم العبارتان الأوليان بتغيير البت إلى '1' (5 فولت ، مصابيح LED) ، ثم يتم إيقاف مؤقت لمدة 100 مللي ثانية.

يحول السطران التاليان بت PINB0 إلى '0' (جهد صفري ، إيقاف تشغيل LED) ، ولكن مع الأسف لن تتمكن مقارنة AND من تنفيذ '0' من البت ، ولكن إذا استخدمنا NOT '~' بالنسبة للقناع الثنائي ، يمكن تحويل كل 0 ثانية إلى 1 والعكس صحيح.

سيمكننا ذلك من التأثير فقط على بت PINB0 وقلبه إلى '0'. تم تضمين الأقواس من أجل احتواء تنفيذ التقنيع بحيث يمكن تطبيق العملية NOT على الأقنعة بأكملها وليس فقط على '1' قبل التحول الأيسر '<<”.

بورتب | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

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

PORTB ^ = 1<< PINB0
_delay_ms (100)

انتهى! سيومض مؤشر LED الخاص بك الآن وفقًا للمعدل المحدد ... بسيط ، أليس كذلك؟




زوج من: دائرة التحكم عن بعد للأجهزة المتعددة التالي: طور التيار المتردد ، محايد ، دائرة مؤشر خطأ الأرض