משימה בלתי אפשרית: בלינק על Xmega

אחרי שהשגתי מיקרו-בקר חדש ונוצץ מדגם ATxmega8E5, וצורב Atmel ICE חדש ונוצץ לא פחות, החלטתי לבדוק את שניהם בעזרת – איך לא – פרויקט Blink קטן. מכיוון שהשבבים ממשפחת xmega בנויים בארכיטקטורת AVR, כמו שבבי ATmega או ATtiny שכבר זכיתי להכיר, חשבתי שזה יהיה סיפור קל וקצר. אתם מוזמנים לשפוט בעצמכם.

לוח הניסוי שיצרתי עבור ה-ATxmega8E5
לוח הניסוי שיצרתי עבור ה-ATxmega8E5

בתור התחלה, הלחמתי את המיקרו-בקר (שבא במארז TQFP32) למתאם ל-DIP שרכשתי בעבר. לא נוח להלחים רכיבים עדינים כאלה בלי flux, שכרגע אין לי, אבל הסתדרתי איכשהו, ואז בניתי לוח לניסויים עם תושבת למתאם, מטריצה קטנה, נוריות LED לאינדיקציה ומייצב מתח – כי ה-xmega עובדים ב-3.3V. הדבר היחיד שהיה חסר הוא חיבור לצריבה, וכאן התחילו הבלגנים.

מיפוי פינים זה לחלשים

לצורב הקודם שלי, AVRISP MKII, יש מחבר לצריבה עם 6 פינים (בסידור 2×3) שנקרא ISP, ויש עליו סימון – לא בולט במיוחד – שאומר מי מהם הוא פין מס' 1. גם לצורב Atmel ICE החדש יש מחבר 2×3, אך אין עליו שום סימון ברור, ומה שעוד יותר גרוע, לא הצלחתי למצוא בשום מקום הסבר נורמלי לכיוון החיבור הנכון. ממשק הצריבה והדיבוג ל-xmega נקרא PDI (ראשי תיבות של Program and Debug Interface), והוא זקוק למעשה לארבעה פינים בלבד מתוך השישה: מתח, אדמה, Reset (שמשמש גם כאות שעון!) ו-Data. אז מי זה מי? איך מוודאים שהמחבר בכיוון הנכון ולא תוקע בטעות מתח לפין נתונים או צרה דומה?

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

מיפוי הפינים (Pinout) הנכון של מחבר PDI - צד הצורב
מיפוי הפינים (Pinout) הנכון של מחבר PDI – צד הצורב

עדכון אוטומטי זה לחלשים

כבר בשלב ההגדרה הראשונית של הפרויקט, סביבת הפיתוח Atmel Studio 6.2 מיהרה להודיע לי שהקושחה של הצורב מיושנת, ושאלה אם זה בסדר מבחינתי שהיא תעדכן אותה. אישרתי, העדכון נכשל ומאותו רגע הצורב הופיע כ-"Disconnected" (או לא הופיע בכלל, גם אחרי אתחולים וניתוקים) ולא ניתנה לי אפשרות לנסות שוב. מסוג הדברים שגורמים לאדם לחפש את הפטיש-10-קילו הקרוב. חזרתי ל-avrfreaks, שם הבעיה הזו כבר הועלתה ונפתרה: מסתבר שצריך להעתיק קובץ מסוים מפה לשם, להריץ קובץ אחר באיזו תיקיה עלומה, וזהו, הצורב מזוהה ומעודכן. כפתור ופרח, כמו שאומרים.

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

עקביות זה לחלשים

אוקיי, אפשר סוף כל סוף לגשת לקוד, ומכיוון שזה AVR, בטח השמות והפונקציונליות של הרגיסטרים זהים למה שאנחנו מכירים, נניח DDRx קובע אם הפינים בפורט x יהיו קלט או פלט. נכון? פחחחחח. ולא רק שזה לא נכון, אפילו אין תיאורים נורמליים של הרגיסטרים ב-datasheet של המיקרו-בקר הזה, כפי שיש ב-datasheet של ATmega328 או ATtiny85. לא, פה צריך ללכת למסמך הכללי שמתאר את משפחת xmega E, ולחטט בו עד שהתמונה מתחילה קצת להתבהר. למשל, ל-DDRx קוראים כאן PORTx.DDR, וכדי לשנות ערכי פלט – מה שנעשה בדגמים הישנים עם רגיסטר בשם PORTx – צריך לעבוד כאן עם PORTx.OUT. לא לגמרי מופרך, כשלעצמו, אבל לחלוטין לא עקבי עם AVR הקודמים.

פיוזים זה לחלשים

שמח וטוב לב, כתבתי בעזרת המידע לעיל קוד Blink בסיסי שאמור להבהב פעם בשניה. אבל רגע, מה תדר השעון של ברירת המחדל? הסתבר שמיפוי הפינים של הצורב אכן היה נכון, אז ניגשתי לחלון הפיוזים של סביבת הפיתוח (שם הגדרתי עד היום דברים כאלה). לא היה שם שום דבר שקשור לשעון. מסתבר שגם פה צורת העבודה שונה לגמרי: הג'וק מתחיל תמיד עם מתנד פנימי של 2MHz, ואת כל הבחירות והשינויים – כולל בחירה במתנד חיצוני – צריך לבצע בקוד. עוד נגיע לזה בפוסטים עתידיים.

בינתיים, הנה קוד Blink שעובד לפין PD0 (פין מס' 28):

#define F_CPU 2000000

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    PORTD.DIR = 1;
        
    while(1)
    {
        _delay_ms(1000);
        PORTD.OUT ^= 1;
    }
}

 להתלונן זה לחלשים

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

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

להרשמה
הודע לי על
0 תגובות
Inline Feedbacks
הראה את כל התגובות