יסודות המיקרו-בקר נחקרו

נסה את הכלי שלנו לביטול בעיות





דבר אחד נהדר במיקרו-בקר IC, אלה זמינים כמעט בכל חלקי העולם ובקמעונאים אלקטרוניים.

מבוא

בעיקרון משתמשים במכשירי מיקרו-בקרה ביישומים הכוללים הערכות של הסביבה שמסביב ואלקטרוניקה דומה.



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

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



מכשיר זה מוקצה לבצע סדרת פקודות ליצירת תוכנית.

שפת התוכנית אותה היית רואה כאן היא C ++. תוכלו ללמוד את השפה הזו לעומק רב יותר בקורס כאן.

כשמדובר MCUs, אתה מקבל את האפשרות של שליטה וקביעת תצורה של כל pinouts שלה.

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

בשבב MCU ניתן להקצות את כל הפינים למעט ה- Vdd וה- Vss שהם סיכות הכוח של השבב עם ייעודים בלעדיים.

פרטי Pinout

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

החל מסיכה זו תמצא 20 סיכות לתחתית בצד זה (משמאל), ועוד 20 סיכות בצד השני (מימין), ממשיכות מלמטה למעלה בצד ימין.

8 הפינים הראשונים שמתחילים מהנקודה הם ה- PBO-7 המהווים את סיכות האינדקס של ה- IC מכיוון שכל התוכניות כאן מתחילות באפס האינדקס.

סדרת הפינאוטים לעיל מכונה PORT B, בעוד שקיימות קבוצות זהות אחרות של יציאות שהוקצו A ל- D.

ניתן להקצות יציאות אלה כדי לקבל ולהכיר נתונים מוזנים הנקראים INPUT, וגם להעביר נתונים בצורה מסוימת הנקראת OUTPUT.

שניים מהסיכות המגיעות בקטגוריה הכללית הם הסיכות (+) / (-) המכונות גם Vdd ו- GND.

ניתן לראות סיכה אחת מ- PORT D (PDO-6) הממוקמת בצד שמאל של השבב באזור התחתון.

ניתן לעקוב אחר PD7 שהוא סיכה מס '7 של פורט D כשהוא עומד לבדו ומתחיל בסדרת פינים מהצד הימני.

כעת ממשיך מהצד הימני של השבב שבו נגמר PORT D, PORT C מתחיל את ספירתו כלפי מעלה בסדר.

אלה תורמים לסיכות המעניינות הרבות של ה- MCU היישר מהאנלוגי לדיגיטלי.

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

הסיכות לעיל מהוות את נמל A.

ניתן להבין את ההמרה האנלוגית לדיגיטלית על פני הפינים הנ'ל בעזרת דוגמה שבה רמת טמפרטורה אנלוגית המתגלה באמצעות חיישן רגיל כגון תרמיסטר מוחלת על אחד מסיכות ה- PORT A המקובלות והממרות על ידי ה- MCU. כדי לייצר קריאה דיגיטלית מאפס עד 255 מעלות צלזיוס (נתון של 8 סיביות שניתן לשדרג להשגת פלט של 10 סיביות).

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

יתר על כן, ל- MCU יש שעון מובנה המוקצה לספירת הפרמטרים הרלוונטיים.

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

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

כיצד ליצור מחבר SPI מהמתכנת למיקרו-בקר

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

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

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

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

לפיכך ההרכבה הנ'ל מהווה כעת פלטפורמת חיבור ביניים צמודה ואמינה עבור ה- SPI ל- MCU.

הרגע עכשיו הכל נראה נחמד ומושלם, אז בוא נעבור להרוויח לגבי המתכנת הנדרש בין המחשב שלך ל- MCU.

יכולות להיות שלל חברות שמייצרות ומכירות יחידות מתכנת אלה, כך שרכישת אלה לא אמורה להוות בעיה עבורך, כגון Adafruit Industries, USBtinyISP או Sparkfun וכו '.

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

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

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

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

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

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

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

סיכת SPI המתחילה משמאל למעלה עוברת ל- 'Master IN, Slave OUT' (MISO)

סיכת SPI ממרכז שמאל מתחברת עם סיכת השעון (SCK)

סיכת SPI בפינה השמאלית התחתונה מצטרפת לאיפוס. (נלמד בהרחבה על סיכה זו בהדרכות הבאות)

SPI הרלוונטי למטה מימין מתחבר לסיכת GND של ה- MCU, GND מתייחס לסיכה היוצרת את קו האספקה ​​האפס או את המסילה השלילית (היחסית) של ההיצע.

SPI שמסתיים מהכותרת הימנית האמצעית מתחבר לסיכת 'Master Out, Slave IN' (MOSI) של ה- MCU.

SPI היוצא מהכותרת הימנית העליונה מחובר ל- (+) של ה- MCU שהוא ללא ספק ה- Vdd או סיכת האספקה ​​החיובית של ה- MCU.

זהו זה.

חבר את שני המחברים כמוסבר ולוח ממשק ה- SPI שלך מוכן לפעולות הנדרשות.

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

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

הכנת קוד תכנות פשוט עבור MCU

אנו לוקחים יחידת USBTinyISP שזמינה ב- Sparkfun לצורך קישור המחשב למיקרו-בקר.

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

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

פתח את sparkfun.com ולחץ על 'דף מתכנת AVR בכיס'. ניתן לדמיין בקלות את הקישור בתוך הדף.

לאחר מכן, מצא את 'מנהל ההתקן של Windows' מתחת למסמכים ופשוט לחץ עליו.

זה יספק לך את הקובץ pocketprog-driver.zip במחשב שלך.

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

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

עבור 64 סיביות בצע את אלה, עבור 32 סיביות פשוט התעלם:

גוגל 'libusb sourceforge' ולחץ על קישור זה הגרסה האחרונה.

היית נתקל בכמה קבצים נוספים, אולם אתה מעוניין למצוא את קובץ ה- bib, כלומר: libusb-win32-bin - #. #. #. #. Zip

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

לתיקיה זו, נווט מעל תיקיית הפח, המשך לתיקיית amd64.

היית רואה כמה תיקיות כאן: ghcalled libusb0.dll ו- libusb0.sys.

תרצה לשנות את שמות אלה ל: libusb0_x64.dll ו- libusb0_x64.sys.

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

כדי להתקין את מנהלי ההתקנים לעיל, השיטה הבאה שהיא לא קונבנציונאלית בסוגה תעניין אותך:

זהו מצב 'הוסף חומרה מדור קודם'.

לחץ על 'תפריט התחל'

ואז המשך בלחיצה ימנית על 'מחשב'

לחץ על 'נהל' ולבסוף לחץ על 'מנהל מכשירים'

לאחר מכן, בתוך התפריט בחר 'הוסף חומרה מדור קודם'

המשך ללחוץ על 'הבא', עד שהאשף יוכנס

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

עכשיו פשוט לחץ על 'הבא'

זה יראה לכם את התפריט 'הצג את כל המכשירים' שעליו תצטרך ללחוץ.

לאחר מכן המשך ללחוץ על סמל 'יש דיסק'.

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

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

מעל ומחוץ!! בואו נמשיך עם ההדרכה הבאה שלנו בעמוד הבא.

עד עכשיו אולי התקנת את התוכנה הנדרשת ובנית את ממשק SPI.

כיצד להעביר תוכנית לשבב מיקרו-בקר

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

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

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

AVRdude היא תוכנית המשויכת להתקנת WinAVR האחרונה שבלעדיה לא ניתן יהיה להעביר את הקובץ בפועל ל- MCU.

תוכנית זו היא פורמט קובץ .hex אשר למעשה מובן עבור MCU לביצועים הנדרשים.

במקרה שהאימות לא יצליח, המתכנת לא יוכל לבצע את העברת הקובץ.

בואו נראה במהירות כיצד נוכל ליישם את הליך הבדיקה בעזרת ההוראות הבאות:

פתח את בקשת DOS (מערכת הפעלה דיסק) על ידי לחיצה על 'תפריט התחל' והקלדת cmd.exe בתיבת החיפוש הנתונה.

כעת ביצוע AVRdude יכול להיעשות על ידי הקלדת פשוט avrdude –c usbtiny –p m32 מעל הפקודת DOS. ברגע שזה יושם, ה- DOS יודה באופן מיידי אם הקשר היה מוצלח.

בפקודה הנ'ל, '-c' הוא דגל התראה הכולל את מפרט הפרמטר של מתכנת 'usbtiny', בעוד שהתג '-p' מזהה את מכשיר המיקרו-בקר ('m32 המציין Atmega32).

במקרה שהשתמשת ב- MCU אחר, תצטרך לכלול את הקידומות הרלוונטיות ליישום.

לאחר סיום ההליך לעיל, תוכל להקליד 'יציאה' מעל הפקודה DOS, וזה יעביר אותך מהחלון.

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

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

ניתן לחשב את ערך הנגד באמצעות הנוסחה הפשוטה הבאה:

R = (Ub - LEDfwd) / I

כאשר Ub הוא מתח האספקה, LEDfwd הוא מתח ההפעלה האופטימלי של ה- LED המשמש, ואני המגברים האופטימליים שלו.

נניח שאנו משתמשים בנורת LED אדומה בעלת מתח קדימה לד = 2.5V וזרם I = 20mA, ניתן לפתור את המשוואה לעיל באופן הבא:

מכיוון שהמתח מ- MCU יהיה 5 וולט, הוא עשוי לבוא לידי ביטוי כ:

R = (5 - 2.5) /. 02 = 125 אוהם, ¼ וואט, הערך הקרוב ביותר הוא 120 אוהם.

עכשיו יש לנו את ה- LED, נגד של 120 אוהם ואת לוח ה- veroboard, פשוט חברו את הרכיבים הנ'ל כמפורט בתרשים עם המיקרו-בקר.

ברגע שזה נעשה, ניתן לתכנת את ה- MCU לתגובה המיועדת על נורית הנורית לעיל.

לאחר מכן, תכנות ה- MCU.

על מנת לאפשר למיקרו-בקר לבצע כמה יישומים משמעותיים, חובה לכתוב הוראות מתאימות ל- MCU.

כיצד להתקין סביבת תכנות ולחקור את WinAVR

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

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

בסופו של דבר זה יתמך על ידי WinAVR ויועבר לשבב ה- MCU המודאג.

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

היית מהלך ההתקנה של WinAVR להיות מהיר ומצחיק במיוחד. בואו נצלול לפרטים עם הנקודות הבאות:

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

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

הורד את הקובץ והתחל בתהליך הביצוע בלחיצה עליו. תן להתקנה להתחיל.

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

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

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

התפקיד הבסיסי של פנקס המתכנתים הנ'ל הוא להפוך קוד קריא אנושי אותו תכתוב לסדרת הוראות המובנות רק ל- MCU.

ההדרכה הבאה תסקור את הבדיקה של המתכנת הנ'ל כדי שנוכל להיות בטוחים בנוגע לתאימותו עם Windows והאם הוא 'לוחץ יד' בצורה מושלמת עם IC המיקרו-בקר שלך.

כיצד לתכנת MCU להפעלת נורית

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

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

רכשנו את המיקרו-בקר AVR Atmel בהתאם למפרט הנדרש שלנו כאן השתמשנו ב- ATMega32 לצורך האיורים. לאחר מכן למדנו על יסודות המיקרו-בקר ועל יחידת המתכנת שאחראית על העברת תוכנית לשבב MCU.

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

לאחר מכן אישרנו האם מנהלי ההתקנים הותקנו כהלכה במחשב עבור 32 סיביות כמו גם מערכת הפעלה של 64 סיביות.

לאחר מכן, התקנו את סביבת התכנות הנקראת Win AVR כדי להקל על העברת מודעות לכתיבה קלה של הקודים למיקרו-בקר, ואחריו הטמעת ה- avrdude לאימות המתכנת באמצעות המחשב האישי והמיקרו-בקר מחוברים ביניהם.

לבסוף בפרק הקודם סיימנו את בניית מעגל ה- LED / הנגד וחיברנו אותו ליציאות ה- MCU הרלוונטיות.

זו עבודה רבה ואכן בכל זאת הגיע הזמן להיכנס מיד לחומר תכנות אמיתי!

מלכתחילה נרצה לחלק את המיקרו-בקר לשלוש קטגוריות זה יפשט את ההבנה שלנו רבות:

שליטה, איתור ותקשורת

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

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

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

קדימה עם העבודה הנוכחית, מה שהופך את MCU לשלוט LED הוא די פשוט:

לשם כך אנו מורים לסיכה מספר 0 ב- PORT B ​​לייצר את 5V הנדרש עבור ה- LED.

כזכור מההדרכה הקודמת, חיברנו את האנודה של ה- LED לסיכה הנ'ל של ה- MCU.

ישנם שני דברים חיוניים הנדרשים להתייחס לסיכה זו של ה- MCU: 1) פלט ו- 2) 5 וולט

נלמד דרך בה אנו מורים לסיכה המסוימת להפוך לפלט של ה- MCU.

ברגע שהוא מוגדר להיות פלט השבב, אנו עשויים להורות שהוא יהיה 'גבוה' (5V) או 'נמוך' (0V) לפי הצורך ליישום.

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

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

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

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

לצורך הקצאת סיכה כפלט עלינו להפעיל את ה- Data Direction Register (DDR). אם אתה תוהה מה המשמעות של רישום כאן, זה פשוט מקום ב- MCU שמאפשר למיקרו-בקר להגיב בצורה מסוימת מסוימת.

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

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

אחת השיטות להקצות pin0 כפלט היא על ידי כתיבת הקוד הבא:

DDRB = 0b00000001

בתוכנית שלעיל, DDRB מסמל את רישום כיוון הנתונים עבור PORT B ​​0b מורה למהדר לגבי הביטוי הבינארי הבא של מספר ואילו ה- '1' בסוף הביטוי מציין את המיקום של ה- pin0, כלומר המיקום שלו בצורה של הסיכה הראשונה של פורט B.

אם אתה זוכר שנודע לנו כי PORT B ​​משייך אליו 8 פינים (מ- 0 ל- pin7), ואם אתה מבחין בקוד הנ'ל יש גם 8 ספרות, כלומר כל ספרה מסמלת את 8 הפינים האלה של PORT B.

כעת ההליך הבא יהיה להקצות 5V לסיכה זו (pin0). שוב עקרון הפעולה זהה ל- DDR כפי שמובא לעיל באמצעות הקוד הבינארי הבא:

פורטבור = 0b00000001

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

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

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

int main (בטל)
{
}

עם זאת, כדי לאפשר לתוכנית לפרש את פרטי רישום DDR ו- PORT ואת תפקודם בתוך שבב MCU, יש לכלול הצהרה נוספת שעשויה להיות מורכבת מכל הנתונים הנוגעים ל- AVR MCU. אולי נרצה להוסיף הכללה זו בכל התוכניות שלנו.

#לִכלוֹל
int main (בטל)
{
}

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

כאן ואילך נוכל להכניס את הצהרות DDR ו- PORT לקוד שלנו, מכיוון שתוספת קובץ הכותרת io.h הייתה מכוונת את המהדר לגביהן.

#לִכלוֹל

int main (בטל)

{

DDRB = 0b00000001 // רישום כיוון נתונים הגדרת pin0 לפלט והסיכות הנותרות כקלט

PORTB = 0b00000001 // הגדר pin0 ל -5 וולט

}

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

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

#לִכלוֹל

int main (בטל)

{

DDRB = 0b00000001 // רישום כיוון נתונים הגדרת pin0 לפלט והסיכות הנותרות כקלט

PORTB = 0b00000001 // הגדר pin0 ל -5 וולט

בעוד (1)

{

// קוד יהיה כאן אם יהיה צורך לבצע שוב ושוב ושוב ... בלי סוף

}

}

ייתכן שתרצה לציין שכאן השתמשנו ב- '1' בצורה של טיעון לולאת 'while', מכיוון שהכל למעט '0' יכול להיחשב ל'אמיתי 'הגיוני.

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

ניתן לראות את נורית ה- LED דולקת לאורך הסיכה שהוקצתה כל עוד ה- MCU קיבל כוח על ה- Vdd וה- Vss שלו.

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

במסגרת ההדרכות הבאות נלמד כיצד להוסיף ממד 'זמן' לנורית הנ'ל, כך לגרום לו להבהב בקצב מסוים מסוים.

למעשה, ביישום לעיל, ה- LED למעשה מהבהב אך קצב הלולאה כה מהיר שהוא כמעט כמו מתג קבוע דולק מעל תאורת ה- LED.

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

כיצד להבהב LED באמצעות מיקרו בקר AVR

בדיון האחרון למדנו כיצד להפעיל מתג לד דולק באמצעות מיקרו-בקר, זה היה יוצא מן הכלל לא? יכול להיות לא כל כך הרבה!

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

בואו נסתכל על זה:

#לִכלוֹל

#לִכלוֹל

int main (בטל)

{

DDRB | = 1<< PINB0

בעוד (1)

{

פורטב ^ = 1<< PINB0

_עיכוב_מס (100)

}

}

אם אתה מרגיש מבולבל מאותם סמלים מוזרים (&, ^, | וכו ') המשמשים בביטוי הנ'ל (& אינו שם אך יכול לשמש בקודים דומים אחרים), הנה המידע הקשור שתהיה מעוניין לדעת אודות אלה :

הוא כולל אלגוריתמים לוגיים סטנדרטיים רבים כגון AND, OR, NOT ו- XOR המשמשים בדרך כלל עם הקוד הנ'ל.

פונקציונליות לוגית זו משווה באופן ספציפי את שתי הסיביות '1' ו- '0' בהתאם לטבלאות האמת שהוקצו להן.

נקבל רעיון על ידי ניתוח סידור הסיביות הבא:

01001011 &
10001101
שווים
00001001

בקוד הנ'ל מתייחס ל- AND כפי שמשמש בתכנות C.

קריאת השורות אנכית, זה מציע ש- 0 ו- 1 שווה ל- 0, 1 ו- 0 שווה גם ל- 0, 0 ו- 0 שווה ל- 0, 1 ו- 1 שווה ל- 1. הקריאה היא פשוטה כמו זו. אלה הם לפי טבלת האמת של מפעיל AND.

אם אנו מעריכים את הטבלה הבאה, היא מציינת את הסמל '|' המציין את השימוש בפונקציונליות 'OR', את '|' ניתן למצוא ממש בצד שמאל של 'backspace' במקלדת המחשב שלך:

01001011 |
10001101
שווים
11001111

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

שילוב הסיביות הבא מיועד למפעיל לוגיקה של XOR המסומן על ידי ^ וניתן ללמוד אותו בדיוק כפי שעשינו עם טבלאות האמת AND, או:

01001011 ^
10001101
שווים
11000110

עכשיו בואו נמשיך עם התוכנית הראשונה ונלמד מה מסמל השורה הבאה בה:

#לִכלוֹל

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

ב'כלול 'את ה- delay.h מאפשר לנו כמה שיטות קלות ליישום.

כפי שהשם מרמז ה- delay.h מאפשר לנו לעכב את התוכנית המסוימת.

את הביטוי הבא int main (בטל) ניתן להשמיט מהדיון המתמשך מכיוון שכבר סיקרנו זאת בפוסטים הקודמים שלנו.

הבא מגיע ה- DDRB שהשתנה.

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

DDRB = 0b00000001

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

DDRB = DDRB | 0b00000001

כאן היא עטויה מסיכת 'OR': 0b00000001, אם כי נראה שמדובר במספר בינארי אותנטי, במקרה שה- DDRB הקודם למשל: 0b01001010, ואז החלת OR על כך באמצעות מיסוך יכולה לתת: 0b01001010 | 0b00000001 = 0b01001011.

ההבדל שהתקבל כפי שאפשר היה לראות הוא רק עם pin0, שהסיביות שלו השתנו!

דחיסת ההצהרה הנ'ל עוד יותר באמצעות C ++ נותנת:

DDRB | = 0b00000001

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

אז אם “DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

אז אנחנו מתחילים עם 0b00000000, ושמים '1' כדי לייצר 0b0000001 ואז אנו מעבירים אותו למיקומים 0 שמאלים, מה שנותן 0b00000001 זהה לחלוטין לעיל.

כעת, אם נניח שמדובר ב- PINB4, ההצהרה יכולה לבוא לידי ביטוי כ- 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

היזהר שאנחנו משתמשים במדד אפס כלומר יש ארבעה אפסים אחרי ה' 1 '.

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

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

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

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

ניתן לראות את התוכנית הבאה עושה זאת, אך אנו גם נגלה כי ייתכן שהיא לא נראית בתוכנית.

שתי ההצהרות הראשוניות משנות את הסיביות ל- '1' (5V, נורות LED), ואז מוצגת הפסקה של 100 ms.

צמד השורות הבאות הופך את ביט ה- PINB0 ל' 0 '(מתח אפס, כיבוי נורית), אך מצטערים שה- AND השוואה לא יוכל לבצע' 0 'מהסיבית, אך אם אנו משתמשים ב-' ~ 'לא עבור המסכה הבינארית זה יכול להחליף את כל ה- 0 לשנייה ולהיפך.

זה יאפשר לנו להשפיע רק על ביט ה- PINB0 ולהפוך אותו ל '0'. הסוגריים נכללו במטרה להכיל את ביצוע המסכה כך שניתן יהיה להחיל את פעולת ה- NOT על כל המסכות ולא רק על '1' לפני משמרת שמאל '<<”.

פורט | | 1<< PINB0
_עיכוב_מס (100)
PORTB & = ~ (1<< PINB0)
_עיכוב_מס (100)

על מנת ליצור עיכובים ON OFF או פרקי זמן שווים, אנו עשויים לקצר את ארבע השורות הקודמות לשניים ולהחיל פונקציונליות XOR לטובתנו. יש לציין שביצוע XOR הוא סיכה שהוקצה ל- 1 למקרה שזה 0 ולהיפך. ביצוע זה ישפיע רק על ה- PINB0. ככל שניתן להחיל את הפקודה, היא פשוט תהפוך את הסיבית להיפך מההיגיון הקיים.

פורטב ^ = 1<< PINB0
_עיכוב_מס (100)

בוצע! ה- LED שלך יהבהב כעת בהתאם לקצב שנקבע .... פשוט, לא?




קודם: מעגל שליטה מרחוק למכשירים מרובים הבא: מעגל שלב AC, ניטראלי, מעגל מחוון תקלות כדור הארץ