לפני חודש וקצת התלהבתי מה-ATmega328PB, עד כדי כך שבחרתי בו כבסיס לפרויקט של לקוח. מסתבר שהשמחה היתה מוקדמת מדי: נראה שלג'וק הזה יש חיסרון אחד משמעותי ש"שכחו" לציין במסמכים הרשמיים, ושאלמלא הייתי זהיר במיוחד, היה מחריב לי את כל הפרויקט. וזו רק ההתחלה!
אנשי השיווק והמכירות מנסים תמיד לשכנע את המפתחים להשתמש במיקרו-בקרים הכי חדשים ומשוכללים, אבל מפתחים רבים מעדיפים להיצמד ואפילו בכוח לרכיבים הישנים והטובים שהם כבר מכירים. זו לא סתם שמרנות עיקשת, אלא לקח ממשי מאד מהחיים האמתיים – כי לעתים קרובות מוצרים חדשים כוללים כל מיני באגים ידועים ולא-ידועים, ואף מפתח שפוי לא רוצה להיות זה שנתקל בהם רגע לפני הדדליין.
גם אני שמעתי מספיק סיפורי זוועה כדי להימנע ככל האפשר מ"המילה האחרונה", אפילו לפרוייקטים האישיים שלי. במקרה של ה-328PB חרגתי מהכלל הזה, כי חשבתי שהוא לא מוצר חדש לגמרי, אלא הרחבה של ה-328P הוותיק והמוכר. ה-datasheet כבר הגיע לגרסה C ובכל זאת סעיף ה-Errata (שגיאות) שלו היה די ריק, וגם לא צצו ביקורות קטלניות בשום מקום שהייתי מודע אליו. אז מה כבר יכול להשתבש?
א-הה.
ל-328PB יש מתנד פנימי של 8MHz (כמו ל-328P), ומה עושים אם רוצים תדר שעון גבוה יותר? אחת האופציות, שתקפה לכל משפחת AVR מאז ומתמיד (למיטב ידיעתי), היא להוסיף למעגל גביש ושני קבלים. אבל לא ל-328PB! בשקט בשקט, בלי להדגיש או לציין את זה באופן בולט/ברור, חברת Atmel פשוט הוציאה מהג'וק את החומרה שתומכת בגבישים במהירות גבוהה. אם תרצו להריץ את המיקרו-בקר במהירות גבוהה יותר משמעותית מ-8MHz, תצטרכו מקור שעון עם אספקת חשמל משלו (כלומר, או External clock או רכיב Oscillator, שהוא מורכב ויקר יותר מגביש רגיל). גביש "קלאסי" כמו בלוחות הארדואינו ייתן אות רגיש להפרעות במקרה הטוב, או לא יעבוד בכלל.
למזלי, תכננתי מראש את הפרויקט במחשבה על תדר שעון נמוך ככל האפשר (מטעמי חיסכון בחשמל). את גביש ה-16MHz חשבתי להוסיף בשלב האבטיפוס בלבד, בשביל תכונות ופונקציות דיבוג שלא יהיו קיימות בתוצר הסופי – וגם ערכתי הרבה ניסויים ראשוניים על מטריצה ו-Veroboard. כך "תפסתי" את הבאג הזה בשלב מוקדם יחסית, ואמנם הוא בזבז לי זמן עבודה וקלקל לי כמה תוכניות, אך לא מוטט את הפרויקט כולו.
קצה הקרחון
בעודי מנסה לברר, בפורומים שונים, אם מישהו נתקל בתקלה דומה, הסתבר שזה עוד כלום: החל מפברואר השנה, חברת Atmel התחילה לייצר דגמים רבים ממשפחת ATmega – כולל ATmega328P הוותיק! – בלי החומרה הזו שתומכת ב-Full Swing Crystal Oscillator. זאת אומרת, לפחות בתצורת ה-SMD, כבר אי אפשר יהיה לבנות לוחות ארדואינו רגילים ואמינים עם גביש "קלאסי". יש לציין שקוד הזיהוי של השבבים החדשים שונה, כך שסביבת הפיתוח של ארדואינו אמורה להתריע על "חתימה" בעייתית, ואף על פי כן לא אתפלא אם בשנים הקרובות יתחילו צרות עם ארדואינו וחיקויי ארדואינו בגלל הסיפור הזה. אם כן, זיכרו איפה קראתם על זה בפעם הראשונה…
קשה לנחש מה גרם ל-Atmel לבצע מהלך כזה (מן הסתם כרוך בעניין יתרון כלכלי כלשהו, ובכל זאת) ומדוע הוא לא צף ועלה בפורומים מוקדם יותר. הצרה היא שזו לא פעם ראשונה וגם לא האחרונה שדבר כזה קורה בעולם המיקרו-בקרים, ואי אפשר להימנע ממנו לגמרי. הדרך היחידה לצמצם את הנזקים היא לא לסמוך על אף אחד: לבדוק כמה שיותר וכמה שיותר מוקדם, וככל שהפרויקט חשוב וגדול יותר, כך להתעקש יותר על רכיבים מוכרים – ואפילו עבורם להשאיר מרווחי תמרון וביטחון.
עד הבאג הבא…