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

תכנות במקביל Attiny85 או דלעת עם עיניים מרובות צבעים: 7 שלבים
תכנות במקביל Attiny85 או דלעת עם עיניים מרובות צבעים: 7 שלבים

וִידֵאוֹ: תכנות במקביל Attiny85 או דלעת עם עיניים מרובות צבעים: 7 שלבים

וִידֵאוֹ: תכנות במקביל Attiny85 או דלעת עם עיניים מרובות צבעים: 7 שלבים
וִידֵאוֹ: ארדואינו למתחילים 7: בו-זמניות 2024, נוֹבֶמבֶּר
Anonim

מאת jumbleview Jumbleview.info עקוב אחר מאת המחבר:

הצעקה
הצעקה
הצעקה
הצעקה
החלפת סוללת NiCd עם ספק כוח חיצוני
החלפת סוללת NiCd עם ספק כוח חיצוני
החלפת סוללת NiCd עם ספק כוח חיצוני
החלפת סוללת NiCd עם ספק כוח חיצוני
ידית מצלמה דיגיטלית
ידית מצלמה דיגיטלית
ידית מצלמה דיגיטלית
ידית מצלמה דיגיטלית

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

פרויקט זה מראה כיצד לשלוט בשני נוריות אנודה נפוצות בגודל 10 מ מ בשלושה צבעים (עיניים מרובות צבעים של נצנצים ליל כל הקדושים) עם שבב Attiny85. מטרת הפרויקט היא להכניס את הקורא לאומנות התכנות במקביל ולשימוש בספריית פרוטוטים של אדם דאנקלס. פרויקט זה מניח כי הקורא יודע על בקרי 8 סיביות AVR, יכול לכתוב תוכנית C ויש לו ניסיון כלשהו באולפן Atmel.

קוד הפרויקט שפורסם ב- GitHub:

אספקה

לפני התכנות עדיין צריך לבנות את המעגל. להלן רכיבים:

  • בקר Attiny85 (כל ספק אלקטרוני).
  • שני נוריות LED בגודל 10 מ"מ עם אנודה משותפת. נוריות אדפרוט
  • נגדים 100 אוהם, 120 אוהם, 150 אוהם 0.125 או 0.250 וואט (כל ספק אלקטרוני).
  • כותרת שש פינים לממשק AVR ISP. ניתן להכין מכותרת Adafruit זו
  • קצת לוח לחם או לוח תבנית מודפס. השתמשתי בזה
  • ממשק AVR ISP MKII ו- Atmel Studio 6.1 (גרסה מאוחרת יותר אמורה לפעול גם כן).

שלב 1: חיתוך

מעגל
מעגל

העיצוב משתמש בחמישה סיכות שבב:

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

אפשר לשאול: למה לא להשתמש בכל שש סיכות הכניסה/החוצה של השבב כך שאנודות LED יתחברו ישירות ל- +5 v ולכל קתודה תהיה סיכה ייעודית? זה יהפוך את התכנות לפשוטה. למרבה הצער, יש את הבעיה: סיכה PB5 (RESET) היא סיכה חלשה המסוגלת לספק ~ 2 mA בלבד מהזרם, בעוד שצריך להיות ~ 20 mA.

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

שלב 2: תרשים תזמון

תרשים תזמון
תרשים תזמון

תרשים תזמון עוזר לנו להבין מה עלינו לתכנת.

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

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

שלב 3: תכנות. פקודות מאקרו והגדרות

תכנות. פקודות מאקרו והגדרות
תכנות. פקודות מאקרו והגדרות

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

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

שלב 4: תכנות. לולאה ראשית

תכנות. לולאה ראשית
תכנות. לולאה ראשית

אז הבה נסתכל על הסוף כדי לראות מה מכיל ההליך העיקרי.

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

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

שלב 5: תכנות. פונקציות עזר

תִכנוּת. פונקציות עזר
תִכנוּת. פונקציות עזר

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

ויש עוד פונקציה אחת שתופעל ישירות על ידי שגרת פרוטוטרד. שמו הוא DoAndCountdown ().

מבחינה טכנית השימוש בפונקציה כזו אינו חובה אבל מצאתי את זה נוח. יש לו שלוש טיעונים:

  • מצביע לתפקוד הגדרת צבע LED (כמו RedColor או GreenColor או וכו ')
  • ערך התחלתי של מונה הפוך: מספר כמה פעמים יש להפעיל פונקציה זו בשלב מסוים של פרוטוטה.
  • מצביע למונה הפוכה. ההנחה היא שכאשר יש שינוי בצבע, המונה ההפוך הוא 0, כך שבהתחלה קוד איטרציה יקצה לערך ההתחלתי של המונה. לאחר כל מונה איטרציה יורד.

פונקציה DoAndCountdown () מחזירה ערך של מונה הפוך.

שלב 6: תכנות. שגרות פרוטוטרד

תכנות. שגרות פרוטוטרד
תכנות. שגרות פרוטוטרד

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

הפונקציה מופעלת עם שני טיעונים:

  • מצביע למבנה פרוטוטה. מבנה זה אותחל על ידי main לפני שהלולאה הראשית החלה.
  • מצביע למונה הפוכה. הוא הוגדר ל- 0 על ידי ראשי לפני שהלולאה הראשית החלה.

הגדר את המתח של הפונקציה כדי להפוך את LED השמאלי פעיל ולאחר מכן מתחיל קטע פרוטוטה. קטע זה נמצא בין פקודות מאקרו PT_BEGIN ו- PT_END. בפנים יש קוד כלשהו שבמקרה שלנו חוזר רק על פקודות מאקרו PT_WAIT_UNTIL. מאקרו זה מבצע את הפעולות הבאות:

  • הזמנת הפונקציה DoAndCountdown. זה מגדיר מתח על קתודות LED כדי לפלוט צבע מסוים.
  • התוצאה שהוחזרה בהשוואה ל- 0. אם המצב הוא 'שקר' פונקציית פרוטוטרד 'חוזרת מיד ומניבה שליטה ללולאה הראשית.
  • כאשר פרוטוטרד מופעל בפעם הבאה הוא שוב מבצע קוד לפני PT_BEGIN, ואז קופץ ישירות אל הפקודות מאקרו PT_WAIT_UNTIL שממנו הוא חזר בפעם הקודמת.
  • פעולות כאלה חוזרות על עצמן עד שהתוצאה של DoAndCountdown היא 0. במקרה כזה אין החזרה, התוכנית נשארת ב- protothread ומבצעת את השורה הבאה של הקוד. במקרה שלנו זה PT_WAIT_UNTIL הבא אך באופן כללי זה יכול להיות כמעט כל קוד C.
  • בביצוע הראשוני של מונה ההפוך השני של PT_WAIT_UNTIL הוא 0, כך שתהליך DoAndCountdown () קבע אותו לערך ההתחלתי. פקודות מאקרו שנייה שוב יבוצעו 250 פעמים עד שמונה הרוורס יגיע ל -0.
  • מצב struct pt מתאפס ברגע שהבקרה מגיעה לפקודות מאקרו PT_END. כאשר הפונקציה protothread מופעלת בפעם הבאה קטע protothread מתחיל לבצע שורה של הקוד מיד לאחר PT_BEGIN.

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

שלב 7: פנימי

פנימיות
פנימיות

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

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

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

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

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

מוּמלָץ: