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

تجميع ذراع GPIO - T.I. مجموعة تعلم نظام الروبوتات - معمل 6: 3 خطوات
تجميع ذراع GPIO - T.I. مجموعة تعلم نظام الروبوتات - معمل 6: 3 خطوات

فيديو: تجميع ذراع GPIO - T.I. مجموعة تعلم نظام الروبوتات - معمل 6: 3 خطوات

فيديو: تجميع ذراع GPIO - T.I. مجموعة تعلم نظام الروبوتات - معمل 6: 3 خطوات
فيديو: Meet the Turing Pi 2 - Mix Pis and NVIDIA Jetsons on a Mini ITX Board! 2024, يوليو
Anonim
تجميع ذراع GPIO - T. I. مجموعة تعلم نظام الروبوتات - معمل 6
تجميع ذراع GPIO - T. I. مجموعة تعلم نظام الروبوتات - معمل 6

أهلا،

في Instructable السابق حول تعلم تجميع ARM باستخدام Texas Instruments TI-RSLK (يستخدم متحكم MSP432) ، ويعرف أيضًا باسم Lab 3 إذا كنت تقوم بإجراء TI. بالطبع ، راجعنا بعض الإرشادات الأساسية جدًا مثل الكتابة إلى السجل والتكرار الشرطي. مررنا خلال التنفيذ باستخدام Eclipse IDE.

البرامج الصغيرة التي نفذناها لم تفعل شيئًا للتفاعل مع العالم الخارجي.

نوع من الملل.

دعنا نحاول تغيير ذلك قليلاً اليوم من خلال التعرف قليلاً على منافذ الإدخال / الإخراج ، على وجه التحديد ، دبابيس GPIO الرقمية.

يحدث أن MSP432 يأتي على لوحة تطوير بها بالفعل مفتاحان يعملان بالضغط ، RGB LED ، و LED أحمر ، وكلها مرتبطة ببعض منافذ GPIO.

هذا يعني أنه عندما نتعلم إعداد هذه المسامير ومعالجتها عبر التجميع ، يمكننا رؤية تلك التأثيرات بصريًا.

أكثر إثارة للاهتمام من مجرد التنقّل عبر مصحح الأخطاء.

(ما زلنا في طريقنا - ستكون هذه وظيفة "تأخير"):- D

الخطوة 1: لنحاول الكتابة إلى / القراءة من ذاكرة الوصول العشوائي

قبل أن ننتقل إلى الوصول إلى GPIO والتحكم فيه ، يجب أن نتخذ خطوة صغيرة.

لنبدأ بمجرد القراءة والكتابة إلى عنوان ذاكرة قياسي. نعلم من Instructable السابق (انظر الصور هناك) أن ذاكرة الوصول العشوائي تبدأ من 0x2000 0000 ، لذلك دعونا نستخدم هذا العنوان.

سنقوم بنقل البيانات بين السجل الأساسي (R0) و 0x2000 0000.

نبدأ ببنية ملف أساسية أو محتويات برنامج تجميع. يرجى الرجوع إلى Instructable لإنشاء مشروع تجميع باستخدام TI's Code Composer Studio (CCS) ، وبعض المشاريع النموذجية.

.إبهام

.text.align 2. global main.thumbfunc main main:.asmfunc؛ ---------------------------------- ----------------------------------------------- ؛ (سيظهر رمزنا هنا) ؛ ------------------------------------------ ---------------------------------------.endasmfunc. end

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

مجموعة ACONST 0x20000000 ؛ سنستخدم هذا لأسفل أكثر (إنه ثابت)

؛ من الواضح أن "0x" تشير إلى أن ما يلي هو قيمة سداسية عشرية.

لذا تبدو محتويات ملف البداية الآن كما يلي:

.إبهام

.text.align 2 ACONST.set 0x20000000 ؛ سنستخدم هذا لأسفل أكثر (إنه ثابت) ؛ من الواضح أن '0x' تشير إلى أن ما يلي هو قيمة سداسية عشرية.. global main.thumbfunc main main:.asmfunc؛ --------------------------------------- ------------------------------------------ ؛ (سيظهر رمزنا هنا) ؛ ------------------------------------------ ---------------------------------------.endasmfunc. end

الآن بعد أن أصبح لدينا ما سبق ، دعنا نضيف رمزًا بين الأسطر المتقطعة.

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

ملاحظة: تذكر أنه في الكود ، أي سطر به فاصلة منقوطة ("؛") يعني أنه تعليق بعد تلك الفاصلة المنقوطة.

;-----------------------------------------------------------------------------------------------

؛ جاري الكتابة ؛------------------------------------------------ ----------------------------------------------- MOV R0 ، # 0x55 ؛ سيحتوي السجل الأساسي R0 على البيانات التي نريد كتابتها إلى موقع ذاكرة الوصول العشوائي. ؛ من الواضح أن "0x" تشير إلى أن ما يلي هو قيمة سداسية عشرية.

بعد ذلك ، دعنا نلقي نظرة على العبارات التي لا تعمل.

؛ MOV MOV غير قابل للاستخدام لكتابة البيانات إلى موقع ذاكرة الوصول العشوائي.

؛ MOV هو فقط للبيانات الفورية التي يتم تسجيلها ، أو من سجل إلى آخر ؛ أي ، MOV R1 ، R0. ؛ يجب أن تستخدم STR. ؛ STR R0 = ACONST ؛ مصطلح غير صالح في التعبير ('=') ؛ STR R0 ، 0x20000000 ؛ وضع العنونة غير القانوني لتعليمات المتجر ؛ STR R0 ، ACONST ؛ وضع العنونة غير القانوني لتعليمات المتجر

دون أن نوضح أكثر من اللازم ، حاولنا استخدام كلمة "ACONST" أعلاه. بشكل أساسي ، هو وضع احتياطي أو ثابت بدلاً من استخدام قيمة حرفية مثل 0x20000000.

لم نتمكن من الكتابة للكتابة إلى موقع ذاكرة الوصول العشوائي باستخدام ما ورد أعلاه. لنجرب شيئًا آخر.

؛ يبدو أنه يجب علينا استخدام سجل آخر يحتوي على موقع ذاكرة الوصول العشوائي في

؛ من أجل التخزين في موقع ذاكرة الوصول العشوائي هذا MOV R1 ، # 0x20000000 ؛ اضبط موقع ذاكرة الوصول العشوائي (ليس محتوياته ، ولكن الموقع) في R1. ؛ من الواضح أن '0x' تشير إلى أن ما يلي هو قيمة سداسية عشرية. STR R0، [R1] ؛ اكتب ما يوجد في R0 (0x55) في ذاكرة الوصول العشوائي (0x20000000) باستخدام R1. ؛ نستخدم سجلاً آخر (R1) له عنوان موقع ذاكرة الوصول العشوائي ؛ من أجل الكتابة إلى موقع ذاكرة الوصول العشوائي هذا.

طريقة أخرى للقيام بما ورد أعلاه ، ولكن باستخدام "ACONST" بدلاً من قيمة العنوان الحرفية:

؛ لنفعل ما سبق مرة أخرى ، لكن دعنا نستخدم رمزًا بدلاً من قيمة موقع ذاكرة الوصول العشوائي الحرفية.

؛ نريد استخدام "ACONST" كبديل لـ 0x20000000. ؛ لا يزال يتعين علينا القيام بـ "#" للدلالة على قيمة فورية ، لذلك (انظر في الأعلى) ، كان علينا استخدام التوجيه ".set". ؛ لإثبات ذلك ، دعنا نغير نمط البيانات في R0. MOV R0 ، # 0xAA ؛ حسنًا ، نحن مستعدون للكتابة إلى ذاكرة الوصول العشوائي باستخدام الرمز بدلاً من قيمة العنوان الحرفي MOV R1 ، #ACONST STR R0 ، [R1]

يدخل الفيديو في مزيد من التفاصيل ، بالإضافة إلى التنقل خلال القراءة من موقع الذاكرة.

يمكنك أيضًا عرض ملف المصدر المرفق.

الخطوة 2: بعض معلومات المنافذ الأساسية

Image
Image
بعض معلومات المنافذ الأساسية
بعض معلومات المنافذ الأساسية
بعض معلومات المنافذ الأساسية
بعض معلومات المنافذ الأساسية

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

إذن كيف نتفاعل مع دبابيس GPIO؟ من نظرة سابقة على هذا المتحكم الدقيق وتعليمات ARM الخاصة به ، نعرف كيفية التعامل مع سجلاته الداخلية ، ونعرف كيفية التفاعل مع عناوين الذاكرة (RAM). لكن دبابيس GPIO؟

يحدث أن هذه الدبابيس هي ذاكرة معيَّنة ، لذا يمكننا التعامل معها تمامًا مثل عناوين الذاكرة.

هذا يعني أننا بحاجة إلى معرفة ما هي تلك العناوين.

فيما يلي عناوين بدء المنفذ. بالمناسبة ، بالنسبة لـ MSP432 ، فإن "المنفذ" عبارة عن مجموعة من المسامير ، وليس مجرد دبوس واحد. إذا كنت معتادًا على Raspberry Pi ، أعتقد أن هذا يختلف عن الوضع هنا.

تُظهر الدوائر الزرقاء في الصورة أعلاه الكتابة على السبورة للمفتاحين ومصابيح LED. تشير الخطوط الزرقاء إلى مصابيح LED الفعلية. لن نضطر إلى لمس وصلات العبور الرأسية.

لقد صنعت الموانئ التي نهتم بها بالخط العريض أدناه.

  • GPIO P1: 0x4000 4C00 + 0 (حتى العناوين)
  • GPIO P2: 0x4000 4C00 + 1 (عناوين فردية)
  • GPIO P3: 0x4000 4C00 + 20 (حتى العناوين)
  • GPIO P4: 0x4000 4C00 + 21 (عناوين فردية)
  • GPIO P5: 0x4000 4C00 + 40 (حتى العناوين)
  • GPIO P6: 0x4000 4C00 + 41 (عناوين فردية)
  • GPIO P7: 0x4000 4C00 + 60 (حتى العناوين)
  • GPIO P8: 0x4000 4C00 + 61 (عناوين فردية)
  • GPIO P9: 0x4000 4C00 + 80 (حتى العناوين)
  • GPIO P10: 0x4000 4C00 + 81 (عناوين فردية)

لم ننتهي بعد. نحن بحاجة إلى مزيد من المعلومات.

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

كتل عناوين تسجيل الإدخال / الإخراج

سنحتاج إلى عناوين أخرى ، مثل:

  • عنوان تسجيل إدخال المنفذ 1 = 0x40004C00
  • عنوان تسجيل إخراج المنفذ 1 = 0x40004C02
  • عنوان تسجيل اتجاه المنفذ 1 = 0x40004C04
  • المنفذ 1 حدد 0 عنوان التسجيل = 0x40004C0A
  • المنفذ 1 حدد 1 عنوان التسجيل = 0x40004C0C

وقد نحتاج إلى آخرين.

حسنًا ، نحن نعرف الآن نطاق عناوين تسجيل GPIO للتحكم في مؤشر LED الأحمر الفردي.

ملاحظة مهمة جدًا: كل منفذ إدخال / إخراج على لوحة MSP432 LaunchPad عبارة عن مجموعة من عدة دبابيس أو خطوط (عادةً 8) ، ويمكن تعيين كل منها على حدة كمدخل أو إخراج.

هذا يعني ، على سبيل المثال ، أنك إذا كنت تقوم بتعيين قيم لـ "عنوان تسجيل اتجاه المنفذ 1" ، فأنت بحاجة إلى الاهتمام بالبت (أو البتات) التي تقوم بتعيينها أو تغييرها في هذا العنوان. المزيد عن هذا لاحقًا.

تسلسل برمجة منفذ GPIO

القطعة الأخيرة التي نحتاجها هي عملية أو خوارزمية يجب استخدامها للتحكم في LED.

تهيئة لمرة واحدة:

  • قم بتكوين P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00 ، 0x00 لوظائف GPIO العادية.
  • قم بتعيين بت تسجيل الاتجاه 1 من P1DIRREG كإخراج أو عالي.

حلقة:

اكتب عالية إلى بت 0 من سجل P1OUTREG لتشغيل مؤشر LED الأحمر

  • استدعاء وظيفة تأخير
  • اكتب LOW إلى bit 0 من سجل P1OUTREG لإيقاف تشغيل مؤشر LED الأحمر
  • استدعاء وظيفة تأخير
  • كرر الحلقة

ما هي وظيفة الإدخال / الإخراج (تكوين SEL0 و SEL1)

العديد من المسامير الموجودة على LaunchPad لها استخدامات متعددة. على سبيل المثال ، يمكن أن يكون الدبوس نفسه هو GPIO الرقمي القياسي ، أو يمكن استخدامه أيضًا في الاتصالات التسلسلية UART أو I2C.

من أجل استخدام أي وظيفة محددة لهذا الدبوس ، تحتاج إلى تحديد هذه الوظيفة. تحتاج إلى تكوين وظيفة الدبوس.

توجد صورة أعلاه لهذه الخطوة تحاول شرح هذا المفهوم في شكل مرئي.

تشكل عناوين SEL0 و SEL1 مجموعة زوج تعمل كنوع من اختيار الوظيفة / الميزة.

لأغراضنا ، نريد GPIO رقمي قياسي للبت 0. وهذا يعني أننا نحتاج إلى بت 0 لـ SEL0 و SEL1 ليكون منخفضًا.

تسلسل برمجة المنفذ (مرة أخرى)

1. اكتب 0x00 إلى P1 SEL 0 Register (العنوان 0x40004C0A). هذا يحدد قيمة منخفضة للبت 0

2. اكتب 0x00 إلى P1 SEL 1 Register (العنوان 0x40004C0C). هذا يعين LOW للبت 0 ، إعداد GPIO.

3. اكتب 0x01 إلى P1 DIR Register (العنوان 0x40004C04). يؤدي هذا إلى تعيين قيمة عالية للبت 0 ، مما يعني الإخراج.

4. قم بتشغيل مؤشر LED من خلال كتابة 0x01 إلى P1 OUTPUT Register (العنوان 0x40004C02)

5. القيام بنوع من التأخير (أو مجرد خطوة واحدة خلال التصحيح)

6. قم بإيقاف تشغيل LED عن طريق كتابة 0x00 إلى P1 OUTPUT Register (العنوان 0x40004C02)

7. قم بنوع من التأخير (أو مجرد خطوة واحدة خلال التصحيح)

8. كرر الخطوات من 4 إلى 7.

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

الخطوة الثالثة: هل اكتشفت العيب الوحيد في الفيديو؟

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

شكرًا لك على الوقت الذي قضيته في استعراض هذا Instructable.

التالي يتوسع في ما بدأناه هنا.

موصى به: