جدول المحتويات:
- الخطوة 1: دعنا ننتقل مباشرة
- الخطوة 2: تحسين الكود - أضف وظيفة
- الخطوة 3: إضافة "تأجيل تكرار الانشغال"
- الخطوة 4: معيار استدعاء إجراء هندسة ARM (AAPCS)
- الخطوة 5: الوظيفة مع المعلمة - الوظائف المتداخلة
- الخطوة 6: إدخال GPIO - إضافة مفاتيح
فيديو: الجزء 2 - تجميع GPIO ARM - RGB - المكالمات الوظيفية - المفاتيح: 6 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
في الجزء الأول ، تعلمنا كيفية تبديل مؤشر LED أحمر واحد على لوحة تطوير MSP432 LaunchPad من شركة Texas Instruments ، باستخدام التجميع بدلاً من C / C ++.
في Instructable ، سنفعل شيئًا مشابهًا - التحكم في RGB LED الموجود أيضًا على نفس اللوحة.
على طول الطريق ، نأمل في زيادة معرفتنا بتجميع ARM ، وليس مجرد الاستمتاع بإضاءة بعض مصابيح LED.
الخطوة 1: دعنا ننتقل مباشرة
حقًا ، الفيديو الأول يوضح كل شيء. ليس هناك الكثير لإضافته.
والهدف الرئيسي منه هو إعادة فكرة أن كل منفذ إدخال / إخراج على MSP432 يتكون من كتلة من عناوين "التسجيل" ، والتي تتكون بدورها من عدة بتات لكل منها.
علاوة على ذلك ، يتم تجميع البتات بطريقة متعامدة. أي أن البتة 0 من كل عنوان سجل تشير إلى نفس رقم التعريف الشخصي I / O الخارجي.
كررنا فكرة أن الأمر يتطلب عدة عناوين تسجيل لهذا المنفذ ، لفعل شيء حتى ولو بت واحد أو دبوس.
ولكن في هذه الحالة ، نظرًا لأننا نتعامل مع RGB LED ، نحتاج إلى التعامل مع ثلاث بتات لكل عنوان تسجيل.
لقد أكدنا أننا بحاجة إلى العديد من السجلات: سجل DIR ، وسجل SEL0 ، وسجل SEL1 ، وسجل الإخراج. وثلاث بتات في كل مرة.
الخطوة 2: تحسين الكود - أضف وظيفة
كما رأيت في الخطوة أعلاه ، كانت حلقة البرنامج الرئيسية تحتوي على الكثير من التعليمات البرمجية المتكررة ، أي عندما نقوم بإيقاف تشغيل مصابيح LED.
لذلك يمكننا إضافة دالة إلى البرنامج. لا يزال يتعين علينا استدعاء هذه الوظيفة في كل مرة نريد إيقاف تشغيل مصابيح LED ، ولكنها تؤدي إلى انهيار بعض الكود إلى عبارة واحدة.
لو كان كود LED-off الخاص بنا أكثر ارتباطًا بالعديد من الإرشادات ، لكان هذا بمثابة توفير حقيقي للذاكرة.
جزء من البرمجة المدمجة ووحدات التحكم الصغيرة هو إدراك حجم البرنامج بشكل أكبر.
يوضح الفيديو.
بشكل أساسي ، نضيف تعليمة متفرعة إلى الكود الرئيسي لدينا ، ولدينا كتلة أخرى من الكود وهي الوظيفة التي نتفرع إليها. وبعد ذلك ، بمجرد أن ننتهي ، أو في نهاية الوظيفة ، نعود إلى العبارة التالية داخل البرنامج الرئيسي.
الخطوة 3: إضافة "تأجيل تكرار الانشغال"
في قسم التعريفات من الكود ، أضف ثابتًا لتسهيل عملية tweek للتوقيت المطلوب:
؛ أي كلمات بعد الفاصلة المنقوطة ("؛") تبدأ تعليقًا.
؛ الرمز في هذا الجزء يعين اسمًا لقيمة. ؛ يمكنك أيضًا استخدام ".equ" لكنها مختلفة قليلاً. ؛ ".equ" (أعتقد) لا يمكن تغييره ، بينما ". set" تعني أنه يمكنك ؛ قم بتغيير قيمة "DLYCNT" لاحقًا في الكود إذا كنت ترغب في ذلك. ؛ سيتم استخدام "DLYCNT" كقيمة للعد التنازلي في الروتين الفرعي للتأخير. مجموعة DLYCNT 0x30000
أضف وظيفة تأخير جديدة:
تأخير:.asmfunc؛ بداية روتين أو وظيفة "تأخير".
MOV R5 ، #DLYCNT ؛ تحميل وحدة المعالجة المركزية الأساسية R5 مع القيمة المعينة إلى "DLYCNT". dlyloop. هذا يشير إلى بداية حلقة التأخير. المجمع يحدد العنوان. SUB R5 ، # 0x1 ؛ اطرح 1 من القيمة الحالية في سجل وحدة المعالجة المركزية الأساسية R5. CMP R5 ، # 0x0 ؛ قارن القيمة الحالية في R5 إلى 0. BGT dlyloop ؛ الفرع إذا كانت القيمة في R5 أكبر من 0 ، لتسمية (العنوان) "dlyloop". BX LR ؛ إذا وصلنا إلى هنا ، فهذا يعني أن قيمة R5 كانت 0. العائد من الروتين الفرعي..endasmfunc؛ يمثل نهاية الروتين الفرعي.
ثم في الجسم الرئيسي ، داخل الحلقة الرئيسية ، استدعاء أو استدعاء وظيفة التأخير هذه:
؛ هذا جزء من الكود ، من الجسم الرئيسي أو الوظيفة الرئيسية (انظر ملف "main.asm").
؛ هذه حلقة في "main" ، وتوضح كيف نستدعي أو نستخدم وظيفة "التأخير" الجديدة. ؛ إن '#REDON' و '#GRNON' هي أيضًا تعريفات (ثوابت) (انظر أعلى 'main.asm'). ؛ إنها مجرد طريقة سهلة لضبط اللون المحدد لـ RGB LED. حلقة MOV R0 ، #REDON ؛ أحمر - ضبط سجل وحدة المعالجة المركزية الأساسية R0 مع القيمة المعينة إلى "REDON". STRB R0 ، [R4] ؛ تم تعيين السجل الأساسي R4 مسبقًا بعنوان إخراج GPIO. ؛ اكتب ما يوجد في R0 ، في العنوان المحدد بواسطة R4. تأخير BL ؛ تفرع إلى وظيفة "التأخير" الجديدة. BL ledsoff ؛ تفرع إلى وظيفة "ledsoff" الموجودة مسبقًا. تأخير BL ؛ كما سبق MOV R0 ، #GRNON ؛ أخضر - كما سبق STRB R0 ، [R4] ؛ وما إلى ذلك وهلم جرا. BL تأخير BL ledsoff BL تأخير
الفيديو يخوض في التفاصيل.
الخطوة 4: معيار استدعاء إجراء هندسة ARM (AAPCS)
ربما يكون هذا هو الوقت المناسب لتقديم شيء ما. إنها اتفاقية لغة التجميع. يُعرف أيضًا باسم معيار استدعاء الإجراء لهندسة ARM.
هناك الكثير لهذا ، لكنه مجرد معيار. لا يمنعنا ذلك من تعلم برمجة التجميع ، ويمكننا اعتماد أجزاء من هذا المعيار أثناء ذهابنا ، بمجرد أن نشعر بالراحة تجاه بعض المفاهيم التي نتعلمها.
خلاف ذلك ، قد نشعر وكأننا نشرب من خرطوم مياه ضخم. الكثير من المعلومات.
السجلات الأساسية
منذ أن أصبحنا على دراية بالسجلات الأساسية لـ MSP432 ، فلنحاول الآن اعتماد بعض هذه المعايير. سنتوافق مع هذا عندما نكتب الوظيفة التالية (تشغيل / إيقاف تشغيل مؤشر LED).
1) من المفترض أن نستخدم R0 كمعامل دالة. إذا كنا نرغب في تمرير قيمة إلى الوظيفة (روتين فرعي) ، فيجب أن نستخدم R0 للقيام بذلك.
2) يتعين علينا استخدام Link Register للغرض المقصود منه - فهو يحتفظ بالعنوان الذي يشير إلى مكان العودة بعد اكتمال الإجراء الفرعي.
سترى كيف نطبق هذه.
الخطوة 5: الوظيفة مع المعلمة - الوظائف المتداخلة
يمكننا تنظيف الكود الخاص بنا وتقليل حجم الذاكرة التي يشغلها من خلال دمج الأقسام المتكررة في وظيفة واحدة. الاختلاف الوحيد في جسم الحلقة الرئيسية هو أننا نحتاج إلى معلمة حتى نتمكن من تمرير الألوان المختلفة المختلفة التي نريد رؤيتها من RGB LED.
ألق نظرة على الفيديو للحصول على التفاصيل. (آسف للطول)
الخطوة 6: إدخال GPIO - إضافة مفاتيح
لنجعله اكثر اهتماما. حان الوقت لإضافة بعض التحكم في التبديل إلى برنامج التجميع الخاص بنا.
يحتوي هذا Instructable على صور توضح كيفية توصيل المحولين الموجودين على اللوحة بـ MSP432.
بشكل أساسي: المحول 1 (SW1 أو S1) متصل بـ P1.1 ، والمحول 2 (SW2 أو S2) متصل بـ P1.4.
هذا يجعل الأمور مثيرة للاهتمام بعض الشيء ، ليس فقط لأننا نتعامل مع المدخلات بدلاً من المخرجات ، ولكن أيضًا لأن هذين المحولين يشغلان أو يشغلان بتتين من نفس كتلة عنوان التسجيل كما يفعل مؤشر LED الأحمر الفردي الذي يعد ناتجًا.
لقد تعاملنا مع تبديل مؤشر LED الأحمر الفردي في Instructable ، لذلك نحتاج فقط إلى إضافة رمز للتعامل مع المفاتيح.
المنفذ 1 سجل كتلة العنوان
تذكر أننا غطينا هذه في Instructable السابق ، لكن علينا تضمين واحدة جديدة:
- عنوان تسجيل إدخال المنفذ 1 = 0x40004C00
- عنوان تسجيل إخراج المنفذ 1 = 0x40004C02
- عنوان تسجيل اتجاه المنفذ 1 = 0x40004C04
- منفذ 1 المقاوم تمكين عنوان التسجيل = 0x40004C06
- المنفذ 1 حدد 0 عنوان التسجيل = 0x40004C0A
- المنفذ 1 حدد 1 عنوان التسجيل = 0x40004C0C
عند استخدام المنافذ كمدخلات ، من الجيد استخدام مقاومات السحب الداخلي أو المنسدلة MSP432.
نظرًا لأن لوحة تطوير Launchpad قد قامت بتوصيل المحولين إلى الأرض (LOW عند الضغط عليها) ، فهذا يعني أنه يجب علينا استخدام مقاومات السحب لأعلى للتأكد من أن لدينا قوة عالية صلبة عندما لا يتم الضغط عليها.
سحب المقاومات لأعلى / اسحب
يتطلب الأمر عنوانين مختلفين من عناوين Port 1 Register لربط مدخلات المحول هذه بمقاومات سحب.
1) استخدم سجل Port 1 Resistor-Enable (0x40004C06) للإشارة فقط إلى أنك تريد مقاومات (لهاتين البتتين) ،
2) ثم استخدم سجل إخراج المنفذ 1 (0x40004C02) لتعيين المقاومات إما على شكل سحب لأعلى أو سحب لأسفل. قد يبدو محيرًا أننا نستخدم سجل الإخراج على المدخلات. سجل المخرجات يشبه الغرض المزدوج تقريبًا.
لذلك ، لإعادة الحالة بطريقة أخرى ، يمكن أن يرسل سجل الإخراج إما مرتفعًا أو منخفضًا لمخرج (مثل مؤشر LED الأحمر الفردي) ، و / أو يتم استخدامه لضبط مقاومات السحب أو المنسدلة للمدخلات ، ولكن فقط إذا تم تمكين هذه الميزة عبر سجل Resistor-Enable.
مهم في ما سبق - عند إرسال / تعيين LOW أو HIGH إلى أي بت إخراج ، ستحتاج إلى الحفاظ على حالة السحب لأعلى / المنسدلة لبتات الإدخال في وقت واحد.
(الفيديو يحاول الشرح)
قراءة بت إدخال المنفذ
- اضبط SEL0 / SEL1 لوظائف GPIO
- قم بتعيين سجل DIR كمدخل لبتات التبديل ، ولكن كإخراج لمصباح LED (في نفس الوقت بنفس البايت)
- تمكين المقاومات
- قم بتعيينها كمقاومات سحب
- اقرأ المنفذ
- قد ترغب في تصفية القيمة المقروءة لعزل البتات التي تحتاجها فقط (التبديل 1 و 2)
موصى به:
الجزء 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 Steps
الجزء 1 ARM Assembly TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: يركز هذا Instructable على وحدة التحكم الدقيقة STM32 Nucleo. الدافع وراء ذلك لتكون قادرًا على إنشاء مشروع تجميع من العظام. سيساعدنا هذا على التعمق في فهم مشروع MSP432 Launchpad (TI-RSLK) الذي يحتوي على
الجزء 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: 6 Steps
الجزء 3: GPIO: ARM Assembly: Line Follower: TI-RSLK: مرحبًا. هذه هي الدفعة التالية حيث نواصل استخدام تجميع ARM (بدلاً من لغة ذات مستوى أعلى). مصدر إلهام Instructable هذا هو Lab 6 من مجموعة أدوات تعلم نظام Texas Instruments Robotics System ، أو TI-RSLK. سنستخدم الميكروفون
استخدام تعبيرات Lambda مع الواجهات الوظيفية في Java: 15 خطوة
استخدام تعبيرات Lambda مع الواجهات الوظيفية في Java: تعد الواجهات الوظيفية في Java أداة مفيدة للغاية لا يستخدمها العديد من المبرمجين الجدد. إنها تسمح للمطورين بتجريد التعليمات البرمجية الخاصة بهم بحيث يمكن تطبيقها على العديد من المشكلات المختلفة. هذا مفيد بشكل خاص مع تعبيرات Lambda التي
ROS MoveIt Robotic Arm الجزء 2: وحدة تحكم الروبوت: 6 خطوات
ROS MoveIt Robotic Arm الجزء 2: وحدة تحكم الروبوت: https://github.com/AIWintermuteAI/ros-moveit-arm.git في الجزء السابق من المقالة ، أنشأنا ملفات URDF و XACRO لذراعنا الآلي وأطلقنا RVIZ للتحكم في ذراع آلية في بيئة محاكاة ، هذه المرة سنفعل ذلك بحقيقة
طرح الدائرة غير الوظيفية: 3 خطوات (بالصور)
دارة غير وظيفية: هذه قطعة زخرفية مصنوعة من عناصر وظيفية تشكل دائرة غير وظيفية. جمالها يكمن في عدم وظيفتها. إذا كانت الكهرباء تتدفق ، أو تومض مصابيح LED ، أو تهتز المحركات أو تقاوم المقاومة ، فسيكون ذلك