ישנם מספר מושגים שיכולים לעזור לך להגשים את חלומך. אני לא יכול, במסגרת התשובה הזו, לומר לך בדיוק כיצד ליישם את מה שאתה רוצה, אבל אני יכול להראות לך את המושגים שיעזרו לך ליישם אותו.
ראשית יש את הרעיון של ה אדון האוטובוסים . זה לא בהכרח המכשיר שמייצר תקשורת מיידית - במקום זאת זה המכשיר ש בבעלותו ו שולט באוטובוס.
כאשר מכשיר שאינו ' כאשר אדון האוטובוסים רוצה לתקשר באוטובוס הוא מבקש תחילה אישור ממנהל האוטובוסים. ה- Z80 הישן (טוב, אני אומר "ישן", אך הם עדיין נמצאים בשימוש בצורות רבות כיום) השתמש במושג זה כדי לאפשר לשבבים אחרים להשתמש בנתונים ולטפל באוטובוסים. הוא מורכב משני אותות - BUSRQ ו- BUSACK. תחילה מכשיר בודק אם אחד מ- BUSRQ או BUSACK פעיל, ואם גם הוא אינו מפעיל את BUSRQ. אם מנהל האוטובוסים מוכן לוותר על האוטובוס למכשיר השני (הוא לא משתמש בו באותו רגע) הוא מפעיל את BUSACK והמכשיר השני אז יודע שהוא יכול להשתמש באוטובוס. שום דבר אחר לא יכול להשתמש בו עד שפורסמו שניהם BUSRQ ו- BUSACK. נחמד ופשוט ואלגנטי.
אבל לא מושלם. אם שני מכשירים מחליטים לבקש את האוטובוס באותו רגע בדיוק אתה מקבל התנגשות . זו בעיה שכיחה בקרב מערכות אוטובוסים משותפות כמו זו, וגורמת לבעיות בלתי נספרות אלא אם כן אתה יודע כיצד לטפל בזה נכון.
הזן את המושג הקשב בזמן שאתה מדבר . זה כולל שהמכשיר שנשלח לאוטובוס מקשיב גם למה שנשלח באוטובוס דרך מקלט נפרד. לאחר מכן הוא יכול לדעת אם מה שהוא שלח באוטובוס הוא מה שבסופו של דבר הגיע לאוטובוס. למשל אם שני מכשירים מדברים בו זמנית והאחד שולח 10011001
והשני שולח 11001100
התוצאה שמופיעה באוטובוס עשויה בסופו של דבר להסתיים כמשהו אחר, כגון 11011101
או אולי 10001000
תלוי איך נוצרים אותות האוטובוס. אז אם אתה יודע מה ששלחת נפגם אתה יכול עכשיו לעשות משהו בקשר לזה.
המושג הבא: גיבוי . זה המקום בו שני השולחים ממתינים לתקופה קצרה ומנסים לשלוח שוב. כל עוד שניהם מתעכבים לפרק זמן שונה הראשון שניסה יקבל את האוטובוס ויוכל לתקשר. אבל איך מבטיחים ששניהם יתעכבו לזמנים שונים? אתה עשוי לחשוב שהתשובה פשוטה: השתמש במספר אקראי, כמו rand ()
או אקראי ()
. אבל זה גם בעייתי:
מושג אחר: ה פסאודו מחולל מספרים אקראיים
הארדואינו אינו מייצר מספרים אקראיים . הוא פשוט משתמש בנוסחה מתמטית מורכבת כדי ליצור רצף של מספרים ש נראה לנו אקראי. הם לא. כתוב תוכנית קטנה להדפסת 10 מספרים אקראיים דרך סדרתי והפעל אותה מספר פעמים (לחץ על כפתור האיפוס). תוכלו למצוא את אותם מספרים "אקראיים" באותו סדר בכל פעם. נסה את זה בארדואינו אחר ותקבל שוב את אותם המספרים. תמיד אותו הדבר.
אז מה לעשות? התשובה נקראת זריעה מחולל המספרים האקראיים. המספר הבא שנוצר על ידי rand ()
et al. תלוי במספר שנוצר לאחרונה. אז שנה את המספר הראשון וכל שאר המספרים ישתנו. עם זאת, יש לך מצב של 22 תפוס. אתה צריך מספר אקראי כדי לזרוע את מחולל המספרים האקראיים כדי שיהיה אקראי כדי להיות מסוגל ליצור מספר אקראי כדי לזרוע את מחולל המספרים האקראיים ... ad infinitum. אתה רואה לאן זה הולך? אינך יכול לזרוע מ- rand ()
מכיוון ש- rand ()
אינו אקראי עד שזרעת ממקור אקראי. אז אתה צריך למצוא מקור אקראי.
וזו לא משימה קלה. המקור הטוב ביותר ל אנטרופיה כידוע הוא רעש לבן . זה יכול להיווצר במספר דרכים עם מספר מעגלים שונים - מפירוק צומת דיודות ועד להגברת רווח גבוה מאוד של התנודות התרמיות בנגד.
כולם מורכבים למדי למה שאתה באמת רוצה, אבל יש שיטה פשוטה יותר, אם קצת פחות אקראית - קרא קרא קלט אנלוגי שאינו מחובר לשום דבר. לא יהיה לו טווח כמו מחולל אנטרופיה תקין, אך הוא אמור לספק מספיק אקראיות בכדי לתת סיכוי סביר שכל מכשיר יקבל זרע אחר.
מושג שימושי נוסף הוא ההפרעה.
זה טוב במצב שאתה לא רוצה את המורכבות של אוטובוס רב-מאסטר עם כל ההתנגשויות וכו '. יש לך מאסטר יחיד שעושה את כל העבודה באוטובוס, וכאשר עבד למכשיר יש משהו חשוב לומר שהוא דוחף את המאסטר בהפרעה. המאסטר אומר "כן? מה אתה רוצה?" עליו העבד עונה "מישהו לחץ על הכפתור שלי".
בדרך זו האדון לא סוקר את העבד כל הזמן כדי לראות אם הכפתור נלחץ. זה משמש לעתים קרובות בסידורי אוטובוסים כמו SPI ויש הרבה שבבים, כמו שבבי הרחבת IO, שיכולים להפריע כאשר אחד מסיכות הקלט שלהם משנה את המצב.
אבל אם יש לך 20 מכשירים עושה את זה כלומר יש לך 20 סיכות הפסקה? לא בהכרח. מושג חדש: חוטית או .
אפשר בהחלט שיהיו מספר עבדים שונים המשתמשים באותו סיכת הפסקה. הסיכה מוחזקת בדרך כלל HIGH עם נגד (זה יכול להיות נגד משיכה פנימי) ולכל עבד יש פלט ניקוז פתוח המחובר לסיכה זו. פלט ניקוז פתוח, כאשר הוא "כבוי", אינו מחובר לשום דבר - זה כאילו שהסיכה נמצאת במצב קלט (למעשה ניתן לחקות אותה על שבבים שאין להם ניקוז פתוח על ידי מעבר בין קלט למצב פלט). כאשר הפלט "פועל" הוא מחבר את הסיכה לקרקע, מושך את סיכת ה- IO כלפי מטה, בדיוק כמו שלחצן היה עושה.
אז על המאסטר לפלס את עבדיו שהוא יודע שהם קשור לאותה הפרעה כדי לראות מי צריך תשומת לב. ניתן כמובן ליישם מספר סיכות הפסקה שונות עם קבוצות שונות של עבדים על כל אחת - אולי בעדיפות גבוהה עם מכשיר אחד בלבד, ובעדיפות נמוכה יותר עם מספר מכשירים בכל אחת מהן, למשל.
ניתן להשתמש באותו מושג של חוטית OR ו פתוח ניקוז כדי לאפשר למכשירים מרובים לחלוק את אותם חוטים פיזיים. כך בדיוק עובד I2C - שני קווי האוטובוס נמשכים מעלה על ידי נגדים והמכשירים עליו משתמשים ביציאות ניקוז פתוחות כדי למשוך את הקו נמוך כדי לשחרר אותו חזרה לגובה כדי ליצור את רמות ההיגיון השונות. אם שני מכשירים מושכים אותו נמוך ביחד הוא פשוט יהיה נמוך. ללא שיטת הניקוז הפתוחה אם היה לך מכשיר אחד שמוציא 1 ואחר מוציא 0 אתה בעצם היה מקבל קצר בין השניים ובסופו של דבר אתה פוגע בשבבים.
ואז כמובן יש לך את הרעיון של תקשורת סינכרונית לעומת אסינכרונית, אבל זה קומקום דג אחר לגמרי. במילים פשוטות, פרוטוקולים עם שעון, כמו SPI ו- I2C, שמאסטר מייצר שעון זה, הם סינכרוניים. פרוטוקולים כמו UART ו- RS-232, RS-485 וכו 'הם א-סינכרוניים - הם מסתמכים על שני הקצוות המסכימים עד כמה נתונים נשלחים במהירות (קצב שידור), כך שהם יודעים לפרש את האותות כשהם מגיעים.