eeprom חיצוני בתקשורת I2C לארדואינו (משוחזר 02.06.2015)

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

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

לארדואינו DUE אין eeprom

כן, מה שקראתם, אין לו! למה אני מופתע בכלל?! זה מעבד ARM, מה הקשר לו ולארדואינו אונו.
חיפוש זריז באינטרנט הביא לי כמה פתרונות מעניינים ויצירתיים ביותר:

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

24LC01B

זהו ג'וק eeprom חיצוני שמדבר בתקשורת i2c, של חברת microchip.
הוא מכיל 1kbit זיכרון, שזה בלוק אחד של 128x8bit של זיכרון, כלומר יכול לשמור 128 בטים, כלומר יכול לשמור 128 ערכים של 0-255, מה שתפור עלי!
מה שיותר תפור עלי, זה שהיה לי כאלה, ממש במקרה, פעם הזמנתי בשביל לעשות האק למצלמת gopro, שלא יצא לפועל – או יותר נכון יצא לפועל בצורה אחרת, ואז איבדתי אותה בים, ועכשיו היא שייכת לפוסידון.

כשחיפשתי דוגמאות וספריות נתקלתי במלא דברים שסתם מסבכים את החיים, אז החלטתי לכתוב לבד בעזרת ספריית wire.h שנועה לתקשורת בi2c.
למזלי הערכים שאני צריך לכתוב הם משפרים שלמים קטנים – פחות מ255
משתנים בוליאנים שהשפה ממירה לבד בין true,flase ו 0,1.
והחלק הטיפה מסובך הוא מספרים עשרוניים- float, שצריך לבצע בהם מניפולציה קטנה:
נניח יש לי מספר – 28.5, נכפול ב 10 ונקבל 285 – כבר יותר יפה, אבל עדיין לא נכנס בבייט.
טריק שהשתמשתי בו פעם כדי לשמור קילובייט (1024) בשני בתים הוא לחלק את המספר ב4, כי 255 נכנס ב1024 בדיוק 4 פעמים, לקחת את החלק השלם של החילוק ב4 ולשמור בבייט אחד ולקחת את המודולו ב4 ולשמור בבייט שני.
לדוגמא, 285/4 = 71 (החלק השלם), ו285%4 = 1 (שארית החלוקה)
להרכיב מחדש זה 71*4 ועוד 1 = 285
במקרה שלי חילקתי גם ב 10 וקיבלתי 28.5 בחזרה.

את הקוד שרשמתי אפשר לראות פה כדוגמא:

חיבור הeeprom לארדואינו – ממש פשוט vcc,gnd,sda,scl וזהו, find & replace זריז על כל הקוד כדי להחליף את השם של הפונקציה שקוראת וכותבת לזיכרון, והוספת זיכרון בלתי נדיף לפרויק00ט שלי הושלמה.

לחברת microchip, יש עוד מגוון צ'יפים כאלה נם נפחים הרבה יותר גדולים, כמו 256kbit ו512kbit u ואפילו 1024, בנוסף גם במגוון תקשורות, את כל אלה ניתן לראות בקישור פה.

מקווה שזה תרם למישהו.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *