זוכרים את הימים שלוחות ה-MSP430G2 Launchpad היו הדבר הכי מרגש מאז המצאת הארדואינו (ויותר זולים אפילו מהחיקויים הסיניים)? בואו נחזור אליהם רגע, מזווית קצת יותר מתקדמת ומקצועית, ונראה איך עובדים עם המיקרו-בקרים 16-ביט של TI ברמת הרגיסטרים – בפוסט זה, יצירת פרויקט בסביבת הפיתוח Code Composer Studio והגדרות בסיסיות של פלט ושעון.
בימים אלה של מחסור עולמי בשבבים ואגירה היסטרית של מלאי על ידי שחקנים גדולים מאיתנו, העיקרון הידוע של "לא לשים את כל הביצים בסל אחד" מקבל משנה תוקף. ברוח זו, ניסיתי לשחק קצת עם מיקרו-בקר EFM32 של חברת Silicon Labs, אך החוויה הייתה כל כך מתסכלת שכדי להתאושש ממנה, חזרתי להסתכל על MSP430. זוהי משפחה גדולה ומגוונת מאוד של מיקרו-בקרים, וגם אם הם יקרים יותר מ-PIC ו-AVR, וה-Datasheets שלהם פחות ידידותיים, לפחות אפשר להתחיל לעבוד איתם בלי להשתגע, ובתקופה כזו גם זה משהו.
הצורב הרשמי שלהם, MSP-FET, הוא מוצר יקר מאוד – סביבות 600 ש"ח – אך בכל לוחות ההערכה (שמחיריהם מתחילים מ-$10 לפני משלוח) יש צורב מובנה, וספציפית ב-MSP430G2 אפשר לשלוף בקלות את המיקרו-בקר החוצה ולחבר לתושבת שלו חוטים, כצורב מאולתר. סביבת הפיתוח היא חינמית לגמרי וגם ללא ההגבלות על גודל הקוד שהיו קיימות בעבר. אני משתמש כאן בגרסה 10.2. במהלך ההתקנה תישאלו עם אילו מוצרים אתם מתכוונים לפתח – בשלב זה מספיק לבחור את MSP430, ולחסוך כמה מאות מגה-בייטים על הדיסק.
בהפעלה הראשונה מתבקשים גם לבחור איפה לשים את הפרויקטים, מה שנקרא Workspace. אפשר לסמן את הבחירה כברירת מחדל וההודעה לא תופיע יותר. אחרי זה, יצירה של פרויקט חדש היא באמת פשוטה. נניח שיש לנו לוח עם המיקרו-בקר MSP430G2553. אחרי שנחבר את הלוח ל-USB, נבחר בתפריט File->New->CCS Project ונגדיר שם את המיקרו-בקר הנכון, את הלוח (בעזרת הכפתור "Identify" אם צריך), שם הפרויקט, והקומפיילר שמופיע כברירת מחדל. שימו לב גם לבחירה בסוג הפרויקט הריק בתיבה, "with main.c".
וכמו קסם – שוב, ביחס לביזיון הנורא עם EFM32 – נפתח לנו הקובץ main.c של הפרויקט, כולל קוד מוכן לקימפול, שאפילו מכבה לנו באדיבות את ה-Watchdog timer שמופעל בחומרה כברירת מחדל. אפשר להתחיל לעבוד!
על המשמעות המדויקת של הפקודה בשורה 9 נדבר בפוסט הבא. בינתיים, בואו נהבהב בלד. יש שני לדים מובנים על הלוח, שמחוברים לפינים P1.0 ו-P1.6. כמו בכל מיקרו-בקר, הפינים מחולקים לפורטים, שמסומנים ב-MSP430 במספרים עוקבים החל מ-1. כלומר, אנחנו צריכים לכתוב לביט 0 או לביט 6 של פורט 1 כדי להפעיל לד. אבל איך נקרא הרגיסטר הרלוונטי של הפורט?
אם נציב את הסמן על הטקסט "msp430.h" בפקודת ה-include היחידה בקוד למעלה ונלחץ על F3, ייפתח לנו קובץ מתווך שמכיל המון פקודות include מותנות. בזכות ההתניות האלה, רק אחת מהן מתבצעת בפועל, ובה נמצא הקובץ msp430g2553.h, שהוא זה שמעניין אותנו באמת.
נחזור על התרגיל עם F3 כאן, ונמצא אוצר: כל השמות וההגדרות של הרגיסטרים וערכי הביטים המשמעותיים עבור המיקרו-בקר שלנו. זה, בשילוב עם ה-Datasheet של משפחת MSP430x2xx כולה, ובמידה פחותה ה-Datasheet הספציפי של הג'וק, יתנו לנו את כל המידע שצריך כדי להתחיל. ככה נלמד ש-P1DIR הוא הרגיסטר שקובע את הכיוונים (קלט/פלט) של פינים בפורט1, ושהרגיסטר P1OUT קובע את ערכי הפלט (HIGH/LOW). עוד לא למדנו להשתמש בטיימרים ואין לנו פונקציות מוכנות מראש כמו millis בארדואינו, אז ניעזר כאן בלולאת ספירה סתמית כדי ליצור השהייה, ונהבהב בלד שמחובר ל-P1.0. הנה הקוד:
כדי להריץ אותו, אגב, לוחצים F11 או על אייקון החיפושית הירוקה כדי להתחיל סשן דיבוג, ואז על F8 (או לחצן המשולש הירוק) להרצה רגילה.
הלד האדום על הלוח יידלק ויכבה, בקצב של פעם בשנייה לערך. הליבה של ה-MSP430, כזכור, היא 16 ביט, כך שהעיבוד של המשתנה x אמור להיות די מהיר. אנחנו יודעים גם שהמיקרו-בקר הזה מגיע לקצב שעון של 16MHz. אז איך זה שכל סיבוב של לולאת הספירה לוקח על פי ההערכה כ-12.5 מיליוניות השנייה, או 200 מחזורי שעון?
ובכן, כפי שקורה בכל מקום בעצם חוץ מארדואינו, מהירות השעון שמופעלת כברירת מחדל היא לא המקסימום שהרכיב מסוגל לו. אם נסתכל על ערכי האיפוס של הרגיסטרים של השעון, ועל הטבלה ב-Datasheet שמסבירה אותם, נראה שקצב השעון שלנו כרגע הוא בכלל אי-שם בין 0.8-1.5MHz.
זה עדיין יוצא הרבה מחזורי שעון לכל סיבוב של הלולאה, אך כבר מתחיל להיראות סביר. ואנחנו יכולים, כמובן, לשנות את הרגיסטרים כדי לעלות למהירות מרבית. השמות הרלוונטיים שמופיעים בטבלה, RSELx ו-DCOx, הם לא רגיסטרים בפני עצמם אלא אוספי ביטים בתוך רגיסטרים אחרים. בקוד, כשאני עובר לשעון המהיר ביותר, זה ייראה כך:
עכשיו הלד מרצד בתדירות גבוהה מספיק כדי להציק בעין, ולפי הסקופ כל מחזור הדלקה וכיבוי נמשך בסביבות 53 אלפיות שנייה – קצר פי עשרים מקודם, בהחלט סדר הגודל הנכון על פי הטבלה.
כמו במיקרו-בקרים רבים, גם פה אפשר לשקף את השעון הפנימי (במקרה זה "שעון המודולים הפריפריאליים", שנקרא SMCLK) בפין פלט. זה יהיה פין P1.4, והקוד שמתעל אליו את פלט השעון הוא
P1DIR |= 16; // pin 1.4 is Output
P1SEL = 16; // Alternate function (SMCLK) on P1.4
במהירות ברירת המחדל, הוא פולט גל ריבועי יפה בתדר 1.07MHz, ובמהירות מרבית קיבלתי… 20MHz?! שזו אמנם אחלה מהירות, אבל הרבה יותר מהערך הנקוב של 16MHz בראש ה-Datasheet. שימו לב שלפי הטבלה למעלה זה יכול להגיע אפילו עד 26MHz. מה עושים עם טווח סטייה גדול כל כך? מסתבר שהמיקרו-בקרים עוברים קליברציה במפעל, וערכי התיקון הנכונים לכל אחד נרשמים ונגישים לנו דרך רגיסטרים מיוחדים, עם שמות כמו CALBC1_8MHz. הנה ההגדרות שלהם מקובץ ה-header:
אם נעתיק בקוד שלנו את הערכים המתאימים לרגיסטרים של המתנד, למשל כך:
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
נקבל תדר קרוב מאוד ל-16MHz, יציב דיו כדי לכתוב פונקציות כמו millis.
אוקיי, זה לא המיקרו-בקר הכי מסביר-פנים בעולם, ובכל זאת הוא ו"הסביבה האקולוגית" שלו ברורים ועושים את העבודה – יותר ממה שאפשר לומר על כמה ג'וקים אחרים. כמו כן, ל-MSP430 יש גם נגדי pull-up וגם pull-down פנימיים, לבחירתנו, ולדגמים המודרניים זיכרון FRAM במקום FLASH, שכפי שהזכרתי בעבר פותח עולם שלם של אפשרויות חדשות.
המשך יבוא…