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

כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC: 5 שלבים
כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC: 5 שלבים

וִידֵאוֹ: כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC: 5 שלבים

וִידֵאוֹ: כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC: 5 שלבים
וִידֵאוֹ: גישת דופן לרציף עם יאכטה 2024, נוֹבֶמבֶּר
Anonim
כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC
כיצד לפרש את כיוון הסיבוב ממתג סיבוב דיגיטלי באמצעות PIC

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

שלב 1: חלקים

חלקים
חלקים

על מנת ליישם זאת תצטרך: מתג סיבובי (מקודד בריבוע) נגדים למעלה פלטפורמת מיקרו-בקר מתאימה לפרויקט שלי השתמשתי במקודד אופטי גרייהיל 61C22-01-04-02. גיליון הנתונים של המתג הסיבובי דורש נגדי משיכה של 8.2k אוהם בשתי קווי הנתונים המגיעים מהמתג. תרצה לבדוק את גליון הנתונים של המקודד שבו אתה בוחר להשתמש. ניתן להזמין את המתג הסיבובי בו השתמשתי גם באמצעות מתג כפתור צירית. זוהי תכונה שימושית לביצוע בחירות שחויגו וכו ', אך לא אדון בממשק שלה כאן. יש לי רשימת "פלטפורמת מיקרו -בקר מתאימה" מכיוון (לדעתי) ניתן ליישם זאת על יותר מפלטפורמה אחת. ראיתי הרבה אנשים שמשתמשים במיקרו -בקרים אחרים עבור Instructables אז אני רוצה להראות גם את הגישה הכללית. כתבתי את כל הקוד ב- PIC Basic Pro לשימוש עם שבב PIC16F877A Microchip. באמת, הדבר המרכזי שאתה צריך על המיקרו -בקר הוא היכולת להפריע כאשר יש שינוי לוגי בשני הסיכות. ב- PIC16F877A, זה נקרא הפרעה לשינוי PORTB. יתכנו שמות אחרים לזה בבקרים אחרים. תכונת הפרעה זו של מיקרו -בקר היא חלק ממה שהופך את היישום הזה לאלגנטי כל כך.

שלב 2: ממשק חומרה

ממשק חומרה
ממשק חומרה

פתרון "פשוט" יהיה לקבל מתג "קוטב יחיד של 16 מוטות" עם 16 חיבורים אל המיקרו-בקר. כל פלט מתג נקשר אז לסיכה על המיקרו -בקר, כך שכל מיקרוגל יכול להיבדק על ידי הבקר. זהו שימוש מוגזם בסיכות קלט/פלט. העניינים מחמירים עוד יותר אם אנו רוצים שיותר מ- 16 עמדות (מעצרים) יהיו זמינות לנו במתג. כל מיקום נוסף במתג ידרוש קלט נוסף לבקר המיקרו. זה הופך במהירות לשימוש מאוד לא יעיל בכניסות במיקרו בקר. הזן את היופי של המתג הסיבובי. למתג הסיבובי יש רק שתי יציאות לבקר המיקרו המופיע כ- A ו- B בגיליון הנתונים. יש רק ארבע רמות היגיון אפשריות שהקווים האלה יכולים לקחת: AB = 00, 01, 10 ו- 11. זה מקטין מאוד את מספר קווי הכניסה שעליך להשתמש בהם בחיבור המתג למיקרו -בקר. אז, קיצצנו את מספר קווי הכניסה לשניים בלבד. עכשיו מה? נראה שאנו באמת זקוקים ל -16 מצבים שונים אך למתג החדש הזה יש רק ארבע. האם ירינו לעצמנו ברגל? לא. תמשיך לקרוא. נעסוק מעט בתיאוריה העומדת מאחורי פעולת המתג הסיבובי כדי להסביר.

שלב 3: תורת הפעלה של חומרה

תורת חומרה של הפעולה
תורת חומרה של הפעולה
תורת חומרה של הפעולה
תורת חומרה של הפעולה
תורת חומרה של הפעולה
תורת חומרה של הפעולה

חישת כיוון סיבוב אפשרית באמצעות מתג "קוטב יחיד 16 לזרוק" כאמור אך הוא משתמש בכניסות רבות על המיקרו-בקר. השימוש במתג הסיבובי מפחית את מספר הכניסות למיקרו -בקר, אך כעת עלינו לפרש את האותות המגיעים מהמתג ולתרגם אותם לכיוון סיבוב. ציינתי קודם כי המתג היה מקודד בריבוע. זוהי גם אחת האלגנטיות המרכזיות בפתרון זה. המשמעות היא שיש קוד של 2 סיביות שהמתג נותן המתאים למיקום המתג. יתכן שאתה חושב: "אם יש קלט של שני סיביות לבקר המיקרו, כיצד אנו מייצגים את כל 16 העמדות?" זו שאלה טובה. אנחנו לא מייצגים את כולם. אנחנו רק צריכים לדעת את המיקומים היחסיים של הכפתור כדי שנוכל לקבוע את כיוון הסיבוב. המיקום המוחלט של הכפתור אינו רלוונטי. לסיבוב עם כיוון השעון, הקוד שהמתג נותן חוזר על עצמו כל ארבעה מעצרים והוא מקודד באפור. קוד אפור פירושו שיש שינוי ביט אחד בלבד לכל שינוי מיקום. במקום קלט AB לספור לסיבוב עם כיוון השעון בבינארי כמו זה: 00, 01, 10, 11, הוא משתנה כך: 00, 10, 11, 01. שימו לב כי עבור הדפוס האחרון, רק קלט אחד משתנה בין סטים. הערכים נגד כיוון השעון עבור קלט AB למיקרו -בקר ייראו כך: 00, 01, 11, 10. זה פשוט ההפך של התבנית עם כיוון השעון כאשר AB = 00 מופיע קודם. עיין בתרשימים להסבר ויזואלי יותר..

שלב 4: תורת הפעולה של התוכנה

תורת התוכנה של הפעולה
תורת התוכנה של הפעולה

השגרה שמסיקה את כיוון הסיבוב מונעת מפסיקה. המיקרו -בקר שאתה בוחר צריך להיות מסוגל להפריע בכל פעם שיש שינוי באחד משני הפינים (לפחות) כאשר ההפרעה מופעלת. זה נקרא הפרעה לשינוי PORTB ב- PIC16F877A. בכל פעם שהמתג מסובב, המיקרו -בקר יופרע וביצוע התוכנית יישלח לשגרת השירות להפריע (ISR). ה- ISR יבין במהירות באיזה כיוון הסתובב המתג, יציב דגל כראוי ויחזור במהירות לתוכנית הראשית. אנחנו צריכים שזה יקרה מהר למקרה שהמשתמש יסובב את המתג מהר מאוד. אנו יודעים שתבנית ה- AB המקודדת האפורה חוזרת על כל ארבע עמדות, כך שאם נבצע את העבודה השגרתית למעברים בין ארבעת העמדות הללו היא תעבוד עבור כל האחרים. שימו לב שבמחזור אחד של ארבע עמדות, ישנם ארבעה קצוות. קצה עולה וקצה נופל עבור קלט A כמו גם קלט B. המיקרו -מעבד יופרע בכל פעם שיש קצה שמשמעותו שבקר המיקרו יופרע בכל פעם שהכפתור יופנה. כתוצאה מכך, ISR צריך להבין לאיזה כיוון הופנה הכפתור. כדי לעזור לנו להבין כיצד לעשות זאת, אנו פונים לצורת הגל לסיבוב עם כיוון השעון. שים לב שבכל פעם שיש ל- A יתרון, הערך החדש שלו תמיד שונה מזה של B. כאשר הכפתור עובר ממיקום 1 ל- 2, A עובר מ logic-0 ל- logic-1. B עדיין 0 עבור המעבר הזה ואינו תואם את הערך החדש של A. כאשר הכפתור עובר ממיקום 3 ל- 4, ל- A יש קצה נופל בעוד B נשאר בלוגיקה -1. שים לב שוב, כי B והערך החדש של A שונים. כרגע, אנו יכולים לראות שבכל פעם A גורם להפסקה במהלך סיבוב עם כיוון השעון, ערכו החדש שונה מזה של B. בואו נבדוק את B כדי לראות מה קורה. ל- B יש קצה עולה כאשר המתג עובר ממיקום 2 ל- 3. כאן, הערך החדש של B זהה ל- A. במבט על הקצה הנותר אחר לסיבוב עם כיוון השעון, ל- B יש קצה נופל הנע ממיקום 4 ל -5. (מיקום 5 זהה למיקום 1.) הערך החדש של B זהה ל- A גם כאן! כעת נוכל לבצע כמה ניכויים! אם A גורם להפסקה והערך החדש של A שונה מזה של B, הסיבוב היה בכיוון השעון. בנוסף, אם B גורם להפרעה והערך החדש של B זהה ל- A, הסיבוב היה בכיוון השעון. בואו נבדוק במהירות את המקרה של סיבוב נגד כיוון השעון. בדיוק כמו סיבוב עם כיוון השעון, סיבוב נגד כיוון השעון יגרום לארבע הפרעות במחזור אחד: שתיים עבור קלט A ושניים עבור קלט B. לכניסה A יש קצה עולה כאשר הכפתור נע ממיקום 4 ל -3 וקצה נופל ממקום 2 ל -1. כאשר הכפתור נע ממיקום 4 ל -3, הערך החדש של A זהה לערכו של ב. שים לב שכאשר A עובר ממיקום 2 ל -1 הערך החדש שלו זהה גם לערך B. כעת, אנו יכולים לראות שכאשר A גורם להפסקה והערך החדש שלה תואם לזה של B הסיבוב היה נגד כיוון השעון. במהירות, נסתכל על קלט B כדי לאמת את הכל. B יגרום להפסקה כאשר הכפתור עובר ממיקום 5 (שזהה ל 1) ל -4 וכאשר הכפתור נע ממיקום 3 ל 2. בשני המקרים הללו, הערך החדש של B אינו תואם את הערך הקיים. של A שהוא ההיפך מהמקרים בהם B גורם להפסקה לסיבוב עם כיוון השעון. אלו חדשות טובות. הכל מסתדר כמו שצריך. לסיכום, אם A גורם להפרעה והערך החדש שלה אינו תואם לערך B או אם B גורם להפרעה והערך החדש של B תואם לערך A שאנו יודעים שהיתה סיבוב עם כיוון השעון. אנו יכולים לבדוק את שאר המקרים לסיבוב נגד כיוון השעון בתוכנה או שנוכל להניח שמכיוון שזה לא היה סיבוב עם כיוון השעון זה היה נגד כיוון השעון. השגרה שלי פשוט הניחה את ההנחה.

שלב 5: תוכנה

תוֹכנָה
תוֹכנָה
תוֹכנָה
תוֹכנָה

לא השתמשתי בהפרעות המובנות ב- PIC Basic Pro. השתמשתי בכמה קבצים שכללתי בקוד שלי מאת דארל טיילור כדי להניע את השגרה. כאן שייך קרדיט ענק לדארל! הקבצים בחינם. פשוט בקר באתר שלו למידע נוסף, יישומים אחרים והורדת הקבצים. אתה יכול לדלג על חלק זה אם אינך משתמש ב- PIC עם הפרעות של דארל טיילור. פשוט הגדר את ההפסקות לפי הצורך בפלטפורמה שבה אתה משתמש. כדי להגדיר את הפרעות של דארל טיילור (DT) יש שני דברים לעשות: 1.) כלול את קובצי DT_INTS-14.bas ו- ReEnterPBP.bas בקובץ שלך קוד.2.) העתק והדבק את זה לתוך המאקרו שלך. ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMI הכנס כרטיסיות ומרווחים כמו הגרפיקה בסוף ה- Instructable כך שתוכל לראות דברים קצת יותר קלים בקוד שלך. יהיה עליך לשנות אותו מעט כך שיתאים לצרכיך. תחת תווית, החלף את ISR בשם שגרת המשנה שהיא ISR שלך. אל תשכח את קו הדגש! אתה צריך את זה! כדי לגרום להפרעות לפעול, יש עוד שני דברים לעשות: 1.) כתוב את ה- ISR. אתה תכתוב את זה בדיוק כמו שאתה מתכוון לכתוב תת -תוכנית PBP חוץ מזה שתצטרך להוסיף @ INT_RETURN בסוף התת -שגרה במקום RETURN. זה יכיר בביצוע הפרעה ותחזור ביצוע התוכנית למקום שבו היא הפסיקה בלולאה הראשית. בתוך ה- ISR, עליך לנקות את דגל ההפרעה כדי שהתוכנית שלך לא תיתפס להפסקה רקורסיבית. כל שעליך לעשות הוא לקרוא את PORTB כדי לנקות את דגל ההפרעה ב- PIC16F877A. לכל מיקרו -בקר שונה יש דרך לנקות דגלי הפרעה. בדוק את גליון הנתונים של המיקרו -בקר שלך..2) כאשר אתה מגיע לנקודה בקוד שברצונך להפעיל את ההפרעה, השתמש בשורת קוד זו:@ INT_ENABLE RBC_INT כאשר ברצונך להשבית את ההפרעה פשוט השתמש:@ INT_DISABLE RBC_IN יש הרבה של דברים ארוזים במה שכיסיתי אז אסכם במהירות. עד כה התוכנית שלך אמורה להיראות בערך כך:; כל הגדרה או קוד נדרש INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" מאקרו ASMINT_LIST; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, yes endm INT_CREATEENDASM; כל הגדרה או קוד נדרש אחר@ INT_ENABLE RBC_INT; קוד שצריך לדעת לאיזה כיוון הכפתור מסתובב@ INT_DISABLE RBC_INT; קוד אחרEND; סוף תכנית ISR:; קוד ISR כאן@ INT_RETURN (טבלת הגדרת מטפלים) אני חושב שכאן כל מי שאינו משתמש ב- PIC או DT מפריע יכול להצטרף שוב. כעת, עלינו לכתוב למעשה את ה- ISR כך שהמיקרו -בקר יידע לאיזה כיוון הכפתור מסתובב. נזכיר מהקטע של תורת התוכנה שנוכל להסיק את כיוון הסיבוב אם נדע את הקלט שגרם להפרעה, את ערכו החדש ואת ערך הקלט האחר. להלן הפסאודוקוד: קרא את PORTB לתוך משתנה שריטה כדי לנקות את דגל ההפרעה בדוק אם A גרם להפרעה. אם נכון, השווה A ו- B. בדוק אם שונה, אם שונה, זה היה סיבוב עם כיוון השעון אחרת, זה היה נגד השעון EndifCheck אם B גרם להפרעה. אם נכון, השווה A ו- B בדוק אם שונה, אם זהה, זה היה סיבוב עם כיוון השעון אחרת, זה היה נגד השעון EndifReturn from interrupt כיצד אנו יודעים אם שינוי ב- A או B גרם להפרעה? קל לגלות את הערך החדש של הקלט שהשתנה ואת הקלט האחר (ללא שינוי) כיוון שאנו יכולים לקרוא אותם בתוך ה- ISR. עלינו לדעת מה מצבו של כל אחד לפני שההוצאה להורג תישלח לשירות הרשות. זה קורה בשגרה העיקרית. השגרה העיקרית יושבת ומחכה למשתנה בתים שקראנו ל- CWflag להיות מוגדר ל- 1 או לנקות אותו ל- 0 על ידי ה- ISR. לאחר כל שינוי מוכר של הכפתור או אם אין פעילות כפתור, המשתנה מוגדר ל- 5 כדי לציין מצב סרק. אם הדגל מתייצב או מתנקה, השגרה העיקרית מגדילה או מורידה מיד את לחץ הנקודה המבוססת כראוי על הסיבוב ואז מחזירה את משתנה CWflag ל -5 מכיוון שהכפתור שוב סרק. מכיוון שהשגרה העיקרית היא בדיקת CWflag, היא מתעדת גם את מצב ערכי המתג הסיבובי A ו- B. זה ממש פשוט ונראה כך: oldA = AoldB = BT אין כאן שום דבר סופר מפואר. כלול את שתי השורות האלה בתחילת הלולאה הבודקת את סיבוב ה- CWflag. אנחנו רק מעדכנים את ערכי ההיגיון של הכניסות מהכפתור המסתובב בתוך לולאת התוספות/הקטנה בשגרה הראשית, כך שנוכל לראות איזו קלט גרם להפרעה בעת ביצוע ה- ISR. להלן קוד ה- ISR: ABchange: scratch = PORTB 'קרא PORTB כדי לנקות את דגל ההפרעה' אם A גורם להפרעה, בדוק את B לכיוון הסיבוב אם ישן A! = A ואז 'אם A ו- B שונים, זה היה סיבוב עם כיוון השעון IF A! = B THEN GOTO CW 'אחרת, זה היה סיבוב נגד כיוון השעון ELSE GOTO CCW ENDIF ENDIF' אם B גורם להפסקה, בדוק את A לכיוון הסיבוב אם ישן B! = B ואז 'אם A ו- B זהים, זה היה סיבוב עם כיוון השעון אם A == B ואז הלכתי CW 'אחרת, זה היה סיבוב נגד כיוון השעון ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN כללתי את קוד ISR בקובץ AB_ISR.bas מכיוון שהקובץ הכרטיסיות בקוד אינן מופיעות כפי שהן צריכות להופיע. כעת, מכיוון של- ISR יש את הערכים הישנים עבור תשומות A ו- B הוא יכול לקבוע איזו קלט גרם להפרעה, להשוות אותו לקלט השני (ללא שינוי) ולקבוע את הכיוון של סיבוב. כל מה שהשגרה העיקרית צריכה לעשות היא לבדוק את ה- CWflag כדי לראות לאיזה כיוון הכפתור פנה (אם יש לו) ולהגדיל או להקטין מונה, נקודה או כל מה שאתה אוהב או צריך. אני מקווה שזה עזר וגם לא היה. מְבַלבֵּל. ממשק מסוג זה שימושי במיוחד אם המערכת שלך כבר משתמשת בהפרעות מכיוון שזו רק הפרעה נוספת להוספה. תהנה!

מוּמלָץ: