קלט ופלט בלי פינים

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

אילוסטרציה: מיקרו-בקר עם שני פינים בלבד
קצת כמו מארי קונדו לאמבדד

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

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

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

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

ובכן, אנחנו יכולים לשלוט בצריכת החשמל ואפילו די בקלות, אם אנחנו מוותרים למשך השידור על הפעילות הרגילה של המיקרו-בקר. אפשר למשל לתת לו לרוץ בלולאה רגילה במשך 10 אלפיות השנייה (זה מייצג נניח ביט "1") או להעביר אותו למצב שינה חסכוני למשך פרק זמן דומה (ביט "0"). אם נעביר את החשמל למיקרו-בקר דרך נגד בעל ערך שחושב בקפידה, נוכל לראות בבירור באמצעות סקופ את השינויים במתח שנופל על הנגד הזה ולקרוא כך את הביטים, בדרך כלל בלי לפגוע בפעולת המערכת. בצילום המסך הבא אפשר לראות פלט ON/OFF פשוט מסוג זה, שהפקתי באמצעות מיקרו-בקר PIC12F1840. המתח נמדד על פני נגד 91 אוהם שבין מקור המתח 5V לפין Vcc של ה-PIC.

לא Blink רגיל
לא Blink רגיל

מתי זה כן פוגע בפעולת המערכת? כיוון שנגד החישה הזה מפיל קצת מתח, מערכת שתלויה במתח פעולה מדויק (למשל למדידות אנלוגיות מסוימות) עשויה להיקלע לקשיים. מצד שני, אין רע בלי טוב: מיקרו-בקר שמסוגל למדוד את מתח האספקה של עצמו, באמצעות מתח רפרנס פנימי, יכול גם לזהות ולתעד שינויים במתח האספקה – וזה פותח לנו ערוץ קלט נטול פינים, מהמפעיל החיצוני ששולט במתח אל תוך המיקרו-בקר! (הערה לדקדקנים: נכון, הקלט והפלט הנ"ל עוברים בכל זאת דרך איזשהו פין [Vcc], אבל הוא לא נחשב פין PGIO).

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

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

עריכה: קצת אחרי שפרסמתי את הפוסט הזה, נזכרתי שיש רכיבים שעושים דברים דומים בכוונה תחילה, למשל בפרוטוקול 1-Wire, שמעביר את ה"פלוס" של החשמל ואת המידע על אותו כבל. קשה מאוד ליצור משהו חדשני לגמרי בתחום שלנו!

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

יש עוד מקרה נפוץ יחסית שבו רואים רכיב דיגיטלי שמתקשר עם הסביבה למרות שיש לו רק 2 מגעים – תגי RFID.