הדרכה להרכבת AVR 7: 12 שלבים
הדרכה להרכבת AVR 7: 12 שלבים

וִידֵאוֹ: הדרכה להרכבת AVR 7: 12 שלבים

וִידֵאוֹ: הדרכה להרכבת AVR 7: 12 שלבים
וִידֵאוֹ: MKS SGEN L V1.0 - A4988 Stepper Drivers 2025, יָנוּאָר
Anonim
מדריך הרכבה של AVR 7
מדריך הרכבה של AVR 7

ברוכים הבאים לשיעור 7!

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

  1. לוח מקשים. אתה יכול לקנות אחד או שאתה יכול לעשות מה שעשיתי ולנקות אחד.
  2. 2 כותרות נקבה ללוח המקשים (אם אתה מוריד אחת)
  3. חיבור חוטים
  4. לוח לחם
  5. 4 1 נגדי קוהם
  6. נגד 15 קוהם
  7. 1 3.3 נגד קוהם
  8. נגד 1 180 אוהם
  9. נגד 1 680 אוהם
  10. מולטימטר דיגיטלי
  11. מנתח שלך מתוך הדרכה 5

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

להלן קישור לאוסף השלם של מדריכי הרכבת AVR שלי:

שלב 1: סרק לוח מקשים 1

סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1
סורק לוח מקשים 1

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

שלב 2: סרוק לוח מקשים 2

סורק לוח מקשים 2
סורק לוח מקשים 2
סורק לוח מקשים 2
סורק לוח מקשים 2
סורק לוח מקשים 2
סורק לוח מקשים 2

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

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

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

בכל מקרה לאחר שתסיים להרוס את הטלפון ולסנן את החלקים נסיים להכין את לוח המקשים שלנו.

שלב 3: סרוק לוח מקשים 3

סורק לוח מקשים 3
סורק לוח מקשים 3
סורק לוח מקשים 3
סורק לוח מקשים 3
סורק לוח מקשים 3
סורק לוח מקשים 3

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

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

מפה את כל המפתחות לסיכות הפלט בצורה זו.

שלב 4: חברו את לוח המקשים

חברו את לוח המקשים
חברו את לוח המקשים
חברו את לוח המקשים
חברו את לוח המקשים

כעת עקוב אחר תרשים החיווט והעבר את לוח המקשים ללוח הלחם שלך.

איך זה הולך לעבוד הוא שנכניס 5V בצד שמאל והצד הימני יגיע ל- GND. הסיכה הראשונה מימין בתרשים נכנסת לסיכה האנלוגית הראשונה שלנו על המיקרו -בקר Atmega328p. כאשר אין לחיצה על לחצנים האות יהיה 0V, וכאשר כל אחד מהלחצנים השונים נלחץ הקלט ליציאה האנלוגית ינוע בין 0V ל- 5V עם כמות שונה בהתאם לאיזה מקש נלחץ. בחרנו את ערכי הנגד כך שכל נתיב יכיל התנגדות שונה מהשאר. היציאה האנלוגית בבקר המיקרו לוקחת אות אנלוגי ומחלקת אותו ל -1024 ערוצים שונים בין 0V ל -5V. המשמעות היא שלכל ערוץ יש רוחב 5V/1024 = 0.005 V/ערוץ = 5 mV/ערוץ. כך שהיציאה האנלוגית יכולה להבחין במתח כניסה כל עוד הם נבדלים ביותר מ -5 mV. במקרה שלנו בחרנו ערכי הנגד כך שכל שתי לחיצות מקשים ישלחו אות מתח השונה מזה יותר כך שבקרוב יכול להיות מסוגל להחליט על איזה מקש נלחץ. הבעיה הגדולה היא שהמערכת כולה רועשת מאוד ולכן נצטרך לבחור טווח מתחים כדי למפות לכל לחיצה על כפתור - אבל ניכנס לזה קצת יותר מאוחר.

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

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

שלב 5: העבר את לוח המקשים למנתח שלך

חבר את לוח המקשים למנתח שלך
חבר את לוח המקשים למנתח שלך
חבר את לוח המקשים למנתח שלך
חבר את לוח המקשים למנתח שלך

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

עם זאת, ישנם מספר דברים נוספים. אנחנו גם הולכים לחבר כפתור ל- PD2. כְּלוֹמַר. קח חוט ממעקה 5V שלך לכפתור ומהצד השני של הכפתור ל- PD2, ולבסוף, אנו רוצים לנתק את סיכת AREF ממעקה 5V שלנו ובמקום זאת להשאיר אותה מנותקת. נוכל להכניס קבל ניתוק של 0.1 מיקרופראד אם נרצה. זהו קבל קרמיקה עליו כתוב 104. שתי הספרות הראשונות הן המספר והספרה האחרונה היא הכוח של 10 שאנו מכפילים אותה בכדי לקבל תשובה בפיקופראדות (פיקו פירושו 10^-12), אז 104 פירושו 10 x 10^4 פיקופרדות, שזהה לזה 100 ננו-פרדות (ננו פירושו 10^-9), שזהה ל -0.1 מיקרופראד (מיקרו פירושו 10^-6). בכל מקרה, כל זה עושה לייצב את סיכת AREF כאשר נוכל להשתמש בה כסיכת ההתייחסות שלנו.

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

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

אז לעת עתה, הדרך שבה היא פועלת היא שנחזיק את המקש לחיצה ממושכת, לאחר מכן נלחץ על הכפתור כדי להפעיל את ה- ADC, ואז נרפה ולקוות שהערך הבינארי של הכפתור שדחפנו יופיע על מנתח.

אז בואו נכתוב קוד שישיג זאת.

שלב 6: אילו מתגים להחלפה עלינו להגדיר?

אילו מתגי החלפה עלינו להגדיר?
אילו מתגי החלפה עלינו להגדיר?

בואו נחשוב קודם כל כיצד אנו הולכים לקודד את זה כך שהבקר יוכל לקרוא את הקלט ממקלדת המקשים ולהפוך אותו לערך מספרי המתאים ללחצן שנלחץ עליו. אנו הולכים להשתמש בממיר אנלוגי לדיגיטל (ADC). שנבנה ב- Atmega328p. אנו נשתמש ב- AREF כמתח ההתייחסות שלנו ופלט לוח המקשים שלנו יחובר ל- PortC0 או PC0. שים לב שסיכה זו נקראת גם ADC0 עבור ממיר אנלוגי לדיגיטל 0. אולי כדאי שתקרא את סעיף 12.4 על הפרעות עבור ATmega328P וגם את פרק 24 בממיר אנלוגי לדיגיטלי לפני שנקבל התחילו או לפחות שהקטעים האלה יהיו מוכנים לעיון. על מנת להגדיר את המיקרו -בקר כך שידע מה לעשות עם אות קלט אנלוגי וכיצד לתקשר עם התוכנית שלנו, תחילה עלינו להגדיר כמה מה- ADC השונים. סיביות רגיסטר קשורות. אלה שווים למעשה למתגי ההחלפה הישנים במחשבים הראשונים. או שתפעיל את המתג למצב כבוי או כבוי, או עוד יותר אחורה תחבר כבלים בין שקע אחד לשני כך שאלקטרונים שיגיעו למזלג הזה בכביש ימצאו שער אחד סגור ושער פתוח יאלץ אותו במסלול אחר במבוך של מעגלים ובכך מבצעים משימה לוגית אחרת. בעת קידוד בשפת הרכבה יש לנו גישה קרובה לפונקציות האלה של המיקרו -בקר שהוא אחד הדברים האטרקטיביים בביצועו מלכתחילה. זה יותר "ידיים על" והרבה פחות קורה "מאחורי הקלעים" כביכול. אז אל תחשוב להגדיר את הרישומים האלה כמשימה מייגעת. זה מה שהופך את שפת ההרכבה למעניינת! אנו רוכשים מערכת יחסים אישית מאוד עם הפעולות הפנימיות וההיגיון של השבב וגורמים לו לעשות בדיוק מה שאנחנו רוצים - לא יותר ולא פחות. אין מחזורי שעון מבוזבזים. אז הנה רשימה של המתגים שעלינו להגדיר:

  1. כבה את סיביות ה- ADC להפחתת חשמל, PRADC, שהיא סיביה 0 ברשם ה- PRR, שכן אם סיבית זו מופעלת היא תכבה את ה- ADC. מרשם הפחתת החשמל הוא בעצם דרך לכבות דברים שונים שמשתמשים בחשמל כאשר אינך צריך אותם. מכיוון שאנו משתמשים ב- ADC אנו רוצים לוודא שהוא אינו מושבת בדרך זו. (ראה PRADC בעמוד 46)
  2. בחר את ערוץ הקלט האנלוגי שיהיה ADC0 על ידי כיבוי MUX3… 0 ברשם ADC Multiplexer Selection (ADMUX) (ראה טבלה 24-4 עמ '249) אלה כבר כבויים כברירת מחדל, כך שאנחנו לא באמת צריכים לעשות זאת. עם זאת, אני כולל אותו מכיוון שאם תשתמש פעם ביציאה שאינה ADC0, יהיה עליך להחליף את המתגים הללו בהתאם. שילובים שונים של MUX3, MUX2, MUX1, MUX0 מאפשרים לך להשתמש בכל אחת מהיציאות האנלוגיות כקלט שלך ותוכל לשנות אותן גם אם ברצונך להסתכל על חבורת אותות אנלוגיים שונים בבת אחת.
  3. כבה את הביטים REFS0 ו- REFS1 ברשם ADMUX כך שנשתמש ב- AREF כמתח ההתייחסות שלנו ולא בהפניה פנימית (ראה עמוד 248).
  4. הפעל את bit ADLAR ב- ADMUX כך שהתוצאה "מותאמת לשמאל" נדון בבחירה זו בשלב הבא.
  5. הגדר את ביט ה- ADC0D ברשם השבתת הקלט הדיגיטלי (DIDR0) כדי לכבות את הקלט הדיגיטלי ל- PC0. אנו משתמשים ביציאה זו לקלט אנלוגי, כך שנוכל להשבית את הקלט הדיגיטלי עבורה.
  6. הגדר את ISC0 ו- ISC1 במרשם הפיקוח החיצוני A (EICRA) כדי לציין שאנחנו רוצים להפעיל בקצה העולה של אות מתח לסיכה INT0 (PD2), ראה עמוד 71.
  7. נקה סיביות INT0 ו- INT1 במרשם מסכות ההפרעות החיצוניות (EIMSK) כדי לציין שאיננו משתמשים בהפרעות בסיכה זו. אם היינו מאפשרים הפרעות בסיכה זו היינו זקוקים למטפל להפרעה בכתובת 0x0002 אך במקום זאת אנו מגדירים אותה כך שאות בסיכה זו מפעילה את המרת ה- ADC, שהשלמתה מטופלת על ידי המרת ה- ADC להפריעה מלאה בשעה כתובת 0x002A. ראה עמוד 72.
  8. הגדר את סיביות ה- ADC Enable (ADEN) (bit 7) בבקרת ה- ADC וברשם הסטטוסים A (ADCSRA) כדי לאפשר את ה- ADC. ראה עמוד 249.
  9. נוכל להתחיל בהמרה אחת על ידי הגדרת ביט ההמרה ADC להתחיל (ADSC) בכל פעם שרצינו לקרוא את האות האנלוגי, אולם לעת עתה נעדיף לקרוא אותו אוטומטית בכל פעם שמישהו ילחץ על הכפתור, כך שבמקום זאת נאפשר את ה- ADC Autotrigger Enable (ADATE) bit in register ADCSRA כך שההפעלה תתבצע באופן אוטומטי.
  10. הגדרנו גם את הביטים ADPS2..0 (הסיביות Prescalar AD) ל -111 כך ששעון ה- ADC הוא שעון ה- CPU המחולק בפקטור של 128.
  11. אנו נבחר את מקור ההפעלה של ADC להיות PD2 הנקרא גם INT0 (External Request Request 0). אנו עושים זאת על ידי החלפת הביטים השונים במרשם ADCSRB (ראה טבלה 24-6 בעמוד 251). אנו רואים לפי הטבלה שאנו רוצים ש- ADTS0 כבוי, ADTS1 מופעל ו- ADTS2 כבוי כך שה- ADC יפעיל את הסיכה הזו. שים לב שאם נרצה לדגום ברציפות את היציאה האנלוגית כמו אם היינו קוראים איזה אות אנלוגי רציף (כמו דגימת צליל או משהו) היינו מגדירים זאת למצב הפעלה חופשית. השיטה בה אנו משתמשים להגדרת ההפעלה ב- PD2 מפעילה קריאת ADC של היציאה האנלוגית PC0 מבלי לגרום להפסקה. ההפרעה תבוא לאחר השלמת ההמרה.
  12. הפעל את ביט ADC Interrupt Enable (ADIE) ברישום ADCSRA כך שכאשר ההמרה האנלוגית לדיגיטל תסתיים היא תיצור הפרעה שאנו יכולים לכתוב עבורה מטפל ולהכניס ל-.org 0x002A.
  13. הגדר את ה- I bit ב- SREG כדי לאפשר הפרעות.

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

שלב 7: כתוב את ה- Interrupt Handler

בשלב האחרון ראינו שהגדרנו אותו כך שקצה עולה שיזוהה ב- PD2 יפעיל המרה אנלוגית לדיגיטל ב- PC0 וכאשר ההמרה תושלם היא תזרק הפרעה מלאה ל- ADC. עכשיו אנחנו רוצים לעשות משהו עם ההפסקה הזו. אם תבחן את לוח 12-6 בעמוד 65 תראה רשימה של ההפרעות האפשריות. כבר ראינו את הפרעה של RESET בכתובת 0x0000 ואת הפרעת הצפה של טיימר/מונה 0 בכתובת 0x0020 בהדרכות קודמות. עכשיו אנחנו רוצים להסתכל על הפרעה ל- ADC שאנו רואים לפי הטבלה בכתובת 0x002A. אז בתחילת קוד שפת ההרכבה נזדקק לשורה שכתוב עליה:

.org 0x002Arjmp ADC_int

אשר יקפוץ למטפל הפרעות שלנו שכותרתו ADC_int בכל פעם שה- ADC השלים המרה. אז כיצד עלינו לכתוב את מטפל ההפרעות שלנו? אופן הפעולה של ה- ADC הוא על ידי ביצוע החישוב הבא:

ADC = Vin x 1024 / Vref

אז בוא נראה מה יקרה אם אני לוחץ על כפתור "חיוג חוזר" בלוח המקשים. במקרה זה המתח ב- PC0 ישתנה לערך כלשהו, נניח 1.52V, ומכיוון ש- Vref הוא ב- 5V יהיה לנו:

ADC = (1.52V) x 1024 / 5V = 311.296

וכך הוא יופיע כ- 311. אם נרצה להחזיר את זה למתח היינו פשוט הופכים את החישוב. אולם לא נצטרך לעשות זאת מכיוון שאיננו מעוניינים במתחים בפועל רק בהבחנה ביניהם. עם סיום ההמרה, התוצאה מאוחסנת במספר 10 סיביות הממוקם ברשמי ADCH ו- ADCL וגרמנו לה להיות "מותאמת שמאל" מה שאומר ש- 10 הסיביות מתחילות בביט 7 של ADCH ויורדות ל- ביט 6 של ADCL (ישנם שני סיביות בסך הכל בשני האגרים האלה ואנו משתמשים רק ב 10 מהם, כלומר 1024 ערוצים). נוכל לקבל את התוצאה "מותאמת ימינה" אם נרצה על ידי ניקוי ביט ה- ADLAR ברשם ADMUX. הסיבה שאנו בוחרים שמאלה מותאמת היא מכיוון שהאותות שלנו רחוקים זה מזה עד ששתי הספרות האחרונות של מספר הערוץ אינן רלוונטיות ו סביר להניח שהם רק רעש, כך שנבחין בלחיצות הלחיצה באמצעות 8 הספרות העליונות בלבד, במילים אחרות, נצטרך להסתכל רק על ADCH כדי להבין איזה כפתור נלחץ. רשום, המיר את המספר הזה לערך לוח מקשים, ולאחר מכן שלח את הערך לנוריות הניתוח של מנתח הרשם שלנו, כך שנוכל לוודא כי לחיצה על אמירה "9" תגרום להאיר את נוריות ה- LED המתאימות ל "00001001". לפני שנלך למרות שאנו צריכים קודם כל לראות מה מופיע ב- ADCH כאשר אנו לוחצים על הכפתורים השונים. אז בואו נכתוב מטפל פשוט להעביר פשוט את התוכן של ADCH לתצוגת המנתח. אז הנה מה שאנחנו צריכים:

ADC_int: lds מנתח, ADCH; טען את הערך של ADCH לתוך ה- analyserbi EIFR שלנו, 0; נקה את דגל ההפרעה החיצוני כך שהוא יהיה מוכן לחזור שוב

כעת, אתה אמור להיות מסוגל פשוט להעתיק את הקוד ממנתח שלנו במדריך 5 ולהוסיף את הפרעה הזו ואת הגדרות ההחלפה ולהפעיל אותו. תרגיל 2: כתוב את הקוד והפעל אותו. ודא שאתה מציג את ADCH בתצוגת המנתח שלך. נסה ללחוץ על אותה מקש מספר פעמים. האם אתה תמיד מקבל את אותו ערך ב- ADCH?

שלב 8: מפה את ערכי הלחיצה

מפה את ערכי הלחיצה
מפה את ערכי הלחיצה

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

תרגיל 3: בצע את המיפוי הזה ולאחר מכן כתוב מחדש את שגרת הפרעות ה- ADC שלך.

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

ADC_int:; מנתח מטפל clr חיצוני; התכונן לכפתור מספרים חדשים H, ADCH; ADC מתעדכן כאשר ADCH נקרא כפתור clccpi H, 240brlo PC+3; אם ADCH גדול יותר אז זה מנתח 1ldi, 1; אז מנתח עומס עם החזרה של 1rjmp; ולחזור כפתור clccpi H, 230; אם ADCH גדול יותר אז מנתח 2brlo PC+3ldi, כפתור clccpi 2rjmp H, מנתח 217brlo+3ldi מנתח, כפתור clccpi 3rjmp H, 203brlo PC+3ldi מנתח, כפתור clccpi 4rjmp H, 187brlo PC+3ldi מנתח, 5rjmp החזר clccpi H, מנתח 155brlo PC+3ldi, כפתור clccpi 6rjmp returnH, 127brlo PC+3ldi מנתח, 255; אנו נקבע פלאש כמו כל כפתור החזרה clccpi on, H, 115brlo PC+3ldi מנתח, 7rjmp החזרה clccpi H, 94brlo PC+3ldi מנתח, 8rjmp החזרה clccpi כפתור, 62brlo PC+3ldi מנתח, 9rjmp החזרה clccpi H, 37brlo PC+3ldi מנתח, 0b11110000; הכוכבית היא כפתור החזרה העליון של ה- clccpi בחצי העליון H, מנתח 28brlo PC+3ldi, 0rjmp return clccpi H, 17brlo PC+3ldi מנתח, 0b00001111; סימן ה- hash הוא החלק התחתון onrjmp לחצן clccpi H, 5brlo PC+3ldi מנתח, 0b11000011; חיוג חוזר הוא נתח 2rjmp תחתון 2rjmp החוזר ldi, 0b11011011; אחרת אירעה שגיאה חזרה: reti

שלב 9: קוד ווידאו לגרסה 1

צירפתי את הקוד שלי לגרסה הראשונה הזו של מנהל ההתקן של לוח המקשים. בזה אתה צריך ללחוץ על המקש ולאחר מכן ללחוץ על הכפתור על מנת לגרום ל- ADC לקרוא את הקלט מלוח המקשים. מה שהיינו מעדיפים הוא אין כפתור אלא במקום זאת האות לביצוע ההמרה מגיע מהלחץ עצמו. תרגיל 3: הרכיב והעלה את הקוד הזה ונסה אותו. ייתכן שיהיה עליך לשנות את ספי ההמרה השונים כך שיתאימו למתח הלחיצה שלך מכיוון שהם כנראה שונים משלי. מה יקרה אם תנסה להשתמש בקלט ממקלדת הן עבור ה- ADC0 והן עבור סיכת ההפרעה החיצונית במקום באמצעות כפתור? אצרף גם סרטון של פעולת הגרסה הראשונה של מנהל ההתקנה שלנו. תוכל להבחין בכך בקוד שלי יש קטע המאתחל את מצביע הערימה. ישנם רישומים שונים שייתכן שתרצה לדחוף ולהקפיץ מהערימה כאשר אנו מניפולציות על משתנים ומה לא ויש גם רישומים שאולי נרצה לשמור ולשחזר מאוחר יותר. לדוגמה, SREG הוא רישום שאינו נשמר על פני הפרעות, כך שהדגלים השונים שמוגדרים ומתנקים כתוצאה מפעולות עשויים להשתנות אם מתרחשת הפרעה באמצע משהו. אז הכי טוב אם תדחוף את SREG לערימה בתחילת מטפל להפרעות ואז תוריד אותו שוב בסוף המטפל. שמתי אותו בקוד כדי להראות כיצד הוא מאתחל וכדי לצפות כיצד נזדקק לו מאוחר יותר, אך מכיוון שלא אכפת לנו מה יקרה ל- SREG במהלך הפרעות בקוד שלנו, לא השתמשתי בערימה לשם כך. שהשתמשתי בפעולת המשמרת כדי להגדיר סיביות שונות ברגיסטרים בעת אתחול. למשל בשורה:

ldi temp, (1 <> sts EICRA, טמפ '

הפקודה "<<" בשורת הקוד הראשונה שלמעלה היא פעולת shift. זה בעצם לוקח את המספר הבינארי 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. בקוד שלנו 0V1 הזה מופיע כ- 0b11011011 (מכיוון שלחיצת המקש '0' כבר משתמשת בערך התצוגה 0b00000000)

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

אז בואו למצוא פתרון אחר …

שלב 11: איך נפטרים מהכפתור? גרסה 3

איך נפטרים מהכפתור? גרסה 3
איך נפטרים מהכפתור? גרסה 3

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

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

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

הגיוני? טוב בוא נעשה את זה…

תסתכל על הקוד החדש המצורף.

אתה רואה את השינויים הבאים:

  1. הוספנו rjmp בכתובת.org 0x0002 כדי לטפל בהפרעה החיצונית INT0
  2. שינינו את רישום EIMSK כדי לציין שאנחנו רוצים להפריע בסיכה INT0
  3. שינינו את סיכת ה- ADATE ברשם ADCSRA כדי להשבית את התכונה 'הפעלה אוטומטית'
  4. נפטרנו מהגדרות ה- ADCSRB מכיוון שהן לא רלוונטיות כאשר ADATE כבוי
  5. אנחנו כבר לא צריכים לאפס את דגל ההדק החיצוני מכיוון ששגרת ההפרעה INT0 עושה זאת באופן אוטומטי כשהיא מסתיימת - בעבר לא הייתה לנו שגרת הפרעה, רק הפעלנו את ה- ADC של אות באותו סיכה, אז היינו צריכים לנקות את הדגל הזה ביד.

כעת במעבדת ההפרעות אנו פשוט קוראים המרה יחידה מה- ADC.

תרגיל 5: הפעל גרסה זו וראה מה קורה.

שלב 12: קוד ווידאו לגרסת העבודה

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

מה שאנחנו צריכים זה להציג עיכוב בין ההפסקה ב- PD2 לבין קריאת ה- ADC ב- PC0. אנו נעשה זאת על ידי הוספת טיימר/מונה, הפרעה של הצפת נגדים ושגרת עיכוב. למרבה המזל אנחנו כבר יודעים איך לעשות זאת מתוך הדרכה 3! אז פשוט נעתיק ונדביק משם את הקוד הרלוונטי.

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

תבחין כי הקריאות אינן מדויקות כפי שניתן היה לקוות. זה כנראה בגלל מספר מקורות:

  1. אנו מקישים מפלט המתח של לוח המקשים להפעלה ב- PD2 המשפיע על הקריאה ב- PC0.
  2. אנחנו לא באמת יודעים כמה זמן יש לעכב לאחר ההדק כדי לקבל את הקריאה הטובה ביותר.
  3. נדרשת מספר מחזורים עד להשלמת המרת ה- ADC מה שאומר שלא נוכל לירות במהירות על לוח המקשים.
  4. כנראה שיש רעש בלוח המקשים עצמו.
  5. וכו…

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

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

  1. הוא משתמש רק בשני מהסיכות שבמיקרו הבקר שלנו במקום ב- 8.
  2. זהו פרויקט נהדר להראות היבטים שונים של ה- ADC על המיקרו-בקר השונה מהדברים הסטנדרטיים שתוכל למצוא שם כמו קריאות טמפרטורה, סיבוב פוטנציומטרים וכו '. רציתי דוגמה לקריאות בודדות המופעלות ולהפעלה אוטומטית של סיכה חיצונית. ולא רק מצב הפעלה חופשי של מעבד.

בכל מקרה, הנה כמה תרגילים אחרונים עבורך:

תרגיל 6: כתוב מחדש את מטפל ההפרעה המלא להמרת ADC כדי להשתמש בטבלת חיפוש. כְּלוֹמַר. כך שהוא בודק את הערך האנלוגי עם הפריט הראשון בטבלה ואם הוא גדול יותר הוא חוזר מהפסק, אם הוא לא אז הוא מעלה את Z לפריט הבא בטבלה ומתחזר שוב לבדיקה. זה יקצר את הקוד וינקה את שגרת ההפסקות ויגרום לו להיראות נחמד יותר. (אני אתן פתרון אפשרי כשלב הבא) תרגיל 7: חבר את לוח המקשים שלך ל -8 סיכות על המיקרו -בקר וכתוב עליו את הדרייבר הפשוט וחווה כמה הוא יותר נחמד. האם אתה יכול לחשוב על כמה דרכים לגרום לשיטה שלנו לפעול טוב יותר?

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

נתראה בפעם הבאה!