לאלתר ג'וק לוגי ממיקרו-בקר

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

מיקרו-בקר בתפקיד ג'וק לוגי, בתוך מתאם זמני ל-DIP
מיקרו-בקר בתפקיד ג'וק לוגי, בתוך מתאם זמני ל-DIP

לפני קצת פחות משנה, חברת TI פרסמה מדריך קצר בשם הלא-קליט "Enhance simple analog and digital functions for $0.25", שאמר דבר כזה: במקום להשתמש באינספור ג'וקים ייעודיים שונים למשימות סטנדרטיות, כגון קריאת לוח מקשים או המרה מ-UART ל-SPI, למה שלא תיקחו חופן מיקרו-בקרים מדגם MSP430FR2000 הזול ותתכנתו עליהם כל פונקציה שבא לכם? מספר סוגי הרכיבים שתצטרכו לקנות בשביל המוצר יקטן מאוד, ובמחיר של 25 סנט ליחידה (אם קונים הרבה, כמובן) סביר להניח שזה אפילו ישתלם יותר מבחינה כלכלית. המדריך כלל הסברים על היישום של 25 פונקציות נפוצות שונות, וקישורים לקוד מוכן.

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

בלי להיכנס לפרטים, לא מזמן הייתי צריך משהו שממיר את הספרות 0-9 מייצוג בינארי (4 ביטים) לפלט שמתאים לרכיב תצוגה Seven Segment. לפני שנים רבות, כשרכיבי תצוגה כאלה היו בערך שיא הטכנולוגיה, הומצאו ג'וקים שזה בדיוק התפקיד שלהם. הם נקראו BCD to 7-Segment decoder (לידע כללי, BCD הם ראשי התיבות של Binary Coded Decimal). הג'וקים מדגם 4511 הם דוגמה נפוצה לרכיבים כאלה, ואפילו כיום עוד אפשר למצוא אותם גם במזרח הרחוק וגם באתרי רכיבים מקצועיים. אלא שאני הייתי זקוק לאחד בלבד, ומהר.

כך עלו בדעתי כמה מיקרו-בקרים שיושבים אצלי כבר הרבה זמן חסרי מעש: PIC16F616 במארז SOIC שעקרתי מלוחות ישנים של מישהו אחר. זהו דגם ותיק וחלש יחסית, עם 14 פינים סה"כ, 128 בייטים SRAM ובלי שום EEPROM. האם אפשר לקחת אחד כזה ולכתוב לו בזריזות תוכנה שתהפוך אותו לממיר הרצוי?

לא נעשה מזה דרמה: ברור שאפשר, וזה גם לא ממש מסובך. צריך רק להחליט אילו פינים ישמשו לקלט ואילו לפלט, ליצור טבלת חיפוש להמרה נוחה של הקלט לפלט, ולנהל את הזזות הביטים הדרושות. מי שרוצה להגדיל ראש יכול להוסיף אופציה להתאמת הקוד לרכיבי Common cathode או Common anode וכדומה. השאלה המעניינת יותר, בהנחה שהקוד כבר נכתב, היא עד כמה הוא יעיל ביחס לג'וק ייעודי – ואם יש הבדל, האם הוא משמעותי מספיק כדי להפריע לביצוע המשימה.

על פי ה-Datasheet של אחד מדגמי ה-4511, זמן התגובה המרבי שלו לשינוי באחד מקווי הקלט הוא כ-60ns (בטמפרטורת החדר ובמתח הפעלה 4.5V). את ה-PIC16F616 אני מריץ במהירות הגבוהה ביותר שהמתנד הפנימי מסוגל לה – 8MHz – וכזכור, ב-PIC כל מחזור מערכת לוקח 4 מחזורי שעון, כלומר תדר אפקטיבי של 2MHz, או 500ns למחזור. ברפרוף על פלט האסמבלי של הקוד שלי (שבשפת C הוא לא מסובך במיוחד) הערכתי שהוא זקוק לכ-50(!) מחזורים כדי להגיע מקריאת הקלט הגולמי ועד להשלמת כל הפלט, כלומר 25us. כמו כן, כיוון שהקוד רץ בלולאה אינסופית, סביר מאוד שהוא לא יצליח לתפוס את השינוי בדיוק ברגע שהוא מתרחש, וזמן התגובה יכול להתארך לפיכך עד 50us. כמעט פי אלף יותר מהג'וק הייעודי!

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

הפרש זמן בין שינוי בקלט (צהוב) לשינוי הפלט.
הפרש זמן של כ-60 מיליוניות השנייה בין שינוי בקלט (צהוב) לשינוי הפלט במערכת שלי.

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

אגב, הזכרתי שהקוד שלי רץ בלולאה אינסופית של קלט-עיבוד-פלט. לכאורה יכולתי לשפר את המצב אם הייתי מחבר פסיקה לכל פיני הקלט, שתזהה שינוי כלשהו, ועובר למצב שינה. זה בהחלט היה חוסך הרבה חשמל – כנראה חסכוני אפילו יותר מה-4511 הקלאסי – וזמן התגובה היה הופך לאחיד וצפוי יותר. עם זאת הוא לא היה מתקצר בהרבה: ל-PIC הזה נדרשות עד 11 מיליוניות השנייה להתעוררות משינה במתח הפעלה 5V. יכולתי גם, מן הסתם באמצעות תוכנת עזר, ליצור טבלת חיפוש גדולה הרבה יותר שתאפשר לי לדלג על שלב עיבוד הביטים של הקלט ולחסוך כ-40% מהפעולות הדרושות. אולי אחקור את הכיוונים האלה בפוסט המשך.

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

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

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

מגניב!
תוכל לצרף קישור אל המדריך?