דברים חדשים: VM800P35A והבאג הבלתי-נסלח

המוצר המיוחד שהגיע אליי הפעם הוא VM800P35A, לוח הדגמה שמשלב מסך LCD קטן, מעין-ארדואינו מובנה, מעבד אודיו, שעון זמן-אמת, חריץ ל-Micro SD ובעיקר שבב EVE (מנוע וידאו מוטמע – Embedded Video Engine) מדגם FT800 של חברת FTDI. השילוב של שלושת אלה מבטיח תוצאה מעניינת מאד: ארדואינו עם תצוגת מולטימדיה זריזה להפליא, ברמה של משחקי פלאש מודרניים (אם לא יותר מזה).

הצד האחורי (והמעניין יותר) של ה-VM800P35A
הצד האחורי (והמעניין יותר) של ה-VM800P35A

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

ft800memWrite32(RAM_CMD + cmdOffset, 
                (DL_BEGIN | FTPOINTS));

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

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

פחחחחחח.

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

הבאג ואיך מצאתי אותו

הקוד התקמפל בלי בעיה, וגם עלה ללוח בלי תלונות (אחרי שהבנתי שצריך לבחור Arduino Duemilanove בתור לוח היעד – מעניין אם זה מכיוון שמדובר ב-FTDI, שבשבבים שלהם נעשה שימוש בדגמי ארדואינו הישנים). בכל אופן, על המסך לא ראו כלום. במבט חטוף בקוד (500 שורות ברוטו) הבחנתי שהוא עושה משהו עם Serial, אז פתחתי את המוניטור הסריאלי כדי לראות מה קורה שם. ואכן, מיד הופיעה שם ההודעה הסופר-אינפורמטיבית: "System Halted".

VM800P35A מלפנים - כן, ככה זה נראה גם כשהרצתי את הקוד לדוגמה...
VM800P35A מלפנים – כן, ככה זה נראה גם כשהרצתי את הקוד לדוגמה…

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

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

// Set LCD display resolution here
// QVGA  = 320 x 240 (VM800B/C 3.5")
#define LCD_QVGA 
// WQVGA = 480 x 272 (VM800B/C 4.3" and 5.0")
//#define LCD_WQVGA                

// Set Arduino platform here
// FTDI FT800 "Plus" board with AT328P 
#define VM800B                
// Arduino Pro, Uno, etc. (I/O 10 on SS#)
//#define ARDUINO

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

אהה.

מכאן ההמשך היה קל. חיפשתי היכן מופיע הקבוע השני, ARDUINO, ומצאתי את הקטע הבא בתחילת הפונקציה setup:

 #ifdef ARDUINO
  triggerPin = 2;
  ft800irqPin = 3;
  ft800pwrPin = 4;
  ft800csPin  = 10;
#endif

#ifdef FT800P
  triggerPin = 2;
  ft800irqPin = 3;
  ft800pwrPin = 4;
  ft800csPin  = 9;
#endif

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

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

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