תוכן עניינים:

חלק 2 - הרכבה של GPIO ARM - RGB - שיחות פונקציה - מתגים: 6 שלבים
חלק 2 - הרכבה של GPIO ARM - RGB - שיחות פונקציה - מתגים: 6 שלבים

וִידֵאוֹ: חלק 2 - הרכבה של GPIO ARM - RGB - שיחות פונקציה - מתגים: 6 שלבים

וִידֵאוֹ: חלק 2 - הרכבה של GPIO ARM - RGB - שיחות פונקציה - מתגים: 6 שלבים
וִידֵאוֹ: Gledopto WLED Light Bar - מנורה ניתנת להתייחסות - סקירה, שילוב ב-Home Assistant 2024, יולי
Anonim
חלק 2 - הרכבה של זרוע GPIO - RGB - שיחות פונקציה - מתגים
חלק 2 - הרכבה של זרוע GPIO - RGB - שיחות פונקציה - מתגים

בחלק 1 למדנו כיצד להחליף נורית אדומה אחת בלוח הפיתוח MSP432 LaunchPad מטקסס אינסטרומנטס, באמצעות הרכבה במקום C / C ++.

במדריך זה, נעשה דבר דומה - לשלוט על נורית RGB שנמצאת גם היא על אותו לוח.

בדרך, אנו מקווים להרחיב את הידע שלנו בהרכבת ARM, ולא רק שיהיה כיף להדליק כמה נוריות.

שלב 1: בוא נקפוץ ישר פנימה

באמת, הסרטון הראשון אומר הכל. אין הרבה יותר להוסיף.

הנקודה העיקרית בה היא להעלות הביתה את הרעיון שכל יציאת קלט/פלט ב- MSP432 מורכבת מגוש כתובות "רישום", שבתורו מורכב מכמה סיביות כל אחת.

יתר על כן, הביטים מקובצים בצורה אורתוגונלית. כלומר, ביט 0 של כל כתובת רישום מתייחס לאותו פין קלט/פלט חיצוני.

חזרנו על הרעיון שצריך כמה כתובות רישום ליציאה הזו, כדי לעשות משהו אפילו בביט או סיכה אחת.

אבל שבמקרה זה, מכיוון שאנו עוסקים במנורת RGB, עלינו להתמודד עם שלושה סיביות עבור כל כתובת רישום.

חיזקנו כי אנו זקוקים למספר רשמים: רישום DIR, מרשם SEL0, פנקס SEL1 ורשום OUTPUT. ושלוש סיביות בכל פעם.

שלב 2: שפר את הקוד - הוסף פונקציה

Image
Image

כפי שראית בשלב לעיל, ללולאת התוכנית הראשית היה הרבה קוד חוזר, כלומר כאשר אנו מכבים את נוריות הלדים.

כך שנוכל להוסיף פונקציה לתוכנית. אנחנו עדיין צריכים לקרוא לפונקציה הזו בכל פעם שאנו רוצים לכבות את הלדים, אך היא גורמת לחלק מהקוד להתמוטט לאמירה אחת.

אילו קוד ה- LED-off שלנו היה מעורב יותר בהוראות רבות נוספות, זה היה חוסך זיכרון אמיתי.

חלק מתכנות מוטבע ומבקרי מיקרו הוא להיות מודע הרבה יותר לגודל התוכנית.

הסרטון מסביר.

בעיקרו של דבר, אנו מוסיפים משפט הסתעפות לקוד הראשי שלנו, ויש לנו עוד גוש קוד שהוא הפונקציה שאליה אנו מסתעפים. ואז לאחר שסיימנו, או בסיום הפונקציה, אנו מסתעפים בחזרה להצהרה הבאה בתוך התוכנית הראשית.

שלב 3: הוסף עיכוב בלולאה עסוקה

בקטע הצהרות בקוד, הוסף קבוע כדי שיהיה קל לצייץ לתזמון הרצוי:

; כל מילה לאחר חצי נקודה (';') מתחילה הערה.

; הקוד בחלק זה מקצה שם לערך.; היית יכול גם להשתמש ב- '.equ' אבל הם שונים במקצת.; לא ניתן לשנות את '.equ' (אני חושב), ואילו '.set' פירושו שאתה יכול; שנה את הערך של 'DLYCNT' בהמשך הקוד אם תרצה.; 'DLYCNT' ישמש כערך הספירה לאחור בתוכנית המשנה העיכוב. ערכת DLYCNT. 0x30000

הוסף פונקציית עיכוב חדשה:

עיכוב:.asmfunc; תחילת תת -התוכנית או הפונקציה 'עיכוב'.

MOV R5, #DLYCNT; טען ליבה מעבד מרשם R5 עם ערך המוקצה ל- 'DLYCNT'. dlyloop; זה מסמן התחלה של לולאת עיכוב. assembler קובע את הכתובת. 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').; הם רק דרך קלה להגדיר את הצבע שצוין של LED RGB. לולאה MOV R0, #REDON; אדום - הגדר מעבד מרכזי ליבה R0 עם ערך שהוקצה ל'אדום '. STRB R0, [R4]; רשם הליבה R4 נקבע בעבר עם כתובת פלט GPIO.; כתוב את מה שיש ב- R0, לכתובת שצוין על ידי R4. עיכוב BL; ענף לפונקציית ה'השהיה 'החדשה. BL ledsoff; ענף לפונקציית 'ledsoff' קיימת כבר. עיכוב BL; זהה MOV R0, #GRNON; ירוק - זהה STRB R0, [R4]; וכן הלאה. עיכוב BL עיכוב BL ledsoff BL

הסרטון נכנס לפרטי פרטים.

שלב 4: תקן שיחות הליך ARM Architecture (AAPCS)

כנראה שזה זמן טוב להציג משהו. זה כינוס בשפת אסיפה. ידוע גם בשם תקן קריאת נוהל לארכיטקטורת ARM.

יש בזה הרבה, אבל זה רק סטנדרט. זה לא מונע מאיתנו ללמוד תכנות הרכבה, ואנחנו יכולים לאמץ חלקים מהתקן הזה תוך כדי, ברגע שנרגיש בנוח עם כמה מושגים שאנחנו לומדים.

אחרת, אנו עלולים להרגיש כאילו אנו שותים מצינור מים ענק. יותר מדי אינפורמציה.

מרשמי ליבה

מכיוון שהכרנו את רשמי הליבה של MSP432, בואו ננסה לאמץ כעת כמה מהתקנים הללו. נתאים לכך כאשר נכתוב את הפונקציה הבאה (הפעלה / כיבוי של נורית LED).

1) אנו אמורים להשתמש ב- R0 כפרמטר פונקציה. אם ברצוננו להעביר ערך לפונקציה (תת שגרה), עלינו להשתמש ב- R0 לשם כך.

2) עלינו להשתמש ברישום הקישורים למטרתו המיועדת - הוא מחזיק בכתובת המציינת לאן לחזור לאחר השלמת תוכנית המשנה.

תראה כיצד אנו מיישמים את אלה.

שלב 5: פונקציה עם פרמטר - פונקציות מקוננות

אנו יכולים לנקות את הקוד שלנו ולהפחית את כמות הזיכרון שהוא תופס על ידי שילוב חלקים חוזרים לפונקציה אחת. ההבדל היחיד בגוף הלולאה הראשי הוא שאנחנו צריכים פרמטר כדי שנוכל להעביר את הצבעים השונים שאנחנו רוצים לראות של ה- RGB LED.

תסתכל על הסרטון לפרטים. (סליחה על האורך)

שלב 6: קלט GPIO - הוסף מתגים

בואו נעשה את זה יותר מעניין. הגיע הזמן להוסיף קצת בקרת מתג לתוכנית ההרכבה שלנו.

למדריך זה יש תמונות המראות כיצד שני המתגים המשולבים מחוברים ל- MSP432.

בעיקרו: מתג 1 (SW1 או S1) מחובר ל- P1.1, ומתג 2 (SW2 או S2) מחובר ל- P1.4.

זה הופך את העניין למעט מעניין לא רק מכיוון שאנו עוסקים בכניסות במקום ביציאות, אלא גם מכיוון ששני המתגים האלה תופסים או תופסים שני סיביות של אותו בלוק כתובת רגיסטר, כמו גם הנורית האדומה היחידה שהיא פלט.

עסקנו בהחלפת נורית LED אדומה יחידה במדריך זה, כך שעלינו רק להוסיף קוד לטיפול במתגים.

יציאת 1 חסימת כתובת הרשמה

זכור כי סקרנו את אלה בספר ההוראות הקודם, אך עלינו לכלול אחד חדש:

  • כתובת רישום קלט של יציאה 1 = 0x40004C00
  • יציאת 1 כתובת רישום פלט = 0x40004C02
  • כתובת רישום כיוון יציאה 1 = 0x40004C04
  • יציאה 1 Resistor Enable Register address = 0x40004C06
  • יציאה 1 בחר 0 הרשמה כתובת = 0x40004C0A
  • יציאה 1 בחר 1 רישום כתובת = 0x40004C0C

כשמשתמשים ביציאות ככניסות, כדאי להשתמש בנגדים הפנימיים או המשיכים הפנימיים של MSP432.

מכיוון שלוח הפיתוח של Launchpad חיבר את שני המתגים לקרקע (LOW בעת לחיצה), פירוש הדבר שעלינו להשתמש בנגורי משיכה למעלה כדי לוודא שיש לנו HIGH מוצק כאשר הם לא נלחצים.

נגדים למשוך למעלה / למטה

נדרשות שתי כתובות שונות של Port 1 Register כדי לקשור את כניסות המתג האלה לנגירי משיכה.

1) השתמש ברשם הפעלת Resistor 1 אפשר (0x40004C06) רק כדי לציין שאתה רוצה נגדים (עבור שני הביטים האלה), 2) ולאחר מכן השתמש ברשם הפלט של יציאה 1 (0x40004C02) כדי להגדיר את הנגדים כמשוך כלפי מעלה או כמשוך כלפי מטה. זה עשוי להיראות מבלבל כי אנו משתמשים ברישום פלט בכניסות. לרשם הפלט יש כמעט מטרה כפולה.

אז, כדי לקבוע מחדש דרך אחרת, פלט הפלט יכול לשלוח פלט גבוה או נמוך לפלט (כגון הנורית האדומה היחידה), ו / או הוא משמש להגדרת נגדי משיכה כלפי מעלה או משיכה., אך אך ורק אם תכונה זו הופעלה באמצעות הרשם לאפשר התנגדות.

חשוב באמור לעיל-בעת שליחה/הגדרה של LOW או HIGH לכל סיבי פלט, יהיה עליך לשמור על מצב המשיכה/משיכה של סיבי הקלט בו זמנית.

(הסרטון מנסה להסביר)

קריאת ביט קלט יציאה

  • הגדר את SEL0 / SEL1 עבור פונקציונליות GPIO
  • הגדר את רשם ה- DIR כקלט לביסי המתג, אך כפלט עבור הנורית (בו זמנית באותו בייט)
  • אפשר נגדים
  • הגדר אותם כנגדי משיכה
  • קרא את הנמל
  • ייתכן שתרצה לסנן את הערך הנקרא כדי לבודד רק את הביטים הדרושים לך (מתג 1 ו -2)

מוּמלָץ: