ללוחות ארדואינו הנפוצים יש קילובייט אחד של זיכרון EEPROM, ששומר על תוכנו גם כשהלוח אינו מחובר לחשמל. אם הפרויקט שלכם מחייב יותר מקילובייט, או כולל מיקרו-בקר ללא EEPROM, אפשר להשלים את החסר בעזרת שבבי EEPROM ייעודיים. מבין אלה, משפחת השבבים AT24Cxx היא אופציה זמינה, זולה מאד וקלה לשימוש. בואו ונראה איך משלבים אותה בפרויקט.
מה זה AT24Cxx
מדובר במעגלים משולבים (ג'וקים) בעלי 8 רגליים בלבד, במספר סוגי מארזים, שכוללים כמות מסוימת של זיכרון EEPROM וכן מודול פנימי לתקשורת עם מיקרו-בקר באמצעות חיבור Two-Wire (למעשה, מה שאנחנו מכירים בשם I2C). ה-xx כאן הוא מספר כלשהו, שמציין כמה קילוביט של זיכרון הג'וק הספציפי מכיל. לדוגמה, הדגם AT24C64A מכיל 64 קילוביט, שהם 8 קילובייט. הג'וקים החדשים-יותר במשפחה זו כוללים גם 512 או 1024 קילוביט. אי-שם בעבר, שבבי EEPROM אלה יוצרו על ידי חברת Atmel, ומכאן ה-AT בתחילת השם. אך מאז נכנסו לתחום גם יצרנים אחרים, ששמרו פחות או יותר על צורת הסימון ועל המפרט הטכני של המקור.
משפחת AT24Cxx שימושית במיוחד למייקרים וחובבים, ממספר סיבות. ראשית, הג'וקים האלה קיימים גם במארז DIP הנוח. שנית, הם זמינים ועולים גרושים: באיביי ובעליאקספרס אפשר לקנות ערמות שלהם במחיר של כחצי שקל ליחידה. שלישית, העבודה איתם כאמור קלה. רביעית, לכל שבב יש פינים של "כתובת", בעזרתם אפשר לשרשר מספר ג'וקים ולהשיג עוד יותר זיכרון, ולסיום, הג'וקים מסוגלים לעבוד בלי בעיה גם ב-3.3V וגם ב-5V.
חיבורים
הנה מיפוי הפינים של ג'וק ממשפחת AT24Cxx. הפין GND הוא כמובן האדמה, ו-Vcc הוא מתח ההפעלה.
הפינים A0-2 הם ה"כתובת" של הרכיב. אם לא מחברים אותם לשום דבר (ובהנחה שאין קיבול מקרי ובעייתי במעגל), ברירת המחדל שלהם היא GND, או 0. כדי לשנות את הכתובת, מחברים את הפינים הרצויים ל-Vcc. כך ניתן להגדיר בסך הכל שמונה כתובות שונות.
פין WP הוא Write Protect. אם הוא מחובר ל-GND, או לא מחובר לכלום, ניתן לכתוב ולקרוא מהשבב. לעומת זאת, כל עוד WP מחובר ל-Vcc, ניתן יהיה לקרוא נתונים קיימים אבל אי אפשר יהיה לכתוב מידע חדש.
הפינים SCL ו-SDA הם שני הקווים הסטנדרטיים של תקשורת I2C – קו השעון וקו הנתונים. את אלה מחברים ישירות ל-SCL ול-SDA של המיקרו-בקר. בלוחות ארדואינו Uno גרסה R3, הקווים האלה קיבלו פינים משלהם שנמצאים ליד הפין AREF. בלוחות אחרים הם משותפים עם פינים אחרים – ראו למשל בדף הספריה Wire של ארדואינו.
קוד
תיאור פרוטוקול התקשורת ב-datasheet של הג'וקים האלה קצת מתיש, אך בעצם לא חיוני להבין אותו עד הסוף: אלא אם מתחשק לכם לממש את פרוטוקול I2C בעצמכם, תוכלו להשתמש בכלים מוכנים מראש, כגון הספריה Wire. עם זאת, קחו בחשבון שהספריה הזו בסיסית מאד ולא מכסה את כל טווח האפשרויות של תקשורת I2C.
בגדול, כל פעולה מתחילה בשליחה של כתובת רכיב (שמתחילה בביטים הקבועים 1010, ואחריהם שלושה ביטים "חופשיים" כמו שאפשר להגדיר בעזרת הפינים A0-2). הביט הבא בתור, השמיני, אומר אם מדובר בפעולת כתיבה או קריאה. אחרי זה שולחים שני בייטים שמציינים את הכתובת הרצויה בזיכרון, ואחריהם שולחים – או מקבלים – את הבייט הספציפי שרוצים לכתוב או לקרוא. אם אתם רוצים להיכנס לפרטים הקטנים, יש עוד כמה סיגנלים של התחלה/סיום/אישור שצריך לנהל, ויש גם דרכים לבצע כתיבה של בלוק נתונים (עד 32 בייטים) וקריאה סדרתית (של בייטים עוקבים) כדי לחסוך שליחה של כתובות עוקבות.
הנה הקוד המאולתר שהכנתי עבור המערכת שהוצגה בסרטון למעלה. הוא כולל פניה לרכיב יחיד בלבד (כתובת 1010000), וקריאה וכתיבה של בייטים בודדים (פונקציות אלה מבוססות על קוד קיים שמצאתי ברשת). אל תשכחו לאתחל את התקשורת באמצעות קריאה ל-
Wire.begin()
אי-שם בתחילת התוכנית, וחשוב מאד גם לתת לפקודות כתיבה מספיק זמן להסתיים (ראו בהמשך), לפני שמנסים לדבר שוב עם הג'וק.
מגבלות
כמו ל-EEPROM של הארדואינו עצמו, גם לג'וקים אלה יש מספר מגבלות שצריך להכיר.
קודם כל, התקשורת עם רובם יכולה להתבצע במהירות שעון מרבית של 400KHz (ואפילו פחות, במתחי הפעלה נמוכים יותר). כלומר, בהערכה גסה מאד של 4 בייטים של תקשורת עבור כל בייט של נתונים (בקריאה לא סדרתית), אנחנו יכולים להגיע לקצב קריאה של עד כ-12KBps בלבד. אגב, אם משתמשים במודול I2C בחומרה (כפי שעושה הספריה Wire), לא צריך להתעסק עם קצב השעון – זה מטופל אוטומטית עבורנו.
כתיבה של בייט יחיד דורשת עד 5 אלפיות השניה, ויש גם מגבלה על מספר הכתיבות המובטח – אם כי היא בסביבות מיליון כתיבות, פי עשרה מאשר בארדואינו. המידע אמור להישאר בג'וק לפחות מאה שנים, אז בקטע הזה אתם יכולים להיות רגועים.
צריכת החשמל נעה בין מיקרואמפר ספורים בזמן אי-פעילות, לבין עד 3 מיליאמפר בזמן כתיבה.
צודק, אני לא לגמרי מסודר עם התוויות והקטגוריות של הפוסטים – במיוחד אלה הישנים… נקווה שיהיה לי זמן לטפל בזה מתישהו!
עידו שלום,
ראשית רציתי להודות לך אני לומד הרבה מהבלוג שלך!
הנושא מאוד מעניין אותי כי אני מגיע לקצה גבול הזיכרון בפרויקט שאני עושה בUno.
תוכל קצת להרחיב בנושא או להכווין אותי להרחבות בנושא?
אני קצת מתקשה להבין את ההבדלים בין הEEPROM לבין ה-SRAM ואת השימושים השונים בהם.
את הפוסט הישן הזה כבר קראת?
https://www.idogendel.com/whitebyte/archives/475