יש לנו דבורה מהבהבת!

בקושי שלושה חודשים עברו מאז שקניתי את לוח הפיתוח של ה-EFM8 Busy Bee, וכבר התפניתי לשחק איתו קצת ולכתוב קוד בלינק בסיסי למיקרו-בקר המבטיח מבית Silicon Labs. הנה הפרטים הראשונים…

תקריב לוח ההערכה ל-EFM8BB1
תקריב לוח ההערכה ל-EFM8BB1

לפני הכול, בואו נתרענן קצת על הרקע. ה-EFM8 היא ארכיטקטורה חדשה יחסית של מיקרו-בקרים 8-ביט, שמבוססים על ליבת CIP-51 – תואמת ל-8051 הוותיקה, אך מהירה הרבה יותר. תחת המטריה הכללית של EFM8 קיימות ארבע משפחות של "דבורים". ה-Busy Bee היא המשפחה ל"שימושים כלליים", והמיקרו-בקר הספציפי על הלוח שלי הוא EFM8BB10F8G במארז QSOP24, שלמרות ה-Q בשמו יש לו פינים רק בשני צדדים ולא בארבעה. הנה עיקרי המפרט הטכני של הג'וק:

  • מהירות שעון מרבית: 25MHz (24.5MHz עם שעון פנימי)
  • 8KB זיכרון FLASH
  • 0.5KB זיכרון RAM
  • מתח עבודה 2.2V-3.6V
  • 16 פיני קלט/פלט דיגיטלי
  • 15 ערוצי ADC, ברזולוציה של 12 ביט
  • I2C, SPI, UART (אחד מכל סוג)
  • טיימרים: ארבעה של 16 ביט

שימו לב שאין זיכרון EEPROM. אין גם גרסה במארז DIP, אבל המחיר (יחסית לביצועים) נמוך ביותר, פחות מ-70 סנט ליחידה. התכנות מתבצע בסביבת הפיתוח Simplicity Studio, שהקומפיילר שלה – כך מסתבר – הוא Keil 8051. המידע הבסיסי על המיקרו-בקר נמצא במסמך הזה, ואילו המפרט המעניין באמת עם שמות הרגיסטרים וכל התכל'ס נמצא כאן. זהו, אפשר להתחיל לעבוד!

קובצי Header

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

#include <SI_EFM8BB1_Defs.h>
#include <SI_EFM8BB1_Register_Enums.h>

הגדרת פין פלט

את המידע על הרגיסטרים הרלוונטיים להגדרת פין פלט לקחתי מה-Reference Manual, וגם מעיון בדוגמאות קוד שהגיעו עם סביבת הפיתוח. בניגוד לכל מיקרו-בקר אחר שראיתי עד היום, כאן אין הגדרה נפרדת לפיני פלט ולפיני קלט, אבל יש הגדרה נפרדת לפיני Open Drain (שיכולים להעביר זרם רק ל"כיוון" האדמה או בכלל לא) ולפיני Push-Pull (שיכולים להעביר זרם בשני הכיוונים, כמו HIGH ו-LOW בארדואינו). יש הגדרות נוספות שצריך יהיה ללמוד ולהבין בהמשך, אבל בינתיים נעשה את המינימום כדי להגדיר את פין P0.2 כפין פלט "רגיל". הפקודה הראשונה מגדירה אותו כפין דיגיטלי, והשנייה הופכת אותו לפין Push-Pull:

P0MDIN |= 4;
P0MDOUT |= 4;

זו ההגדרה הבסיסית, אבל כדי שהיא "תתפוס" צריך להפעיל גם את ה-Crossbar. מה זה Crossbar? זה יצטרך לחכות לפוסט נפרד, ואם עד היום עבדתם רק עם ארדואינו ודומיו הוא יפוצץ לכם את השכל… בינתיים פשוט נפעיל אותו על ידי כתיבת 1 לביט השישי של הרגיסטר XBR2:

XBR2 |= 0x40;

השבתת ה-Watchdog

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

WDTCN = 0xDE;
WDTCN = 0xAD;

מין הומור של מהנדסים, כנראה… (0xDEAD, הבנתם?)

קביעת פלט הפין

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

P0 ^= 4;

מבחן ראשון: לולאה מהירה

הנה, אם כן, התוכנית המלאה שמטרתה פשוט לנדנד את הפלט בפין P0.2:

#include <SI_EFM8BB1_Defs.h>
#include <SI_EFM8BB1_Register_Enums.h>

int main (void){
 
  WDTCN = 0xDE;
  WDTCN = 0xAD;

  P0MDIN |= 4;
  P0MDOUT |= 4;
  XBR2 |= 0x40;

  while (1) {
    P0 ^= 4;
  }
 
}

כשמעלים אותה ללוח (ועל כך בפוסט הבא) מתקבל גל ריבועי בפין P0.2, בתדר של כ-250KHz. למה התדר הזה? ובכן, שעון ברירת המחדל מבוסס על המתנד הפנימי (24.5MHz) חלקי 8, שזה 3,062,500 הרץ. מצב הפין מתחלף כל 2 מיליוניות השנייה בערך, כלומר שישה מחזורי שעון לכל "סיבוב" של הלולאה – מספר סביר בהחלט.

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

הדבורה מהבהבת
הדבורה מהבהבת

בלינק קלאסי

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

#include <SI_EFM8BB1_Defs.h>
#include <SI_EFM8BB1_Register_Enums.h>

int main (void){

  uint16_t j;

  WDTCN = 0xDE;
  WDTCN = 0xAD;

  P0MDIN |= 4;
  P0MDOUT |= 4;
  XBR2 |= 0x40;

  while (1) {
    for (j = 0; j < 60000; ++j) ;
    P0 ^= 4;
  }

}

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

להרשמה
הודע לי על
2 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

עידו, מה קורה עם הפרוייקט לחדרי בריחה ?