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

מדריך הרכבה של AVR 1: 5 שלבים
מדריך הרכבה של AVR 1: 5 שלבים

וִידֵאוֹ: מדריך הרכבה של AVR 1: 5 שלבים

וִידֵאוֹ: מדריך הרכבה של AVR 1: 5 שלבים
וִידֵאוֹ: Marlin Firmware 2.0.x Explained 2024, נוֹבֶמבֶּר
Anonim
הדרכה להרכבת AVR 1
הדרכה להרכבת AVR 1

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

אני מפעיל את Arch linux ואני עובד על atmega328p-pu שהוקם על לוח לחם. אתה יכול לעשות את זה בדיוק כמוני או שאתה יכול פשוט לחבר ארדואינו למחשב שלך ולעבוד על הבקרה כך.

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

להלן מה שתצטרך:

1. לוח לחם

2. ארדואינו, או רק המיקרו -בקר

3. מחשב שמריץ לינוקס

4. מכלול אברה באמצעות git: שיבוט git https://github.com/Ro5bert/avra.git או אם אתה משתמש באובונטו או במערכת מבוססת דביאן פשוט הקלד "sudo apt install avra" ותקבל את שני ה- avr assembler ו- avrdude. עם זאת, אם תקבל את הגירסה העדכנית ביותר באמצעות github, תקבל גם את כל הקבצים הדרושים לכלול, במילים אחרות יש לו כבר את הקבצים m328Pdef.inc ו- tn85def.inc.

5. avrdude

את הסט המלא של מדריכי הרכבת AVR שלי תוכלו למצוא כאן:

שלב 1: בנה לוח בדיקה

בנה לוח בדיקות
בנה לוח בדיקות

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

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

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

שים לב שאם אתה מנסה את זה עם ATtiny85, תוכל פשוט להשיג את מתכנת Sparkfun Tiny כאן: https://www.sparkfun.com/products/11801# ולאחר מכן פשוט חבר אותו ליציאת ה- USB במחשב שלך. תחילה יהיה עליך להתקין מטען אתחול ב- Attiny85 והדרך הקלה ביותר היא פשוט להשתמש ב- Arduino IDE. עם זאת, יהיה עליך ללחוץ על הקובץ ועל ההעדפות ולאחר מכן להוסיף את כתובת האתר החדשה של לוחות: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json אשר מאפשר לך להתקין את מטען האתחול (אם ATtiny85 שלך לא הגיע עם אחד כבר).

שלב 2: התקן את Assembler ו- Avrdude

כעת תוכל להוריד ולהתקין את האסמבלר וה- avrdude מהקישורים שניתנו בשלב הראשון של מדריך זה. סביר להניח שאם כבר עבדת עם Arduino's אז כבר התקנת avrdude.

לאחר התקנת אברה תבחין כי יש תת -ספרייה שמגיעה איתו בשם "מקורות" ובתוך הספרייה הזו יש חבורה של קבצי כולל. כל אלה הם בקרי המיקרו שתוכל לתכנת עם אברה. מיד תבחין כי אין קובץ ל- 328p שבו אנו משתמשים כאן. צירפתי אחד. הקובץ צריך להיקרא m328Pdef.inc ואתה צריך להכניס אותו לספריית כולל או בכל מקום אחר שאתה אוהב. נכלול אותו בתוכניות שפת ההרכבה שלנו. כל זה הוא לתת לכל אחד מהרשמים בשמות המיקרו -בקר מתוך גליון הנתונים כך שלא נצטרך להשתמש בשמותיהם הקסדצימליים. הקובץ הכולל לעיל מכיל "הוראות פרגמה" מכיוון שהוא תוכנן לתכנות C ו- C ++. אם נמאס לך לראות את המאסף יורק תלונות "מתעלמות מהנחיית פרגמה" פשוט היכנס לקובץ ומחק או פרסם את כל השורות המתחילות ב- #pragma

אוקיי, עכשיו כשיש לך את המיקרו -בקר מוכן, המאסף שלך מוכן והתכנת שלך מוכן, נוכל לכתוב את התוכנית הראשונה שלנו.

הערה: אם אתה משתמש ב- ATtiny85 במקום ב- ATmega328P, עליך לקבל קובץ כולל שונה הנקרא tn85def.inc. אני אצרף אותו גם (שים לב שהייתי צריך לקרוא לזה tn85def.inc.txt כדי שהמדריכים יאפשרו לי להעלות אותו.) עם זאת, אם קיבלת את אברמבלר מ- github אז כבר יש לך את שני הקבצים האלה איתו. אז אני ממליץ להשיג אותו ולרכז אותו בעצמך: שיבוט git

שלב 3: שלום עולם

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

תחילה חבר נורית מ- PB5 (ראה תרשים ה- pinout) הנקראת גם Digital Out 13 על ארדואינו, לנגד 220 אוהם ולאחר מכן ל- GND. כְּלוֹמַר.

PB5 - LED - R (220 אוהם) - GND

עכשיו לכתוב את התוכנית. פתח את עורך הטקסט האהוב עליך וצור קובץ בשם "hello.asm"

; שלום.אסם

; מדליק נורית שמחוברת ל- PB5 (יציאה דיגיטלית 13). כולל "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start

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

לאחר שיצרת את הקובץ, במסוף אתה מרכיב אותו כדלקמן:

avra hello.asm

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

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U פלאש: w: hello.hex

אם אתה משתמש בארדואינו עם קרש לחם, יהיה עליך ללחוץ על כפתור האיפוס על הארדואינו של לוח הלחם ממש לפני שתבצע את הפקודה לעיל. שים לב כי ייתכן שיהיה עליך להוסיף סודו מלפנים או לבצע אותו כשורש. שים לב גם שבחלק מהארדואינו (כמו ה- Arduino UNO) סביר להניח שתצטרך לשנות את קצב הסיביות ל- -b 115200 ואת היציאה -P /dev /ttyACM0 (אם תקבל שגיאה מ- avrdude על חתימת מכשיר לא חוקית, פשוט הוסף - F לפקודה)

אם הכל עבד כפי שהוא אמור להדליק כעת נורית LED ….. "שלום עולם!"

אם אתה משתמש ב- ATtiny85 אז הפקודה avrdude תהיה:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

שלב 4: Hello.asm שורה אחר שורה

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

; שלום.אסם

; מדליק נורית שמחוברת ל- PB5 (יציאה דיגיטלית 13)

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

.כלול "./m328Pdef.inc"

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

ldi r16, 0b00100000

ldi מייצג "עומס מיידי" ואומר למרכיב לקחת רישום עבודה, r16 במקרה זה, ולהטעין לתוכו מספר בינארי, 0b00100000 במקרה זה. ה- 0b מלפנים אומר שהמספר שלנו בינארי. אם היינו רוצים היינו יכולים לבחור בסיס אחר, כמו הקסדצימלי. במקרה זה המספר שלנו היה 0x20 שהוא הקסדסימלי עבור 0b00100000. או שיכולנו להשתמש ב- 32 שהוא בסיס 10 עשרוני עבור אותו מספר.

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

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

יוצא DDRB, r16

שורה זו אומרת למהדר להעתיק את תוכן הרשם r16 לרשם DDRB. DDRB מייצג "Register Direction Data B" והוא מגדיר את "הסיכות" ב- PortB. על מפת ה- pinout של 328p אתה יכול לראות שיש 8 סיכות המסומנות בשם PB0, PB1,…, PB7. סיכות אלה מייצגות את "הביטים" של "PortB" וכאשר אנו מעמיסים את המספר הבינארי 00100000 לרשם ה- DDRB אנו אומרים כי אנו רוצים ש- PB0, PB1, PB2, PB3, PB4, PB6 ו- PB7 יוגדרו כסיכות INPUT מכיוון שיש להם 0 בתוכם, ו- PB5 מוגדר כסיכת OUTPUT מכיוון ששמנו 1 בנקודה זו.

יוצא PortB, r16

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

תרגיל 2: קח מולטימטר דיגיטלי, חבר את ההובלה השחורה לאדמה (GND) ולאחר מכן בדוק כל אחד מהסיכות PB0 דרך PB7 עם ההובלה האדומה. האם המתחים בכל אחד מהסיכות הם בדיוק המתאימים להכנסת 0b00100000 ל- PortB? אם יש כאלה שלא, מדוע אתה חושב שכן? (ראו את מפת הסיכות)

הַתחָלָה:

rjmp התחל

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

תרגיל 3: הסר את שתי השורות שלעיל מהקוד שלך כך שהתוכנית תיפול מצוק. מה קורה? אתה אמור לראות משהו שנראה כמו התוכנית ה"מצמץ "המסורתית בה השתמש ארדואינו כ"עולם שלום!". למה אתה חושב שזה מתנהג כך? (תחשוב מה חייב לקרות כשהתוכנית נופלת מצוק …)

שלב 5: מסקנה

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

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

ldi hregister, מספר טוען מספר (0-255) לרשום חצי עליון (16-31)

יוצא ioregister, הרשמה מעתיקה מספר מרשם עבודה לרשום קלט/פלט

תווית rjmp קופצת לשורת התוכנית שכותרתה "תווית" (שאינה יכולה להיות רחוקה מ -204 הוראות - כלומר קפיצה יחסית)

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

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

מוּמלָץ: