جدول المحتويات:
- الخطوة 1: كشط لوحة المفاتيح 1
- الخطوة 2: كشط لوحة المفاتيح 2
- الخطوة 3: كشط لوحة المفاتيح 3
- الخطوة 4: قم بربط لوحة المفاتيح
- الخطوة 5: قم بتوصيل لوحة المفاتيح بالمحلل الخاص بك
- الخطوة 6: ما هي مفاتيح التبديل التي يجب أن نضعها؟
- الخطوة 7: اكتب معالج المقاطعة
- الخطوة 8: حدد قيم Keypress
- الخطوة 9: التعليمات البرمجية والفيديو للإصدار 1
- الخطوة 10: رمز الإصدار 2
- الخطوة 11: كيف نتخلص من الزر؟ الإصدار 3
- الخطوة 12: التعليمات البرمجية والفيديو لإصدار العمل
فيديو: برنامج AVR Assembler التعليمي 7: 12 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:35
مرحبًا بك في البرنامج التعليمي 7!
سنعرض اليوم أولاً كيفية البحث عن لوحة مفاتيح ، ثم نوضح كيفية استخدام منافذ الإدخال التناظرية للتواصل مع لوحة المفاتيح ، وسنفعل ذلك باستخدام المقاطعات وسلك واحد كمدخل. سنقوم بتوصيل لوحة المفاتيح بحيث ترسل كل ضغطة مفتاح جهدًا فريدًا إلى الإدخال التناظري والذي سيسمح لنا بالتمييز حسب الجهد الذي تم الضغط على المفتاح فيه. ثم سنخرج الرقم الذي تم الضغط عليه لمحلل التسجيل الخاص بنا لإظهار أن كل شيء يحدث كما ينبغي. هناك عدد من المزالق التي يمكنك التعامل معها عند استخدام المحول التناظري إلى الرقمي (ADC) في ATmega328p وهكذا سنقوم خذ الأشياء في مراحل قليلة في الطريق لمحاولة اكتشاف كيفية تجنبها. سنرى أيضًا لماذا لا يعد استخدام المحول التناظري إلى الرقمي هو أفضل طريقة للتحكم في لوحة المفاتيح على الرغم من أنها تستخدم عددًا أقل من المنافذ على وحدة التحكم الدقيقة الخاصة بك. في هذا البرنامج التعليمي ، ستحتاج إلى:
- لوحة مفاتيح. يمكنك شراء واحدة أو يمكنك القيام بما فعلته والبحث عن واحد.
- رأسان من الإناث للوحة المفاتيح (إذا كنت تقوم بمسح واحد)
- توصيل الأسلاك
- لوح التجارب
- 4 1 مقاومات كوم
- 1 15 كوم المقاوم
- 1 3.3 كم المقاوم
- 1180 أوم المقاوم
- 1680 أوم المقاوم
- جهاز رقمي متعدد
- المحلل الخاص بك من البرنامج التعليمي 5
قد ترغب في تخطي الخطوات القليلة الأولى إذا كان لديك بالفعل لوحة مفاتيح ولا تحتاج إلى البحث عن لوحة مفاتيح.
هنا رابط إلى المجموعة الكاملة من دروس مجمّع AVR الخاصة بي:
الخطوة 1: كشط لوحة المفاتيح 1
منذ زمن بعيد ، حتى عندما كان أجدادك مجرد أطفال ، اعتاد الناس على استخدام هذه الأجهزة ذات المظهر الغريب ، والتي تحتوي على كبلات طويلة متصلة بالحائط ، للتواصل مع بعضها البعض. كانت تسمى "هواتف" وعادة ما كانت عبارة عن أشياء بلاستيكية رخيصة تصدر صوتًا مزعجًا عندما اتصل بك شخص ما (لا يعني ذلك أن نغمات رنين "جاستن بيبر" اليوم ليست مزعجة بنفس القدر). على أي حال ، كانت هذه الأجهزة تحتوي على لوحات مفاتيح كانت سلكية بكل بساطة ومن ثم يسهل البحث عنها ولديها مفتاحان إضافيان ("إعادة الاتصال" و "الفلاش") من لوحات المفاتيح التي يمكنك شراؤها والتي قد ترغب في إعادة استخدامها مثل "مفاتيح الأسهم" أو "مفاتيح القائمة" أو أي شيء آخر. لذلك سنبدأ بمسح لوحة المفاتيح من هاتف قديم. أولاً ، خذ الهاتف (أستخدم GE كما هو موضح في الصور) وافصله عن بعضه البعض للكشف عن الأسلاك ، ثم خذ إزميلًا واقطع المقابض البلاستيكية الصغيرة التي تمسك لوحة المفاتيح وقم بإزالة لوحة المفاتيح.
الخطوة 2: كشط لوحة المفاتيح 2
الآن خذ منشار PVC وقم بقص البلاستيك من حول فتحات المفاتيح ثم اقطع حول الحافة للحصول على العمق الصحيح تاركًا لوحة مفاتيح رفيعة.
ثم أعد تشغيل لوحة المفاتيح باستخدام الأوتاد الصغيرة التي تبقى بعد قص الأجزاء العلوية منها في الخطوة الأخيرة واستخدم مكواة لحام لوضع المكواة الساخنة ببساطة في كل فتحة ربط مما يؤدي إلى إذابة البلاستيك ونشره على السطح. الجزء السفلي من لوحة المفاتيح تشكل "مقابض" جديدة والتي ستثبت لوحة المفاتيح في مكانها كما كان من قبل.
أحب البحث عن مكبرات الصوت الثلاثة وربما الأشياء الأخرى مثل المفاتيح وما لا يوجد على السبورة. ومع ذلك ، هذه المرة لن أبحث عن المفاتيح والأشياء لأن لدينا أهدافًا أخرى في الوقت الحالي. أيضًا ، يوجد TA31002 IC خطي هناك وهو عبارة عن جرس هاتف. يمكن العثور على ورقة البيانات وتنزيلها بسهولة عبر الإنترنت مع توفير pinout والميزات. لذلك سأتركه ملحومًا باللوحة في الوقت الحالي ثم ألعب به لاحقًا. أود توصيله بجهاز الذبذبات ومعرفة الإشارات الرائعة التي يمكنني الخروج منها. ربما حتى جعل جرس الباب للخروج منه. من تعرف.
على أي حال بمجرد الانتهاء من تدمير الهاتف وتنظيف الأجزاء ، سننتهي من صنع لوحة المفاتيح الخاصة بنا.
الخطوة 3: كشط لوحة المفاتيح 3
استخدم فتيل إزالة اللحام وقم بإزالة الكابلات الشريطية من أسفل لوحة المفاتيح مع التأكد من أن الفتحات الموجودة في لوحة الدائرة واضحة ثم قم بإرفاق رأسين أنثيين على اللوحة حيث توجد الثقوب. ربما يتعين عليك قص الرؤوس بحيث تكون رؤوس ذات 4 أطراف توصيل.
الآن بعد أن تم توصيل الرؤوس ، يمكنك توصيلها بلوحة توصيل ، وأخذ مقياس متعدد ، واختبار المفاتيح عن طريق لصق جهاز القياس المتعدد عبر دبابيس عشوائية وقياس المقاومة. سيسمح لك ذلك بتخطيط المفاتيح. من الصعب معرفة كيفية توصيل المفاتيح بالمخرجات من خلال النظر إلى الدائرة ، ولكن إذا كنت تستخدم مقياسًا متعددًا ، فيمكنك توصيله بأي دبابيسين ثم الضغط على الأزرار حتى ترى رقمًا على الشاشة بدلاً من دائرة مفتوحة. سيكون هذا هو pinout لهذا المفتاح.
قم بتعيين جميع المفاتيح لإخراج الدبابيس بهذه الطريقة.
الخطوة 4: قم بربط لوحة المفاتيح
الآن اتبع مخطط الأسلاك وقم بتوصيل لوحة المفاتيح بلوحة التجارب.
كيف يعمل هذا هو أننا سنضع 5V في الجانب الأيسر والجانب الأيمن يذهب إلى GND. يدخل الدبوس الأول الموجود على اليمين في الرسم التخطيطي في أول المسامير التناظرية الخاصة بنا في متحكم Atmega328p. عندما لا تكون هناك أزرار مضغوطة ، ستكون الإشارة 0 فولت ، وعندما يتم الضغط على كل زر من الأزرار المختلفة ، سيتراوح الإدخال إلى المنفذ التناظري بين 0 فولت و 5 فولت بكمية مختلفة اعتمادًا على المفتاح الذي تم الضغط عليه. اخترنا قيم المقاوم بحيث يحتوي كل مسار على مقاومة مختلفة عن الباقي. يأخذ المنفذ التناظري في الميكروكونترولر إشارة تناظرية ويقسمها إلى 1024 قناة مختلفة بين 0V و 5V. هذا يعني أن كل قناة لها عرض 5V / 1024 = 0.005 V / channel = 5 mV / channel. لذلك يمكن للمنفذ التناظري أن يميز الفولتية المدخلة طالما أنها تختلف بأكثر من 5 مللي فولت. في حالتنا ، اخترنا قيم المقاوم بحيث يرسل أي ضغطين مفتاحين إشارة جهد تختلف بأكثر من ذلك ، لذا يجب أن يكون المتحكم الدقيق قادرًا بسهولة على تحديد المفتاح الذي تم الضغط عليه. تكمن المشكلة الكبيرة في أن النظام بأكمله صاخب للغاية ، لذا سنحتاج إلى اختيار مجموعة من الفولتية لتعيينها لكل ضغطة زر - لكننا سندخل إلى ذلك لاحقًا.
لاحظ أننا قادرون على التحكم في لوحة مفاتيح ذات 14 زرًا باستخدام خط إدخال واحد فقط إلى وحدة التحكم. هذا هو أحد الجوانب المفيدة للمدخلات التناظرية.
الآن ستكون محاولتنا الأولى للتحكم في لوحة المفاتيح هي الضغط على مفتاح يتسبب في حدوث مقاطعة ، وسوف يقرأ الروتين الفرعي للمقاطعة منفذ الإدخال التناظري ويقرر أي مفتاح تم الضغط عليه ، ثم سيخرج هذا الرقم إلى الروتين الفرعي لمحلل التسجيل الخاص بنا والذي سيعرض القيمة الرئيسية في ثنائي على مصابيح LED الثمانية التي أنشأناها في البرنامج التعليمي 5.
الخطوة 5: قم بتوصيل لوحة المفاتيح بالمحلل الخاص بك
توضح الصور كيف نريد توصيل لوحة المفاتيح بالمتحكم الدقيق حتى نتمكن من رؤية الإخراج على شاشة المحلل لدينا. بشكل أساسي ، نقوم ببساطة بتوصيل الإخراج من لوحة المفاتيح إلى PortC pin 0 ، والذي يُسمى أيضًا ADC0 على ATmega328P.
ومع ذلك ، هناك بعض الأشياء الإضافية. سنقوم أيضًا بتوصيل زر بـ PD2. بمعنى آخر. خذ سلكًا من سكة 5V إلى زر ومن الجانب الآخر من الزر إلى PD2 ، وأخيرًا ، نريد فصل دبوس AREF عن سكة 5V الخاصة بنا وتركه مفصولًا بدلاً من ذلك. يمكننا إدخال مكثف فصل 0.1 ميكرو فاراد إذا أردنا. هذا مكثف خزفي مكتوب عليه 104. أول رقمين هما الرقم وآخر رقم هو أس 10 نضربه في للحصول على إجابة في picofarads (pico تعني 10 ^ -12) ، لذا 104 تعني 10 x 10 ^ 4 picofarads ، وهو نفس 100 نانوفاراد (نانو تعني 10 ^ -9) ، وهو نفس 0.1 ميكروفاراد (يعني الجزئي 10 ^ -6). على أي حال ، كل ما يفعله هو تثبيت دبوس AREF عندما يمكننا استخدامه كدبوس مرجعي.
نريد أيضًا مقاومة 1 Mohm بين PD2 والأرض. سنقوم بتعيين PD2 كدبوس إخراج عند 0 فولت وسنقوم بتشغيل حافة موجبة عند هذا الدبوس. نريد أن تختفي الحافة على الفور عندما نحرر الزر ، لذلك سنقوم بإدخال المقاوم "المنسدل" هذا.
السبب في أننا نريد الزر هو أننا نريد تشغيل المحول التناظري إلى الرقمي الخاص بنا من طرف INT0 على الشريحة ، وهو أيضًا PD2. في النهاية ، نود أن يؤدي الضغط على المفتاح إلى تشغيل ADC وكذلك توفير المدخلات ليتم تحويلها دون الحاجة إلى زر منفصل ، ولكن نظرًا للطريقة التي يعمل بها التوقيت ، سنبدأ من خلال وجود زر منفصل لتشغيل ADC وبمجرد أن نصلح الكل الأخطاء خارجة ونحن واثقون من أن كل شيء يعمل بشكل صحيح ، ثم سنعالج مشكلات الضوضاء والتوقيت التي تأتي مع التشغيل من نفس الزر الذي نريد قراءته.
لذا ، في الوقت الحالي ، الطريقة التي تعمل بها هي أننا سنضغط باستمرار على مفتاح ، ثم نضغط على الزر لتشغيل ADC ، ثم نتركه ونأمل أن تظهر القيمة الثنائية للزر الذي دفعناه على المحلل.
لذلك دعونا نكتب بعض التعليمات البرمجية لتحقيق ذلك.
الخطوة 6: ما هي مفاتيح التبديل التي يجب أن نضعها؟
لنفكر أولاً في كيفية قيامنا بترميز هذا حتى تتمكن وحدة التحكم من قراءة المدخلات من لوحة المفاتيح وتحويلها إلى قيمة عددية تتوافق مع الزر الذي تم الضغط عليه. سنستخدم المحول التناظري إلى الرقمي (ADC) تم تضمينه في Atmega328p. سنستخدم AREF كجهد مرجعي لدينا وسيتم توصيل إخراج لوحة المفاتيح لدينا بـ PortC0 أو PC0. لاحظ أن هذا الدبوس يسمى أيضًا ADC0 للمحول التناظري إلى الرقمي 0. قد تكون فكرة جيدة بالنسبة لك أن تقرأ القسم 12.4 حول المقاطعات لـ ATmega328P وكذلك الفصل 24 حول المحول التناظري إلى الرقمي قبل أن نحصل عليه بدأت أو على الأقل جهّز هذه الأقسام للرجوع إليها. من أجل إعداد المتحكم الدقيق بحيث يعرف ما يجب فعله بإشارة إدخال تناظرية ، وكيفية التفاعل مع برنامجنا ، يتعين علينا أولاً تعيين عدد قليل من ADC المختلفة بتات التسجيل ذات الصلة. هذه هي في الأساس معادلة لمفاتيح التبديل القديمة على أجهزة الكمبيوتر الأولى. إما أن تقوم بتشغيل مفتاح أو إيقاف تشغيله ، أو حتى إلى الخلف ، يمكنك توصيل الكابلات بين منفذ وآخر حتى تجد الإلكترونات التي تصل إلى تلك الشوكة في الطريق بوابة مغلقة وأخرى مفتوحة تجبرها على السير في مسار مختلف في متاهة الدوائر وبالتالي أداء مهمة منطقية مختلفة. عند الترميز بلغة التجميع ، لدينا وصول وثيق إلى وظائف وحدة التحكم الدقيقة هذه ، والتي تعد واحدة من الأشياء الجذابة للقيام بذلك في المقام الأول. إنه أكثر "تدريب عملي" وأقل بكثير ما يحدث "خلف الكواليس" كما كان. لذلك لا تفكر في تعيين هذه السجلات كمهمة شاقة. هذا ما يجعل لغة التجميع ممتعة! نحن نكتسب علاقة شخصية للغاية مع الأعمال الداخلية ومنطق الشريحة ونجعلها تفعل ما نريده بالضبط - لا أكثر ولا أقل. لا توجد دورات على مدار الساعة ضائعة ، فإليك قائمة بالمفاتيح التي نحتاج إلى ضبطها:
- قم بإيقاف تشغيل بت ADC لخفض الطاقة ، PRADC ، وهو بت 0 من سجل PRR ، لأنه إذا كان هذا البت قيد التشغيل ، فسيتم إيقاف تشغيل ADC. يعد سجل تقليل الطاقة في الأساس وسيلة لإغلاق العديد من الأشياء التي تستخدم الطاقة عندما لا تحتاج إليها. نظرًا لأننا نستخدم ADC ، فإننا نريد التأكد من عدم تعطيله بهذه الطريقة. (انظر PRADC في الصفحة 46)
- حدد قناة الإدخال التناظري لتكون ADC0 عن طريق إيقاف تشغيل MUX3… 0 في سجل ADC Multiplexer Selection (ADMUX) (انظر الجدول 24-4 صفحة 249) تم إيقاف تشغيل هذه القنوات افتراضيًا بالفعل ، لذلك لا نحتاج حقًا إلى القيام بذلك. ومع ذلك ، فأنا أقوم بتضمينه لأنه إذا كنت تستخدم منفذًا بخلاف ADC0 ، فستحتاج إلى تبديل هذه المفاتيح وفقًا لذلك. تسمح لك مجموعات متنوعة من MUX3 و MUX2 و MUX1 و MUX0 باستخدام أي من المنافذ التناظرية كمدخلات ويمكنك أيضًا تغييرها أثناء التنقل إذا كنت تريد إلقاء نظرة على مجموعة من الإشارات التناظرية المختلفة في وقت واحد.
- قم بإيقاف تشغيل REFS0 و REFS1 بت في سجل ADMUX حتى نتمكن من استخدام AREF كجهد مرجعي بدلاً من مرجع داخلي (انظر الصفحة 248).
- قم بتشغيل بت ADLAR في ADMUX حتى تكون النتيجة "معدلة لليسار" سنناقش هذا الاختيار في الخطوة التالية.
- قم بتعيين بت ADC0D في سجل تعطيل الإدخال الرقمي (DIDR0) لإيقاف تشغيل الإدخال الرقمي إلى PC0. نحن نستخدم هذا المنفذ للإدخال التناظري لذلك قد نقوم أيضًا بتعطيل الإدخال الرقمي له.
- اضبط ISC0 و ISC1 في سجل التحكم في المقاطعة الخارجية A (EICRA) للإشارة إلى أننا نريد التشغيل عند الحافة الصاعدة لإشارة الجهد إلى طرف INT0 (PD2) ، راجع الصفحة 71.
- امسح البتتين INT0 و INT1 في سجل قناع المقاطعة الخارجية (EIMSK) للإشارة إلى أننا لا نستخدم المقاطعات على هذا الدبوس. إذا أردنا تمكين المقاطعات على هذا الدبوس ، فسنحتاج إلى معالج مقاطعة على العنوان 0x0002 ولكن بدلاً من ذلك نقوم بإعداده بحيث تؤدي الإشارة الموجودة على هذا الدبوس إلى تشغيل تحويل ADC ، والذي تتم معالجة إكماله من خلال مقاطعة تحويل ADC الكاملة عند العنوان 0x002A. راجع الصفحة 72.
- قم بتعيين بت تمكين ADC (ADEN) (بت 7) في عنصر تحكم ADC وسجل الحالة A (ADCSRA) لتمكين ADC. راجع صفحة 249.
- يمكننا بدء تحويل واحد عن طريق تعيين بت تحويل بدء ADC (ADSC) في كل مرة أردنا قراءة الإشارة التناظرية ، ومع ذلك ، في الوقت الحالي ، نفضل قراءتها تلقائيًا عندما يضغط شخص ما على الزر ، لذلك بدلاً من ذلك سنقوم بتمكين ADC Autotrigger تمكين (ADATE) بت في سجل ADCSRA بحيث يتم التشغيل تلقائيًا.
- قمنا أيضًا بتعيين ADPS2..0 بت (بتات AD Prescalar) على 111 بحيث تكون ساعة ADC هي ساعة وحدة المعالجة المركزية مقسومة على عامل 128.
- سنحدد مصدر تشغيل ADC ليكون PD2 والذي يسمى أيضًا INT0 (طلب المقاطعة الخارجية 0). نقوم بذلك عن طريق تبديل البتات المختلفة في سجل ADCSRB (انظر الجدول 24-6 في الصفحة 251). نرى بالجدول أننا نريد إيقاف تشغيل ADTS0 ، وتشغيل ADTS1 ، وإيقاف تشغيل ADTS2 بحيث يقوم ADC بتشغيل هذا الدبوس. لاحظ ما إذا كنا نرغب في اختبار المنفذ التناظري باستمرار كما لو كنا نقرأ بعض الإشارات التناظرية المستمرة (مثل أخذ عينات الصوت أو شيء ما) فسنقوم بتعيين هذا على وضع التشغيل المجاني. الطريقة التي نستخدمها لإعداد التشغيل على PD2 تؤدي إلى قراءة ADC للمنفذ التناظري PC0 دون التسبب في مقاطعة ، وستأتي المقاطعة عند اكتمال التحويل.
- قم بتمكين بت ADC Interrupt Enable (ADIE) في سجل ADCSRA بحيث أنه عند اكتمال التحويل من التناظرية إلى الرقمية ، فإنه سينشئ مقاطعة يمكننا كتابة معالج مقاطعة لها ووضعها في.org 0x002A.
- اضبط I bit في SREG لتمكين المقاطعات.
التمرين 1: تأكد من قراءة الأقسام ذات الصلة في ورقة البيانات لكل من الإعدادات المذكورة أعلاه حتى تفهم ما يجري وما سيحدث إذا قمنا بتغييرها إلى إعدادات بديلة.
الخطوة 7: اكتب معالج المقاطعة
في الخطوة الأخيرة ، رأينا أننا قمنا بإعداده بحيث تؤدي الحافة الصاعدة التي تم اكتشافها في PD2 إلى تشغيل تحويل تناظري إلى رقمي على PC0 وعندما يكتمل هذا التحويل ، فإنه سيؤدي إلى مقاطعة ADC Conversion Complete. الآن نريد أن نفعل شيئًا مع هذه المقاطعة. إذا قمت بفحص الجدول 12-6 في الصفحة 65 ، فسترى قائمة بالمقاطعات المحتملة. لقد رأينا بالفعل مقاطعة RESET على العنوان 0x0000 والمقاطعة Timer / Counter0 Overflow على العنوان 0x0020 في البرامج التعليمية السابقة. الآن نريد أن ننظر إلى مقاطعة ADC التي نراها بالجدول على العنوان 0x002A. لذلك في بداية كود لغة التجميع الخاص بنا ، سنحتاج إلى سطر يقرأ:
.org 0x002Arjmp ADC_int
والتي ستنتقل إلى معالج المقاطعة المسمى ADC_int كلما أكملت ADC التحويل. إذن كيف يجب أن نكتب معالج المقاطعة الخاص بنا؟ الطريقة التي يعمل بها ADC هي عن طريق إجراء الحساب التالي:
ADC = Vin x 1024 / Vref
لذا دعونا نرى ما سيحدث إذا ضغطت على زر "إعادة الاتصال" على لوحة المفاتيح. في هذه الحالة ، سيتغير الجهد على PC0 إلى بعض القيمة ، لنقل 1.52 فولت ، وبما أن Vref عند 5 فولت ، سيكون لدينا:
ADC = (1.52 فولت) × 1024/5 فولت = 311.296
وبالتالي ستظهر على هيئة 311. إذا أردنا تحويل هذا الجهد مرة أخرى إلى جهد ، فسنقوم بعكس العملية الحسابية. لن نحتاج إلى القيام بذلك لأننا لسنا مهتمين بالجهود الفعلية فقط في التمييز بينها. عند الانتهاء من التحويل ، يتم تخزين النتيجة في رقم 10 بت يتم وضعه في سجلات ADCH و ADCL وقد تسببنا في "تعديلها إلى اليسار" مما يعني أن 10 بتات تبدأ عند البت 7 من ADCH وتنزل إلى الأسفل إلى بت 6 من ADCL (يوجد إجمالي 16 بت في هذين المسجلين ونستخدم 10 منها فقط ، أي 1024 قناة). يمكن أن نحصل على النتيجة "مُعدلة بشكل صحيح" إذا أردنا مسح بت ADLAR في سجل ADMUX. السبب الذي جعلنا نختار تعديل اليسار هو أن إشاراتنا متباعدة بما فيه الكفاية بحيث لا يكون آخر رقمين من رقم القناة مناسبين و من المحتمل أن تكون مجرد ضوضاء لذلك سنميز ضغطات المفاتيح باستخدام الأرقام الثمانية العليا فقط ، بمعنى آخر ، سنحتاج فقط إلى إلقاء نظرة على ADCH لمعرفة الزر الذي تم الضغط عليه. لذلك يجب على معالج المقاطعة قراءة الرقم من ADCH قم بالتسجيل ، وقم بتحويل هذا الرقم إلى قيمة لوحة المفاتيح ، ثم أرسل هذه القيمة إلى مصابيح LED الخاصة بمحلل التسجيل حتى نتمكن من التحقق من أن دفع "9" على سبيل المثال ، سيؤدي إلى إضاءة مؤشر LED المقابل لـ "00001001". قبل أن نذهب إلى ذلك على الرغم من أننا نحتاج أولاً إلى رؤية ما يظهر في ADCH عندما نضغط على الأزرار المختلفة. لذلك دعونا نكتب فقط معالج مقاطعة بسيط يرسل فقط محتويات ADCH إلى شاشة المحلل ، لذلك هذا ما نحتاجه:
ADC_int: محلل lds ، ADCH ؛ قم بتحميل قيمة ADCH في محللاتنا B EIFR ، 0 ؛ امسح علامة المقاطعة الخارجية بحيث تكون جاهزة للعودة مرة أخرى
الآن ، يجب أن تكون قادرًا فقط على نسخ الكود من المحلل الخاص بنا في البرنامج التعليمي 5 وإضافة هذه المقاطعة وإعدادات التبديل وتشغيلها. التمرين 2: اكتب الكود وقم بتشغيله. تأكد من حصولك على عرض ADCH على شاشة المحلل الخاص بك. حاول الضغط على نفس المفتاح عدة مرات. هل تحصل دائمًا على نفس القيمة في ADCH؟
الخطوة 8: حدد قيم Keypress
ما علينا فعله الآن هو تحويل القيم في ADCH إلى أرقام مقابلة للمفتاح الذي تم الضغط عليه. نقوم بذلك عن طريق كتابة محتويات ADCH لكل ضغطة مفتاح ثم تحويلها إلى رقم عشري كما فعلت في الصورة. في روتين معالجة المقاطعة الخاص بنا ، سننظر في مجموعة كاملة من القيم تتوافق مع كل ضغطة مفتاح بحيث تقوم ADC بتعيين أي شيء في هذا النطاق إلى ضغطة مفتاح معينة.
التمرين 3: قم بهذا التعيين ثم أعد كتابة روتين مقاطعة ADC.
إليك ما حصلت عليه من أجلي (من المحتمل جدًا أن يكون ما لديكم مختلفًا). لاحظ أنني قمت بإعداده مع مجموعة من القيم لكل ضغطة مفتاح.
ADC_int: ؛ محلل يدوي للمقاطعة الخارجية ؛ التحضير للأرقام الجديدة buttonH ، ADCH ؛ تحديثات ADC عندما تتم قراءة ADCH ، زر clccpi ، 240brlo PC + 3 ؛ إذا كانت ADCH أكبر ، فسيكون محلل 1ldi ، 1 ؛ لذلك تحميل محلل مع عودة 1rjmp ؛ وإرجاع clccpi buttonH ، 230 ؛ إذا كان ADCH أكبر ، ثم محلل 2brlo PC + 3ldi ، وزر 2rjmp return clccpiH ، ومحلل 217brlo PC + 3ldi ، و 3rjmp return clccpi buttonH ، ومحلل 203brlo PC + 3ldi ، و 4rjmp return clccpi buttonH ، 187brlo PC + 3ldi 155brlo PC + 3ldi محلل ، 6rjmp عودة clccpi زر H ، 127brlo PC + 3ldi محلل ، 255 ؛ سنقوم بتعيين الفلاش على أنه كل زر عودة clccpi onrjmp H ، 115brlo PC + 3ldi المحلل ، 7rjmp return clccpi buttonH ، 94brlo PC + 3ldi ، محلل 8rjmp ، زر clccpi العودة 62brlo PC + 3ldi ، 9rjmp return clccpi buttonH ، 37brlo PC + 3ldi ، محلل ، 0b11110000 ؛ النجمة هي النصف العلوي onrjmp return clccpi buttonH ، 28brlo PC + 3ldi المحلل ، 0rjmp return clccpi buttonH ، 17brlo PC + 3ldi ، 0b00001111 ؛ علامة التجزئة هي النصف السفلي onrjmp Return clccpi buttonH ، محلل 5brlo PC + 3ldi ، 0b11000011 ؛ redial هو أعلى 2 أسفل 2rjmp محلل ldi ، 0b11011011 ؛ وإلا حدث خطأ إرجاع: reti
الخطوة 9: التعليمات البرمجية والفيديو للإصدار 1
لقد أرفقت الكود الخاص بي لهذا الإصدار الأول من برنامج تشغيل لوحة المفاتيح. في هذا ، تحتاج إلى الضغط على المفتاح ثم الضغط على الزر لجعل ADC يقرأ الإدخال من لوحة المفاتيح. ما نفضله هو عدم وجود زر ولكن بدلاً من ذلك تأتي الإشارة لإجراء التحويل من الضغط على المفتاح نفسه. التمرين 3: قم بتجميع هذا الرمز وتحميله وجربه. قد تضطر إلى تغيير عتبات التحويل المختلفة لتتوافق مع الفولتية لضغط المفاتيح نظرًا لأنها تختلف عن بلدي على الأرجح. ماذا يحدث إذا حاولت استخدام إدخال من لوحة المفاتيح لكل من ADC0 ولوحة المقاطعة الخارجية بدلاً من الزر؟ سأقوم أيضًا بإرفاق مقطع فيديو لتشغيل هذا الإصدار الأول من برنامج تشغيل الضغط على المفاتيح الخاص بنا. ستلاحظ ذلك يوجد في الكود الخاص بي قسم يقوم بتهيئة Stack Pointer. هناك العديد من السجلات التي قد نرغب في دفعها وإخراجها من المكدس عندما نتعامل مع المتغيرات وما لا ، وهناك أيضًا سجلات قد نرغب في حفظها واستعادتها لاحقًا. على سبيل المثال ، SREG هو سجل لا يتم حفظه عبر المقاطعات ، لذلك يمكن تغيير العلامات المختلفة التي تم تعيينها ومسحها نتيجة للعمليات في حالة حدوث مقاطعة في منتصف شيء ما. لذلك من الأفضل أن تدفع SREG إلى المكدس في بداية معالج المقاطعة ثم تنفصل عنه مرة أخرى في نهاية معالج المقاطعة. لقد وضعته في الكود لإظهار كيفية تهيئته ولتوقع كيف سنحتاجه لاحقًا ولكن نظرًا لأننا لا نهتم بما يحدث لـ SREG أثناء المقاطعات في التعليمات البرمجية الخاصة بنا ، لم أستخدم المكدس لهذا الغرض. أنني استخدمت عملية التحول لتعيين وحدات بت مختلفة في السجلات عند التهيئة. على سبيل المثال في السطر:
ldi temp ، (1 <
الأمر "<<" في السطر الأول من التعليمات البرمجية أعلاه هو عملية إزاحة. يأخذ بشكل أساسي الرقم الثنائي 1 ، وهو 0b00000001 وينقله إلى اليسار بمقدار الرقم ISC01. هذا هو موضع البت المسمى ISC01 في سجل EICRA. نظرًا لأن ISC01 هي بت 1 ، يتم إزاحة الرقم 1 إلى الموضع الأيسر 1 ليصبح 0b00000010. وبالمثل ، فإن الثانية ، ISC00 ، هي بت 0 من EICRA وبالتالي فإن إزاحة الرقم 1 هي صفر مواضع إلى اليسار. إذا ألقي نظرة أخرى على ملف m328Pdef.inc الذي قمت بتنزيله في البرنامج التعليمي الأول وقمت باستخدام evrr منذ ذلك الحين ، فسترى أنه مجرد قائمة طويلة من عبارات ".equ". ستجد أن ISC01 تساوي 1. يستبدل المجمّع كل مثيله بـ 1 قبل أن يبدأ حتى في تجميع أي شيء. إنها مجرد أسماء للتسجيلات لمساعدتنا نحن البشر في قراءة وكتابة التعليمات البرمجية. الآن ، الخط الرأسي بين عمليتي التحول أعلاه هو منطقي "أو" العملية. ها هي المعادلة:
0b00000010 | 0b00000001 = 0b00000011
وهذا ما نقوم بتحميله (باستخدام "ldi") في درجة الحرارة. السبب الذي يجعل الناس يستخدمون هذه الطريقة لتحميل القيم في السجل هو أنها تسمح للشخص باستخدام اسم البت بدلاً من مجرد رقم وهذا يجعل الكود أسهل في القراءة ، وهناك أيضًا طريقتان أخريان استخدمناهما. نستخدم التعليمات "ori" و "andi". تسمح لنا هذه بتات SET و CLEAR على التوالي دون تغيير أي من البتات الأخرى في السجل. على سبيل المثال ، عندما كنت أستخدم
درجة حرارة أوري ، (1
هذه درجة الحرارة "أو" مع 0b00000001 والتي تضع 1 في بت الصفر وتترك كل الباقي دون تغيير. أيضا عندما كتبنا
أندي درجة الحرارة ، 0b11111110
هذا يغير بت الصفر من درجة الحرارة إلى 0 ويترك الباقي دون تغيير.
التمرين 4: يجب أن تمر عبر الكود وتأكد من فهمك لكل سطر. قد تجد أنه من المثير للاهتمام العثور على طرق أفضل للقيام بالأشياء وكتابة برنامج أفضل. هناك مائة طريقة لترميز الأشياء وأنا واثق تمامًا من أنه يمكنك العثور على طريقة أفضل بكثير من طريقة عملي. قد تجد أيضًا أخطاء (لا سمح الله!) وسهو. في هذه الحالة ، أود بالتأكيد أن أسمع عنهم حتى يمكن إصلاحهم.
حسنًا ، لنرى الآن ما إذا كان بإمكاننا التخلص من هذا الزر الزائد …
الخطوة 10: رمز الإصدار 2
إن أبسط طريقة للتخلص من الزر هي إزالته تمامًا ، ونسيان الإدخال إلى PB2 ، ثم قم بتبديل ADC إلى "وضع التشغيل المجاني".
بمعنى آخر ، قم ببساطة بتغيير سجل ADCSRB بحيث يكون كل من ADTS2 و ADTS1 و ADTS0 صفرًا.
ثم اضبط بت ADSC في ADCSRA على 1 والذي سيبدأ التحويل الأول.
الآن قم بتحميله إلى وحدة التحكم الدقيقة الخاصة بك وستجد أن الرقم الصحيح يظهر على الشاشة أثناء الضغط على الزر وفقط أثناء الضغط على الزر. وذلك لأن ADC يقوم باستمرار بأخذ عينات من منفذ ADC0 وعرض القيمة. عندما ترفع إصبعك عن الزر ، فإن "ارتداد الزر" سيتسبب في ظهور بعض القيم العشوائية بسرعة كبيرة ثم يستقر مرة أخرى على الإدخال 0V. في الكود لدينا هذا 0V يظهر كـ 0b11011011 (لأن الضغط على المفتاح "0" يستخدم بالفعل قيمة العرض 0b00000000)
ليس هذا هو الحل الذي نريده لسببين. أولاً ، لا نريد أن نضطر إلى الضغط على الزر. نريد الضغط عليه مرة واحدة وعرض الرقم (أو استخدامه في بعض التعليمات البرمجية الجديدة في برنامج تعليمي لاحق). ثانيًا ، لا نريد اختبار ADC0 باستمرار. نريدها أن تأخذ قراءة واحدة ، وتحويلها ، ثم تنام حتى تؤدي ضغطة مفتاح جديدة إلى إجراء تحويل جديد. يعد وضع التشغيل المجاني هو الأفضل إذا كان الشيء الوحيد الذي تريد أن يفعله الميكروكونترولر هو قراءة بعض المدخلات التناظرية باستمرار - مثل ما إذا كنت تريد عرض درجات الحرارة في الوقت الفعلي أو شيء من هذا القبيل.
فلنبحث عن حل آخر …
الخطوة 11: كيف نتخلص من الزر؟ الإصدار 3
هناك طرق عديدة يمكننا المضي قدمًا. أولاً يمكننا إضافة أجهزة للتخلص من الزر. على سبيل المثال ، قد نحاول وضع ترانزستور في الدائرة عند خط إخراج الضغط على المفتاح بحيث يستغرق هزيلة صغيرة من التيار من الخرج وإرسال نبضة 5 فولت إلى دبوس المقاطعة PD2.
ومع ذلك ، من المحتمل أن يكون ذلك صاخبًا جدًا على الأقل وفي أسوأ الأحوال لن يتيح وقتًا كافيًا لقراءة ضغط مفتاح دقيقة لأن خرج الجهد للوحة المفاتيح لن يكون لديه وقت للاستقرار قبل التقاط قراءة ADC.
لذلك نفضل التوصل إلى حل برمجي. ما نود القيام به هو إضافة مقاطعة على دبوس PD2 وكتابة معالج المقاطعة الذي يستدعي قراءة واحدة لدبوس لوحة المفاتيح. بمعنى آخر ، نتخلص من قاطع التشغيل الآلي من ADC ، ونضيف مقاطعة خارجية تستدعي ADC بداخلها. بهذه الطريقة ، تأتي الإشارة لقراءة ADC بعد أن تكون إشارة PD2 قد حدثت بالفعل ، وقد يمنح هذا الأشياء وقتًا كافيًا للاستقرار إلى جهد دقيق قبل قراءة دبوس PC0 وتحويله. سيظل لدينا مقاطعة إكمال ADC والتي تُخرج النتيجة إلى شاشة المحلل في النهاية.
منطقي؟ حسنًا ، لنفعل ذلك …
ألق نظرة على الكود الجديد المرفق.
ترى التغييرات التالية:
- أضفنا rjmp على العنوان.org 0x0002 للتعامل مع المقاطعة الخارجية INT0
- قمنا بتغيير سجل EIMSK للإشارة إلى أننا نريد مقاطعة دبوس INT0
- قمنا بتغيير رقم التعريف الشخصي ADATE في سجل ADCSRA لتعطيل التشغيل التلقائي
- لقد تخلصنا من إعدادات ADCSRB لأنها غير ذات صلة عند إيقاف تشغيل ADATE
- لم نعد بحاجة إلى إعادة تعيين علامة المشغل الخارجية نظرًا لأن روتين مقاطعة INT0 يقوم بذلك تلقائيًا عند اكتماله - لم يكن لدينا في السابق روتين مقاطعة ، لقد قمنا للتو بتشغيل ADC من إشارة عند هذا الدبوس ، لذلك اضطررنا إلى امسح هذا العلم باليد.
الآن في معالج المقاطعة ، نقوم ببساطة باستدعاء تحويل واحد من ADC.
التمرين 5: قم بتشغيل هذا الإصدار وشاهد ما سيحدث.
الخطوة 12: التعليمات البرمجية والفيديو لإصدار العمل
كما رأينا في الإصدار الأخير ، لا تعمل مقاطعة الزر بشكل جيد للغاية لأن المقاطعة يتم تشغيلها على حافة صاعدة إلى طرف PD2 ثم يستدعي معالج المقاطعة تحويل ADC. ومع ذلك ، فإن ADC يحصل بعد ذلك على قراءة الجهد قبل أن يستقر ، وبالتالي فإنه يقرأ هراء.
ما نحتاجه هو تقديم تأخير بين المقاطعة على PD2 وقراءة ADC على PC0. سنفعل ذلك عن طريق إضافة مؤقت / عداد ، ومقاطعة تجاوز التدفق ، وروتين تأخير. لحسن الحظ ، نحن نعرف بالفعل كيفية القيام بذلك من البرنامج التعليمي 3! لذلك سنقوم فقط بنسخ ولصق الكود ذي الصلة من هناك.
لقد أعطيت الكود الناتج وفيديو يظهره قيد التشغيل.
ستلاحظ أن القراءات ليست دقيقة كما يأمل المرء. من المحتمل أن يكون هذا بسبب عدد من المصادر:
- نحن نضغط من خرج الجهد للوحة المفاتيح للتشغيل على PD2 مما يؤثر على القراءة في PC0.
- لا نعرف حقًا كم من الوقت نتأخر بعد الزناد للحصول على أفضل قراءة.
- يستغرق تحويل ADC بضع دورات حتى يكتمل مما يعني أنه لا يمكننا تسريع إطلاق النار على لوحة المفاتيح.
- ربما يكون هناك ضوضاء في لوحة المفاتيح نفسها.
- إلخ…
لذلك ، على الرغم من أننا نجحنا في تشغيل لوحة المفاتيح ، ويمكننا الآن استخدامها في التطبيقات باستخدام قيم ضغط المفاتيح بطريقة أخرى بدلاً من مجرد إخراجها إلى شاشة المحلل ، إلا أنها ليست دقيقة للغاية وهي مزعجة للغاية. هذا هو السبب في أنني أعتقد أن أفضل طريقة لتوصيل لوحات المفاتيح هي ببساطة لصق كل إخراج من لوحة المفاتيح في منفذ مختلف وتحديد المفتاح الذي يتم الضغط عليه من خلال المنافذ التي ترى الجهد. هذا سهل وسريع ودقيق للغاية.
في الواقع ، هناك سببان فقط وراء رغبة المرء في قيادة لوحة المفاتيح بالطريقة التي فعلناها هنا:
- إنها تستخدم فقط 2 من المسامير الموجودة في وحدة التحكم الدقيقة الخاصة بنا بدلاً من 8.
- إنه مشروع رائع لإظهار جوانب مختلفة من ADC على وحدة التحكم الدقيقة والتي تختلف عن الأشياء القياسية التي يمكنك العثور عليها هناك مثل قراءات درجة الحرارة ، ومقاييس فرق الجهد ، وما إلى ذلك. بدلاً من مجرد تشغيل وضع التهام وحدة المعالجة المركزية مجانًا.
على أي حال ، إليك تمارين أخيرة لك:
التمرين 6: أعد كتابة معالج المقاطعة الكامل لتحويل ADC لاستخدام "جدول البحث". بمعنى آخر. بحيث تختبر القيمة التناظرية مع العنصر الأول في الجدول وإذا كانت أكبر تعود من المقاطعة ، وإذا لم تكن كذلك ، فإنها تزيد Z إلى العنصر التالي في الجدول وتعود الفروع إلى الاختبار مرة أخرى. سيؤدي ذلك إلى تقصير الرمز وتنظيف روتين المقاطعة وجعله يبدو أجمل. (سأقدم حلاً ممكنًا كخطوة تالية) التمرين 7: اربط لوحة المفاتيح الخاصة بك بـ 8 دبابيس على وحدة التحكم الدقيقة واكتب برنامج التشغيل البسيط لها واختبر مدى جمالها. هل يمكنك التفكير في بعض الطرق لجعل طريقتنا تعمل بشكل أفضل؟
هذا كل شيء لهذا البرنامج التعليمي. لقد أرفقت النسخة النهائية بالمؤشرات. بينما نقترب من هدفنا النهائي ، سنستخدم لوحة المفاتيح مرة أخرى في البرنامج التعليمي 9 لإظهار كيفية التحكم في شاشات العرض السبع المقاطع معها (وبناء شيء مثير للاهتمام يستخدم المفاتيح الإضافية على لوحة مفاتيح الهاتف) ثم سنقوم بعد ذلك بدلًا من ذلك ، انتقل إلى التحكم في الأشياء عن طريق الضغط على الأزرار (نظرًا لأن هذه الطريقة تتناسب بشكل أفضل مع المنتج النهائي الذي نقوم ببنائه من خلال هذه البرامج التعليمية) وسنقوم فقط بوضع لوحة المفاتيح على الرف.
أراك المرة القادمة!
موصى به:
برنامج AVR Assembler التعليمي 2: 4 خطوات
برنامج AVR Assembler التعليمي 2: هذا البرنامج التعليمي هو استمرار لـ & quot؛ برنامج AVR Assembler التعليمي 1 & quot؛ إذا لم تكن قد مررت بالبرنامج التعليمي 1 ، فعليك التوقف الآن والقيام بذلك أولاً. في هذا البرنامج التعليمي سنواصل دراستنا لبرمجة لغة التجميع لـ atmega328p u
برنامج AVR Assembler التعليمي 1: 5 خطوات
برنامج AVR Assembler التعليمي 1: لقد قررت كتابة سلسلة من البرامج التعليمية حول كيفية كتابة برامج لغة التجميع لـ Atmega328p وهو المتحكم الدقيق المستخدم في Arduino. إذا ظل الناس مهتمين ، فسأستمر في تخصيص واحد أسبوعيًا أو نحو ذلك حتى نفاد
برنامج AVR Assembler التعليمي 6: 3 خطوات
برنامج AVR Assembler التعليمي 6: مرحبًا بك في البرنامج التعليمي 6! سيكون البرنامج التعليمي اليوم قصيرًا حيث سنطور طريقة بسيطة لتوصيل البيانات بين واحد atmega328p وآخر باستخدام منفذين يربطهما. سنأخذ بعد ذلك بكرة النرد من البرنامج التعليمي 4 والسجل
برنامج AVR Assembler التعليمي 8: 4 خطوات
برنامج AVR Assembler التعليمي 8: مرحبًا بك في البرنامج التعليمي 8! في هذا البرنامج التعليمي القصير ، سنأخذ القليل من التحويل من تقديم جوانب جديدة لبرمجة لغة التجميع لإظهار كيفية نقل مكونات النماذج الأولية الخاصة بنا إلى & quot؛ مطبوعة & quot؛ منفصلة لوحة دائرة كهربائية. ال
برنامج AVR Assembler التعليمي 9: 7 خطوات
برنامج AVR Assembler التعليمي 9: مرحبًا بك في البرنامج التعليمي 9 ، سنعرض اليوم كيفية التحكم في كل من شاشة العرض المكونة من 7 أجزاء والشاشة المكونة من 4 أرقام باستخدام كود لغة التجميع ATmega328P و AVR. أثناء القيام بذلك ، سيتعين علينا إجراء تحويلات إلى كيفية استخدام المكدس