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

מתגי קריאה עם ATtiny2313: 9 שלבים
מתגי קריאה עם ATtiny2313: 9 שלבים

וִידֵאוֹ: מתגי קריאה עם ATtiny2313: 9 שלבים

וִידֵאוֹ: מתגי קריאה עם ATtiny2313: 9 שלבים
וִידֵאוֹ: הרכבת מתג תאורה ב5 דקות 2024, נוֹבֶמבֶּר
Anonim
מתגי קריאה עם ATtiny2313
מתגי קריאה עם ATtiny2313

היו מספר הוראות העוסקות בפלטים מה- ATtiny2313 והתקני AVR דומים. לדוגמה, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- מנוע-עם-AVR-מיקרו-מעבד/. לאחר שעבדתי על האחרון מ- The Real Elliot, שהראה כיצד לשלוט במנועי צעד, גיליתי שזה יהיה מאוד מועיל להפעיל קטעי קוד חלופיים באותה תוכנית כך שלא אצטרך לתכנת מחדש את ATtiny2313 כל אחד פעם רציתי לנסות וריאציה קלה של קוד (כגון חצי צעד או הפעלת הצעד לאחור). אמנם קל לכתוב קוד באמצעות מתג/הצהרת מקרה כדי לאפשר בחירה של וריאציות חלופיות, אך יש צורך בדרך כלשהי לבחירת המקרה. המשמעות היא שיש לקרוא איזשהו מכשיר קלט כדי לשלוט במקרה. למרבה המזל, ל- ATtiny2313 יש הרבה סיכות קלט/פלט ומתוכנן היטב לקריאת כניסות ממתגים. מדריך זה יראה כיצד לקרוא תשומות ולקבל החלטות על סמך מצבם. מכיוון שרק זה יהפוך למדריך משעמם למדי, אסביר לך דרך פשוטה להשתמש ביכולת הטיימר/מונה של ה- ATtiny2313 להנעת רמקול קטן כמצפצף. תהיה גם סטייה קטנה בטכניקות ניפוי פשוטות.

שלב 1: מכשיר הקלט

מכשיר הקלט
מכשיר הקלט
מכשיר הקלט
מכשיר הקלט

מדריך זה מבוסס על עבודתו המצוינת של אליוט האמיתי ומשתמש במערכת הפיתוח של הגטו ATtiny2313 שהוא מתאר. גליון הנתונים ATtiny2313 מאת Atmel הוא ההפניה האולטימטיבית לכל הפונקציות, אך הוא אינו בהכרח קל לקריאה. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (הקישור מכיל את כל גליונות הנתונים של AVR, אתר את 2313.) האיור מציג קבוצה פשוטה של מתגי קלט. זוהי חבילה של ארבעה מתגי הפעלה/כיבוי; ידוע גם בשם מתגי יחיד, יחיד לזרוק (SPST). בדרך כלל, חיבור אחד, או מוט, של כל מתג נקשר לקרקע בעוד שהחיבור השני נמשך גבוה דרך נגד הגבלת זרם (10K בערך). קלט מיקרו -בקר מחובר לקוטב עם הנגד. אם המתג פתוח, המיקרו -בקר יקרא את הקלט כ- HI. אם המתג סגור, המיקרו -בקר יקרא את הקלט LO. עיין בסכימה לפרטים. ATtiny2313 מפשט את הדברים על ידי מתן נגדי משיכה מתוכנתים על סיכות I/O כאשר הם מוגדרים ככניסות. המשמעות היא שבמתגים יכול להיות פשוט מוט אחד קשור לקרקע (LO) והקוטב השני מחובר לכניסת מעבד. הדוגמה הראשונה מציגה רק שני מתגים. המתגים נקראים ומוגדרים עם הקוד הבא. הגדר את המתגים ככניסות: (אין צורך בקוד; זו ברירת המחדל.) הפעל את נגדי המשיכה: PORTB = _BV (PB0) | _BV (PB1); קרא את התשומות: but1 = ~ PINB & 0x03; שימו לב לשימוש בהיפוך ומיסוך כדי לקבל ערך נכון.

שלב 2: בלינקרים לאות

נשתמש בשני המתגים האלה כדי להבהב נורית מספר פעמים הניתנת לתכנות. נוריות הלדים בהן נשתמש יהיו הנורות הבלינקים שהאליאם האמיתי התפרסם. מתגים 1 ו -2 יטופלו כשתי ספרות בינאריות, כך שהשילוב יכול לייצג את המספרים 0, 1, 2 ו- 3. התוכנית שלנו תקרא את שני המתגים ותמצמץ את הנורית במספר הפעמים המתאים, אך רק אם המתג ההגדרות השתנו. המתגים מנותקים למשך 500 אלפיות השנייה (לא מותאמים). אלגוריתם הניתוק הוא די פשוט. המתגים נקראים והקריאה מצויינת. אם הוא שונה מהערך oldBut (הערך השמור האחרון), התוכנית מתעכבת במשך 500 אלפיות השנייה והמתגים נקראים שוב. אם הערך זהה לקריאה קודמת, הערך של oldBut יעודכן והנורית תמצמץ מספר הפעמים שמשתמע מהערך הבינארי של שני המתגים. שים לב להיפוך הערך שכן מתג שהוא "מופעל" קורא LO. המתגים ייסרקו ברציפות לשינויים נוספים. אנא עיין במדריכים קודמים של The Real Elliot למידע נוסף על בלינקלייט. עיין ב https://www.ganssle.com/debouncing.pdf למידע נוסף על ביטול מתגים. הנה קוד ATtiny2313 לדוגמה זו. בפעולה, תוכנית זו תמצמץ את הנורית ב- PB4 (פין 8 פיזי) פעמיים כדי להראות שהיא מאתחלת. לאחר מכן הוא יקרא מתגים אחד ושניים, וימצמץ פעם עד שלוש פעמים בהתאם להגדרת המתג בכל פעם שהם משתנים. כאשר המתגים אינם משתנים, הנורית תהבהב לאט. כדי להריץ קוד זה, צור ספרייה חדשה (תקרא לו "בסיסי" אם תרצה) והורד את קובץ קוד ה- C הבא ותעשה לתוכו קובץ. שנה את שם Makefile1.txt רק ל- Makefile. באמצעות WinAVR, הרכיב את התוכנית וטען אותה ב- ATtiny2313 שלך.

שלב 3: טעינה קלה על איתור באגים

אם אתה כמוני (וכל מתכנת אחר בעולם) סביר להניח שחווית תקופות שבהן הקוד "ללא טעויות" שהקלדת בקפידה וריכזת אינו עושה מה שאתה מצפה שהוא יעשה. אולי זה פשוט לא עושה כלום! אז מה הבעיה? איך אתה הולך לגלות? למרבה המזל, ישנן מספר גישות לגרום לדברים לעבוד. (קבל ספר זה לקבלת טיפול מצוין בנושא איתור באגים. Http://www.debuggingrules.com/) ברצוני להציע כמה הצעות פשוטות הנוגעות לנושא יישומי ניפוי מיקרו בקר. שלב ראשון הוא לבנות על מה אתה יודע. אם קיבלת פעם בלינקלייט לעבוד, השתמש בו שוב כדי לראות היכן אתה נמצא בתוכנית שלך. אני אוהב שהנורית תהבהב פעמיים כדי לסמן את תחילת התוכנית. תוכל להכניס את הקוד לשם כך בתחילת התוכנית. ברגע שאתה יודע ששום דבר לא בסדר בחומרה שלך, צור פונקציה לביצוע המהבהבים. הנה הפונקציה שבה אני משתמש./********* ------------------------------ ** blinkEm-הפונקציה להבהב LED באמצעות PD4 ** יש להגדיר PD4 כפלט. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _ delay_ms (1000); PORTD = ~ _BV (PD4); _ delay_ms (1000); לספור--; }} כעת ניתן להשתמש בפונקציה זו בנקודות שונות בקוד שלך כאות שהקוד ביצע עד כה. הכרת הקוד פועל פירושה שתוכל לבחון היטב כל חלק שרץ, אך לא עשה את מה שציפית, כדי למצוא שגיאות. שינוי של דבר אחד בכל פעם הוא גם טכניקת מפתח לאיתור באגים (המתואר בהפניה למעלה). שיטה קלאסית זו פועלת יחד עם "הפרד וכבוש": נקיטת צעדים של תינוק להוספת פונקציונליות בהדרגה. זו אולי נראית כמו גישה איטית, אבל היא לא איטית כמעט כמו לנסות לפתור חלק גדול של קוד שאינו עובד בבת אחת.

שלב 4: ניפוי באגים נוסף

ישנן פעמים רבות בהן אנו רוצים לבדוק קטע קוד על ידי דילוג על רוב השורות שבו, ולאחר מכן לאפשר אותן אחת אחת בכל פעם שאנו מוודאים שכל אחת מהן עובדת. בדרך כלל, אנו עושים זאת על ידי "הערות" על שורות שאנו רוצים לדלג עליהן. הרחבה של טכניקה זו היא לחתוך ולהדביק גוש קוד, להגיב על המקור (כדי שלא נאבד אותו) ולפרוץ ל- copy. C יש ארבע דרכים פשוטות להערות שורות. הצבת "//" מול שורה מעירה את השורה הזו. סגירת שורה אחת או יותר ב- "/*" ו- "*/" תביא קטע שלם. כדי ששיטה זו תפעל ביעילות, לא חייב להיות "*/" אחר בגוש הקוד (מלבד הסוף). אז משמעת אפקטיבית היא להשתמש ב- // עבור הערות בתוך קוביות קוד, ולשמור את המבנה / * * / לבניית הערות ולהערות קטעי קוד. הצבת "#if 0" בתחילת בלוק להערה. ולסיים את הקטע ב "#endif". אפשר יותר שליטה סלקטיבית באמצעות "#ifdef (מזהה)" בתחילת בלוק ו "#endif" בסוף. אם ברצונך לגבש את הגוש, השתמש ב- "#define (מזהה)" מוקדם יותר בתוכנית. שים לב שסימני הציטוט נועדו להדגשה בלבד ואין לכלול אותם. שילוב של טכניקות אלה אמור לספק גישה שימושית לניפוי באגים של תוכניות ATtiny2313 שלך. אתה עשוי למצוא כלים אלה שימושיים ככל שנמשיך בהוראה זו.

שלב 5: שימוש בטיימר/מונה 0 לצפצופים

שימוש בטיימר/מונה 0 לצפצופים
שימוש בטיימר/מונה 0 לצפצופים

ל- ATtiny2313 יש שני משאבי טיימר/נגד רבי עוצמה: אחד של 8 סיביות ואחד של 16 סיביות. אלה עשויים להיות מוגדרים כמחוללי תדרים, בקרי אפנון רוחב דופק משתנים ורשמי השוואת פלט. הפונקציונליות המלאה של אלה מתוארת ב -49 עמודים בגיליון הנתונים. עם זאת, נשתמש במקרה פשוט. רק טיימר/מונה 0 (ה -8 סיביות) ישמש והוא ישמש פשוט כמחולל תדרים. התדר ינותב לרמקול קטן כדי להפיק צפצוף. טיימר/מונה 0 מתואר במלואו בעמודים 66 עד 83 בגיליון הנתונים של ATtiny2313. קריאה מדוקדקת של חומר זה תספק לאדם הבנה מלאה של זמן/מונה 0. למרבה השמחה, מצב פשוט למדי, Clear Timer on Compare (CTC), הוא כל מה שנדרש כדי ליצור את צליל הביפ שאנו רוצים.

עבור המצב בו נשתמש, פעולת הטיימר/מונה היא קדימה. כאשר נבחר אות שעון, המונה מתחיל באפס ומגדיל כל דופק שעון. כאשר ערך המונה מגיע לערך ברשום השוואת הפלט (TOP), המונה מתאפס לאפס והספירה מתחילה מחדש. ביט הפלט המשויך לטיימר/מונה מופעל לייצור פלט גל מרובע. זה מניע ישירות את מתמר האודיו להשמיע צליל ביפ. מתמר שמע קטן מסוג TDK מפיק את הצפצוף. יחידה מתאימה היא Digikey 445-2530-ND, TDK SD1209T3-A1 (השתמשתי בגרסה מוקדמת של זה). זוהי גרסת 3 וולט; גם גרסת 5 וולט תעבוד אני מצפה. אני מסיע את זה ישירות מיציאת הפלט של Attiny2313 ונראה שזה עובד בסדר. ל- Sparkfun יש מכשיר דומה.

שלב 6: הגדרת טיימר/מונה 0

ניתן להשתמש במצב CTC להחלפת פלט OC0A על פין 2, יציאה B (סיכה פיזית 14). כדי לאפשר פלט על סיכה זו, יש להגדיר את DDRB כראוי. קוד C עבור זה הוא בדיוק כמו הגדרת פלט עבור בלינקלייט. DDRB = _BV (PB2); // יציאת B2 היא פלט. השלב הבא הוא אספקת אות שעון וטעינת פנקס השוואת הפלט ליצירת צורת גל כתדירות. המשוואה לתדירות המתקבלת ניתנת בגיליון הנתונים (עמוד 72). מונחים במשוואה יתוארו להלן. להלן המשוואה: fOC0A = fclk_I/O/2*N*(1+OCR0A) היכן fOC0A: = תדר פלט fclk_I/O: = תדר מקור השעון N: = גורם שעון קבוע בגודל OCR0A: = ערך ביציאה השווה את רשם הטיימר/ מונה 0A. שעון מקור תדר, fclk_I/O זהו התדר של שעון המערכת. ערך ברירת המחדל הוא 1MHz. ביטים CS00, CS01 ו- CS02 של TCCR0B שולטים בבחירה זו. מאחר שסיביות אלה גם בוחרות את הערך של N, הוא מתואר להלן. ערך מראש, NN הוא הערך המשמש לחלוקה או שינוי גודל של שעון המערכת. ביטים CS00, CS01 ו- CS02 של TCCR0B שולטים בבחירה זו. טבלה 41 בעמוד 81 בגיליון הנתונים של ATtiny2313 מתארת את השילובים. מכיוון שרצוי תדר קרוב ל- 1kHz, יוגדרו הביטים CS00 ו- CS01 של TCCR0B. שים לב שהגדרת כל שלוש הסיביות ל- 0, ובכך אין בחירת מקור שעון, מפסיקה ביעילות את הפלט. זוהי השיטה שתשתמש בה כדי להתחיל ולעצור את הביפ. ערך TOP, ערך OCR0A ערך זה הוא ה- TOP העליון של המונה אשר נטען ברשם השוואת הפלט עבור טיימר/מונה 0A. כאשר ערך זה יושג, המונה יאופס לאפס והספירה תתחיל מחדש עד שתגיע TOP והמחזור יחזור. ניתן לשנות את TOP בקלות, כך שתדירות הצפצוף קלה לשינוי. מכיוון שרצוי תדר קרוב ל -1 קילו -הרץ, TOP מוגדר ל- 7. (שימו לב שניתן היה להגדיר את מכשיר ההרשמה ל- 8, ולהגדיר את TOP ל- 63. אותה תוצאה - הבחירה שלכם.) תדר פלט, fOC0A שימוש במשוואה לחישוב תוצאות תדר הפלט. ב: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz קרוב מספיק! להלן הקוד לטעון את פלט השוואת הפלט ומאגר הבקרה נגד טיימר 0B. אנא עיין בקוד התוכנית בפועל כדי להבין כיצד משתמשים בהם. OCR0A = 7; // ערך זמן TCCR0B = _BV (CS01) | _BV (CS00); // בחר שעון פנימי & prescale = 8 TCCR0B = 0; // אין מקור שעון מכבה את הטון הגדרת מצב זמן/מונה כפרט אחרון, נציין את מצב הטיימר/המונה הרצוי לנו על ידי הגדרת סיביות מתאימות ברשם טיימר/מונה בקרת 0A. מצב CTC נבחר על ידי הגדרת ביט WGM01 כמתואר בטבלה 40, עמוד 79 בגיליון הנתונים. מכיוון שאנו רוצים שהפלט יחליף כל מחזור, יש להגדיר את סיביות COM0A0 גם כמתואר בטבלה 34 בעמוד 77. להלן הקוד: TCCR0A = _BV (COM0A0) | _BV (WGM01); // מצב החלפת CTC

שלב 7: שימוש בארבעה מתגים

כשאנחנו מיישמים את הביפר, בואו להרחיב את החומרה והתוכנה שלנו לטפל בארבעה מתגים. מכיוון שהפלט של מונה טיימר 0A נמצא ביציאה B, סיכה 2, איננו יכולים פשוט לחבר מתגים נוספים ברצף ליציאה B. פתרון קל יהיה להשתמש ביציאה D, אך בואו נשמור את היציאה הזו זמינה עבור פונקציות אחרות (אולי מנוע צעד). אז בואו נחבר את המתגים הנוספים ל- PB3 ו- PB4. קריאת המתגים היא לרוב ללא שינוי. ערך המסכה משתנה ל 0x1B (00011011 בינארי) למסכה 2 יחד עם 5, 6 ו 7. טריק נוסף משמש ליצירת מספר בינארי של 4 סיביות. העבר את סיביות 3 ו -4 ימינה לביט אחד ושלב אותן עם סיביות 0 ו -1 למספר בינארי של 4 סיביות. זהו תחביר C סטנדרטי לשינוי ושילוב סיביות, אך אולי אינו מוכר היטב למתחילים. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 יש קריאת מתג בפעולה, התוכנית תהבהב פעמיים ותצפצף פעמיים כדי לאותת אתחול. בכל פעם שהמתגים משתנים, המספר שהם מייצגים יצפצף. כאשר המתגים אינם משתנים, הנורית תהבהב. כדי להריץ את הקוד הזה, צור ספרייה חדשה (תקרא לזה ביפ אם תרצה) והורד את קובץ קוד C הבא ותעשה קובץ מתוכנת לתוכו. שנה את שם Makefile2.txt רק ל- Makefile. באמצעות WinAVR, הרכיב את התוכנית וטען אותה ב- Attiny2313 שלך.

שלב 8: שימוש במתג/מארז

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

כדי להריץ קוד זה, צור ספרייה חדשה (קראו לו Switch אם תרצו) והורידו את קובץ קוד C הבא ותייצרו לתוכו קובץ. שנה את שם Makefile3.txt רק ל- Makefile. באמצעות WinAVR, הרכיב את התוכנית וטען אותה ב- Attiny2313 שלך.

שלב 9: מסקנה

סיכום
סיכום

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

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

מוּמלָץ: