shiftIn – הסבר ופרטים

- עמוד זה הוא חלק מהמדריך לפונקציות ארדואינו -

הפונקציה shiftIn(dataPin, clockPin, bitOrder) קוראת בייט יחיד באופן סדרתי (שמונה ביטים בזה אחר זה) ממקור חיצוני. הפונקציה מניחה שמחובר לארדואינו מקור חיצוני, ששולח את הביטים בהתאם לאות שעון, שנשלח אליו ו“מודיע” לו מתי להעביר כל ביט (אות השעון יוצא מהארדואינו, לא מגיע מהמקור החיצוני).

פרמטרים

dataPin הוא מספר/שם הפין שדרכו מגיעים הנתונים מהמקור החיצוני (חייב להיות מוגדר כפין קלט – ראו pinMode). פרמטר זה הוא מטיפוס uint8_t. שמות פינים כגון A0 הינם למעשה קבועים שמוגדרים מראש בספריות הליבה של ארדואינו, כך שניתן להשתמש גם בהם.

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

bitOrder, מטיפוס uint8_t, מציין את הסדר בו אמורים הביטים להגיע – משמאל לימין (הקבוע MSBFIRST, שערכו 1) או מימין לשמאל (הקבוע LSBFIRST, שערכו 0). ערך גדול מ-1 ייחשב גם הוא MSBFIRST.

ערך חוזר

הבייט שהתקבל מהמקור החיצוני. ערך מטיפוס uint8_t.

הסבר קצר: סדר הביטים

כאשר כותבים ערך בייצוג בינארי, נהוג לקרוא אותו משמאל לימין. למשל, המספר הבינארי 100 נקרא “אחד-אפס-אפס”, וערכו בבסיס עשר הוא 4. כשהמידע נשלח בשיטת MSBFIRST, הביטים יגיעו בסדר ה“טבעי” – אחד-אפס-אפס. בשיטת LSBFIRST, לעומת זאת, הם יישלחו “מהסוף להתחלה” – אפס-אפס-אחד.

חשוב מאד לתאם בין שיטת השידור לשיטת הקליטה, אחרת יתקבלו ערכים שגויים. לדוגמה, אם השולח משדר את הביטים “אחד-אפס-אפס” בשיטת MSBFIRST, אבל הקולט חושב שמדובר בשיטת LSBFIRST, התוצאה בצד הקולט תהיה המספר הבינארי 001 – שערכו בבסיס עשר הוא 1.

דוגמאות

uint8_t dataByte;
dataByte = shiftIn(10, 11, MSBFIRST);

הערות

  • הפונקציה shiftIn מניחה שמקור המידע החיצוני מגיב לעלייה באות השעון (כלומר, כשאות השעון עובר מ-LOW ל-HIGH). זהו סוג תגובה נפוץ מאד אך לא אוניברסלי – חובה לוודא שהמקור החיצוני עובד בשיטה זו. כמו כן, הפלט בפין clockPin חייב להיות LOW לפני הקריאה לפונקציה, כדי שהסינכרון בין השעון לביטים יהיה נכון.
  • בפונקציה זו, בלוחות ארדואינו טיפוסיים (תדר פעולה של 16MHz), משך ה-LOW של אות השעון הוא כ-5 מיליוניות השנייה, ומשך ה-HIGH הוא כ-10 מיליוניות השנייה – כאשר הביט אמור להיות זמין לקריאה בפין dataPin תוך מיליוניות שניה בודדות מתחילת ה-HIGH. אלה הם זמנים ממושכים יחסית עבור רכיבים מודרניים, אך עדיין חובה לוודא שהמקור החיצוני מסוגל להגיב במהירות הדרושה.
  • הפונקציה shiftIn היא חוסמת (Blocking) – הקוד הראשי ימשיך לרוץ רק בסיום הקליטה.

קישורים רלוונטיים

בלוג אישי בנושאי מייקינג, תכנות, מיקרו-בקרים ואלקטרוניקה