جدول المحتويات:

متحكم AVR. تبديل LED باستخدام مفتاح زر الضغط. الضغط على زر التصحيح: 4 خطوات
متحكم AVR. تبديل LED باستخدام مفتاح زر الضغط. الضغط على زر التصحيح: 4 خطوات

فيديو: متحكم AVR. تبديل LED باستخدام مفتاح زر الضغط. الضغط على زر التصحيح: 4 خطوات

فيديو: متحكم AVR. تبديل LED باستخدام مفتاح زر الضغط. الضغط على زر التصحيح: 4 خطوات
فيديو: أعلى مستوى وصلتوا في البرمجة 2024, شهر نوفمبر
Anonim
Image
Image

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

الخطوة 1: كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7

كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7
كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7
كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7
كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7
كتابة وبناء تطبيق AVR Microcontroller في C Code باستخدام منصة التطوير المتكاملة Atmel Studio 7
كتابة وبناء تطبيق AVR Microcontroller في C Code باستخدام منصة التطوير المتكاملة Atmel Studio 7

إذا لم يكن لديك برنامج Atmel Studio ، فيجب عليك تنزيله وتثبيته.

www.microchip.com/mplab/avr-support/atmel-studio-7

الأسطر القليلة الأولى لدينا بعض تعريف المترجم.

يحدد F_CPU تردد الساعة بالهرتز وهو شائع في البرامج التي تستخدم مكتبة avr-libc. في هذه الحالة يتم استخدامه بواسطة إجراءات التأخير لتحديد كيفية حساب التأخير الزمني.

#ifndef F_CPU

#define F_CPU 16000000UL // إخبار وحدة التحكم بتردد الكريستال (16 ميجا هرتز AVR ATMega328P) #endif

# تضمين // رأس لتمكين التحكم في تدفق البيانات عبر المسامير. يحدد المسامير والمنافذ وما إلى ذلك.

يعد ملف التضمين الأول جزءًا من avr-libc وسيتم استخدامه في أي مشروع AVR تعمل عليه تقريبًا. سيحدد io.h وحدة المعالجة المركزية التي تستخدمها (وهذا هو سبب تحديد الجزء عند التجميع) ، وبدوره يتضمن رأس تعريف الإدخال / الإخراج المناسب للشريحة التي نستخدمها. إنه يحدد ببساطة الثوابت لجميع المسامير والمنافذ والسجلات الخاصة وما إلى ذلك.

# تضمين // رأس لتمكين وظيفة التأخير في البرنامج

المكتبة تستخدم / delay.h تحتوي على بعض الإجراءات الروتينية للتأخير القصير. الوظيفة التي سنستخدمها هي _delay_ms ().

نستخدم التعريفات للإعلان عن الأزرار ومنافذ LED ودبابيسها. يتيح لنا استخدام عبارات التعريف مثل هذه الحاجة فقط إلى تعديل 3 خطوط يسهل العثور عليها إذا نقلنا مؤشر LED إلى منفذ إدخال / إخراج مختلف أو استخدمنا AVR مختلفًا.

#define BUTTON1 1 // مفتاح زر متصل بالمنفذ B pin 1

#define LED1 0 // Led1 متصل بالمنفذ B pin 0 # تعريف LED2 1 // Led2 متصل بالمنفذ C pin 1 # تعريف LED3 2 // Led3 متصل بالمنفذ D pin 2

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

#define DEBOUNCE_TIME 25 // وقت الانتظار أثناء زر "إزالة الارتداد"

#define LOCK_INPUT_TIME 300 // وقت الانتظار بعد الضغط على الزر

init_ports_mcu باطلة ()

{

يتم استدعاء هذه الوظيفة مرة واحدة فقط في بداية برنامجنا لتهيئة دبابيس الإدخال التي سنستخدمها.

بالنسبة للزر ، سنستخدم سجلات PORT و PIN للكتابة والقراءة. باستخدام AVRs ، نقرأ دبوسًا باستخدام سجل PINx الخاص به ونكتب إلى رقم التعريف الشخصي باستخدام سجل PORTx الخاص به. نحتاج إلى الكتابة إلى زر التسجيل لتمكين عمليات السحب.

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

أولاً ، نقوم بتعيين دبابيس الإدخال / الإخراج الخاصة بمؤشر LED كإخراج باستخدام سجل اتجاه البيانات الخاص بها.

DDRB = 0xFFu ؛ // قم بتعيين كل دبابيس PORTB كإخراج.

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

DDRB & = ~ (1 <

بعد ذلك ، يتم ضبط دبابيس PORTB على ارتفاع (+5 فولت) لتشغيلها. تكون دبابيس الإخراج عالية في البداية ، وبما أن LED الخاص بنا سلكي عالي النشاط ، فسيتم تشغيله ما لم نقم بإيقاف تشغيله صراحة.

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

PORTB = 0xFF ؛ // اضبط جميع دبابيس PORTB على أنها عالية. الصمام قيد التشغيل ،

// أيضًا تم تمكين مقاوم السحب الداخلي لأول دبوس PORTB. DDRC = 0xFFu ؛ // تعيين كافة دبابيس PORTC كإخراج. PORTC = 0x00u ؛ // ضبط جميع دبابيس PORTC منخفضة مما يؤدي إلى إيقاف تشغيله. DDRD = 0xFFu ؛ // قم بتعيين جميع دبابيس PORTD كإخراج. PORTD = 0x00u ؛ // ضبط جميع دبابيس PORTD منخفضة مما يؤدي إلى إيقاف تشغيله. }

حرف button_state غير موقع ()

{

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

الآن ، تذكر أنه عندما نضغط على المفتاح ، يتم سحب دبوس الإخراج إلى الأرض. وبالتالي ، فإننا ننتظر انخفاض الدبوس.

/ * يتم الضغط على الزر عندما يكون BUTTON1 بت واضحًا * /

إذا كان (! (PINB & (1 <

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

_delay_ms (DEBOUNCE_TIME) ،

إذا كان (! (PINB & (1 <

int main (باطل)

{

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

حرف غير موقّع n_led = 1 ؛ // في البداية رقم LED قيد التشغيل الآن

استدعاء الوظيفة لتهيئة دبابيس الإدخال / الإخراج المستخدمة:

init_ports_mcu () ،

حلقة لا نهائية حيث يعمل برنامجنا:

بينما (1)

{

عندما يُرجع button_state واحدًا يشير إلى أنه تم الضغط على الزر وإلغاءه ، ثم تبديل الحالة الحالية لمصابيح LED وفقًا للمعامل n_led.

if (button_state ()) // إذا تم الضغط على الزر ، فقم بتبديل حالة LED والتأخير لمدة 300 مللي ثانية (#define LOCK_INPUT_TIME)

{التبديل (n_led) {الحالة 1: PORTB ^ = (1 << LED1) ؛ PORTC ^ = (1 << LED2) ؛ استراحة؛

تستخدم هذه العبارات عوامل C bitwise. هذه المرة يستخدم عامل التشغيل OR الحصري. عندما تقوم بـ XOR the PORT بقيمة بت للبت الذي تريد تبديله ، يتم تغيير هذا البت دون التأثير على البتات الأخرى.

الحالة 2:

PORTC ^ = (1 << LED2) ؛ PORTD ^ = (1 << LED3) ؛ استراحة؛ الحالة 3: PORTD ^ = (1 << LED3) ؛ PORTB ^ = (1 << LED1) ؛ n_led = 0 ؛ // إعادة تعيين كسر رقم LED ؛ } n_led ++ ؛ // يتم تشغيل LED التالي _delay_ms (LOCK_INPUT_TIME) ؛ }} return (0)؛ }

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

البرمجة كاملة.

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

يمكنك تنزيل ملف main.c مع البرنامج في كود c:

الخطوة 2: نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة

نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة
نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة
نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة
نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة

قم بتنزيل وتثبيت AVRDUDE. أحدث إصدار متاح هو 6.3: قم بتنزيل الملف المضغوط

أولاً ، انسخ الملف السداسي عشرية للبرنامج إلى دليل AVRDUDE. في حالتي هو ButtonAVR.hex

ثم اكتب في نافذة موجه DOS الأمر: avrdude –c [اسم المبرمج] –p m328p –u –U flash: w: [اسم ملف hex الخاص بك].

في حالتي هو: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

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

شاهد الفيديو مع وصف تفصيلي لحرق ذاكرة فلاش متحكم:

حرق ذاكرة فلاش متحكم دقيق …

نعم! الآن ، يعمل الميكروكونترولر وفقًا لتعليمات برنامجنا. دعونا التحقق من ذلك!

الخطوة 3: تصحيح تبديل الأجهزة

تصحيح تبديل الأجهزة
تصحيح تبديل الأجهزة

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

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

الخطوة 4: الدائرة الكهربائية

دائرة كهربائية
دائرة كهربائية
دائرة كهربائية
دائرة كهربائية
دائرة كهربائية
دائرة كهربائية

قم بتوصيل المكونات وفقًا للرسم التخطيطي.

موصى به: