جدول المحتويات:
- الخطوة 1: كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة Atmel Studio 7
- الخطوة 2: نقل ملف HEX للبرنامج إلى ذاكرة فلاش للشريحة
- الخطوة 3: تصحيح تبديل الأجهزة
- الخطوة 4: الدائرة الكهربائية
فيديو: متحكم AVR. تبديل LED باستخدام مفتاح زر الضغط. الضغط على زر التصحيح: 4 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:39
في هذا القسم ، سوف نتعلم كيفية إنشاء كود البرنامج C لـ ATMega328PU لتبديل حالة المصابيح الثلاثة وفقًا للإدخال من مفتاح التبديل. أيضًا ، اكتشفنا حلولًا لمشكلة "التبديل الارتداد". كالعادة ، سنقوم بتجميع الدائرة الكهربائية على قاعدة AVR ATmega328 للتحقق من عمل كود البرنامج.
الخطوة 1: كتابة وبناء تطبيق AVR Microcontroller في كود C باستخدام منصة التطوير المتكاملة 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 للبرنامج إلى ذاكرة فلاش للشريحة
قم بتنزيل وتثبيت 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: الدائرة الكهربائية
قم بتوصيل المكونات وفقًا للرسم التخطيطي.
موصى به:
مفتاح WAVE SWITCH باستخدام مفتاح أقل باستخدام 555: 4 خطوات
WAVE SWITCH || TOUCH LESS SWITCH USING 555: مرحبًا بالجميع مرحبًا بكم اليوم أنا أقوم ببناء مفتاح بسيط يعمل باللمس أقل ، يتم تنشيطه فقط من خلال التلويح بيدنا بمساعدة مستشعر الأشعة تحت الحمراء وموقت 555 IC ، لذلك دعونا نبنيها…. نظرًا لأن 555 يعمل كمتجر فليب فلوب
Atollic TrueStudio-Switch على مؤشر LED بالضغط على زر الضغط باستخدام STM32L100: 4 خطوات
Atollic TrueStudio-Switch على مؤشر LED عن طريق الضغط على زر الضغط باستخدام STM32L100: في هذا البرنامج التعليمي الخاص بـ STM32 سأخبرك عن كيفية قراءة دبوس GPIO الخاص بـ STM32L100 ، لذلك سأقوم هنا بعمل توهج على اللوحة بواسطة الضغط على زر الضغط
متحكم AVR. تعديل عرض النبض. متحكم محرك DC وشدة ضوء LED: 6 خطوات
متحكم AVR. تعديل عرض النبض. متحكم محرك التيار المستمر وشدة ضوء LED: مرحبًا بالجميع! يعد تعديل عرض النبض (PWM) تقنية شائعة جدًا في الاتصالات السلكية واللاسلكية والتحكم في الطاقة. يتم استخدامه بشكل شائع للتحكم في الطاقة التي يتم تغذيتها لجهاز كهربائي ، سواء كان محركًا أو مصباح LED أو مكبرات صوت وما إلى ذلك
مفتاح اللمس - كيفية عمل مفتاح اللمس باستخدام الترانزستور ولوحة التوصيل: 4 خطوات
مفتاح اللمس | كيفية عمل مفتاح يعمل باللمس باستخدام الترانزستور ولوحة البريد: مفتاح اللمس هو مشروع بسيط للغاية يعتمد على تطبيق الترانزستورات. يتم استخدام الترانزستور BC547 في هذا المشروع الذي يعمل بمثابة مفتاح اللمس. تأكد من مشاهدة الفيديو الذي سيعطيك التفاصيل الكاملة حول المشروع
كيفية صنع روبوت متحكم به قائم على DTMF - بدون متحكم وبرمجة - تحكم من أي مكان في العالم - RoboGeeks: 15 خطوة
كيفية صنع روبوت متحكم به قائم على DTMF | بدون متحكم وبرمجة | تحكم من أي مكان في العالم | RoboGeeks: هل تريد أن تصنع روبوتًا يمكن التحكم فيه من أي مكان في العالم ، لنفعل ذلك